title: MySQL:3.MySQL Group Replication(MGR)集群
categories: 數(shù)據(jù)庫
tags:
- MySQL
timezone: Asia/Shanghai
date: 2019-03-10
簡介
集群自身不提供VIP機(jī)制,也沒有像MongoDB副本集那樣提供JAVA/PHP客戶端API接口實現(xiàn)故障切換(需要開發(fā)自己寫,成本較高),需要結(jié)合第三方HaProxy軟件(建議2塊網(wǎng)卡做bond0)+自定義腳本實現(xiàn)秒級故障切換,另通過代理方式,性能會降低,因為多了一層網(wǎng)絡(luò)轉(zhuǎn)發(fā)。
MySQL Group Replication有兩種模式,單主模式single-primary mode和多主模式multi-primary mode,在同一個group內(nèi),不允許兩種模式同時存在,并且若要切換到不同模式,必須修改配置后重新啟動集群
單主模式
在單主模式下,只有一個節(jié)點可以可以讀寫,其他節(jié)點只能提供讀,在單主模式下,該參數(shù) group_replication_enforce_update_everywhere_checks 必須被設(shè)置為 FALSE ,當(dāng)主節(jié)點宕掉,自動會根據(jù)服務(wù)器的server_uuid變量和group_replication_member_weight變量值,選擇下一個slave誰作為主節(jié)點,group_replication_member_weight的值最高的成員被選為新的主節(jié)點,在group_replication_member_weight值相同的情況下,group根據(jù)數(shù)據(jù)字典中 server_uuid排序,排序在最前的被選擇為主節(jié)點
多主模式
在多主模式下,在加入該群組的所有成員,所有服務(wù)器都設(shè)置為讀寫模式,在多主模式下,不支持SERIALIZABLE事務(wù)隔離級別,在多主模式下,不能完全支持級聯(lián)外鍵約束
Group Replication的特性和注意事項
- 全同步復(fù)制,事務(wù)要么在所有節(jié)點都提交,要么都回滾;
- 多主復(fù)制,可以在任意節(jié)點進(jìn)行寫操作;
- 在從服務(wù)器上并行應(yīng)用事件,真正意義上的并行復(fù)制;
- 節(jié)點自動配置–故障節(jié)點自動從集群中移除,當(dāng)故障節(jié)點再次加入集群,無需手工備份當(dāng)前數(shù)據(jù)庫并拷貝至故障節(jié)點;
- 應(yīng)用程序的兼容性:無需更改應(yīng)用程序,原生的MySQL接口;
- 生產(chǎn)環(huán)境上集群推薦配置3個節(jié)點; 每個節(jié)點都包含完整的數(shù)據(jù)副本;
- 各個節(jié)點的同步復(fù)制,通過GTID binlog ROW實現(xiàn)。
局限性:
- 目前的復(fù)制僅僅支持InnoDB存儲引擎
- 每張表必須有主鍵
- 只支持ipv4網(wǎng)絡(luò)
- 集群最大支持9個節(jié)點
- 不支持Savepoints
- 不支持SERIALIZABLE隔離級別在Multi-Primary多主模式
- 不支持外鍵在Multi-Primary多主模式
- 整個集群的寫入吞吐量是由最弱的節(jié)點限制,如果有一個節(jié)點變得緩慢,比如硬盤故障(RAID10壞了一塊盤),那么整個集群將是緩慢的。為了穩(wěn)定的高性能要求,所有的節(jié)點應(yīng)使用統(tǒng)一的硬件。
優(yōu)點:
- 真正的多主架構(gòu),任何節(jié)點都可以進(jìn)行讀寫,無需進(jìn)行讀寫分離;(注:生產(chǎn)環(huán)境建議只在一臺機(jī)器上寫,由于集群是樂觀鎖并發(fā)控制,事務(wù)沖突的情況會在commit階段發(fā)生。如果有兩個事務(wù)在集群中不同的節(jié)點上對同一行寫入并提交,失敗的節(jié)點將回滾,客戶端返回報錯,作為DBA你不想被一群開發(fā)投訴的話,還是默默的開啟Single-Primary寫入模式)
- 無集中管理,可以在任何時間點失去任何一個節(jié)點,集群將正常工作不受影響;
- 節(jié)點宕機(jī)不會導(dǎo)致數(shù)據(jù)丟失;
- 對應(yīng)用透明。
缺點:
- 加入新節(jié)點,開銷大,需要復(fù)制完整的數(shù)據(jù)。
- 不能有效的解決寫擴(kuò)展問題,磁盤空間滿了,無法自動擴(kuò)容,不能像MongoDB分片那樣自動移動chunk做balance
- 有多少個節(jié)點就有多少份重復(fù)的數(shù)據(jù)
- 由于事務(wù)提交需要跨節(jié)點通訊(分布式事務(wù)),寫入會比主從復(fù)制慢
- 對網(wǎng)絡(luò)要求非常高,如果網(wǎng)絡(luò)出現(xiàn)波動或機(jī)房被ARP攻擊,造成兩個節(jié)點失聯(lián),Group Replication集群發(fā)生腦裂,服務(wù)將不可用。
環(huán)境
[root@centos181002 ~]# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)
[root@centos181002 ~]# mysql -V
mysql Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using EditLine wrapper
MGR 必須3節(jié)點以上
centos181001 11.11.11.61
centos181002 11.11.11.62
centos181003 11.11.11.63
第零步:初始環(huán)境準(zhǔn)備(by all)
1.關(guān)閉系統(tǒng)默認(rèn)防火墻(by all)
setenforce 0
sed -i -r "/^SELINUX=/c SELINUX=disabled" /etc/selinux/config
which systemctl && systemctl stop firewalld
which systemctl && systemctl disable firewalld
which systemctl && systemctl stop iptables || service iptables stop
which systemctl && systemctl disable iptables || chkconfig iptables off
2.寫入HOSTS(by all)
echo '11.11.11.61 centos181001' >> /etc/hosts
echo '11.11.11.62 centos181002' >> /etc/hosts
echo '11.11.11.63 centos181003' >> /etc/hosts
cat /etc/hosts
第一步:安裝MySQL并設(shè)置開機(jī)自動啟動(by all)
1.安裝MySQL(by all)
cat <<EOF >/etc/yum.repos.d/mysql-community.repo
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
EOF
yum install -y mysql-community-server
2.啟動和初始化(by all)
systemctl start mysqld
systemctl status mysqld
systemctl enable mysqld
grep 'temporary password' /var/log/mysqld.log
mysql_secure_installation
第二步:配置MGR
1.編輯my.cnf(請注意有4個地方的IP需要修改)(by all)
## 編輯并增加以下內(nèi)容
cp /etc/my.cnf /etc/my.cnf.bak
vi /etc/my.cnf
##################################### 唯一標(biāo)識號,3臺服務(wù)器要求不一樣 #####################################
server_id=1
# 開啟全局事務(wù)ID
# show variables like '%gtid%';
gtid_mode=ON
# 開啟全局事務(wù)ID強(qiáng)一致性
enforce_gtid_consistency=ON
# 復(fù)制元數(shù)據(jù)存儲在系統(tǒng)表而不是文件
master_info_repository=TABLE
# 中繼日志信息寫入到表而不是文件
relay_log_info_repository=TABLE
# 禁用二進(jìn)制日志時間校驗和
binlog_checksum=NONE
# 把relay-log里的日志內(nèi)容再記錄到slave本地的binlog里
# show variables like 'log_slave_updates';
log_slave_updates=ON
# 開啟二進(jìn)制日志
log_bin=binlog
# 基于行的二進(jìn)制日志
binlog_format=ROW
# 指示服務(wù)器對于每個事務(wù),它必須收集寫集并使用XXHASH64散列算法將其編碼為 散列。
transaction_write_set_extraction=XXHASH64
##################################### 需要使用``SELECT UUID()``命令生成 #####################################
loose-group_replication_group_name="6485a55e-4282-11e9-b311-000c29e93fe1"
# 指示插件在服務(wù)器啟動時不自動啟動操作。這在設(shè)置組復(fù)制時很重要,因為它確保您可以在手動啟動插件之前配置服務(wù)器。
# 配置成員后,您可以設(shè)置 group_replication_start_on_boot 為on,以便在服務(wù)器引導(dǎo)時自動啟動Group Replication。
loose-group_replication_start_on_boot=off
##################################### IP白名單 #####################################
loose-group_replication_ip_whitelist='11.11.11.61,11.11.11.62,11.11.11.63'
##################################### 與其他成員通訊用地址和端口 #####################################
loose-group_replication_local_address= "11.11.11.61:24901"
loose-group_replication_group_seeds= "11.11.11.61:24901,11.11.11.62:24901,11.11.11.63:24901"
# 此選項只能在任何時候在一個服務(wù)器實例上使用,通常是第一次引導(dǎo)組時(或者在整個組關(guān)閉并重新備份的情況下)。
# 如果多次引導(dǎo)組,例如當(dāng)多個服務(wù)器實例設(shè)置了此選項時,則可以創(chuàng)建一個人工分裂腦情景,其中存在兩個具有相同名稱的不同組。在第一個服務(wù)器實例聯(lián)機(jī)后禁用此選項
loose-group_replication_bootstrap_group=off
2.重啟服務(wù)并安裝組復(fù)制插件
systemctl restart mysqld.service
mysql -uroot -pXiaoliu123!
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
SHOW PLUGINS;
exit
3.編輯my.cnf并重啟服務(wù)
## 將所有``loose-``去掉
vi /etc/my.cnf
systemctl restart mysqld.service
4.節(jié)點1執(zhí)行
mysql -uroot -pXiaoliu123!
# 創(chuàng)建用戶會在日志中記錄,可以先關(guān)閉日志
SET SQL_LOG_BIN=0;
## 創(chuàng)建用戶并授權(quán)
CREATE USER rpl_user@'%' IDENTIFIED BY 'Xiaoliu123!';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
# 創(chuàng)建用戶完成以后打開日志
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Xiaoliu123!' FOR CHANNEL 'group_replication_recovery';
set global group_replication_ip_whitelist="127.0.0.1/32,11.11.11.0/24";
## 啟動GROUP_REPLICATION
SET GLOBAL group_replication_bootstrap_group = ON;
START GROUP_REPLICATION;
## 待replication_group_members表查詢結(jié)果MEMBER_STATE字段狀態(tài)為ONLINE,再執(zhí)行關(guān)閉初始化。
SET GLOBAL group_replication_bootstrap_group = OFF;
## 查看集群節(jié)點情況
SELECT * FROM performance_schema.replication_group_members;
## 查看事務(wù)復(fù)制信息
select * from performance_schema.replication_connection_status\G
5.節(jié)點2和節(jié)點3執(zhí)行
mysql -uroot -pXiaoliu123!
# 創(chuàng)建用戶會在日志中記錄,可以先關(guān)閉日志
SET SQL_LOG_BIN=0;
## 創(chuàng)建用戶并授權(quán)
CREATE USER rpl_user@'%' IDENTIFIED BY 'Xiaoliu123!';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
# 創(chuàng)建用戶完成以后打開日志
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Xiaoliu123!' FOR CHANNEL 'group_replication_recovery';
set global group_replication_ip_whitelist="127.0.0.1/32,11.11.11.0/24";
## 啟動GROUP_REPLICATION
START GROUP_REPLICATION;
## 查看集群節(jié)點情況
SELECT * FROM performance_schema.replication_group_members;
## 查看事務(wù)復(fù)制信息
select * from performance_schema.replication_connection_status\G
第三步:測試MGR
1.節(jié)點1建表
CREATE TABLE t1(
id int not null default 0 primary key,
name char(20)
);
insert into t1(name) values ('xiaoliu');
2.節(jié)點2和節(jié)點3查詢是否有通過過來
select * from test.t1;
相關(guān)查詢命令
select * from performance_schema.replication_group_member_stats \G ;
select * from performance_schema.replication_connection_status \G ;
select * from performance_schema.replication_applier_status \G ;
select *from performance_schema.replication_group_members where member_id =(select variable_value from performance_schema.global_status WHERE VARIABLE_NAME= 'group_replication_primary_member');
SHOW BINLOG EVENTS;