MySQL 雙主雙從實作讀寫分離
本節是基于上一節繼續擴充,基于Docker 實作MySQL 2主2從(讀寫分離)
一、2 主 2從架構解析
1.兩台mysql都可讀寫,互為主備,預設隻使用一台(masterA)負責資料的寫入,另一台(masterB)備用;
2.masterA是masterB的主庫,masterB又是masterA的主庫,它們互為主從;
3.兩台主庫之間做高可用,可以采用keepalived等方案(使用VIP對外提供服務);
4.所有提供服務的從伺服器與masterB進行主從同步(雙主多從);
架構簡易圖如下:

服務節點 | 節點狀态 |
---|---|
192.168.190.165 | 既是主節點也是從節點,與183互為主從 |
192.168.190.183 | 既是主節點也是從節點,與165互為主從 |
192.168.190.184 | 是183的從節點 |
192.168.190.185 | 是165的從節點 |
二、主節點配置
這裡是對 192.168.190.165 和 192.168.190.183 2個互為主從的主節點 做統一的配置
1.1. 編寫docker-compose.yml 檔案
- 建立目錄 mkdir /usr/local/docker/mysql/
- cd /usr/local/docker/mysql/ && mkdir data conf
- vim docker-compose.yml
version: '3.1'
services:
mysql:
restart: always
image: mysql:5.7
container_name: mysql
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- ./data:/var/lib/mysql
- ./conf:/etc/mysql/mysql.conf.d
1.2. 編寫MySQL配置檔案mysqld.cnf
第1個主節點配置
192.168.190.165 在 /usr/local/docker/mysql/conf/ 目錄下建立,mysqld.cnf檔案,并加入以下配置
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
symbolic-links=0
server-id = 165
log-bin = mysql-bin
enforce_gtid_consistency = ON
gtid_mode = ON
auto_increment_increment=2
auto_increment_offset=2
log-slave-updates
sync_binlog=1
第2個主節點配置
192.168.190.183 在 /usr/local/docker/mysql/conf/ 目錄下建立,mysqld.cnf檔案,并加入以下配置
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
symbolic-links=0
server-id = 183
log-bin = mysql-bin
enforce_gtid_consistency = ON
gtid_mode = ON
auto_increment_increment=2
auto_increment_offset=1
log-slave-updates
sync_binlog=1
1.3 檢視2個主節的 狀态
1、啟動mysql: cd /usr/local/docker/mysql/ && docker-compose up -d
2、進入容器:docker exec -it mysql /bin/bash
3、登入容器中mysql server : mysql -uroot -p123456
- 192.168.190.195 主節點1狀态
mysql> show master status \G;
*************************** 1. row ***************************
File: mysql-bin.000005
Position: 495
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: 83039ec9-d923-11e9-b99b-0242c0a82002:1-11,
fe718590-d923-11e9-8508-0242c0a8c002:1-7
1 row in set (0.00 sec)
- 192.168.190.183 主節點2狀态
mysql> show master status \G;
*************************** 1. row ***************************
File: mysql-bin.000005
Position: 495
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: 83039ec9-d923-11e9-b99b-0242c0a82002:1-11,
fe718590-d923-11e9-8508-0242c0a8c002:1-7
1 row in set (0.00 sec)
1.4. 設定2個主節點的主從關系
## 1、在主節點配置主從複制賬号(2個主節點都執行一遍)
create user 'bpm'@'%' identified by '123456';
grant replication slave on *.* to bpm;
## 2、設定主從關系
### 2.1 192.168.190.195 節點設定 需要同步的節點(主庫節點)
change master to
master_host='192.168.190.183',
master_user='bpm',
master_password='123456';
### 2.2 192.168.190.183 節點設定 需要同步的節點(主庫節點)
change master to
master_host='192.168.190.195',
master_user='bpm',
master_password='123456';
1.5 開啟主從複制
- 192.168.190.195 節點(Slave_IO_Running 、Slave_SQL_Running 都必須為Yes)
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.190.183
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: 7b7d4c2fe2d3-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
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:
- 192.168.190.183 節點(Slave_IO_Running 、Slave_SQL_Running 都必須為Yes)
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.190.165
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: 117fd52ec5fe-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
三、從節點配置
這裡主要是對 192.168.141.57 (是192.168.141.54的從節點) 、192.168.141.58 (是192.168.141.55的從節點)
做統一的配置
2.1 編寫docker-compose.yml 檔案
version: '3.1'
services:
mysql:
restart: always
image: mysql:5.7
container_name: mysql
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- ./data:/var/lib/mysql
- ./conf:/etc/mysql/mysql.conf.d
2.2 編寫MySQL配置檔案mysqld.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
symbolic-links=0
server-id=184
enforce_gtid_consistency = ON
gtid_mode = ON
2.3 啟動MySQL
- 啟動mysql: cd /usr/local/docker/mysql/ && docker-compose up -d
- 進入容器:docker exec -it mysql /bin/bash
- 登入容器中: mysql server : mysql -uroot -p123456
2.4 開啟主從配置
從節點1
開啟從節點 192.168.190.184 複制 主節點192.168.190.183
change master to
master_host='192.168.190.183',
master_user='bpm',
master_password='123456';
start slave
檢視從節點資訊
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.190.183
Master_User: bpm
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 3060753
Relay_Log_File: 53afe365d437-relay-bin.000004
Relay_Log_Pos: 3060966
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
..... 省略
從節點2
開啟從節點 192.168.190.185 複制 主節點192.168.190.165
change master to
master_host='192.168.190.165',
master_user='bpm',
master_password='123456';
start slave
檢視從節點資訊
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.190.165
Master_User: bpm
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 495
Relay_Log_File: e7bbc17474b2-relay-bin.000008
Relay_Log_Pos: 708
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
。。。。。省略
ster_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 495
Relay_Log_File: e7bbc17474b2-relay-bin.000008
Relay_Log_Pos: 708
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
。。。。。省略