2.在多主模式下,所有的 server 成员都可以同时接受更新.
1)复制组由多个 server成员构成,并且组中的每个 server 成员可以独立地执行事务。但所有读写(RW)事务只有在冲突检测成功后才会提交。只读(RO)事务不需要在冲突检测,可以立即提交。
2)换句话说,对于任何 RW 事务,提交操作并不是由始发 server 单向决定的,而是由组来决定是否提交。准确地说,在始发 server 上,当事务准备好提交时,该 server 会广播写入值(已改变的行)和对应的写入集(已更新的行的唯一标识符)。然后会为该事务建立一个全局的顺序。最终,这意味着所有 server 成员以相同的顺序接收同一组事务。因此,所有 server 成员以相同的顺序应用相同的更改,以确保组内一致。
3)组复制使您能够根据在一组 server 中复制系统的状态来创建具有冗余的容错系统。因此,只要它不是全部或多数 server 发生故障,即使有一些 server 故障,系统仍然可用,最多只是性能和可伸缩性降低,但它仍然可用。server 故障是孤立并且独立的。它们由组成员服务来监控,组成员服务依赖于分布式故障检测系统,其能够在任何 server 自愿地或由于意外停止而离开组时发出信号。
4)他们是由一个分布式恢复程序来确保当有 server 加入组时,它们会自动更新组信息到最新。并且多主更新确保了即使在单个服务器故障的情况下也不会阻止更新,不必进行 server故障转移。因此,MySQL 组复制保证数据库服务持续可用。
5)值得注意的一点是,尽管数据库服务可用,但当有一个 server 崩溃时,连接到它的客户端必须定向或故障转移到不同的 server。
这不是组复制要解决的问题。连接器,负载均衡器,路由器或其他形式的中间件更适合处理这个问题。
mysql>INSTALL PLUGIN group_replication SONAME 'group_replication.so';
[client]
port =
socket = /usr/local/mysql/tmp/mysql.sock [mysqld]
port =
socket = /usr/local/mysql/tmp/mysql.sock
back_log =
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
loose-group_replication_start_on_boot = off #为了避免每次启动自动引导具有相同名称的第二个组,所以设置为OFF。
loose-group_replication_bootstrap_group = off #同上
loose-group_replication_local_address = '192.168.1.88:33061' #写自己主机所在IP
loose-group_replication_group_seeds ='192.168.1.88:33061,192.168.1.89:33061,192.168.1.90: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 = #每个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 =
log-error = /usr/local/mysql/log/mysqld_error.log
my.cnf
mysql> CHANGE MASTER TO MASTER_USER='repl',MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.27 sec)
mysql> set global group_replication_ip_whitelist="127.0.0.1/32,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,192.168.1.0/24";
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected, 2 warnings (0.56 sec)
mysql> set global group_replication_ip_whitelist="127.0.0.1/32,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,192.168.1.0/24";
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (4.02 sec)
Query OK, 1 row affected (0.15 sec)
mysql> use test;
Database changed
Query OK, 0 rows affected (0.94 sec)
mysql> INSERT INTO t1 VALUES (1, 'lalala');
Query OK, 1 row affected (0.46 sec)
mysql> select * from t1;
+----+--------+
| c1 | c2 |
+----+--------+
| 1 | lalala |
+----+--------+
1 row in set (0.00 sec)
(1)关闭88的数据库实例
(2)在89节点操作
查询组成员,发现88已不在组中
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | f308d2d6-6c93-11e7-a5b1-000c2979c7bf | mgr90 | 3306 | ONLINE |
| group_replication_applier | f39c169e-6c93-11e7-a550-000c291d7bdb | mgr89 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
2 rows in set (0.00 sec)
(3)写入数据
mysql> insert into t1 values(2,'Mr.Li');
Query OK, 1 row affected (0.02 sec)
mysql> select * from t1;
+----+----------+
| c1 | c2 |
+----+----------+
| 1 | lalala |
| 2 | Mr.Li |
+----+----------+
5 rows in set (0.00 sec)
(4)启动88的数据库
修改配置文件,自动启动组复制
loose-group_replication_start_on_boot = on
group_replication_allow_local_disjoint_gtids_join = on
(5)再次查看组成员,发现88已重新加入组
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 715e9af4-6c93-11e7-aabf-000c291abb1f | mgr88 | 3306 | ONLINE |
| group_replication_applier | f308d2d6-6c93-11e7-a5b1-000c2979c7bf | mgr90 | 3306 | ONLINE |
| group_replication_applier | f39c169e-6c93-11e7-a550-000c291d7bdb | mgr89 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)
(6)查看数据,发现数据已同步
mysql> use test1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from t1;
+----+----------+
| c1 | c2 |
+----+----------+
| 1 | lalala |
| 2 | Mr.Li |
+----+----------+
5 rows in set (0.00 sec)
|
排错