MySQL Group Replication正是基于這些技術(shù)和概念,實(shí)現(xiàn)了一種多主全更新的復(fù)制協(xié)議。

簡(jiǎn)而言之,一個(gè)Replication-group就是一組節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都可以獨(dú)立執(zhí)行事務(wù),而讀寫事務(wù)則會(huì)在于group內(nèi)的其他節(jié)點(diǎn)進(jìn)行協(xié)調(diào)之后再commit。因此,當(dāng)一個(gè)事務(wù)準(zhǔn)備提交時(shí),會(huì)自動(dòng)在group內(nèi)進(jìn)行原子性的廣播,告知其他節(jié)點(diǎn)變更了什么內(nèi)容/執(zhí)行了什么事務(wù)。這種原子廣播的方式,使得這個(gè)事務(wù)在每一個(gè)節(jié)點(diǎn)上都保持著同樣順序。這意味著每一個(gè)節(jié)點(diǎn)都以同樣的順序,接收到了同樣的事務(wù)日志,所以每一個(gè)節(jié)點(diǎn)以同樣的順序重演了這些事務(wù)日志,最終整個(gè)group保持了完全一致的狀態(tài)。
組復(fù)制可以在兩種模式下運(yùn)行。
1.在單主模式下,組復(fù)制具有自動(dòng)選主功能,每次只有一個(gè) server成員接受更新。
2.在多主模式下,所有的 server 成員都可以同時(shí)接受更新。
MGR的限制
僅支持InnoDB表,并且每張表一定要有一個(gè)主鍵;
必須打開GTID特性,二進(jìn)制日志格式必須設(shè)置為ROW;
二進(jìn)制日志不支持binlog event checksum
目前一個(gè)MGR集群最多支持9個(gè)節(jié)點(diǎn)
事務(wù)寫集合(Transaction write set extraction)必須打開。(這個(gè)目前與savepoint沖突,這也是導(dǎo)致mysqldump無法備份GR實(shí)例的原因
SERIALIZABLE 隔離級(jí)別不支持
并行執(zhí)行DDL可能導(dǎo)致數(shù)據(jù)一致性等方面的錯(cuò)誤,目前不支持在多節(jié)點(diǎn)同時(shí)執(zhí)行同一對(duì)象的DDL
外鍵的級(jí)聯(lián)約束操作目前的實(shí)現(xiàn)并不完全支持
三 主從復(fù)制限制
? 1.存儲(chǔ)引擎必須為innodb
? 2.每個(gè)表必須提供主鍵
? 3.只支持ipv4,網(wǎng)絡(luò)需求較高
? 4.一個(gè)group最多只能有9臺(tái)服務(wù)器
? 5.不支持Replication event checksums,
? 6.不支持Savepoints
? 7.multi-primary mode部署方式不支持SERIALIZABLE事務(wù)隔離級(jí)別
? 8.multi-primary mode部署方式不能完全支持級(jí)聯(lián)外鍵約束
? 9.multi-primary mode部署方式不支持在不同節(jié)點(diǎn)上對(duì)同一個(gè)數(shù)據(jù)庫(kù)對(duì)象并發(fā)執(zhí)行DDL
盡管數(shù)據(jù)庫(kù)服務(wù)可用,但當(dāng)有一個(gè) server 崩潰時(shí),連接到它的客戶端必須定向或故障轉(zhuǎn)移到不同的 server。這不是組復(fù)制要解決的問題。連接器,負(fù)載均衡器,路由器或其他形式的中間件更適合處理這個(gè)問題。
準(zhǔn)備階段:
此操作是多主模式
1、開放33061端口
#? --permanent永久生效,沒有此參數(shù)重啟后失效
firewall-cmd --zone=public --add-port=33061/tcp --permanent
重新載入防火墻
firewall-cmd --reload
firewalld常用命令
# 啟動(dòng)? ? ? ? ?systemctl start firewalld
# 關(guān)閉? ? ? ? ? systemctl stop firewalld
# 查看狀態(tài)? systemctl status firewalld
# 開機(jī)禁用? systemctl disable firewalld
# 開機(jī)啟用? systemctl enable firewalld
# 查看所有打開的端口? ? ? ? firewall-cmd --zone=public --list-ports
2、三臺(tái)服務(wù)器設(shè)置免密
ssh-keygen -t rsa
ssh-copy-id mgr1
ssh-copy-id mgr2
ssh-copy-id mgr3
3、三臺(tái)服務(wù)器設(shè)置hosts
特別要注意一個(gè)關(guān)鍵點(diǎn): 必須保證各個(gè)mysql節(jié)點(diǎn)的主機(jī)名不一致,并且能通過主機(jī)名找到各成員!
則必須要在每個(gè)節(jié)點(diǎn)的/etc/hosts里面做主機(jī)名綁定,否則后續(xù)將節(jié)點(diǎn)加入group組會(huì)失??!報(bào)錯(cuò)RECOVERING!
vim /etc/hosts
192.168.59.138 mgr1
192.168.59.140 mgr2
192.168.59.139 mgr3
4、關(guān)閉selinux
臨時(shí)關(guān)閉:輸入命令setenforce 0,重啟系統(tǒng)后還會(huì)開啟。
永久關(guān)閉:輸入命令vi /etc/selinux/config,將SELINUX=enforcing改為SELINUX=disabled
一、修改配置參數(shù)(三臺(tái)都修改)
mgr1
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
character-set-server=utf8
innodb_rollback_on_timeout = ON
collation-server=utf8_general_ci
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
lower_case_table_names=1
max_connections=10000
sync_binlog=1
binlog_format=row
########basic settings########
server-id =138
character_set_server=utf8
max_allowed_packet = 16M
lower_case_table_names=1
slow_query_log=1
slow_query_log_file=/data/mysql/slow.log
########replication settings########
#####replication 復(fù)制配置###############
log-bin = /data/mysql/mysql-bin
max_binlog_size=500M
binlog_format = row
sync_binlog=1
expire_logs_days=15
###group replication###########
gtid_mode=on
enforce_gtid_consistency= ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
#log_slave_updates是將從服務(wù)器從主服務(wù)器收到的更新記入到從服務(wù)器自己的二進(jìn)制日志文件中。
transaction_write_set_extraction = XXHASH64
##server必須為每個(gè)事物收集寫集合,使用XXHASH64哈希算法將其編碼為散列
loose-group_replication_group_name ='51837954-2d8a-11ed-bc2d-000c29f511b3'
#組的名字可以隨便起,但不能用主機(jī)的GTID
loose-group_replication_start_on_boot = off? # #插件在server啟動(dòng)時(shí)不自動(dòng)啟動(dòng)組復(fù)制
loose-group_replication_bootstrap_group = off #同上
loose-group_replication_ip_whitelist="192.168.59.138,192.168.59.140,192.168.59.139"
report_host=192.168.59.138
report_port=3306
loose-group_replication_local_address = '192.168.59.138:33061'
loose-group_replication_group_seeds ='192.168.59.138:33061,192.168.59.140:33061,192.168.59.139:33061'
loose-group_replication_single_primary_mode = FALSE #關(guān)閉單主模式的參數(shù)
loose-group_replication_enforce_update_everywhere_checks = TRUE #開啟多主模式的參數(shù)
########innodb settings########
innodb_flush_log_at_trx_commit = 1 #改為1 是為了更安全, 值為2是性能
innodb_buffer_pool_size=128M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
secure_file_priv="/tmp"
[mysql]
socket=/tmp/mysql.sock
default-character-set=utf8
[client]
mgr2
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
character-set-server=utf8
innodb_rollback_on_timeout = ON
collation-server=utf8_general_ci
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
lower_case_table_names=1
max_connections=10000
binlog_format=row
########basic settings########
server-id =140
character_set_server=utf8
max_allowed_packet = 16M
lower_case_table_names=1
slow_query_log=1
slow_query_log_file=/data/mysql/slow.log
########replication settings########
#####replication 復(fù)制配置###############
log-bin = /data/mysql/mysql-bin
max_binlog_size=500M
binlog_format = row
sync_binlog=1
expire_logs_days=15
###group replication###########
gtid_mode=on
enforce_gtid_consistency= ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
#log_slave_updates是將從服務(wù)器從主服務(wù)器收到的更新記入到從服務(wù)器自己的二進(jìn)制日志文件中。
transaction_write_set_extraction = XXHASH64
##server必須為每個(gè)事物收集寫集合,使用XXHASH64哈希算法將其編碼為散列
loose-group_replication_group_name ='51837954-2d8a-11ed-bc2d-000c29f511b3'
#組的名字可以隨便起,但不能用主機(jī)的GTID
loose-group_replication_start_on_boot = off? # #插件在server啟動(dòng)時(shí)不自動(dòng)啟動(dòng)組復(fù)制
loose-group_replication_bootstrap_group = off #同上
loose-group_replication_ip_whitelist="192.168.59.138,192.168.59.140,192.168.59.139"
report_host=192.168.59.140
report_port=3306
loose-group_replication_local_address = '192.168.59.140:33061'
loose-group_replication_group_seeds ='192.168.59.140:33061,192.168.59.138:33061,192.168.59.139:33061'
loose-group_replication_single_primary_mode = FALSE #關(guān)閉單主模式的參數(shù)
loose-group_replication_enforce_update_everywhere_checks = TRUE #開啟多主模式的參數(shù)
########innodb settings########
innodb_flush_log_at_trx_commit = 1 #改為1 是為了更安全, 值為2是性能
innodb_buffer_pool_size=128M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
secure_file_priv="/tmp"
[mysql]
socket=/tmp/mysql.sock
default-character-set=utf8
[client]
mgr3
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
character-set-server=utf8
innodb_rollback_on_timeout = ON
collation-server=utf8_general_ci
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
lower_case_table_names=1
max_connections=10000
sync_binlog=1
binlog_format=row
########basic settings########
server-id =139
character_set_server=utf8
max_allowed_packet = 16M
lower_case_table_names=1
slow_query_log=1
slow_query_log_file=/data/mysql/slow.log
########replication settings########
#####replication 復(fù)制配置###############
log-bin = /data/mysql/mysql-bin
max_binlog_size=500M
binlog_format = row
sync_binlog=1
expire_logs_days=15
###group replication###########
gtid_mode=on
enforce_gtid_consistency= ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
#log_slave_updates是將從服務(wù)器從主服務(wù)器收到的更新記入到從服務(wù)器自己的二進(jìn)制日志文件中。
transaction_write_set_extraction = XXHASH64
##server必須為每個(gè)事物收集寫集合,使用XXHASH64哈希算法將其編碼為散列
loose-group_replication_group_name ='51837954-2d8a-11ed-bc2d-000c29f511b3'
#組的名字可以隨便起,但不能用主機(jī)的GTID
loose-group_replication_start_on_boot = off? # #插件在server啟動(dòng)時(shí)不自動(dòng)啟動(dòng)組復(fù)制
loose-group_replication_bootstrap_group = off #同上
loose-group_replication_ip_whitelist="192.168.59.138,192.168.59.140,192.168.59.139"
report_host=192.168.59.139
report_port=3306
loose-group_replication_local_address = '192.168.59.139:33061'
loose-group_replication_group_seeds ='192.168.59.138:33061,192.168.59.140:33061,192.168.59.139:33061'
loose-group_replication_single_primary_mode = FALSE #關(guān)閉單主模式的參數(shù)
loose-group_replication_enforce_update_everywhere_checks = TRUE #開啟多主模式的參數(shù)
########innodb settings########
innodb_flush_log_at_trx_commit = 1 #改為1 是為了更安全, 值為2是性能
innodb_buffer_pool_size=128M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
secure_file_priv="/tmp"
[mysql]
socket=/tmp/mysql.sock
default-character-set=utf8
[client]
二、在node0和node1和node2 創(chuàng)建復(fù)制賬號(hào)
set sql_log_bin=0;
create user rpl_user@'%';
grant replication slave on *.* to rpl_user@'%' identified by 'rpl_pass';
flush privileges;
set sql_log_bin=1;
修改賬號(hào)密碼,也要set sql_log_bin=0
/usr/local/mysql/bin/mysql -uroot? -p123@abc
change master to master_user='rpl_user',master_password='rpl_pass' for channel 'group_replication_recovery';
組內(nèi)每臺(tái)主機(jī),都需要先安裝組復(fù)制插件.否則會(huì)導(dǎo)致啟動(dòng)失敗.
mysql>INSTALL PLUGIN group_replication SONAME 'group_replication.so';
克隆的機(jī)器需要修改uuid,因?yàn)閺?fù)制的機(jī)器uuid相同
配置完,重啟mysql服務(wù)
node0節(jié)點(diǎn)上執(zhí)行 啟動(dòng)組復(fù)制
set? global group_replication_bootstrap_group=ON;
set global group_replication_ip_whitelist="192.168.59.0/24";
START GROUP_REPLICATION;? ?
SELECT * FROM performance_schema.replication_group_members;
SET GLOBAL group_replication_bootstrap_group=OFF;
node1
set global group_replication_allow_local_disjoint_gtids_join=ON;
set global group_replication_ip_whitelist="192.168.59.0/24";
START GROUP_REPLICATION;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
SELECT * FROM performance_schema.replication_group_members;
node2
set global group_replication_allow_local_disjoint_gtids_join=ON;
set global group_replication_ip_whitelist="192.168.59.0/24";
START GROUP_REPLICATION;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
SELECT * FROM performance_schema.replication_group_members;
select * from performance_schema.replication_group_members;?
查看集群狀態(tài),都為ONLINE就表示OK:
測(cè)試:
node0上創(chuàng)建測(cè)試庫(kù)
create database mgr1;
use mgr1;
create table mgr1.t1(id int primary key, cn varchar(30));
insert into t1 values(1,'a');
node1上查看
use mgr1;
select * from t1;
node1上插入? insert into t1 values(2,'Tom');
node2上查看
node2上插入? insert into t1 values(3,'li');
模擬節(jié)點(diǎn)宕機(jī)
node1上,service mysql stop
node2上,繼續(xù)插入數(shù)據(jù)
啟動(dòng)node1節(jié)點(diǎn)
service mysql start
mysql>
set global group_replication_allow_local_disjoint_gtids_join = on;
START GROUP_REPLICATION;
再次查看組成員,發(fā)現(xiàn)已重新加入組
mysql> SELECT * FROM performance_schema.replication_group_members;
注意:前面的用戶密碼修改和創(chuàng)建用戶操作必須設(shè)置binlog不記錄,執(zhí)行后再打開,否則會(huì)引起START GROUP_REPLICATION執(zhí)行報(bào)錯(cuò):
報(bào)錯(cuò)信息如下:
ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log
根據(jù)提示打開group_replication_allow_local_disjoint_gtids_join選項(xiàng),mysql命令行執(zhí)行:
mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;
再次啟動(dòng)組復(fù)制
mysql> START GROUP_REPLICATION;
2、連不上master,報(bào)錯(cuò)信息如下:
2017-04-17T16:18:14.756191+08:00 25 [Warning] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information.
2017-04-17T16:18:14.814193+08:00 25 [ERROR] Slave I/O for channel 'group_replication_recovery': error connecting to master'repl_user@host-192-168-99-156:3306' - retry-time: 60? retries: 1, Error_code: 2005
2017-04-17T16:18:14.814219+08:00 25 [Note] Slave I/O thread for channel 'group_replication_recovery' killed while connecting to master
2017-04-17T16:18:14.814227+08:00 25 [Note] Slave I/O thread exiting for channel 'group_replication_recovery', read up to log 'FIRST', position 4
2017-04-17T16:18:14.814342+08:00 19 [ERROR] Plugin group_replication reported: 'There was an error when connecting to the donor server. Check group replication recovery's connection credentials.'
解決方案:
添加映射
vim /etc/hosts
重啟下組復(fù)制
mysql> stop group_replication;
Query OK, 0 rows affected (8.76 sec)
mysql> start group_replication;
Query OK, 0 rows affected (2.51 sec)
日常維護(hù)步驟:
1、如果從庫(kù)某一節(jié)點(diǎn)關(guān)閉
? ? stop group_replication;
2、如果所有的庫(kù)都關(guān)閉后,第一個(gè)庫(kù)作為主庫(kù)首先執(zhí)行
? ? set global group_replication_bootstrap_group=ON;
? ? start group_replication;
剩下的庫(kù)直接執(zhí)行即可!
? ? set global group_replication_allow_local_disjoint_gtids_join=ON;
? ? start group_replication;
3、如果主庫(kù)故障,會(huì)自動(dòng)從兩個(gè)從庫(kù)選出一個(gè)主庫(kù),主庫(kù)啟動(dòng)后再次執(zhí)行如下命令后會(huì)變成從庫(kù)
? ? start group_replication;
至此MGR搭建并驗(yàn)證完成