網站首頁 編程語言 正文
MGR概念
MGR(MySQL Group Replication),是MySQL在2016年12月推出的一個全新的高可用與高擴展的解決方案
為何選用MGR
MySQL推出MGR之前,傳統復制模式分為兩種,
- 異步復制;
- 半同步復制
異步復制:
- master執行事務,寫入binlog日志,然后提交。
- slave接收binlog日志事務并將事務先寫入relay日志,然后重做事務。當master宕機時有可能會造成數據不一致情況。
半同步復制:
- master執行事務,寫入二進制日志,將binlog事務日志傳送到slave,slave接收到binlog事務日志后,將其寫到relay log,然后向master返回傳送成功ACK;
- master收到ACK后,再在存儲引擎中提交事務。(兩種提交方式,由參數rpl_semi_sync_master_wait_point決定)
總結以上要點,存在的弊端如下:
- 寫操作集中在MASTER服務器上;
- 可能產生數據不一致的問題;
- MASTER宕機后,需要人為選擇新主并重新給其他的slave端執行change master。
MGR提供的功能
- 同步復制;
- 單主模式、多主模式;
- 自動切換;
- 彈性擴展
MGR限制
- 僅支持innodb引擎;
- 所有新增表必須顯式創建主鍵;
- 建議隔離級別為READ COMMITED,多主模式下,不支持SERIALIZABLE;
- 多主模式下,不建議使用外鍵;
- 需開啟bin_log_format=row、log_slave_updates=ON;
- 需開啟GTID;
- 需安裝引擎group_replication.so;
- MGR最多支持9個節點
MGR原理
單主模式
單主模式下,只有一個節點可以讀寫,其他節點提供只讀服務。單主模式下,當主節點宕掉,其他節點自動會根據服務器的server_uuid變量和group_replication_member_weight變量值,選擇下一個slave作為主節點,group_replication_member_weight的值最高的成員被選為新的主節點,該參數默認為50,可以在節點上設置不同值;在group_replication_member_weight值相同的情況下,group根據數據字典中server_uuid排序,排序在最前的被選擇為主節點。
多主模式
多主模式下,在組復制中通過Group Replication Protocol協議及Paxos協議,形成的整體高可用解決方案,同時增加了certify的概念,負責檢查事務是否允許提交,是否與其它事務存在沖突,Group Replication是由多個節點共同組成一個數據庫集群,每個節點都可以單獨執行事務,但是read-write(RW)的操作只有在組內驗證后才可以commit,Read-only (RO)事務是不需要驗證可以立即執行,當一個事務在一個節點上提交之前,會在組內自動進行原子性的廣播,告知其他節點變更了什么內容/執行了什么事務,然后為該事物建立一個全局的排序,最終,這意味著所有的服務器都以相同的順序接收相同的事務集。因此,所有服務器都按照相同的順序應用相同的變更集,因此它們在組中保持一致。 在多主模式下,該組的所有成員都設置為讀寫模式,在多主模式下,不支持SERIALIZABLE事務隔離級別,且不能完全支持級聯外鍵約束。
環境準備
1、基于centos7系統的虛擬機(或云服務器),內存建議4G以上;
2、提前安裝好docker環境,并啟動;
docker搭建MRG步驟
1、拉取mysql8鏡像
docker pull mysql:8.0.20
2、創建docker專用網絡
這里是為了后面固定各個容器的IP地址,避免IP地址發生變動帶來的其他問題
docker network create --subnet=172.72.0.0/24 mysql-network
3、創建存儲數據相關目錄
mkdir -p /usr/local/mysql/lhrmgr15/conf.d
mkdir -p /usr/local/mysql/lhrmgr15/data
mkdir -p /usr/local/mysql/lhrmgr16/conf.d
mkdir -p /usr/local/mysql/lhrmgr16/data
mkdir -p /usr/local/mysql/lhrmgr17/conf.d
mkdir -p /usr/local/mysql/lhrmgr17/data
4、啟動3個mysql容器
依次執行下面的docker命令即可,目錄名稱和容器的名稱可以結合自身的情況更改
第一個容器:
docker run -d --name mysql8020mgr33065 \
-h lhrmgr15 -p 33065:3306 --net=mysql-network --ip 172.72.0.15 \
-v /usr/local/mysql/lhrmgr15/conf.d:/etc/mysql/conf.d -v /usr/local/mysql/lhrmgr15/data:/var/lib/mysql/ \
-e MYSQL_ROOT_PASSWORD=lhr \
-e TZ=Asia/Shanghai \
mysql:8.0.20
第二個容器:
docker run -d --name mysql8020mgr33066 \
-h lhrmgr16 -p 33066:3306 --net=mysql-network --ip 172.72.0.16 \
-v /usr/local/mysql/lhrmgr16/conf.d:/etc/mysql/conf.d -v /usr/local/mysql/lhrmgr16/data:/var/lib/mysql/ \
-e MYSQL_ROOT_PASSWORD=lhr \
-e TZ=Asia/Shanghai \
mysql:8.0.20
第三個容器:
docker run -d --name mysql8020mgr33067 \
-h lhrmgr17 -p 33067:3306 --net=mysql-network --ip 172.72.0.17 \
-v /usr/local/mysql/lhrmgr17/conf.d:/etc/mysql/conf.d -v /usr/local/mysql/lhrmgr17/data:/var/lib/mysql/ \
-e MYSQL_ROOT_PASSWORD=lhr \
-e TZ=Asia/Shanghai \
mysql:8.0.20
4、查看已啟動的容器
docker ps
5、修改配置參數
還記得使用docker搭建mysql的過程嗎?當我們需要在docker容器開啟binlog日志的時候,是怎么做的呢?沒錯,需要一個my.cnf文件,接下來,分別在上面的conf.d目錄下,創建my.cnf文件,依次拷貝下面的內容到各自目錄的my.cnf文件中;
第一個my.cnf
[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=''
server-id = 802033065
default-time-zone = '+8:00'
log_timestamps = SYSTEM
log-bin =
binlog_format=row
binlog_checksum=NONE
log-slave-updates=1
skip-name-resolve
auto-increment-increment=2
auto-increment-offset=1
gtid-mode=ON
enforce-gtid-consistency=on
default_authentication_plugin=mysql_native_password
max_allowed_packet = 500M
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log=lhrmgr15-relay-bin-ip15
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address= "172.72.0.15:33061"
loose-group_replication_group_seeds= "172.72.0.15:33061,172.72.0.16:33062,172.72.0.17:33063"
loose-group_replication_bootstrap_group=OFF
loose-group_replication_ip_whitelist="172.72.0.15,172.72.0.16,172.72.0.17"
report_host=172.72.0.15
report_port=3306
第二個my.cnf
[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=''
server-id = 802033066
default-time-zone = '+8:00'
log_timestamps = SYSTEM
log-bin =
binlog_format=row
binlog_checksum=NONE
log-slave-updates=1
gtid-mode=ON
enforce-gtid-consistency=ON
skip_name_resolve
default_authentication_plugin=mysql_native_password
max_allowed_packet = 500M
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log=lhrmgr16-relay-bin-ip16
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address= "172.72.0.16:33062"
loose-group_replication_group_seeds= "172.72.0.15:33061,172.72.0.16:33062,172.72.0.17:33063"
loose-group_replication_bootstrap_group=OFF
loose-group_replication_ip_whitelist="172.72.0.15,172.72.0.16,172.72.0.17"
report_host=172.72.0.16
report_port=3306
第三個my.cnf
[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=''
server-id = 802033067
default-time-zone = '+8:00'
log_timestamps = SYSTEM
log-bin =
binlog_format=row
binlog_checksum=NONE
log-slave-updates=1
gtid-mode=ON
enforce-gtid-consistency=ON
skip_name_resolve
default_authentication_plugin=mysql_native_password
max_allowed_packet = 500M
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log=lhrmgr16-relay-bin-ip16
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address= "172.72.0.17:33063"
loose-group_replication_group_seeds= "172.72.0.15:33061,172.72.0.16:33062,172.72.0.17:33063"
loose-group_replication_bootstrap_group=OFF
loose-group_replication_ip_whitelist="172.72.0.15,172.72.0.16,172.72.0.17"
report_host=172.72.0.17
report_port=3306
6、重啟3個容器
docker restart mysql8020mgr33065 mysql8020mgr33066 mysql8020mgr33067
7、分別登錄到各個docker容器,查看下容器的信息
docker exec -it mysql8020mgr33065 /bin/bash
mysql -uroot -plhr
select @@hostname,@@server_id,@@server_uuid
docker exec -it mysql8020mgr33066 /bin/bash
mysql -uroot -plhr
select @@hostname,@@server_id,@@server_uuid
docker exec -it mysql8020mgr33067 /bin/bash
mysql -uroot -plhr
select @@hostname,@@server_id,@@server_uuid
以第一個容器為例,查詢的信息如下:
以上的準備工作就基本完成了
安裝MGR插件(3個容器內均執行)
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
查看當前容器節點已經安裝的插件,說明安裝完成了
show plugins;
設置數據復制賬號(3個容器內均執行)
通過開篇的原理講解知道,單主模式下,各個節點的數據是強一致的,因此數據寫入到某個節點的時候,必然存在不同節點之間數據的拷貝,因此需要創建一個用戶復制的賬號,在3個容器里面依次執行下面的命令
SET SQL_LOG_BIN=0;
CREATE USER repl@'%' IDENTIFIED BY 'lhr';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='lhr' FOR CHANNEL 'group_replication_recovery';
開啟MGR單主模式
1、啟動MGR,在主庫(172.72.0.15)上執行
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
-- 查看MGR組信息
SELECT * FROM performance_schema.replication_group_members;
2、其他兩個節點加入MGR
在從庫(172.72.0.16,172.72.0.17)上執行,執行完畢,可以查看MGR組信息,反映出各個節點的狀態
START GROUP_REPLICATION;
-- 查看MGR組信息
SELECT * FROM performance_schema.replication_group_members;
可以看到,3個節點狀態為online,且主節點為172.72.0.15,只有主節點可以進行數據寫入,其他節點為只讀,到這里MGR單主模式搭建成功;
原文鏈接:https://blog.csdn.net/zhangcongyi420/article/details/124574977
相關推薦
- 2022-08-03 MongoDB數據庫條件查詢技巧總結_MongoDB
- 2022-05-25 Jenkins 簡單的從git上構建一個maven項目
- 2023-04-24 Python?相對路徑報錯:"No?such?file?or?directory"'原因及解決方法_
- 2022-09-10 親自教你在netty中使用TCP協議請求DNS服務器的詳細過程_服務器其它
- 2022-06-30 詳解Go語言中泛型的實現原理與使用_Golang
- 2022-12-24 C#如何優雅的對WinForm窗體應用程序進行權限控制_C#教程
- 2022-02-25 C++實現單例模式的方法_C 語言
- 2022-08-03 C#記一次http協議multipart/form-data的boundary問題_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支