servername ip port group port
mgr_one 10.168.1.227 3306 6606
mgr_two 10.168.1.226 3306 6606
mgr_three 10.168.1.228 3306 6606
#base config
server_id = 1
port = 3306
#binglog config,Group Replication是要根据GTID来进行同步的,所以需要开启GTID
log_bin = /usr/local/mysql/binarylog/mysql_bin.index
binlog-format = ROW
gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON
master-info-repository = TABLE
relay-log-info-repository = TABLE
binlog-checksum = NONE
expire_logs_days = 7
#group replication config
transaction-write-set-extraction = XXHASH64
loose-group_replication_start_on_boot = OFF
loose-group_replication_bootstrap_group = OFF
loose-group_replication_group_name = 5e1f9814-c91d-11e7-8f9b-000c29ec1057
loose-group_replication_local_address = '10.168.1.227:6606'
loose-group_replication_group_seeds = '10.168.1.226:6606,10.168.1.227:6606,10.169.1.228:6606'
loose-group_replication_single_primary_mode=true
loose-group_replication_enforce_update_everywhere_checks=false
mgr_two:
#base config
server_id = 2
port = 3306
#binglog config,Group Replication是要根据GTID来进行同步的,所以需要开启GTID
log_bin = /usr/local/mysql/binarylog/mysql_bin.index
binlog-format = ROW
gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON
master-info-repository = TABLE
relay-log-info-repository = TABLE
binlog-checksum = NONE
expire_logs_days = 7
#group replication config
transaction-write-set-extraction = XXHASH64
loose-group_replication_start_on_boot = OFF
loose-group_replication_bootstrap_group = OFF
loose-group_replication_group_name = 5e1f9814-c91d-11e7-8f9b-000c29ec1057
loose-group_replication_local_address = '10.168.1.226:6606'
loose-group_replication_group_seeds = '10.168.1.226:6606,10.168.1.227:6606,10.169.1.228:6606'
loose-group_replication_single_primary_mode=true
loose-group_replication_enforce_update_everywhere_checks=false
mgr_three:
#base config
server_id = 3
port = 3306
#binglog config,Group Replication是要根据GTID来进行同步的,所以需要开启GTID
log_bin = /usr/local/mysql/binarylog/mysql_bin.index
binlog-format = ROW
gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON
master-info-repository = TABLE
relay-log-info-repository = TABLE
binlog-checksum = NONE
expire_logs_days = 7
#group replication config
transaction-write-set-extraction = XXHASH64
loose-group_replication_start_on_boot = OFF
loose-group_replication_bootstrap_group = OFF
loose-group_replication_group_name = 5e1f9814-c91d-11e7-8f9b-000c29ec1057
loose-group_replication_local_address = '10.168.1.228:6606'
loose-group_replication_group_seeds = '10.168.1.226:6606,10.168.1.227:6606,10.169.1.228:6606'
loose-group_replication_single_primary_mode=true
loose-group_replication_enforce_update_everywhere_checks=false
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
注:或者在配置文件中直接配置
SET SQL_LOG_BIN=0;
CREATE USER rpl_lvfk@'%';
GRANT REPLICATION SLAVE ON *.* TO rpl_lvfk@'%' IDENTIFIED BY 'rpl_lvfk';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_lvfk', MASTER_PASSWORD='rpl_lvfk' FOR CHANNEL 'group_replication_recovery';
注:使用SET SQL_LOG_BIN=0;来保证创建用户的操作不记录到binlog中,这么做可以避免其他服务加入时报事务冲突错误。
[ERROR] Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | e13d18c2-bf6e-11e7-9a63-000c2951eef3 | mgr_one | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
A、创建组通讯的用户及密码:
SET SQL_LOG_BIN=0;
CREATE USER rpl_lvfk@'%';
GRANT REPLICATION SLAVE ON *.* TO rpl_lvfk@'%' IDENTIFIED BY 'rpl_lvfk';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_lvfk', MASTER_PASSWORD='rpl_lvfk' FOR CHANNEL 'group_replication_recovery';
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (7.40 sec)
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 005e5b4e-c535-11e7-adae-000c2951eef3 | mgr_two | 3306 | ONLINE |
| group_replication_applier | 2a7b77a2-c535-11e7-adae-000c2951eef3 | mgr_three | 3306 | ONLINE |
| group_replication_applier | e13d18c2-bf6e-11e7-9a63-000c2951eef3 | mgr_one | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)
10.168.1.226 mgr_two
10.168.1.227 mgr_one
10.168.1.228 mgr_three
mysql> STOP GROUP_REPLICATION;
Query OK, 0 rows affected (1.00 sec)
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (3.10 sec)
mysql> SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'group_replication_primary_member';
+--------------------------------------+
| VARIABLE_VALUE |
+--------------------------------------+
| e13d18c2-bf6e-11e7-9a63-000c2951eef3 |
+--------------------------------------+
1 row in set (0.02 sec)
mysql> insert into user values(null, 'yy', 28);
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement
mysql> insert into user values(null, 'yy', 28);
Query OK, 1 row affected (0.01 sec)
mysql> select * from user;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 8 | yy | 28 |
+----+------+-----+
1 row in set (0.00 sec)
[mgr_two]
mysql> select * from user;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 8 | yy | 28 |
+----+------+-----+
1 row in set (0.00 sec)
[mgr_three]
mysql> select * from user;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 8 | yy | 28 |
+----+------+-----+
1 row in set (0.00 sec)
至此,mysql group replication 单写模式 (single-primary mode) 搭建并测试完毕
针对7.1的补充一:
MySQL Group Replicaiton默认也不是允许所有节点写入的,初始时集群中只保留一个可写节点(master),其余节点的read_only/super_read_only参数都设置为ON。当master因故障down掉之后,组中的仲裁组件会选取一个节点将read_only/super_read_only设置成OFF,让这个节点充当master节点。
当然,也可以通过命令设置来改变为多个节点的写入 或者 直接配置为多主模式
在[mgr_two]执行
mysql> show variables like '%read_only%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_read_only | OFF |
| read_only | ON |
| super_read_only | ON |
| transaction_read_only | OFF |
| tx_read_only | OFF |
+-----------------------+-------+
5 rows in set (0.01 sec)
mysql> set global read_only=OFF;
Query OK, 0 rows affected (0.00 sec)
mysql> set global super_read_only=OFF;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into user values(null, 'xx', 27);
Query OK, 1 row affected (0.02 sec)
mysql> select * from user;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 8 | yy | 28 |
| 9 | xx | 27 |
+----+------+-----+
2 rows in set (0.00 sec)
mysql> select * from user;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 8 | yy | 28 |
| 9 | xx | 27 |
+----+------+-----+
2 rows in set (0.00 sec)
补充二、如何配置为多主模式,只需在三台服务器上的my.cnf中下面配置
loose-group_replication_single_primary_mode=true
loose-group_replication_enforce_update_everywhere_checks=false
修改为
loose-group_replication_single_primary_mode=false
loose-group_replication_enforce_update_everywhere_checks=true