Mysql Group Replication(MGR) 組復(fù)制

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)證完成

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

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

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