Mysql主從複製(三)主主複製配置

1、環境

  • 系統:Ubuntu 16.04 server
  • Mysql:8.0.17
  • 主master (server-1):192.168.50.5
  • 主master (server-2):192.168.50.6
  • 特點:兩個庫可寫可讀,一個庫修改會寫入另一個庫

2、主主複製原理

主主複製是將兩個主從複製有機合併起來就好了。

3、準備工作

啓動服務器和mysql,使用ps -ef|grep mysql檢查mysql是否啓動

在這裏插入圖片描述
在這裏插入圖片描述

防火牆配置主服務器只允許特定 IP 訪問數據庫的端口,避免不必要的攻擊
主庫1防火牆配置(登錄主庫服務器192.168.50.5)
# iptables -A INPUT -p tcp -s slave_ip --dport 3306 -j ACCEPT
# 檢查當前ip列表
sudo iptables -L -n
# 刪除可能已經存在的配置,避免出現多條重複記錄
# sudo iptables -D INPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT
# 增加配置,只允許特定地址訪問數據庫端口
sudo iptables -I INPUT -p tcp --dport 3306 -j DROP #關閉所有3306端口外部訪問
sudo iptables -I INPUT -s 192.168.50.0/24 -p tcp --dport 3306 -j ACCEPT #允許IP段訪問3306
sudo iptables -I INPUT -s 192.168.1.102 -p tcp --dport 3306 -j ACCEPT #允許主機訪問3306
sudo iptables -A OUTPUT -p tcp -d 192.168.50.6 --dport 3306 -j ACCEPT
sudo iptables -L -n
# 保存配置
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
# 配置被保存到/etc/iptables/rules.v4 /etc/iptables/rules.v6這兩個文件下面,
# 最好確認一下實際保存的內容,尤其是安裝了denyhosts等其他安全軟件的情況下,
# 可能會記錄了多餘的規則,需要手工刪除
主庫2防火牆配置(登錄從庫服務器192.168.50.6)
# iptables -A OUTPUT -p tcp -d master_ip --dport 3306 -j ACCEPT
# 刪除可能已經存在的配置,避免出現多條重複記錄
# sudo iptables -D OUTPUT -p tcp -d 192.168.50.5 --dport 3306 -j ACCEPT
# 增加配置
sudo iptables -I INPUT -p tcp --dport 3306 -j DROP #關閉所有3306端口外部訪問
sudo iptables -I INPUT -s 192.168.50.0/24 -p tcp --dport 3306 -j ACCEPT #允許IP段訪問3306
sudo iptables -I INPUT -s 192.168.1.102 -p tcp --dport 3306 -j ACCEPT #允許主機訪問3306
sudo iptables -A OUTPUT -p tcp -d 192.168.50.5 --dport 3306 -j ACCEPT
sudo iptables -L -n
#保存配置
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
#配置被保存到/etc/iptables/rules.v4 /etc/iptables/rules.v6這兩個文件下面,
#最好確認一下實際保存的內容,尤其是安裝了denyhosts等其他安全軟件的情況下,
#可能會記錄了多餘的規則,需要手工刪除
檢查主從是否可以相互ping通

在這裏插入圖片描述
在這裏插入圖片描述

4、主數據庫master-1配置(192.168.50.5)

修改mysql配置增加以下配置,命令sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server-id=5                   #服務器唯一標識(可以使用IP地址最後一位)
bind-address = 0.0.0.0        #默認是127.0.0.1,此處我們設置爲任意地址,放開遠程訪問,這麼操作之前一定要確保防火牆配置正確,否則會產生安全風險
log-bin=/var/log/mysql/mysql-bin.log #開啓binlog二進制日誌
log_bin_index=/var/log/mysql/master-bin.index #日誌索引
expire_logs_days=10           #日誌的緩存時間
max_binlog_size=200M          #日誌的最大大小
binlog_do_db=mybatis          #同步的數據庫名稱
binlog_ignore_db=mysql        #忽略同步的數據庫
replicate-do-db=mybatis       #要同步的數據庫,默認所有庫
replicate_ignore_db=mysql 	  #忽略同步的數據庫 
auto_increment_increment=2    #步進值auto_imcrement。一般有n臺主MySQL就填n,防止插入主鍵衝突
auto_increment_offset=1       #起始值。一般填第n臺主MySQL。此時爲第一臺主MySQL
重啓mysql在/var/log/mysql/下會生成2個文件,重啓命令service mysql restart

在這裏插入圖片描述

創建用於同步的用戶賬號,比如用戶名repl,密碼repl
# 登錄mysql主庫
mysql -uroot -p
# 創建用戶
$ CREATE USER 'repl'@'192.168.50.6' IDENTIFIED WITH mysql_native_password BY 'repl';
# 分配權限
$ GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.50.6';
# 刷新權限
$ flush privileges;

在這裏插入圖片描述

查看master-1狀態,記錄二進制文件名(mysql-bin.000001)和位置(1168),後面有用
# 登錄mysql主庫
mysql -uroot -p
# 查看主庫狀態
SHOW MASTER STATUS;

在這裏插入圖片描述

創建mybatis數據庫和emploee表,用於測試
create database mybatis;
use mybatis;
CREATE TABLE `employee` (
  `id` bigint(20) NOT NULL auto_increment COMMENT '編號',
  `first_name` varchar(32) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '姓',
  `last_name` varchar(32) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '名',
  `age` int COMMENT '年齡',
  `mobile_phone` varchar(20) COLLATE utf8_bin DEFAULT '' COMMENT '聯繫電話',
  `email` varchar(30) COLLATE utf8_bin DEFAULT '' COMMENT '郵箱',
  `birthday` DATE COMMENT '生日',
  `create_date` DATETIME COMMENT '創建日期',
  `update_date` DATETIME COMMENT '更新日期',
  primary key(id)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='員工信息表';

5、主數據庫master-2配置(192.168.50.6)

修改mysql配置增加以下配置,命令sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server-id=6                  #服務器唯一標識(可以使用IP地址最後一位)
bind-address = 0.0.0.0       #默認是127.0.0.1,此處我們設置爲任意地址,放開遠程訪問,這麼操作之前一定要確保防火牆配置正確,否則會產生安全風險
log-bin=/var/log/mysql/mysql-bin.log #開啓binlog二進制日誌
log_bin_index=/var/log/mysql/master-bin.index #日誌索引
expire_logs_days=10           #日誌的緩存時間
max_binlog_size=200M          #日誌的最大大小
binlog_do_db=mybatis          #同步的數據庫名稱
binlog_ignore_db=mysql        #忽略同步的數據庫
replicate-do-db=mybatis       #要同步的數據庫,默認所有庫
replicate_ignore_db=mysql 	  #忽略同步的數據庫 
auto_increment_increment=2    #步進值auto_imcrement。一般有n臺主MySQL就填n,防止插入主鍵衝突
auto_increment_offset=2       #起始值。一般填第n臺主MySQL。此時爲第一臺主MySQL
重啓mysql在/var/log/mysql/下會生成2個文件,重啓命令service mysql restart

在這裏插入圖片描述

創建用於同步的用戶賬號,比如用戶名repl,密碼repl
# 登錄mysql主庫
mysql -uroot -p
# 創建用戶
$ CREATE USER 'repl'@'192.168.50.5' IDENTIFIED WITH mysql_native_password BY 'repl';
# 分配權限
$ GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.50.5';
# 刷新權限
$ flush privileges;

在這裏插入圖片描述

查看master-2狀態,記錄二進制文件名(mysql-bin.000001)和位置(883),後面有用
# 登錄mysql主庫
mysql -uroot -p
# 查看主庫狀態
SHOW MASTER STATUS;

在這裏插入圖片描述

創建mybatis數據庫和emploee表,用於測試
create database mybatis;
use mybatis;
CREATE TABLE `employee` (
  `id` bigint(20) NOT NULL auto_increment COMMENT '編號',
  `first_name` varchar(32) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '姓',
  `last_name` varchar(32) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '名',
  `age` int COMMENT '年齡',
  `mobile_phone` varchar(20) COLLATE utf8_bin DEFAULT '' COMMENT '聯繫電話',
  `email` varchar(30) COLLATE utf8_bin DEFAULT '' COMMENT '郵箱',
  `birthday` DATE COMMENT '生日',
  `create_date` DATETIME COMMENT '創建日期',
  `update_date` DATETIME COMMENT '更新日期',
  primary key(id)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='員工信息表';

6、構建主主複製

登錄master-1(192.168.50.5)

# 登錄mysql主庫master-1
mysql -uroot -p
# 執行同步SQL語句,複製master-2
CHANGE MASTER TO MASTER_HOST='192.168.50.6', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=1896;
# 啓動同步線程
start slave;
# 查看slave狀態
show slave status\G;

當Slave_IO_Running和Slave_SQL_Running都爲YES的時候就表示主從同步設置成功了
在這裏插入圖片描述

登錄master-2(192.168.50.6)

# 登錄mysql主庫master-2
mysql -uroot -p
# 執行同步SQL語句,複製master-1
CHANGE MASTER TO MASTER_HOST='192.168.50.5', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=1168;
# 啓動同步線程
start slave;
# 查看slave狀態
show slave status\G;

當Slave_IO_Running和Slave_SQL_Running都爲YES的時候就表示主從同步設置成功了
在這裏插入圖片描述

7、測試主主複製

登錄master-1(192.168.50.5)

# 登錄mysql主庫master-1
mysql -uroot -p
# 切換庫
use mybatis;
# 插入一條數據
INSERT INTO employee(first_name, last_name, age, mobile_phone, email, birthday, create_date, update_date) 
VALUES('主從','複製測試',26,'13533965228','[email protected]',SYSDATE(), SYSDATE(),SYSDATE());

# 查詢
select * from employee limit 10;

在這裏插入圖片描述

登錄master-2(192.168.50.6)

# 登錄mysql主庫master-2
mysql -uroot -p
# 切換庫
use mybatis;
# 查詢
select * from employee limit 10;
# master-2再插入一條
INSERT INTO employee(first_name, last_name, age, mobile_phone, email, birthday, create_date, update_date) 
VALUES('master-2','複製測試',26,'13533955228','[email protected]',SYSDATE(), SYSDATE(),SYSDATE());

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

兩個主機數據結果一樣,主主複製配置成功。

8、注意事項

  • 主主複製配置文件中auto_increment_increment和auto_increment_offset只能保證主鍵不重複,卻不能保證主鍵有序。
  • 當配置完成Slave_IO_Running、Slave_SQL_Running不全爲YES時,show slave status\G信息中有錯誤提示(也可以查看日誌,一般在/var/log/mysql/error.log),可根據錯誤提示進行更正。
  • 如果執行start slave;失敗,可以嘗試停止stop slave;或重置reset slave
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章