MySQL主从
环境准备
Docker运行环境
@10 ➜ ~ docker versionClient: Docker Engine - CommunityVersion: 20.10.7API version: 1.41Go version: go1.13.15Git commit: f0df350Built: Wed Jun 2 11:58:10 2021OS/Arch: linux/amd64Context: defaultExperimental: trueServer: Docker Engine - CommunityEngine:Version: 20.10.7API version: 1.41 (minimum version 1.12)Go version: go1.13.15Git commit: b0f5bc3Built: Wed Jun 2 11:56:35 2021OS/Arch: linux/amd64Experimental: falsecontainerd:Version: 1.4.6GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285drunc:Version: 1.0.0-rc95GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7docker-init:Version: 0.19.0GitCommit: de40ad0
主从集群搭建
服务器
| 角色 | 服务器IP | 备注 |
| master | 192.168.33.51 | mysql_master |
| slave01 | 192.168.33.52 | mysql_slave01 |
| slave02 | 192.168.33.53 | mysql_slave02 |
•使用虚拟机多服务器环境,如图所示

主库
•配置文件内新增如下配置:
[mysqld]server-id=1log-bin=master-binlog-bin-index=master-bin.index
•使用Docker运行容器
docker run -p 3306:3306 --name mysql_master \--privileged=true \-v /home/dev/data/mysql/conf:/etc/mysql/conf.d \-v /home/dev/data/mysql/logs:/logs \-v /home/dev/data/mysql/data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=master123 -d mysql:5.7
•启动主数据库后,增加用户用于从库进行复制
# 进入容器内部docker exec -it mysql_master /bin/bash# 使用mysql命令行工具mysql -uroot -pmaster123# 创建用户并分配权限mysql> CREATE USER 'slave'@'%' IDENTIFIED BY 'slave'; #创建用户mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%'; #分配权限mysql> flush privileges; #刷新权限
•查看主库复制状态
mysql> show master status;+-------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+-------------------+----------+--------------+------------------+-------------------+| master-bin.000003 | 749 | | | |+-------------------+----------+--------------+------------------+-------------------+1 row in set (0.01 sec)
•这里记录File以及Position,后续建立主从时需要这两个值
从库
•配置文件内新增以下配置(注:slave01和slave02需要配置为不同的server-id)
[mysqld]server-id=2relay-log-index=slave-relay-bin.indexrelay-log=slave-relay-bin
•使用Docker运行容器
docker run -p 3306:3306 --name mysql_slave01 \--privileged=true \-v /home/dev/data/mysql/conf:/etc/mysql/conf.d \-v /home/dev/data/mysql/logs:/logs \-v /home/dev/data/mysql/data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=slave123 \-d mysql:5.7docker run -p 3306:3306 --name mysql_slave02 \--privileged=true \-v /home/dev/data/mysql/conf:/etc/mysql/conf.d \-v /home/dev/data/mysql/logs:/logs \-v /home/dev/data/mysqldata:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=slave123 \-d mysql:5.7# --privileged=true :指定当前容器具有宿主机的root权限
•连接主库并开启复制
# 进入容器内部docker exec -it mysql_slave01 /bin/bash# 使用mysql命令行工具mysql -uroot -pslave123# 配置主库信息mysql> change master to master_host='192.168.33.51', master_port=3306, master_user='slave', master_password='slave', master_log_file='master-bin.000003', master_log_pos=749, master_connect_retry=30;Query OK, 0 rows affected, 2 warnings (0.02 sec)# 开启复制mysql> start slave;Query OK, 0 rows affected (0.00 sec)# 查看从库状态mysql> show slave status\G;*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.33.10Master_User: slaveMaster_Port: 3307Connect_Retry: 30Master_Log_File: master-bin.000003Read_Master_Log_Pos: 749Relay_Log_File: slave-relay-bin.000002Relay_Log_Pos: 321Relay_Master_Log_File: master-bin.000003Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno: 0Last_Error:Skip_Counter: 0Exec_Master_Log_Pos: 749Relay_Log_Space: 528Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error:Last_SQL_Errno: 0Last_SQL_Error:Replicate_Ignore_Server_Ids:Master_Server_Id: 1Master_UUID: ea044309-df3d-11eb-8a4b-0242ac110004Master_Info_File: /var/lib/mysql/master.infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp:Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set:Executed_Gtid_Set:Auto_Position: 0Replicate_Rewrite_DB:Channel_Name:Master_TLS_Version:1 row in set (0.00 sec)ERROR:No query specified# 看到以下两个状态为Yes表示复制正常进行# Slave_IO_Running: Yes# Slave_SQL_Running: Yes
•同理设置mysql_slave02的复制
测试主从服务
使用Navicat分别连接三个服务器,在主服务器上创建测试数据库、新增表t_user并增加一行数据。查看从服务器,主从功能正常。

小结
至此,MySQL的主从结构已经搭建完成,后续会介绍基于ShardingSphere完成应用方的搭建
文章转载自leithda,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




