Mysql主從複製(二)一主一從配置

1、環境

  • 系統:Ubuntu 16.04 server
  • Mysql:8.0.17
  • 主master (server-1):192.168.50.5
  • 從slave (server-2):192.168.50.6
  • 特點:主庫可寫(會寫入從庫)可讀,從庫只能讀

2、準備工作

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

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

防火牆配置主服務器只允許特定 IP 訪問數據庫的端口,避免不必要的攻擊
# 查看防火牆狀態
ufw status

# 關閉防火牆
ufw disable

# 開啓防火牆
ufw enable
主庫防火牆配置(登錄主庫服務器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 -D INPUT -p tcp --dport 3306 -j DROP
# sudo iptables -D INPUT -p udp --dport 3306 -j DROP 
# sudo iptables -D INPUT -p sctp --dport 3306 -j DROP
# 增加配置,只允許特定地址訪問數據庫端口
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 -L -n
# 保存配置
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
# 配置被保存到/etc/iptables/rules.v4 /etc/iptables/rules.v6這兩個文件下面,
# 最好確認一下實際保存的內容,尤其是安裝了denyhosts等其他安全軟件的情況下,
# 可能會記錄了多餘的規則,需要手工刪除
從庫防火牆配置(登錄從庫服務器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 -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通

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

3、主數據庫master配置(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        #忽略同步的數據庫
重啓mysql,service mysql restart
創建用於同步的用戶賬號,比如用戶名repl,密碼repl
# 創建用戶
mysql -uroot -p -e "CREATE USER 'repl'@'192.168.50.%' IDENTIFIED BY 'repl';"
# 分配權限
mysql -uroot -p -e "GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.50.%';"
# 刷新權限
mysql -uroot -p -e "flush privileges;"
查看master狀態,記錄二進制文件名(mysql-bin.000001)和位置(155),後面有用
mysql -uroot -p -e "SHOW MASTER STATUS;"

在這裏插入圖片描述

創建mybatis數據庫和emploee表,用於測試
create database mybatis;
use mybatis;
CREATE TABLE `employee` (
  `id` bigint(20) NOT NULL 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 '更新日期'
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='員工信息表';

4、從數據庫slave配置(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,此處我們設置爲任意地址,放開遠程訪問,這麼操作之前一定要確保防火牆配置正確,否則會產生安全風險
replicate-do-db=mybatis      #同步的數據庫
replicate_ignore_db=mysql 	 #忽略同步的數據庫 
relay-log=/var/log/mysql/slave-relay-bin    #同步日誌
relay-log-index=/var/log/mysql/slave-relay-bin.index #同步日誌索引
expire_logs_days=10          #日誌的緩存時間
max_binlog_size=200M         #日誌的最大大小
重啓mysql,service mysql restart
執行同步SQL語句

需要主服務器主機名,登陸憑據,二進制文件的名稱和位置,master_host對應主服務器的IP地址,master_port對應主服務器的端口,master_log_file對應show master status顯示的File列:mysql-bin.000001,master_log_pos對應Position列:155,否則有可能出現同步失敗

mysql -uroot -p -e "CHANGE MASTER TO MASTER_HOST='192.168.50.5', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=155;"
啓動slave同步進程
mysql -uroot -p -e "start slave;"
查看slave狀態
mysql -uroot -p -e "show slave status\G;"

在這裏插入圖片描述
當Slave_IO_Running和Slave_SQL_Running都爲YES的時候就表示主從同步設置成功了,如果Slave_IO_Running爲connecting時可能是用來登錄Slave從服務器,連接Master主服務器裏面的密碼或者用戶名輸入錯誤(查看slave的日誌找原因一般在/var/log/mysql/error.log),如果是mysql8則會是密碼加密錯誤,如下圖
在這裏插入圖片描述
原因:mysql 8的密碼插件爲caching_sha2_password,客戶端不支持
解決辦法:修改密碼加密插件爲mysql_native_password,登錄主庫修改repl用戶的密碼使用mysql_native_password加密

mysql -uroot -p -e "ALTER USER 'repl'@'192.168.50.6' IDENTIFIED WITH mysql_native_password BY 'repl';"
mysql -uroot -p -e "flush privileges;"

再重啓一下從庫slave,再查看狀態,可以看到Slave_IO_Running和Slave_SQL_Running都爲YES了
在這裏插入圖片描述

5、測試

查看從庫是否自動創建了數據庫和表

登錄主庫往employee表插入一條數據

-- 插入
INSERT INTO employee VALUES(1, '主從','複製測試',26,'13533965228','[email protected]',SYSDATE(), SYSDATE(),SYSDATE());

-- 查詢
select * from employee limit 10;

在這裏插入圖片描述
登錄從庫執行查詢,從庫有記錄,證明主從複製生效
在這裏插入圖片描述

6、注意事項

由於主從複製是基於I/O的日誌,所以會存在一定延時,如果對數據一致性要求非常高的話,簡單的主從複製在實際環境中會存在問題。
開啓了主從複製,slave庫如果寫入數據的話,可能導致數據回滾從而主從複製線程中斷,可以通過以下方式解決
mysql> stop slave;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave;

停止slave的複製命令

mysql>stop slave;

重置slave

reset slave;

取消slave

# 在從服務器上執行
reset slave all;

# 在主服務器上執行
RESET MASTER;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章