[MGR——Mysql的组复制之多主模式 ] 详细搭建部署过程

组复制可以在两种模式下运行。

1.在单主模式下,组复制具有自动选主功能,每次只有一个 server成员接受更新。
2.在多主模式下,所有的 server 成员都可以同时接受更新.

组复制与异步主从复制区别.

1.传统mysql主从复制,是在主节点执行和提交事务,然后把他们异步的发送到从节点,行复制的重新执行主节点的SQL语句,这是一个 shared-nothing 的系统,默认情况下所有 server 成员都有一个完整的数据副本。

2.半同步复制,它在协议中添加了一个同步步骤。 这意味着主节点在提交时需要等待从节点确认它已经接收到事务。只有这样,主节点才能继续提交操作。

3.MySQL 组复制实现了基于复制协议的多主更新。
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 组复制提供了高可用性,高弹性,可靠的 MySQL 服务。

MGR的限制

仅支持InnoDB表,并且每张表一定要有一个主键,用于做write set的冲突检测;

必须打开GTID特性,二进制日志格式必须设置为ROW,用于选主与write set

COMMIT可能会导致失败,类似于快照事务隔离级别的失败场景

目前一个MGR集群最多支持9个节点

不支持外键于save point特性,无法做全局间的约束检测与部分部分回滚

二进制日志不支持binlog event checksum


下面展示,Mysql组复制之多主模式

 

安装mysql 5.7.18

 

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

cat /etc/hosts

192.168.1.88  mgr88

192.168.1.89  mgr89

192.168.1.90  mgr90

server*:

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


server* (88,89,90)

[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
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 = 20000
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

#--------------------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 =88 #每个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

my.cnf

server88:

mysql>SET GLOBAL group_replication_bootstrap_group=ON;

#这句只有server88,在第一次执行引导组的时候执行.

mysql>GRANT REPLICATION SLAVE ON *.* TO ‘repl‘@‘192.168.%‘ IDENTIFIED BY ‘repl‘;

Query OK, 0 rows affected, 1 warning (0.00 sec)

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)

mysql> START GROUP_REPLICATION;

Query OK, 0 rows affected (1.32 sec)

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

+---------------------------+--------------------------------------+-------------+-------------+--------------+

1 row in set (0.05 sec)

配置 group_replication_recovery 通道的恢复凭据

server 89,90:

mysql> CHANGE MASTER TO MASTER_USER=‘repl‘,MASTER_PASSWORD=‘repl‘ FOR CHANNEL ‘group_replication_recovery‘;

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)

mysql> START GROUP_REPLICATION;

Query OK, 0 rows affected (4.02 sec)

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)

检验

 

1: server88、89、90(分别创建test1、test2和test3,t1、t2、t3测试)

mysql> create database test;
Query OK, 1 row affected (0.15 sec)

mysql> use test;
Database changed

mysql>  CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 varchar(20));

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)

在server89,90 可以看见组复制,同步过来的数

可以在performance_schema中看见组成员

 

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

 


(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)

 

 

排错

1:没有设置白名单网段:需要添加自己所在网段.

报错:‘[GCS] The member is leaving a group without being on one.‘

解决: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"; START GROUP_REPLICATION;

2:ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.1

解决方案:

根据提示打开group_replication_allow_local_disjoint_gtids_join选项,mysql命令行执行:

mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;

再次启动组复制

mysql> START GROUP_REPLICATION;

时间: 2024-10-11 06:53:48

[MGR——Mysql的组复制之多主模式 ] 详细搭建部署过程的相关文章

[MGR——Mysql的组复制之单主模式 ]详细搭建部署过程

1,关于MySQL Group Replication 基于组的复制(Group-basedReplication)是一种被使用在容错系统中的技术.Replication-group(复制组)是由能够相互通信的多个服务器(节点)组成的. 在通信层,Groupreplication实现了一系列的机制:比如原子消息(atomicmessage delivery)和全序化消息(totalorderingof messages). 这些原子化,抽象化的机制,为实现更先进的数据库复制方案提供了强有力的支持

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

组复制可以在两种模式下运行. 1.在单主模式下,组复制具有自动选主功能,每次只有一个 server成员接受更新.2.在多主模式下,所有的 server 成员都可以同时接受更新. 组复制与异步主从复制区别. 1.传统mysql主从复制,是在主节点执行和提交事务,然后把他们异步的发送到从节点,行复制的重新执行主节点的SQL语句,这是一个 shared-nothing 的系统,默认情况下所有 server 成员都有一个完整的数据副本. 2.半同步复制,它在协议中添加了一个同步步骤. 这意味着主节点在提

mysql的组复制

                                                     mysql的组复制 先说说数据库复制的各种形式 异步复制模式下,Master上执行事务产生 binlog,slave 通过连接 master 抓取 binlog 的内容接收到本地的 relaylog 上,然后 apply 对应的事务,产生 slave 服务器上自身的 binlog(由--log-slave-update 参数决定).流程图如下: 其次是半同步复制,流程图如下 异步复制模式下,

Mysql Group Replication 简介及单主模式组复制配置【转】

一 Mysql Group Replication简介 Mysql Group Replication(MGR)是一个全新的高可用和高扩张的MySQL集群服务. 高一致性,基于原生复制及paxos协议的组复制技术,以插件方式提供一致数据安全保证: 高容错性,大多数服务正常就可继续工作,自动不同节点检测资源征用冲突,按顺序优先处理,内置自动防脑裂机制: 高扩展性,自动添加移除节点,并更新组信息: 高灵活性,单主模式和多主模式.单主模式自动选主,所有更新操作在主进行:多主模式,所有server同时更

springmvc学习总结(二) -- maven+springmvc+spring+mybatis+mysql详细搭建整合过程讲解

@[email protected] 写在最前 之前分享过下面这几篇: mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(上)(附demo和搭建过程遇到的问题解决方法) mybatis学习笔记(六) -- maven+spring+mybatis从零开始搭建整合详细过程(下) springmvc学习笔记(一) -- 从零搭建,基础入门 这一篇,在这些练习的基础上,将它们整合在一起! 搭建步骤如下 一.新建maven项目,配置环境,测试是否配置成

MySQL组复制(4):配置多主模型的组复制

在这一篇,我演示的是如何配置MySQL组复制的多主模型(multi-primary).在配置上,多主模型的组复制和单主模型基本没区别. 本文仅为搭建和维护多主模型组复制抛块小砖,若对其间涉及的术语和理论有所疑惑,可参看: 单主模型相关内容的大长文:配置单主模型的组复制. 组复制的理论:MySQL组复制官方手册翻译. 使用组复制技术,必须要了解它的要求和局限性.见:组复制的要求和局限性. 1.组复制:单主和多主模型 MySQL组复制支持单主模型和多主模型,它们都能保证MySQL数据库的高可用. 单

MySQL 半同步复制模式说明及配置示例 - 运维小结

MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二进制日志写入binlog文件之后就返回客户端结果,不会考虑二进制日志是否完整传输到从服务器以及是否完整存放到从服务器上的relay日志中,这种模式一旦主服务(器)宕机,数据就可能会发生丢失. 异步模式是一种基于偏移量的主从复制,实现原理是: 主库开启binlog功能并授权从库连接主库,从库通过cha

MySQL组复制(1):组复制技术简介

1.MySQL高可用的背景 数据库的主从复制是一个很实用的功能,但如何保证它的高可用却是一件难事.实现MySQL主从复制高可用的工具,常见的有: (1).MMM:淘汰了,在一致性和高并发稳定性等方面有些问题. (2).MHA:有些人还在用,但也有些问题,也是趋于淘汰的MySQL主从高可用方案. (3).Galera:引领时代的主从复制高可用技术. (4).MariaDB Galera Cluster:MariaDB对Galera的实现. (5).PXC:Percona XtraDB Cluste

MySQL中间件之ProxySQL(15):ProxySQL代理MySQL组复制

返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.ProxySQL+组复制前言 在以前的ProxySQL版本中,要支持MySQL组复制(MGR,MySQL Group Replication)需要借助第三方脚本对组复制做健康检查并自动调整配置,但是从ProxySQL v1.4.0开始,已原生支持MySQL组复制的代理,在main库中也已提供mysql_group_replication_hostgroups表来控