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

在这一篇,我演示的是如何配置MySQL组复制的多主模型(multi-primary)。在配置上,多主模型的组复制和单主模型基本没区别。

本文仅为搭建和维护多主模型组复制抛块小砖,若对其间涉及的术语和理论有所疑惑,可参看:

使用组复制技术,必须要了解它的要求和局限性。见:组复制的要求和局限性

1.组复制:单主和多主模型

MySQL组复制支持单主模型和多主模型,它们都能保证MySQL数据库的高可用。

  1. 单主模型下:

    • 只有一个主节点,该主节点负责所有的写操作,其他节点作为slave节点提供读取服务(会自动设置为read-only)。
    • 在主节点故障,单主模型会自动选举新的主节点。选举后,剩余节点将指向该节点。但是,客户端还是会有部分请求路由到故障的主节点上,因此需要想办法解决这样的问题。这不是MySQL该考虑解决的问题,而是客户端应用程序、数据库中间件(常见的:ProxySQL、MySQL Router、mycat、amoeba、cobar等)该解决的问题。
    • 只要非自愿离组的故障节点(自愿、非自愿离组,请参见配置单主模型的组复制)不超过大多数,组复制就不会被阻塞。
  2. 多主模型下:
    • 没有master和slave的概念。所有的节点都可以读、写数据。
    • 因为所有节点都能提供读写服务,所以性能较之单主模型要好一些。
    • 配置多主模型的工作方式,比单主模型的限制更多。
    • 节点非自愿故障后,除了影响一点性能,不会对组复制造成影响。除非故障的节点数过多,使得剩余在线节点达不到"大多数"的要求。

2.单主和多主模型配置文件的区别

以下是单主模型组复制的配置文件:

[mysqld]
datadir=/data
socket=/data/mysql.sock

server-id=100                      # 必须
gtid_mode=on                       # 必须
enforce_gtid_consistency=on        # 必须
log-bin=/data/master-bin           # 必须
binlog_format=row                  # 必须
binlog_checksum=none               # 必须
master_info_repository=TABLE       # 必须
relay_log_info_repository=TABLE    # 必须
relay_log=/data/relay-log          # 必须,如果不给,将采用默认值
log_slave_updates=ON               # 必须
sync-binlog=1                      # 建议
log-error=/data/error.log
pid-file=/data/mysqld.pid

transaction_write_set_extraction=XXHASH64         # 必须
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"  # 必须
loose-group_replication_start_on_boot=off        # 建议设置为OFF
loose-group_replication_member_weigth = 40   # 非必需,mysql 5.7.20才开始支持该选项
loose-group_replication_local_address="ABCDEFGHIJK"   # 必须,下一行也必须
loose-group_replication_group_seeds="abcdefg"

其中每一行什么意思,我在单主模型组复制中做了非常详细的解释。

多主模型和单主模型的配置文件基本相同,除了需要加入:

group_replication_enforce_update_everywhere_checks=ON  # 非必需,但强烈建议
group_replication_single_primary_mode=OFF  # 必须,表示关闭单主模型,即使用多主

需要注释权重行,因为多主模型下没有master的概念,所以无需选举的权重值。

# loose-group_replication_member_weigth = 40

此外,除非业务依赖于默认的repeatable read,否则建议将事务隔离级别设置为read committed,且不能设置为serializable级别(强制要求)。所以,如果允许,还可以加上:

tx_isolation = 'read-committed' 

3.配置多主模型

本文打算配置5个节点的多主模型复制组。

具体环境细节如下:

节点名称 系统版本 MySQL版本 客户端接口(eth0) 组内通信接口(eth0) 数据状态
s1 CentOS 7 MySQL 5.7.22 192.168.100.21 192.168.100.21 全新实例
s2 CentOS 7 MySQL 5.7.22 192.168.100.22 192.168.100.22 全新实例
s3 CentOS 7 MySQL 5.7.22 192.168.100.23 192.168.100.23 全新实例
s4 CentOS 7 MySQL 5.7.22 192.168.100.24 192.168.100.24 全新实例
s5 CentOS 7 MySQL 5.7.22 192.168.100.25 192.168.100.25 全新实例

每个节点向外提供MySQL服务和组内通信都使用同一个接口。

1.修改主机名,添加DNS解析。

因为组内每个节点都使用主机名进行解析其他成员的地址,所以必须配置好主机名,并保证每个节点都能正确解析主机名。

在s1上执行:

hostnamectl set-hostname s1.longshuai.com
hostnamectl -H 192.168.100.22 set-hostname s2.longshuai.com
hostnamectl -H 192.168.100.23 set-hostname s3.longshuai.com
hostnamectl -H 192.168.100.24 set-hostname s4.longshuai.com
hostnamectl -H 192.168.100.25 set-hostname s5.longshuai.com

cat >>/etc/hosts<<eof
    192.168.100.21 s1.longshuai.com
    192.168.100.22 s2.longshuai.com
    192.168.100.23 s3.longshuai.com
    192.168.100.24 s4.longshuai.com
    192.168.100.25 s5.longshuai.com
eof

scp /etc/hosts 192.168.100.22:/etc
scp /etc/hosts 192.168.100.23:/etc
scp /etc/hosts 192.168.100.24:/etc
scp /etc/hosts 192.168.100.25:/etc

2.提供配置文件。

以下是s1节点配置文件。

[mysqld]
datadir=/data
socket=/data/mysql.sock

server-id=100                      # 必须
gtid_mode=on                       # 必须
enforce_gtid_consistency=on        # 必须
log-bin=/data/master-bin           # 必须
binlog_format=row                  # 必须
binlog_checksum=none               # 必须
master_info_repository=TABLE       # 必须
relay_log_info_repository=TABLE    # 必须
relay_log=/data/relay-log          # 必须,如果不给,将采用默认值
log_slave_updates=ON               # 必须
sync-binlog=1                      # 建议
log-error=/data/error.log
pid-file=/data/mysqld.pid

tx_isolation = 'read-committed'   # 建议项

transaction_write_set_extraction=XXHASH64         # 必须
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"  # 必须
loose-group_replication_enforce_update_everywhere_checks=ON  # 非必需,但强烈建议
loose-group_replication_single_primary_mode=OFF  # 必须,关闭单主模型,即使用多主
loose-group_replication_start_on_boot=off        # 建议设置为OFF
loose-group_replication_local_address="192.168.100.21:20001"   # 必须
# 下一行也必须,这里我将所有节点都添加到种子节点列表中
loose-group_replication_group_seeds="192.168.100.21:20001,192.168.100.22:20002,192.168.100.23:20003,192.168.100.24:20004,192.168.100.25:20005"

s2、s3、s4和s5节点的配置文件和s1类似,但server_idloose-group_replication_local_address必须改成各节点对应的值。

s2的配置(未包括和s1相同的配置):

server_id=110
loose-group_replication_local_address="192.168.100.22:20002"

s3的配置(未包括和s1相同的配置):

server_id=120
loose-group_replication_local_address="192.168.100.23:20003"

s4的配置(未包括和s1相同的配置):

server_id=130
loose-group_replication_local_address="192.168.100.24:20004"

s5的配置(未包括和s1相同的配置):

server_id=140
loose-group_replication_local_address="192.168.100.25:20005"

配置结束后,启动mysqld实例。

systemctl start mysqld

3.创建复制用户,并设置恢复通道"group_replication_recovery"。

我这里将s1作为组内的第一个节点。所以只需在s1上创建复制用户即可,以后其他节点加入组时,会将该操作复制走。

在s1上执行:

mysql> create user [email protected]'192.168.100.%' identified by '[email protected]!';
mysql> grant replication slave on *.* to [email protected]'192.168.100.%';

设置恢复阶段的异步复制通道:

在s1上执行:

mysql> change master to
            master_user='repl',
            master_password='[email protected]!'
            for channel 'group_replication_recovery';

注意:后面的操作中,如果没有明确指定在s2、s3、s4和s5上执行,那么都是在s1上执行的。有些操作是不允许在多个节点上都执行的。

4.在s1上安装组复制插件,并引导创建复制组。

安装组复制插件,在s1上执行:

mysql> install plugin group_replication soname 'group_replication.so';

以s1节点组的引导节点,在s1上执行:

mysql> set @@global.group_replication_bootstrap_group=on;
mysql> start group_replication;
mysql> set @@global.group_replication_bootstrap_group=off;

执行完上面的语句后,本实验所需的复制组就已经被节点s1创建了。以后s2-s5节点就可以陆续地加入到组中。

在其他节点加组之前,先看下组中的节点s1是否已ONLINE。

mysql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: a659234f-6aea-11e8-a361-000c29ed4cf4
 MEMBER_HOST: s1.longshuai.com
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE

5.向组中加入新节点:s2、s3、s4、s5。

在s2、s3、s4和s5上都执行:

change master to
            master_user='repl',
            master_password='[email protected]!'
            for channel 'group_replication_recovery';

install plugin group_replication soname 'group_replication.so';

然后依次在s2、s3、s4和s5上执行下面的语句开启组复制功能,开启该功能后,将自动加入到组中。但注意,要依次执行,在每个start语句返回成功后再去下一个节点执行:

start group_replication;

6.查看组中成员s1、s2、s3、s4、s5是否全都ONLINE。

在任意一个节点上执行:

mysql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: 22e55db0-7604-11e8-b72d-000c29b06c3c
 MEMBER_HOST: s5.longshuai.com
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: a5165443-6aec-11e8-a8f6-000c29827955
 MEMBER_HOST: s2.longshuai.com
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 3. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: a659234f-6aea-11e8-a361-000c29ed4cf4
 MEMBER_HOST: s1.longshuai.com
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 4. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: ba505889-6aec-11e8-a864-000c29b0bec4
 MEMBER_HOST: s3.longshuai.com
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
*************************** 5. row ***************************
CHANNEL_NAME: group_replication_applier
   MEMBER_ID: bf12fe97-6aec-11e8-a909-000c29e55287
 MEMBER_HOST: s4.longshuai.com
 MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
5 rows in set (0.00 sec)

4.测试多主模型的写负载

多主模型下,所有节点都可以进行读、写操作。但请注意,组复制的几个要求:表必须为innodb表(虽然创建myisam表不报错,但修改数据会报错)、每个表必须有主键、不能有级联的外键等。

在任意节点上执行以下写操作进行测试:

create database mut_gr;
create table mut_gr.t1(id int primary key);
insert into mut_gr.t1 values(1),(2),(3),(4);

在任意节点上继续执行写操作:

insert into mut_gr.t1 values(5);

查看数据是否都已同步到各节点上。

5.更多组复制维护的操作

关于组复制更多维护操作,比如如何重启组、如何安全退组、如何重新加组等等,还是请参看单主模型的组复制,它们的维护是类似的,所以本文就不对重复内容做赘述了。

原文地址:https://www.cnblogs.com/f-ck-need-u/p/9215013.html

时间: 2024-10-06 12:39:12

MySQL组复制(4):配置多主模型的组复制的相关文章

mysql学习-mysql8.0配置双主复制+keepalived实现高可用架构

一般小型公司数据库,使用主从复制即可保证数据库的高可用,但是一旦主数据库故障,切换到从库需要一定的时间,这样就导致了停机时间过长,不能及时恢复业务.使用双主(master)配合keepalived这种mysql高可用架构也是基于主从复制的原理而搭建的.这是一种简单.便捷的解决方案,在高可用集群环境中,keepalived使用vip,利用keepalived自带的服务监控功能和自定义脚本来实现mysql故障时自动切换. 1.mysql双主复制介绍 双主复制,就是相互做主从复制,每个master既是

修改 MySQL 数据库文件夹的属主和属组操作

一般情况下,在数据库迁移的时候,我喜欢把数据库文件夹进行压缩,然后再传输,这样比较简单快捷. 但是在把数据库上传到新的数据库服务器的时候,发现数据库文件夹的属主和属组发生变化了,变成了 root,需要修改为 mysql,如何操作呢? 比如修改名称为 hncg 的数据库的属主和属组,通过如下命令即可实现: chown -R mysql:mysql /zls/server/mysql/data/hncg 就这么简单,这样就可以把属主和属组修改为 mysql 了. chown 的使用格式如下: cho

MySQL数据库的主从配置(多主对一从)

一.实验环境部署 主服务器 192.168.18.42 端口3306  ==> 从服务器 192.168.18.44 端口 3306    主服务器 192.168.18.43 端口3306  ==> 从服务器 192.168.18.44 端口 3307 ##数据库,已经安装mysql服务,安装部分略.从服务器上的多个mysql实例,请看另一篇帖子<用mysql_multi 实现一台机器跑多台mysql > 二.部署服务器 1.在两台主服务器上赋予从机权限,有多台丛机,就执行多次(

实现MySQL主从复制、双主模型的简单案例

写在前面:如果此文有幸被某位朋友看见并发现有错的地方,希望批评指正.如有不明白的地方,愿可一起探讨. MySQL复制的基本原理 MySQL复制解决的基本问题 让一台MySQL服务器的数据与其他MySQL服务器的数据保持同步. MySQL复制的工作原理 MySQL复制的工作原理图如下所示(图来自高性能MySQL第3版) MySQL主从复制的基本步骤: 1.启动主库上的二进制文件,并把数据更改记录到二进制日志中: 2.备库将主库上的二进制日志复制到自身的中继日志中: 3.备库读取自身的中继日志中的事

Keepalived+MariaDB10配置双主高可用数据库

Keepalived+MariaDB10配置双主高可用数据库 OS RS 子网掩码 路由网关 Centos6.6 MariaDB10 Keepalived Eth0:192.168.26.210 255.255.252.0 192.168.25.3 VIP:192.168.27.210 255.255.255.252 Centos6.6 MariaDB10 Keepalived Eth0:192.168.26.211 255.255.252.0 192.168.25.3 VIP:192.168.

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

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

基于heartbeat v1配置mysql和httpd的高可用双主模型

一.配置高可用集群的前提:(以两节点的heartbeat为例) ⑴时间必须保持同步 ⑵节点之间必须用名称互相通信 建议使用/etc/hosts,而不要用DNS 集群中使用的主机名为`uname -n`表示的主机名: ⑶ping node(仅偶数节点才需要) ⑷ssh密钥认证进行无障碍通信: 二.heartbeat v1的配置 程序主配置文件:ha.cf 认证密钥:authkeys, 其权限必须为组和其它无权访问: 资源配置文件:haresources /usr/share/doc/heartbe

双主模型、SSL、percona-toolkit、MySQL复制概念深入

[减轻复制压力]复制过滤器,指定需要复制的白名单,或者需要忽略的黑名单 [[email protected] ~]# cd /etc/ [[email protected] etc]# cp my.cnf{,.master} [[email protected] etc]# ll my.cnf* -rw-r--r--. 1 root root 4686 10月 13 04:43 my.cnf -rw-r--r--. 1 root root 4686 10月 14 20:00 my.cnf.mas

MySQL建立双向主备复制server配置方法

1.环境描写叙述 serverA(主) 192.85.1.175 serverB(从) 192.85.1.176 Mysql版本号:5.1.61 系统版本号:System OS:ubuntu 10.10 X86 (系统安装及数据环境搭建,省略) 2. 创建同步用户: 在服务B命令行运行 : grant replication slave on *.* to 'replication'@'%' identified by 'mysqlsync'; flush privileges; grant F