前言
本文對mysql的傳統(tǒng)主從復制,半同步復制和組復制進行介紹。
一、傳統(tǒng)的主從復制:
1 原理:
Master 數據庫只要發(fā)生變化,立馬記錄到Binlog 日志文件中,Slave數據庫啟動一個I/0 thread連接Master數據庫,請求Master變化的二進制日志。Save I/0獲取到的二進制日志,保存到自己的Relay log 日志文件中。Slave 有一個 SQL thread定時檢查Realy log是否變化,變化那么就更新數據;
2 缺點:
主從復制在正常情況下是可以保證數據一致性的,即從節(jié)點的數據和主節(jié)點的數據是完全一致的。主從復制的機制是主節(jié)點將寫入的數據記錄成二進制日志(binlog),然后從節(jié)點通過讀取和解析主節(jié)點的binlog來進行數據復制。
主從數據不一致可能在以下情況下出現:
- 網絡問題:如果主節(jié)點和從節(jié)點之間的網絡連接發(fā)生故障或不穩(wěn)定,可能會導致binlog傳輸中斷,進而導致數據不一致。
- 主節(jié)點故障:如果主節(jié)點發(fā)生故障,而在發(fā)生故障的瞬間還有未被同步到從節(jié)點的binlog,那么在故障恢復后,從節(jié)點可能會缺失這部分數據。
- 誤操作或數據庫錯誤:如意外執(zhí)行了誤刪除/更新操作,或數據庫出現了錯誤,從節(jié)點按照主節(jié)點的操作紀錄執(zhí)行了相同的操作,導致數據不一致。
雖然主從復制可以保證數據一致性,但在某些極端情況下,如主節(jié)點和從節(jié)點同時出現故障,則可能無法避免數據不一致。因此,對于一些對數據一致性要求非常高的場景,可以考慮使用更可靠的復制方案,如半同步復制或組復制。
二、半同步復制(Semi-Synchronous Replication):
- 半同步復制是主從復制的一種擴展,它確保至少一個從節(jié)點確認已成功接收和寫入主節(jié)點的二進制日志數據。
- 當主節(jié)點接收到一個事務時,它將等待至少一個從節(jié)點(半同步節(jié)點)確認已寫入該事務后才會繼續(xù)進行下一個事務。
- 半同步復制提供了更高的數據一致性和可靠性,但也增加了延遲和性能開銷。
三、組復制:
主從復制只是做了數據的容災備份,但是沒有做到高可用,怎么實現在一個節(jié)點掛掉后,不影響整體的業(yè)務:
1 原理:
組復制是MySQL InnoDB Cluster中使用的一種多主復制技術,它基于Paxos協(xié)議實現了分布式和多主寫入的能力。下面是組復制的基本原理:
-
組成員(Group Members):組復制由多個MySQL實例組成,這些實例彼此協(xié)作并形成一個復制組(replication group)。每個實例都是組成員,可以是主節(jié)點或從節(jié)點。
-
角色與狀態(tài):在組復制中,每個成員可以有三種角色:原始(Primary)、次要(Secondary)和離線(Offline)。原始成員負責處理寫操作,其他次要成員則復制原始成員的數據。離線成員指的是暫時不參與復制的成員。
-
消息通信:組成員之間通過組復制通信層進行消息傳遞和協(xié)調。它提供了成員加入、狀態(tài)變更、數據同步等功能。在組通信期間,成員之間通過消息傳遞來達成一致性。
-
選舉與協(xié)商:組成員使用Paxos協(xié)議來選舉原始成員和進行決策。選舉過程中會協(xié)商并選擇一個成員作為原始成員,該成員負責處理寫操作并將更改廣播到其他成員。
-
數據一致性:每個成員都維護著自己的事務日志,并通過組復制通信層將已提交的事務廣播給其他成員。在事務提交后,組通信確保所有成員的數據是一致的。
-
自動故障轉移:如果原始成員出現故障,組復制會自動選舉新的原始成員來接替。選舉過程中會基于Paxos協(xié)議確保一致的數據狀態(tài),從而實現自動的故障轉移。
通過上述機制,組復制允許多個節(jié)點同時進行寫操作,并保證數據的一致性和可靠性。它提供了高可用性、自動故障轉移以及簡化的管理和擴展能力,適用于分布式環(huán)境和多主寫入場景。
2 實現:
基于組復制搭建一個高可用的mysql 集群
2.1 myql 實例安裝:
-
環(huán)境準備:3 臺虛擬機:
192.168.75.128
192.168.75.129
192.168.75.130 -
docker 在每個虛擬機上安裝一個mysql實例:
docker run -itd --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
- 在每個虛擬機上創(chuàng)建mysql 的目錄文件:
# 創(chuàng)建mysql 目錄
mkdir /root/mysql
# 創(chuàng)建mysql data 目錄
mkdir /root/mysql/data
- 在每個虛擬機上復制容器的my.cnf 配置文件
docker cp mysql:/etc/my.conf /root/mysql
2.1 myql 實例安裝:
- 每個虛擬機都按照mysql實例:
docker run -itd --name mysql-3806 \
--net=host \
--privileged=true \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /root/mysql3806/data:/var/lib/mysql/ \
-v /root/mysql3806/my.cnf:/etc/my.cnf mysql
--net=host 設置mysql 的docker 容器和虛擬機共享網絡
- my.cnf 增加配置:
# 服務實例id,注意每個實例需要保持唯一 ,注意修改
# 192.168.75.129 的server_id=2222
# 192.168.75.130 的server_id=3333
server_id=1111
# 開啟事務的強一致性
gtid_mode=ON
enforce_gtid_consistency=ON
# 存儲方式為table
master_info_repository=TABLE
# 使用舊版密碼的通訊方式
default_authentication_plugin=mysql_native_password
# 同步配置
# binlog的日志格式
binlog_format=ROW
# 不使用binlog校驗和
binlog_checksum=NONE
# 開啟binlog 并且以binlog 前置文件命名
log_bin=binlog
# 作為從庫同步事務后,記錄至數據表
relay_log_info_repository=TABLE
# 從服務記錄事件其他從服務器可以繼續(xù)復制從服務器的二進制日志
log-slave-updates=on
# 組復制配置
# 加載組復制插件
plugin_load_add="group_replication.so"
# UUID,分組的節(jié)點需配置一致
loose-group_replication_group_name="89c88c78-c46e-11ec-a8aa-0800271ee0d3"
# 啟動MySQL時不自動開啟組復制
loose-group_replication_start_on_boot=OFF
# 關閉此MySQL實例的組引導
loose-group_replication_bootstrap_group=OFF
# 關閉單主模式,即使用多主模式
# loose-group_replication_single_primary_mode=OFF
# 在多主模式下,建議開啟此選項,嚴格檢查一致性
# loose-group_replication_enforce_update_everywhere_checks=ON
# 組復制節(jié)點通信禁用SSL
loose-group_replication_ssl_mode=DISABLED
# 當前MySQL實例的組復制通信地址: 33061 為mysql 默認的組內通信端口
# 每個虛擬機的配置自己的mysql 實例ip 地址
loose-group_replication_local_address="192.168.75.128:33061"
# 組復制的節(jié)點通信地址
loose-group_replication_group_seeds="192.168.75.128:33061,192.168.75.129:33061,192.168.75.130:33061"
# 通信白名單配置此處配置192.168.75 段的ip 可以進行通信
loose-group_replication_ip_whitelist="192.168.75.0/24,127.0.0.1"
# 綁定本機ip 地址: 注意每個mysql 實例配置自己的ip
bind-address=192.168.75.128
# 向組內通信 報備的 通信ip 地址 注意每個mysql 實例配置自己的ip
report_host=192.168.75.128
# mysql 的服務端口
port=3806
配置完成記得重啟mysql 實例
2.2 防火墻端口放行:
# 需要開放的端口
firewall-cmd --permanent --zone=public --add-port={3806,33061}/tcp
# 防火墻重新加載
firewall-cmd --reload
# 查看開放的端口
firewall-cmd --zone=public --list-ports
2.3 開啟組復制:
- 每個mysql 實例創(chuàng)建組復制用戶:
set sql_log_bin=0;
create user repl@'%' identified by '666666';
grant replication slave on *.* to repl@'%';
set sql_log_bin=1;
flush privileges;
- 使用賬戶密碼登錄其他MySQL節(jié)點
change master to master_user='repl', master_password='666666' for channel 'group_replication_recovery';
- 組復制:
在 192.168.75.128 mysql 實例中引導組復制
set global group_replication_bootstrap_group=on;
start group_replication;
set global group_replication_bootstrap_group=off;
在 192.168.75.129 和 192.168.75.130 mysql 實例中開啟組復制
start group_replication;
如果啟動失敗,先重置一次,再啟動
reset master;
start group_replication;
- 查看組復制集群情況:
select * from performance_schema.replication_group_members;
2.4 查看主節(jié)點:
- 方式1 :
-- 獲取主機主節(jié)點的id
SHOW STATUS LIKE 'group_replication_primary_member';
-- 對比查看每個mysql 實例的uid
sELECT @@server_uuid;
- 方式2:
show variables like '%read_only%';
主服務器:
從服務器:
2.5 節(jié)點選舉:
當主節(jié)點掛掉之后使用Paxos協(xié)議 從slave 節(jié)點得到新的 master,當修復好后可以重新加入組復制,啟動mysql 實例后:
change master to master_user='repl', master_password='666666' for channel 'group_replication_recovery';
start group_replication;
2.6組復制搭建過程遇到的問題:
- mysql 組復制提示 There is no local IP address matching the one configured for the local node:
msyql docker 實例組內通信的ip 地址問題,涉及到的參數:
loose-group_replication_local_address="192.168.75.128:33061"
loose-group_replication_group_seeds="192.168.75.128:33061,192.168.75.129:33061,192.168.75.130:33061"
問題原因:msyql docker 實例內部不認識 192.168.75.128 ip 所以無法通信,需要在安裝mysql 實例的時候增加 --net=host 參數,是mysql docker 實例與虛擬機共享網絡空間;
- ip/端口 Can’t start server: Bind on TCP/IP port: Cannot assign requested address:
檢查防火墻是否開放 mysql 實例的端口和33061 端口;
- Hostname 192.168.75.12 in Allowlist configuration was not resolvable. Please check your Allowlist configuration:
ip 的白名單設置有問題,涉及參數:loose-group_replication_ip_whitelist ,檢查ip 是否在白名單中;
-
通信的MEMBER_HOST 問題: There was an error when connecting to the donor server. Please check that group_replication_recovery channel credentials and all MEMBER_HOST column values of performance_schema.replication_group_members table are correct and DNS resolvable;
涉及參數:report_host=192.168.75.128 ,配置正確的ip 地址;
總結
本文對mysql 的傳統(tǒng)主從異步復制,半同步復制,組內復制進行了對比,已經通過3臺虛擬機搭建了組內復制架構。文章來源:http://www.zghlxwxcb.cn/news/detail-725909.html
參考:
1 部署高可用、負載均衡的MySQL集群服務;
添加鏈接描述
2 MGR集群搭建及配置過程;文章來源地址http://www.zghlxwxcb.cn/news/detail-725909.html
到了這里,關于Mysql架構篇--Mysql 主從同步方案的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!