荥阳做网站服务器运维
目录
1 实验介绍
2 实验准备
2.1 创建目录为MySQL挂载使用
2.2 编写 docker-compose.yml 文件
2.3 启动容器
3 主从复制操作
3.1 MASTER 操作指令
3.2 SLAVE1 操作指令
3.3 SLAVE2 操作指令
4 验证是否实现主从
4.1 导入sql脚本查看是否正常主从复制
4.2 检验从库是否看见复制是否成功
1 实验介绍
本次实验 使用 docker 镜像,开启三个容器,实现一主两从。
| 容器主机 | IP地址 | 映射主机端口 | 
|---|---|---|
| mysql-master | 192.168.1.2 | 3306 | 
| mysql-slave1 | 192.168.1.3 | 3307 | 
| mysql-slave2 | 192.168.1.4 | 3308 | 
2 实验准备
2.1 创建目录为MySQL挂载使用
使用 docker 做MySQL这一种有状态的,需要很好的保持数据的可靠性,所以得使用宿主机挂载到容器内
 [root@chucong mysql_zhucong]# tree /data/ -L 3/data/├── master              # master的目录│   ├── conf            # 配置文件存放目录│   │   └── my.cnf      # 配置文件│   └── master-data     # 存放数据的地方├── slave1│   ├── conf│   │   └── my.cnf│   └── slave1-data└── slave2├── conf│   └── my.cnf└── slave2-data# MySQL 配置文件[root@chucong mysql_zhucong]# cat /data/master/conf/my.cnf [mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socksymbolic-links=0log_bin=mysql-bin  # 开启bin-log日志,注意只有主配置文件需开启server_id=10#gtid_mode=ON    # 开启GTID#enforce-gtid-consistency=ON    # 保证GTID的强一致性[root@chucong mysql_zhucong]# cat /data/slave1/conf/my.cnf [mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socksymbolic-links=0server_id=20#super_read_only=on  #只读#gtid_mode=ON    # 开启GTID#enforce-gtid-consistency=ON    # 保证GTID的强一致性[root@chucong mysql_zhucong]# cat /data/slave2/conf/my.cnf [mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socksymbolic-links=0server_id=30#super_read_only=on  #只读#gtid_mode=ON    # 开启GTID#enforce-gtid-consistency=ON    # 保证GTID的强一致性 
 
2.2 编写 docker-compose.yml 文件
[root@chucong mysql_zhucong]# docker pull mysql:9.1.0
[root@chucong mysql_zhucong]# vim docker-compose.yml version: '2.27.1'services:mysql-master:image: mysql:9.1.0container_name: mysql-masterenvironment:            # 定义系统值MYSQL_ROOT_PASSWORD: root     # root密码MYSQL_USER: repl      # 创建复制用户MYSQL_PASSWORD: root  # 设置密码ports:- 3306:3306volumes:- /data/master/master-data:/var/lib/mysql # 挂载宿主机目录到容器- /data/master/conf/my.cnf:/etc/my.cnfrestart: alwaysnetworks:mynet1:ipv4_address: 192.168.1.2mysql-slave1:image: mysql:9.1.0container_name: mysql-slave1environment:MYSQL_ROOT_PASSWORD: rootMYSQL_USER: replMYSQL_PASSWORD: rootports:- 3307:3306volumes:- /data/slave1/slave1-data:/var/lib/mysql # 挂载宿主机目录到容器- /data/slave1/conf/my.cnf:/etc/my.cnfrestart: alwaysnetworks:mynet1:ipv4_address: 192.168.1.3mysql-slave2:image: mysql:9.1.0container_name: mysql-slave2environment:MYSQL_ROOT_PASSWORD: rootMYSQL_USER: replMYSQL_PASSWORD: rootports:- 3308:3306volumes:- /data/slave2/slave2-data:/var/lib/mysql # 挂载宿主机目录到容器- /data/slave2/conf/my.cnf:/etc/my.cnfrestart: alwaysnetworks:mynet1:ipv4_address: 192.168.1.4networks:mynet1:                       # 使用自定义桥接模式driver: bridgeipam:config:- subnet: 192.168.1.0/24  # 定义网段gateway: 192.168.1.1    # 定义网关 
 
2.3 启动容器
 [root@chucong zhucong]# docker compose up -d  # 查看容器是否运行[root@chucong zhucong]# docker ps CONTAINER ID   IMAGE         COMMAND                   CREATED          STATUS          PORTS                                                  NAMESe5776a980697   mysql:9.1.0   "docker-entrypoint.s…"   59 minutes ago   Up 43 minutes   33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp   mysql-slave10bb3a700077c   mysql:9.1.0   "docker-entrypoint.s…"   59 minutes ago   Up 43 minutes   33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp   mysql-slave2af2f63aa00e8   mysql:9.1.0   "docker-entrypoint.s…"   59 minutes ago   Up 4 seconds    0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql-master 
 
3 主从复制操作
3.1 MASTER 操作指令
[root@chucong mysql_zhucong]# docker exec -it mysql-master bash
bash-5.1# mysql -uroot -proot# 假如说没有设置变量自动创建可以手动创建,设置了可以省略以下命令mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'root';# 赋予所有库所有表 repl 用户 REPLICATION SLAVE 的权限mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';mysql> FLUSH PRIVILEGES;mysql> SHOW BINARY LOG STATUS\G         # 与过往版本不一样了,以前为 SHOW MASTER status\G*************************** 1. row ***************************File: mysql-bin.000034         # 注意此处的Position: 198                      # 还有此出处,这两行在从库操作的时候有至关重要的作用Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: d83de5a7-b723-11ef-a65b-0242c0a80104:1-21 row in set (0.00 sec) 
 
3.2 SLAVE1 操作指令
 [root@chucong mysql_zhucong]# docker exec -it mysql-slave1 bashbash-5.1# mysql -uroot -proot# 假如说没有设置变量自动创建可以手动创建,设置了可以省略以下命令mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'root';# 以下这整条命令也是发生了巨大的改变,并且不需要指定端口了mysql> CHANGE REPLICATION SOURCE TOSOURCE_HOST='192.168.1.2',          # MASTER 的 IPSOURCE_USER='repl',                 # 创建的用户SOURCE_PASSWORD='root',             # 密码SOURCE_LOG_FILE='mysql-bin.000034', # 为主库使用 SHOW BINARY LOG STATUS\G 中的File值GET_SOURCE_PUBLIC_KEY=1,            # 此处注意 自动获取主服务器的公钥(适用于caching_sha2_password)SOURCE_LOG_POS=198;                 # 为主库使用 SHOW BINARY LOG STATUS\G 中的Position值# 旧版本的命令如下,可指定端口# mysql> CHANGE MASTER TO #    -> MASTER_HOST='192.168.1.2',#    -> MASTER_PORT=3306,#    -> MASTER_USER='repl',#    -> MASTER_PASSWORD='root',#    -> MASTER_LOG_FILE='mysql-bin.000034',#    -> MASTER_LOG_POS=198;mysql> START REPLICA;       # 启动复制  9.1.0 变化的命令 以前版本为 START SLAVE;mysql> SHOW REPLICA STATUS; # 启动复制  9.1.0 变化的命令 以前版本为 SHOW SLAVE STATUS;mysql> SHOW REPLICA STATUS\G*************************** 1. row ***************************Replica_IO_State: Waiting for source to send eventSource_Host: 192.168.1.2Source_User: replSource_Port: 3306Connect_Retry: 60Source_Log_File: mysql-bin.000034Read_Source_Log_Pos: 7061047Relay_Log_File: e5776a980697-relay-bin.000002Relay_Log_Pos: 7061177Relay_Source_Log_File: mysql-bin.000034Replica_IO_Running: Yes      # IO 线程YES表示已经连接成功,如果不是会显示no或者connectReplica_SQL_Running: Yes       
 
 
3.3 SLAVE2 操作指令
[root@chucong mysql_zhucong]# docker exec -it mysql-slave2 bashbash-5.1# mysql -uroot -proot# 假如说没有设置变量自动创建可以手动创建,设置了可以省略以下命令mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'root';# 以下这整条命令也是发生了巨大的改变,并且不需要指定端口了mysql> CHANGE REPLICATION SOURCE TOSOURCE_HOST='192.168.1.2',          # MASTER 的 IPSOURCE_USER='repl',                 # 创建的用户SOURCE_PASSWORD='root',             # 密码SOURCE_LOG_FILE='mysql-bin.000034', # 为主库使用 SHOW BINARY LOG STATUS\G 中的File值GET_SOURCE_PUBLIC_KEY=1,            # 此处注意 自动获取主服务器的公钥(适用于caching_sha2_password)SOURCE_LOG_POS=198;                 # 为主库使用 SHOW BINARY LOG STATUS\G 中的Position值# 旧版本的命令如下,可指定端口# mysql> CHANGE MASTER TO #    -> MASTER_HOST='192.168.1.2',#    -> MASTER_PORT=3306,#    -> MASTER_USER='repl',#    -> MASTER_PASSWORD='root',#    -> MASTER_LOG_FILE='mysql-bin.000034',#    -> MASTER_LOG_POS=198;mysql> START REPLICA;       # 启动复制  9.1.0 变化的命令 以前版本为 START SLAVE;mysql> SHOW REPLICA STATUS; # 启动复制  9.1.0 变化的命令 以前版本为 SHOW SLAVE STATUS;mysql> SHOW REPLICA STATUS\G*************************** 1. row ***************************Replica_IO_State: Waiting for source to send eventSource_Host: 192.168.1.2Source_User: replSource_Port: 3306Connect_Retry: 60Source_Log_File: mysql-bin.000034Read_Source_Log_Pos: 7061047Relay_Log_File: 0bb3a700077c-relay-bin.000002Relay_Log_Pos: 7061177Relay_Source_Log_File: mysql-bin.000034Replica_IO_Running: YesReplica_SQL_Running: Yes 
 
4 验证是否实现主从
4.1 导入sql脚本查看是否正常主从复制
 # MASTER[root@chucong ~]# docker cp smart_work_v3.sql mysql-master:/Successfully copied 6.53MB to mysql-master:/[root@chucong ~]# docker exec -it mysql-master bashbash-5.1# ls afs  boot  docker-entrypoint-initdb.d  home  lib64  mnt  proc  run   smart_work_v3.sql  sys  usrbin  dev   etc                         lib   media  opt  root  sbin  srv                tmp  varbash-5.1# mysql -uroot -prootmysql> CREATE DATABASE shuyan;  # 创建数据库mysql> USE shuyan   # 切换到数据库Database changedmysql> SOURCE smart_work_v3.sql # 导入sql脚本mysql> SHOW TABLES;+----------------------------------------+| Tables_in_shuyan                       |+----------------------------------------+| aaa                                    || abi_http_log                           || act_app_appdef                         || act_app_databasechangelog              || act_app_databasechangeloglock          || act_app_deployment                     || act_app_deployment_resource            || act_cmmn_casedef                       |+----------------------------------------+ 
 
4.2 检验从库是否看见复制是否成功
mysql> USE shuyan;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> SHOW TABLES;+----------------------------------------+| Tables_in_shuyan                       |+----------------------------------------+| aaa                                    || abi_http_log                           || act_app_appdef                         || act_app_databasechangelog              || act_app_databasechangeloglock          || act_app_deployment                     || act_app_deployment_resource            || act_cmmn_casedef                       || act_cmmn_databasechangelog             || act_cmmn_databasechangeloglock         || act_cmmn_deployment                    |+----------------------------------------+ 
