自学内容网 自学内容网

MySQL-9.1.0 实现最基础的主从复制

目录

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-master192.168.1.23306
mysql-slave1192.168.1.33307
mysql-slave2192.168.1.43308

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/mysql
 socket=/var/lib/mysql/mysql.sock
 symbolic-links=0
 log_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/mysql
 socket=/var/lib/mysql/mysql.sock
 symbolic-links=0
 server_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/mysql
 socket=/var/lib/mysql/mysql.sock
 symbolic-links=0
 server_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.0
     container_name: mysql-master
     environment:            # 定义系统值
       MYSQL_ROOT_PASSWORD: root     # root密码
       MYSQL_USER: repl      # 创建复制用户
       MYSQL_PASSWORD: root  # 设置密码
     ports:
       - 3306:3306
     volumes:
       - /data/master/master-data:/var/lib/mysql # 挂载宿主机目录到容器
       - /data/master/conf/my.cnf:/etc/my.cnf
     restart: always
     networks:
       mynet1:
         ipv4_address: 192.168.1.2
 ​
   mysql-slave1:
     image: mysql:9.1.0
     container_name: mysql-slave1
     environment:
       MYSQL_ROOT_PASSWORD: root
       MYSQL_USER: repl
       MYSQL_PASSWORD: root
     ports:
       - 3307:3306
     volumes:
       - /data/slave1/slave1-data:/var/lib/mysql # 挂载宿主机目录到容器
       - /data/slave1/conf/my.cnf:/etc/my.cnf
     restart: always
     networks:
       mynet1:
         ipv4_address: 192.168.1.3
 ​
   mysql-slave2:
     image: mysql:9.1.0
     container_name: mysql-slave2
     environment:
       MYSQL_ROOT_PASSWORD: root
       MYSQL_USER: repl
       MYSQL_PASSWORD: root
     ports:
       - 3308:3306
     volumes:
       - /data/slave2/slave2-data:/var/lib/mysql # 挂载宿主机目录到容器
       - /data/slave2/conf/my.cnf:/etc/my.cnf
     restart: always
     networks:
       mynet1:
         ipv4_address: 192.168.1.4
 ​
 networks:
   mynet1:                       # 使用自定义桥接模式
     driver: bridge
     ipam:
       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                                                  NAMES
 e5776a980697   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-slave1
 0bb3a700077c   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-slave2
 af2f63aa00e8   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-2
 1 row in set (0.00 sec)

3.2 SLAVE1 操作指令

 [root@chucong mysql_zhucong]# docker exec -it mysql-slave1 bash
 bash-5.1# mysql -uroot -proot
 ​
 # 假如说没有设置变量自动创建可以手动创建,设置了可以省略以下命令
 mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'root';
 ​
 # 以下这整条命令也是发生了巨大的改变,并且不需要指定端口了
 mysql> CHANGE REPLICATION SOURCE TO
 SOURCE_HOST='192.168.1.2',          # MASTER 的 IP
 SOURCE_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 event
                   Source_Host: 192.168.1.2
                   Source_User: repl
                   Source_Port: 3306
                 Connect_Retry: 60
               Source_Log_File: mysql-bin.000034
           Read_Source_Log_Pos: 7061047
                Relay_Log_File: e5776a980697-relay-bin.000002
                 Relay_Log_Pos: 7061177
         Relay_Source_Log_File: mysql-bin.000034
            Replica_IO_Running: Yes      # IO 线程YES表示已经连接成功,如果不是会显示no或者connect
           Replica_SQL_Running: Yes      

3.3 SLAVE2 操作指令

 
[root@chucong mysql_zhucong]# docker exec -it mysql-slave2 bash
 bash-5.1# mysql -uroot -proot
 ​
 # 假如说没有设置变量自动创建可以手动创建,设置了可以省略以下命令
 mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'root';
 ​
 # 以下这整条命令也是发生了巨大的改变,并且不需要指定端口了
 mysql> CHANGE REPLICATION SOURCE TO
 SOURCE_HOST='192.168.1.2',          # MASTER 的 IP
 SOURCE_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 event
                   Source_Host: 192.168.1.2
                   Source_User: repl
                   Source_Port: 3306
                 Connect_Retry: 60
               Source_Log_File: mysql-bin.000034
           Read_Source_Log_Pos: 7061047
                Relay_Log_File: 0bb3a700077c-relay-bin.000002
                 Relay_Log_Pos: 7061177
         Relay_Source_Log_File: mysql-bin.000034
            Replica_IO_Running: Yes
           Replica_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 bash
 bash-5.1# ls 
 afs  boot  docker-entrypoint-initdb.d  home  lib64  mnt  proc  run   smart_work_v3.sql  sys  usr
 bin  dev   etc                         lib   media  opt  root  sbin  srv                tmp  var
 ​
 bash-5.1# mysql -uroot -proot
 mysql> CREATE DATABASE shuyan;  # 创建数据库
 mysql> USE shuyan   # 切换到数据库
 Database changed
 ​
 mysql> 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 names
 You can turn off this feature to get a quicker startup with -A
 ​
 Database changed
 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                       |
 | act_cmmn_databasechangelog             |
 | act_cmmn_databasechangeloglock         |
 | act_cmmn_deployment                    |
 +----------------------------------------+


原文地址:https://blog.csdn.net/weixin_68398469/article/details/144413879

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!