MySQL的主从一般用于读写分离,主要是为了提高数据库的读写性能,提高并发能力,本章介绍如何通过Docker搭建MySQL主从结构
 
MySQL主备 
环境准备 
Docker运行环境
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 @10 ➜ ~  docker version Client: Docker Engine - Community  Version:           20.10.7  API version:       1.41  Go version:        go1.13.15  Git commit:        f0df350  Built:             Wed Jun  2 11:58:10 2021  OS/Arch:           linux/amd64  Context:           default  Experimental:      true  Server: Docker Engine - Community  Engine:   Version:          20.10.7   API version:      1.41 (minimum version 1.12)   Go version:       go1.13.15   Git commit:       b0f5bc3   Built:            Wed Jun  2 11:56:35 2021   OS/Arch:          linux/amd64   Experimental:     false   containerd:   Version:          1.4.6   GitCommit:        d71fcd7d8303cbf684402823e425e9dd2e99285d  runc:   Version:          1.0.0-rc95   GitCommit:        b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7  docker-init:   Version:          0.19.0   GitCommit:        de40ad0 
主从集群搭建 
不了解如何使用Docker运行MySQL的可以参考Docker安装MySQL 来完成MySQL的安装。
服务器 
角色 
服务器IP 
备注 
 
 
master 
192.168.33.51 
mysql_ms_master 
 
slave01 
192.168.33.52 
mysql_ms_slave1 
 
slave02 
192.168.33.53 
mysql_ms_slave2 
 
 
主库 
1 2 3 4 [mysqld] server-id =1 log-bin =master-bin log-bin-index =master-bin.index 
1 2 3 4 5 6 docker run -p 3307:3306 --name mysql_ms_master \ --privileged=true  \ -v /home/dev/data/mysql/ms/conf:/etc/mysql/conf.d \ -v /home/dev/data/mysql/ms/logs:/logs \ -v /home/dev/data/mysql/ms/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=master123 -d mysql:5.7 
1 2 3 4 5 6 7 8 9 10 # 进入容器内部 docker exec -it mysql_ms_master /bin/bash # 使用mysql命令行工具 mysql -uroot -pmaster123 # 创建用户并分配权限 mysql> CREATE USER 'slave'@'%' IDENTIFIED BY 'slave'; #创建用户 mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%'; #分配权限 mysql> flush privileges;   #刷新权限 
1 2 3 4 5 6 7 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,后续建立主从时需要这两个值 
 
从库 
配置文件内新增以下配置(注:slave1和slave2需要配置为不同的server-id ) 
 
1 2 3 4 [mysqld] server-id =2 relay-log-index =slave-relay-bin.index relay-log =slave-relay-bin 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 docker run -p 3307:3306 --name mysql_ms_slave1  \ --privileged=true  \ -v /home/dev/data/mysql/ms/conf:/etc/mysql/conf.d \ -v /home/dev/data/mysql/ms/logs:/logs \ -v /home/dev/data/mysql/ms/data:/var/lib/mysql  \ -e MYSQL_ROOT_PASSWORD=slave123 \ -d mysql:5.7 docker run -p 3307:3306 --name mysql_ms_slave2  \ --privileged=true  \ -v /home/dev/data/mysql/ms/conf:/etc/mysql/conf.d \ -v /home/dev/data/mysql/ms/logs:/logs \ -v /home/dev/data/mysql/ms/data:/var/lib/mysql  \ -e MYSQL_ROOT_PASSWORD=slave123 \ -d mysql:5.7 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 docker exec  -it mysql_ms_slave1 /bin/bash mysql -uroot -pslave123 mysql> change master to master_host='192.168.33.51' , master_port=3307, 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 event                   Master_Host: 192.168.33.10                   Master_User: slave                   Master_Port: 3307                 Connect_Retry: 30               Master_Log_File: master-bin.000003           Read_Master_Log_Pos: 749                Relay_Log_File: slave-relay-bin.000002                 Relay_Log_Pos: 321         Relay_Master_Log_File: master-bin.000003              Slave_IO_Running: Yes             Slave_SQL_Running: Yes               Replicate_Do_DB:            Replicate_Ignore_DB:             Replicate_Do_Table:         Replicate_Ignore_Table:        Replicate_Wild_Do_Table:    Replicate_Wild_Ignore_Table:                     Last_Errno: 0                    Last_Error:                   Skip_Counter: 0           Exec_Master_Log_Pos: 749               Relay_Log_Space: 528               Until_Condition: None                Until_Log_File:                  Until_Log_Pos: 0            Master_SSL_Allowed: No            Master_SSL_CA_File:             Master_SSL_CA_Path:                Master_SSL_Cert:              Master_SSL_Cipher:                 Master_SSL_Key:          Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No                 Last_IO_Errno: 0                 Last_IO_Error:                 Last_SQL_Errno: 0                Last_SQL_Error:    Replicate_Ignore_Server_Ids:               Master_Server_Id: 1                   Master_UUID: ea044309-df3d-11eb-8a4b-0242ac110004              Master_Info_File: /var/lib/mysql/master.info                     SQL_Delay: 0           SQL_Remaining_Delay: NULL       Slave_SQL_Running_State: Slave has read  all relay log ; waiting for  more updates            Master_Retry_Count: 86400                   Master_Bind:        Last_IO_Error_Timestamp:       Last_SQL_Error_Timestamp:                 Master_SSL_Crl:             Master_SSL_Crlpath:             Retrieved_Gtid_Set:              Executed_Gtid_Set:                  Auto_Position: 0          Replicate_Rewrite_DB:                   Channel_Name:             Master_TLS_Version:  1 row in  set  (0.00 sec) ERROR:  No query specified           
测试主从服务 
使用Navicat分别连接三个服务器,在主服务器上创建测试数据库、新增表t_user并增加一行数据。查看从服务器,主从功能正常。
小结 
至此,MySQL的主从结构已经搭建完成,后续完成读写分离应用方的创建。