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

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

簡而言之,一個Replication-group就是一組節(jié)點,每個節(jié)點都可以獨立執(zhí)行事務(wù),而讀寫事務(wù)則會在于group內(nèi)的其他節(jié)點進(jìn)行協(xié)調(diào)之后再commit。因此,當(dāng)一個事務(wù)準(zhǔn)備提交時,會自動在group內(nèi)進(jìn)行原子性的廣播,告知其他節(jié)點變更了什么內(nèi)容/執(zhí)行了什么事務(wù)。這種原子廣播的方式,使得這個事務(wù)在每一個節(jié)點上都保持著同樣順序。這意味著每一個節(jié)點都以同樣的順序,接收到了同樣的事務(wù)日志,所以每一個節(jié)點以同樣的順序重演了這些事務(wù)日志,最終整個group保持了完全一致的狀態(tài)。

組復(fù)制可以在兩種模式下運行。

1.在單主模式下,組復(fù)制具有自動選主功能,每次只有一個 server成員接受更新。

2.在多主模式下,所有的 server 成員都可以同時接受更新。

MGR的限制

僅支持InnoDB表,并且每張表一定要有一個主鍵;

必須打開GTID特性,二進(jìn)制日志格式必須設(shè)置為ROW;

二進(jìn)制日志不支持binlog event checksum

目前一個MGR集群最多支持9個節(jié)點

事務(wù)寫集合(Transaction write set extraction)必須打開。(這個目前與savepoint沖突,這也是導(dǎo)致mysqldump無法備份GR實例的原因

SERIALIZABLE 隔離級別不支持

并行執(zhí)行DDL可能導(dǎo)致數(shù)據(jù)一致性等方面的錯誤,目前不支持在多節(jié)點同時執(zhí)行同一對象的DDL

外鍵的級聯(lián)約束操作目前的實現(xiàn)并不完全支持

三 主從復(fù)制限制

? 1.存儲引擎必須為innodb

? 2.每個表必須提供主鍵

? 3.只支持ipv4,網(wǎng)絡(luò)需求較高

? 4.一個group最多只能有9臺服務(wù)器

? 5.不支持Replication event checksums,

? 6.不支持Savepoints

? 7.multi-primary mode部署方式不支持SERIALIZABLE事務(wù)隔離級別

? 8.multi-primary mode部署方式不能完全支持級聯(lián)外鍵約束

? 9.multi-primary mode部署方式不支持在不同節(jié)點上對同一個數(shù)據(jù)庫對象并發(fā)執(zhí)行DDL

盡管數(shù)據(jù)庫服務(wù)可用,但當(dāng)有一個 server 崩潰時,連接到它的客戶端必須定向或故障轉(zhuǎn)移到不同的 server。這不是組復(fù)制要解決的問題。連接器,負(fù)載均衡器,路由器或其他形式的中間件更適合處理這個問題。

準(zhǔn)備階段:

此操作是多主模式

1、開放33061端口

#? --permanent永久生效,沒有此參數(shù)重啟后失效

firewall-cmd --zone=public --add-port=33061/tcp --permanent

重新載入防火墻

firewall-cmd --reload

firewalld常用命令

# 啟動? ? ? ? ?systemctl start firewalld

# 關(guān)閉? ? ? ? ? systemctl stop firewalld

# 查看狀態(tài)? systemctl status firewalld

# 開機禁用? systemctl disable firewalld

# 開機啟用? systemctl enable firewalld

# 查看所有打開的端口? ? ? ? firewall-cmd --zone=public --list-ports

2、三臺服務(wù)器設(shè)置免密

ssh-keygen -t rsa

ssh-copy-id mgr1

ssh-copy-id mgr2

ssh-copy-id mgr3

3、三臺服務(wù)器設(shè)置hosts

特別要注意一個關(guān)鍵點: 必須保證各個mysql節(jié)點的主機名不一致,并且能通過主機名找到各成員!

則必須要在每個節(jié)點的/etc/hosts里面做主機名綁定,否則后續(xù)將節(jié)點加入group組會失?。箦eRECOVERING!

vim /etc/hosts

192.168.59.138 mgr1

192.168.59.140 mgr2

192.168.59.139 mgr3

4、關(guān)閉selinux

臨時關(guān)閉:輸入命令setenforce 0,重啟系統(tǒng)后還會開啟。

永久關(guān)閉:輸入命令vi /etc/selinux/config,將SELINUX=enforcing改為SELINUX=disabled

一、修改配置參數(shù)(三臺都修改)

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必須為每個事物收集寫集合,使用XXHASH64哈希算法將其編碼為散列

loose-group_replication_group_name ='51837954-2d8a-11ed-bc2d-000c29f511b3'

#組的名字可以隨便起,但不能用主機的GTID

loose-group_replication_start_on_boot = off? # #插件在server啟動時不自動啟動組復(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必須為每個事物收集寫集合,使用XXHASH64哈希算法將其編碼為散列

loose-group_replication_group_name ='51837954-2d8a-11ed-bc2d-000c29f511b3'

#組的名字可以隨便起,但不能用主機的GTID

loose-group_replication_start_on_boot = off? # #插件在server啟動時不自動啟動組復(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必須為每個事物收集寫集合,使用XXHASH64哈希算法將其編碼為散列

loose-group_replication_group_name ='51837954-2d8a-11ed-bc2d-000c29f511b3'

#組的名字可以隨便起,但不能用主機的GTID

loose-group_replication_start_on_boot = off? # #插件在server啟動時不自動啟動組復(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ù)制賬號

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;

修改賬號密碼,也要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)每臺主機,都需要先安裝組復(fù)制插件.否則會導(dǎo)致啟動失敗.

mysql>INSTALL PLUGIN group_replication SONAME 'group_replication.so';

克隆的機器需要修改uuid,因為復(fù)制的機器uuid相同

配置完,重啟mysql服務(wù)

node0節(jié)點上執(zhí)行 啟動組復(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:

測試:

node0上創(chuàng)建測試庫

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é)點宕機

node1上,service mysql stop

node2上,繼續(xù)插入數(shù)據(jù)

啟動node1節(jié)點

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í)行后再打開,否則會引起START GROUP_REPLICATION執(zhí)行報錯:

報錯信息如下:

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選項,mysql命令行執(zhí)行:

mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;

再次啟動組復(fù)制

mysql> START GROUP_REPLICATION;

2、連不上master,報錯信息如下:

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、如果從庫某一節(jié)點關(guān)閉

? ? stop group_replication;

2、如果所有的庫都關(guān)閉后,第一個庫作為主庫首先執(zhí)行

? ? set global group_replication_bootstrap_group=ON;

? ? start group_replication;

剩下的庫直接執(zhí)行即可!

? ? set global group_replication_allow_local_disjoint_gtids_join=ON;

? ? start group_replication;

3、如果主庫故障,會自動從兩個從庫選出一個主庫,主庫啟動后再次執(zhí)行如下命令后會變成從庫

? ? start group_replication;

至此MGR搭建并驗證完成

?著作權(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)容

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