探索MySQL数据库的魔力:揭秘多主复制(MGR)的高效与可靠性
在当今的数字化时代,数据库作为信息存储和管理的核心,其性能和可靠性对于任何企业或个人开发者都至关重要。MySQL,作为一款开源的关系型数据库管理系统,凭借其出色的性能、丰富的功能和广泛的社区支持,已经成为众多开发者的首选。然而,随着数据量的爆炸性增长和业务的不断扩展,传统的单主复制模式已经难以满足现代应用对于高可用性和可扩展性的需求。在这样的背景下,MySQL Group Replication(
- 作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注
- 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元
- 个人主页:团儿.-CSDN博客
目录
前言:
在当今的数字化时代,数据库作为信息存储和管理的核心,其性能和可靠性对于任何企业或个人开发者都至关重要。MySQL,作为一款开源的关系型数据库管理系统,凭借其出色的性能、丰富的功能和广泛的社区支持,已经成为众多开发者的首选。
然而,随着数据量的爆炸性增长和业务的不断扩展,传统的单主复制模式已经难以满足现代应用对于高可用性和可扩展性的需求。在这样的背景下,MySQL Group Replication(MGR)应运而生,为MySQL数据库提供了全新的、基于组的高可用性和数据一致性解决方案。
MGR不仅实现了真正的多主复制,允许在多个节点上同时进行读写操作,还通过内置的故障检测和自动恢复机制,极大地提高了数据库的可靠性和可用性。此外,MGR还支持分布式架构,使得数据库能够轻松应对大规模的数据存储和访问需求。
本书/本章节将深入探讨MySQL Group Replication的架构、原理、配置以及运维实践,帮助读者全面了解和掌握这一强大的数据库复制技术。无论你是MySQL的初学者还是资深专家,都能从中获得宝贵的知识和经验,为你的数据库系统注入新的活力和可靠性。
正文:
一.MGR介绍
基于传统异步复制和半同步复制的缺陷——数据的一致性问题无法保证,MySQL官方在5.7.17版本正式推出组复制(MySQL Group Replication,简称MGR)。
由若干个节点共同组成一个复制组,一个事务的提交,必须经过组内大多数节点(N / 2 + 1)决议并通过,才能得以提交。
引入组复制,主要是为了解决传统异步复制和半同步复制可能产生数据不一致的问题。
组复制依靠分布式一致性协议(Paxos协议的变体),实现了分布式下数据的最终一致性,提供了真正的数据高可用方案。
二.基本配置
1. 创建用户,修改hosts
hostnamectl set-hostname mysql
useradd -M -s /sbin/nologin mysql
vim /etc/hosts
添加:
192.168.8.10 mysql
保存退出
2. 上传5.7.20软件到/usr/local解压
tar -zxvf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.20-linux-glibc2.12-x86_64/ /usr/local/mysql
3. 环境变量
vi /root/.bash_profile
末尾添加:
export PATH=$PATH:/usr/local/mysql/bin
保存退出
source /root/.bash_profile
mkdir -p /data/3306/data /data/3307/data /data/3308/data
4. 配置文件说明
配置示例:
cat > /data/3306/my.cnf << END
[mysqld]
user=mysql
datadir=/data/3306/data
basedir=/usr/local/mysql
port=3306
socket=/data/3306/mysql.sock
server_id=1
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=binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="22d56f7c-dfe5-4eb1-a21a-cf9c27e8d625"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="192.168.8.10:33061"
loose-group_replication_group_seeds="192.168.8.10:33061,192.168.8.10:33062,192.168.8.10:33063"
loose-group_replication_bootstrap_group=off
END
cat > /data/3307/my.cnf << END
[mysqld]
user=mysql
datadir=/data/3307/data
basedir=/usr/local/mysql
port=3307
socket=/data/3307/mysql.sock
server_id=2
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=binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="22d56f7c-dfe5-4eb1-a21a-cf9c27e8d625"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="192.168.8.10:33062"
loose-group_replication_group_seeds="192.168.8.10:33061,192.168.8.10:33062,192.168.8.10:33063"
loose-group_replication_bootstrap_group=off
END
cat > /data/3308/my.cnf << END
[mysqld]
user=mysql
datadir=/data/3308/data
basedir=/usr/local/mysql
port=3308
socket=/data/3308/mysql.sock
server_id=3
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=binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="22d56f7c-dfe5-4eb1-a21a-cf9c27e8d625"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="192.168.8.10:33063"
loose-group_replication_group_seeds="192.168.8.10:33061,192.168.8.10:33062,192.168.8.10:33063"
loose-group_replication_bootstrap_group=off
END
***组复制部分,配置文件介绍:
group_replication变量使用的loose-前缀是指示Server启用时尚未加载复制插件也将继续启动
transaction_write_set_extraction = XXHASH64
##指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
loose-group_replication_group_name="01e5fb97-be64-41f7-bafd-3afc7a6ab555"
##表示将加入或者创建的复制组命名为01e5fb97-be64-41f7-bafd-3afc7a6ab555
##可自定义(通过cat /proc/sys/kernel/random/uuid)
loose-group_replication_start_on_boot=off
##设置为Server启动时不自动启动组复制
loose-group_replication_local_address="192.168.8.10:33061"
##绑定本地的192.168.8.10及33061端口接受其他组成员的连接,IP地址必须为其他组成员可正常访问
loose-group_replication_group_seeds="192.168.8.10:33061,192.168.8.10:33062,192.168.8.10:33063"
##本行为告诉服务器当服务器加入组时,应当连接到192.168.8.10:33061,192.168.8.10:33062,192.168.8.10:33063
##这些种子服务器进行配置。本设置可以不是全部的组成员服务地址。
loose-group_replication_bootstrap_group = off
##配置是否自动引导组
loose-group_replication_ip_whitelist=”10.30.0.0/16,10.31.0..0/16,10.27.0.0/16″
##配置白名单,默认情况下只允许192.168.8.10连接到复制组,如果是其他IP则需要配置。
5. 初始化数据,并启动数据库节点
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3308/data
chown -R mysql.mysql /data
mysqld_safe --defaults-file=/data/3306/my.cnf &
mysqld_safe --defaults-file=/data/3307/my.cnf &
mysqld_safe --defaults-file=/data/3308/my.cnf &
6. 3306节点加入GR
创建复制用户:
mysql -S /data/3306/mysql.sock
set sql_log_bin=0;
grant replication slave,replication client on *.* to repl@'localhost' identified by '123';
grant replication slave,replication client on *.* to repl@'127.0.0.1' identified by '123';
grant replication slave,replication client on *.* to repl@'192.168.8.%' identified by '123';
flush privileges;
SET SQL_LOG_BIN=1;
注:如果为三台独立节点,需要将localhost、127.0.0.1和远程主机域都授权用户
开启分布式复制:
change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
加载GR插件:
install plugin group_replication soname 'group_replication.so';
show plugins;
启动复制程序:
set global group_replication_bootstrap_group=ON;
start group_replication;
检测组是否创建并已加入新成员:
select * from performance_schema.replication_group_members;
7. 3307加入GR:
创建复制用户
mysql -S /data/3307/mysql.sock
set sql_log_bin=0;
grant replication slave,replication client on *.* to repl@'localhost' identified by '123';
grant replication slave,replication client on *.* to repl@'127.0.0.1' identified by '123';
grant replication slave,replication client on *.* to repl@'192.168.8.%' identified by '123';
flush privileges;
SET SQL_LOG_BIN=1;
注:如果为三台独立节点,需要将localhost、127.0.0.1和远程主机域都授权用户
开启分布式复制
change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
加载GR插件
install plugin group_replication soname 'group_replication.so';
show plugins;
启动复制程序
start group_replication;
#检测组是否创建并已加入新成员
select * from performance_schema.replication_group_members;
注: 前面的用户密码修改和创建用户操作必须设置binlog不记录,执行后再打开,否则会引起START GROUP_REPLICATION执行报错:
ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.
解决方案是:
根据提示打开group_replication_allow_local_disjoint_gtids_join选项,mysql命令行执行:
mysql> set global group_replication_allow_local_disjoint_gtids_join=ON;
mysql> start group_replication;
8. 3308加入GR
创建复制用户
mysql -S /data/3308/mysql.sock
set sql_log_bin=0;
grant replication slave,replication client on *.* to repl@'localhost' identified by '123';
grant replication slave,replication client on *.* to repl@'127.0.0.1' identified by '123';
grant replication slave,replication client on *.* to repl@'192.168.8.%' identified by '123';
flush privileges;
set sql_log_bin=1;
开启分布式复制
change master to master_user='repl',master_password='123' for channel 'group_replication_recovery';
加载GR插件
install plugin group_replication soname 'group_replication.so';
show plugins;
启动复制程序
start group_replication;
#检测组是否创建并已加入新成员
select * from performance_schema.replication_group_members;
网络限制:
MGR 组通信引擎目前仅支持 IPv4 网络,并且对节点间的网络性能要求较高,低延迟、高带宽的网络是部署 MGR 集群的基础。
MGR 忽略表锁和命名锁,在 MGR 中 lock tables 、 unlock tables 、 get_lock 、 release_lock 等这些表锁和命名锁将被忽略。
MGR 多主模式中,默认不支持 SERIALIZABLE 隔离级别。
多主模式下,对同一个对象进行并发的有冲突的ddl 和 dml 操作导致这种冲突在部分成员节点中无法检测到,最终可能导致数据不一致。
多主模式下,不支持级联约束的外键,可能造成有冲突的操作无法检测。
不支持超大事务。
多主模式下可能导致死锁,比如select ...for update 在不同节点执行,由于多节点锁无法共享,很容易导致死锁。
不支持复制过滤,如果有节点设置了复制过滤,将影响节点间决议的达成。
MGR 最多支持 9 个节点,大于 9 个节点,将拒绝新节点的加入。
期待您的关注~
更多推荐
所有评论(0)