MySQL5.7 Group Replication (MGR)--Mysql的组复制之多主模式

时间:2021-08-15 04:12:46

MGR——Mysql的组复制之多主模式

以下测试在VMware环境:

操作系统:Centos 6.9 X86_64

数据库:Mysql 5.7 (mysql  Ver 14.14 Distrib 5.7.21, for Linux (x86_64) )

所使用虚拟机共计三台,ip分别是192.168.153.157、192.168.153.158、192.168.153.159

MGR模式:多主模式。

一、在三台db服务器上面设置/etc/hosts映射,如下:

[root@mgr157 ~]# cat /etc/hosts

 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
:: localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.153.157 mgr157
192.168.153.158 mgr158
192.168.153.159 mgr159

二、my.cnf文件修改:

vi /etc/my.cnf (157服务器)

 # For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html [mysqld] #-------------------gobal variables------------#
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log-bin = mysql-bin
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = '157be252-2b71-11e6-b8f4-00212889f856'
loose-group_replication_start_on_boot = off
loose-group_replication_bootstrap_group = off
loose-group_replication_local_address = '192.168.153.157:33061'
loose-group_replication_group_seeds ='192.168.153.157:33061,192.168.153.158:33061,192.168.153.159:33061'
loose-group_replication_single_primary_mode = off
loose-group_replication_enforce_update_everywhere_checks = on
max_connect_errors =
max_connections =
wait_timeout =
interactive_timeout =
net_read_timeout =
net_write_timeout =
table_open_cache =
table_definition_cache =
thread_cache_size =
open_files_limit =
character-set-server = utf8
collation-server = utf8_bin
skip_external_locking
performance_schema =
user = mysql
myisam_recover_options = DEFAULT
skip-name-resolve
local_infile =
lower_case_table_names = #--------------------innoDB------------#
innodb_buffer_pool_size = 2000M
#innodb_data_file_path = ibdata1:200M:autoextend
innodb_flush_log_at_trx_commit =
innodb_io_capacity =
innodb_lock_wait_timeout =
innodb_log_buffer_size = 8M
innodb_log_file_size = 200M
innodb_log_files_in_group =
innodb_max_dirty_pages_pct =
innodb_read_io_threads =
innodb_write_io_threads =
innodb_support_xa =
innodb_thread_concurrency =
innodb_file_per_table
innodb_rollback_on_timeout #------------session variables-------#
join_buffer_size = 8M
key_buffer_size = 256M
bulk_insert_buffer_size = 8M
max_heap_table_size = 96M
tmp_table_size = 96M
read_buffer_size = 8M
sort_buffer_size = 2M
max_allowed_packet = 64M
read_rnd_buffer_size = 32M #------------MySQL Log----------------#
log-bin = my3306-bin
binlog_format = row
sync_binlog =
expire_logs_days =
max_binlog_cache_size = 128M
max_binlog_size = 500M
binlog_cache_size = 64k
slow_query_log
log-slow-admin-statements
log_warnings =
long_query_time = 0.25 #---------------replicate--------------#
relay-log-index = relay3306.index
relay-log = relay3306
server-id =
init_slave = 'set sql_mode=STRICT_ALL_TABLES'
log-slave-updates
[myisamchk]
key_buffer = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
open-files-limit = #
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at % of total RAM for dedicated server, else %.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links= log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

vi /etc/my.cnf (158务器)

 # For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html [mysqld] #-------------------gobal variables------------#
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log-bin = mysql-bin
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = '157be252-2b71-11e6-b8f4-00212889f856'
loose-group_replication_start_on_boot = off
loose-group_replication_bootstrap_group = off
loose-group_replication_local_address = '192.168.153.158:33061'
loose-group_replication_group_seeds ='192.168.153.157:33061,192.168.153.158:33061,192.168.153.159:33061'
loose-group_replication_single_primary_mode = off
loose-group_replication_enforce_update_everywhere_checks = on
max_connect_errors =
max_connections =
wait_timeout =
interactive_timeout =
net_read_timeout =
net_write_timeout =
table_open_cache =
table_definition_cache =
thread_cache_size =
open_files_limit =
character-set-server = utf8
collation-server = utf8_bin
skip_external_locking
performance_schema =
user = mysql
myisam_recover_options = DEFAULT
skip-name-resolve
local_infile =
lower_case_table_names = #--------------------innoDB------------#
innodb_buffer_pool_size = 2000M
#innodb_data_file_path = ibdata1:200M:autoextend
innodb_flush_log_at_trx_commit =
innodb_io_capacity =
innodb_lock_wait_timeout =
innodb_log_buffer_size = 8M
innodb_log_file_size = 200M
innodb_log_files_in_group =
innodb_max_dirty_pages_pct =
innodb_read_io_threads =
innodb_write_io_threads =
innodb_support_xa =
innodb_thread_concurrency =
innodb_file_per_table
innodb_rollback_on_timeout #------------session variables-------#
join_buffer_size = 8M
key_buffer_size = 256M
bulk_insert_buffer_size = 8M
max_heap_table_size = 96M
tmp_table_size = 96M
read_buffer_size = 8M
sort_buffer_size = 2M
max_allowed_packet = 64M
read_rnd_buffer_size = 32M #------------MySQL Log----------------#
log-bin = my3306-bin
binlog_format = row
sync_binlog =
expire_logs_days =
max_binlog_cache_size = 128M
max_binlog_size = 500M
binlog_cache_size = 64k
slow_query_log
log-slow-admin-statements
log_warnings =
long_query_time = 0.25 #---------------replicate--------------#
relay-log-index = relay3306.index
relay-log = relay3306
server-id =
init_slave = 'set sql_mode=STRICT_ALL_TABLES'
log-slave-updates
[myisamchk]
key_buffer = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
open-files-limit = #
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at % of total RAM for dedicated server, else %.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links= log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

vi /etc/my.cnf (159务器)

 # For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html [mysqld] #-------------------gobal variables------------#
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log-bin = mysql-bin
transaction_write_set_extraction = XXHASH64
loose-group_replication_group_name = '157be252-2b71-11e6-b8f4-00212889f856'
loose-group_replication_start_on_boot = off
loose-group_replication_bootstrap_group = off
loose-group_replication_local_address = '192.168.153.159:33061'
loose-group_replication_group_seeds ='192.168.153.157:33061,192.168.153.158:33061,192.168.153.159:33061'
loose-group_replication_single_primary_mode = off
loose-group_replication_enforce_update_everywhere_checks = on
max_connect_errors =
max_connections =
wait_timeout =
interactive_timeout =
net_read_timeout =
net_write_timeout =
table_open_cache =
table_definition_cache =
thread_cache_size =
open_files_limit =
character-set-server = utf8
collation-server = utf8_bin
skip_external_locking
performance_schema =
user = mysql
myisam_recover_options = DEFAULT
skip-name-resolve
local_infile =
lower_case_table_names = #--------------------innoDB------------#
innodb_buffer_pool_size = 2000M
#innodb_data_file_path = ibdata1:200M:autoextend
innodb_flush_log_at_trx_commit =
innodb_io_capacity =
innodb_lock_wait_timeout =
innodb_log_buffer_size = 8M
innodb_log_file_size = 200M
innodb_log_files_in_group =
innodb_max_dirty_pages_pct =
innodb_read_io_threads =
innodb_write_io_threads =
innodb_support_xa =
innodb_thread_concurrency =
innodb_file_per_table
innodb_rollback_on_timeout #------------session variables-------#
join_buffer_size = 8M
key_buffer_size = 256M
bulk_insert_buffer_size = 8M
max_heap_table_size = 96M
tmp_table_size = 96M
read_buffer_size = 8M
sort_buffer_size = 2M
max_allowed_packet = 64M
read_rnd_buffer_size = 32M #------------MySQL Log----------------#
log-bin = my3306-bin
binlog_format = row
sync_binlog =
expire_logs_days =
max_binlog_cache_size = 128M
max_binlog_size = 500M
binlog_cache_size = 64k
slow_query_log
log-slow-admin-statements
log_warnings =
long_query_time = 0.25 #---------------replicate--------------#
relay-log-index = relay3306.index
relay-log = relay3306
server-id =
init_slave = 'set sql_mode=STRICT_ALL_TABLES'
log-slave-updates
[myisamchk]
key_buffer = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
open-files-limit = #
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at % of total RAM for dedicated server, else %.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links= log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

三、配置 group_replication

组内每台主机,都需要先安装组复制插件.否则会导致启动失败.
 mysql>INSTALL PLUGIN group_replication SONAME 'group_replication.so';

1.server157:

 mysql>GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.153.%' IDENTIFIED BY 'RKYSrkys123!@#';
mysql>CHANGE MASTER TO MASTER_USER='repl',MASTER_PASSWORD='RKYSrkys123!@#' FOR CHANNEL 'group_replication_recovery';
mysql>set global group_replication_ip_whitelist="127.0.0.1/32,192.168.153.0/24";
mysql>SET GLOBAL group_replication_bootstrap_group = ON;
mysql>START GROUP_REPLICATION;
mysql>SET GLOBAL group_replication_bootstrap_group = OFF;

2.server158、159:

 mysql>CHANGE MASTER TO MASTER_USER='repl',MASTER_PASSWORD='RKYSrkys123!@#' FOR mysql>CHANNEL 'group_replication_recovery';
mysql>set global group_replication_ip_whitelist="127.0.0.1/32,192.168.153.0/24";
mysql>set global group_replication_allow_local_disjoint_gtids_join=ON;
mysql>START GROUP_REPLICATION;

3.查看SELECT * FROM performance_schema.replication_group_members;

server157、158、159上都执行SQL语句查看组状态
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | c8a5168d--11e8-a3e1-000c29cb1157 | mgr157 | | ONLINE |
| group_replication_applier | c8a5168d--11e8-a3e1-000c29cb1159 | mgr159 | | ONLINE |
| group_replication_applier | c8a5168d--11e8-a3e1-000c29cb1ae2 | mgr158 | | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
online代表已经设置成功。

四、检验:

1: server157、158、159(分别创建test157、test158和test159测试)

server157上:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
rows in set (0.01 sec) mysql> create database test157;
Query OK, row affected (0.04 sec) mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test157 |
+--------------------+
rows in set (0.00 sec)
server158上:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test157       |
+--------------------+
rows in set (0.02 sec) mysql> create database test158;
Query OK, row affected (0.04 sec) mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test157 |
| test158 |
+--------------------+
rows in set (0.00 sec)
server159上:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test157       |
| test158       |
+--------------------+
rows in set (0.00 sec) mysql> create database test159;
Query OK, row affected (0.05 sec) mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test157 |
| test158 |
| test159 |
+--------------------+
rows in set (0.00 sec)
在server157、158上也分别验证:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test157 |
| test158 |
| test159 |
+--------------------+

2:模拟宕机一个节点验证

(1)关闭159的数据库实例
  service mysqld stop
(2)在157节点操作
查询组成员,发现159已不在组中

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | c8a5168d--11e8-a3e1-000c29cb1157 | mgr157 | | ONLINE |
| group_replication_applier | c8a5168d--11e8-a3e1-000c29cb1ae2 | mgr158 | | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
rows in set (0.00 sec)

(3)写入数据

server157,158,159上:
mysql> use test157
Database changed
mysql> show tables;
Empty set (0.00 sec) mysql> CREATE TABLE tb1(id int not null primary key);
Query OK, rows affected (0.41 sec) server157,158上:
mysql> show tables;
+-------------------+
| Tables_in_test157 |
+-------------------+
| tb1 |
+-------------------+
row in set (0.01 sec) server159上:
mysql> show tables;
Empty set (0.00 sec)

(4)启动159的数据库

#修改配置文件,自动启动组复制
#loose-group_replication_start_on_boot = on
#group_replication_allow_local_disjoint_gtids_join = on

mysql> STOP GROUP_REPLICATION;
Query OK, rows affected (9.30 sec)

(5)再次查看组成员,发现159已重新加入组

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | c8a5168d--11e8-a3e1-000c29cb1157 | mgr157 | | ONLINE |
| group_replication_applier | c8a5168d--11e8-a3e1-000c29cb1159 | mgr159 | | ONLINE |
| group_replication_applier | c8a5168d--11e8-a3e1-000c29cb1ae2 | mgr158 | | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
rows in set (0.00 sec)

(6)查看数据,发现数据已同步

在server157、、159上:
mysql> show tables;
+-------------------+
| Tables_in_test157 |
+-------------------+
| tb1 |
+-------------------+
row in set (0.01 sec)

到此,已完毕。

######################################################################################################################

附:参考资料

#[client]
#port = 3306
#socket = /usr/local/mysql/tmp/mysql.sock

[mysqld]
#port = 3306
#socket = /usr/local/mysql/tmp/mysql.sock
back_log = 80
basedir = /usr/local/mysql
tmpdir = /tmp
datadir = /usr/local/mysql/data

#-------------------gobal variables------------#
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository = TABLE
relay_log_info_repository = TABLE
binlog_checksum = NONE
log_slave_updates = ON
log-bin = /usr/local/mysql/log/mysql-bin
transaction_write_set_extraction = XXHASH64 #以便在server收集写集合的同时将其记录到二进制日志。写集合基于每行的主键,并且是行更改后的唯一标识此标识将用于检测冲突。
loose-group_replication_group_name = 'ce9be252-2b71-11e6-b8f4-00212889f856' #组的名字可以随便起,但不能用主机的GTID(为mgr高可用组起一个名字,这个名字一定要是uuid格式的。)【此处三台一致】
loose-group_replication_start_on_boot = off #为了避免每次启动自动引导具有相同名称的第二个组,所以设置为OFF。
loose-group_replication_bootstrap_group = off #同上
loose-group_replication_local_address = '192.168.153.157:33061' 【三台分别是192.168.153.157:33061/192.168.153.158:33061/192.168.153.159:33061】 #写自己主机所在IP(mgr各实例之前都是要进行通信的、这个配置项设置的就是本实例所监听的ip:端口)
loose-group_replication_group_seeds ='192.168.153.157:33061,192.168.153.158:33061,192.168.153.159:33061' #(各mgr实例所监听的ip:端口信息) 【三台一致】
loose-group_replication_single_primary_mode = off #关闭单主模式的参数
loose-group_replication_enforce_update_everywhere_checks = on #开启多主模式的参数
max_connect_errors = 20000 #max_connect_errors是一个MySQL中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况。max_connect_errors的值与性能并无太大关系。默认情况下,my.cnf文件中可能没有此行,如果需要设置此数值,手动添加即可。
max_connections = 2000
wait_timeout = 3600
interactive_timeout = 3600
net_read_timeout = 3600
net_write_timeout = 3600
table_open_cache = 1024
table_definition_cache = 1024
thread_cache_size = 512
open_files_limit = 10000
character-set-server = utf8
collation-server = utf8_bin
skip_external_locking
performance_schema = 1
user = mysql
myisam_recover_options = DEFAULT
skip-name-resolve
local_infile = 0
lower_case_table_names = 0 
#lower_case_table_names: 此参数不可以动态修改,必须重启数据库
#lower_case_table_names = 1 表名存储在磁盘是小写的,但是比较的时候是不区分大小写
#lower_case_table_names=0 表名存储为给定的大小和比较是区分大小写的 
#lower_case_table_names=2, 表名存储为给定的大小写但是比较的时候是小写的

#--------------------innoDB------------#
innodb_buffer_pool_size = 2000M
#innodb_data_file_path = ibdata1:200M:autoextend
innodb_flush_log_at_trx_commit = 1
innodb_io_capacity = 600
innodb_lock_wait_timeout = 120
innodb_log_buffer_size = 8M
innodb_log_file_size = 200M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 85
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_support_xa = 1
innodb_thread_concurrency = 32
innodb_file_per_table
innodb_rollback_on_timeout

#------------session variables-------#
join_buffer_size = 8M
key_buffer_size = 256M
bulk_insert_buffer_size = 8M
max_heap_table_size = 96M
tmp_table_size = 96M
read_buffer_size = 8M
sort_buffer_size = 2M
max_allowed_packet = 64M
read_rnd_buffer_size = 32M

#------------MySQL Log----------------#
log-bin = my3306-bin
binlog_format = row #组复制依赖基于行的复制格式
sync_binlog = 1
expire_logs_days = 15
max_binlog_cache_size = 128M
max_binlog_size = 500M
binlog_cache_size = 64k
slow_query_log
log-slow-admin-statements
log_warnings = 1
long_query_time = 0.25

#---------------replicate--------------#
relay-log-index = relay3306.index
relay-log = relay3306
server-id =157 #【每个db的id唯一】
init_slave = 'set sql_mode=STRICT_ALL_TABLES'
log-slave-updates
[myisamchk]
key_buffer = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
open-files-limit = 8192
#log-error = /usr/local/mysql/log/mysqld_error.log
######################################################################################################################