MySQL:3.MySQL Group Replication(MGR)集群


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;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • feisky云計算、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 4,383評論 0 5
  • Group Replication [TOC] 關(guān)于 Group Greplication 異步復(fù)制 半同步復(fù)制 ...
    saup007閱讀 6,019評論 0 4
  • 找工作,總得在“找”吧。我沒有,我一直在穩(wěn)穩(wěn)地等待,那么,我在等待什么呢?我不知道。那么,我就這么一直白吃白喝地呆...
    木子骙骙閱讀 383評論 0 0
  • 1.UNIX時間戳轉(zhuǎn)換為日期 FROM_UNIXTIME() 2.日期轉(zhuǎn)換為UNIX時間戳 UNIX_TIMEST...
    jsjack_wang閱讀 160評論 0 0

友情鏈接更多精彩內(nèi)容