一、MySQL组复制实现高可用原理

MySQL组复制(Group Replication)是MySQL提供的一种高可用性和高扩展性的解决方案,它通过以下机制来实现数据库的高可用性:

1.数据强一致性:

  组复制基于Paxos分布式一致性算法,确保数据在所有参与节点间的一致性和原子性。当一个事务在一个节点上提交成功后,只有当大多数节点确认该事务(称为多数派同意),事务才会被提交。这样即使有个别节点发生故障,数据的一致性仍然能得到保障。

2 自动故障转移

   在组复制中,如果当前的主节点(Primary节点)发生故障,组内的其他节点会自动进行选举,选出一个新的主节点来接管服务,这个过程对应用透明,确保了服务的连续性。这个机制依赖于Paxos算法中的领导者选举过程,确保在任何时刻都只有一个主节点在处理写请求。

3 故障检测:

   组复制内置了心跳机制和健康检查,能够及时检测到节点的加入、离开或故障。当检测到节点不可达时,会触发重新配置和可能的主节点切换,以维持服务的稳定运行

4 冲突解决:

    在分布式系统中,可能会出现并发写入导致的数据冲突,组复制通过冲突检测和解决机制确保数据的一致性。如果两个事务在不同节点上几乎同时提交并且冲突,那么其中一个事务会被标记为失败,需要重新执行。

5 灵活的节点管理

    组复制允许动态添加或移除节点,这意味着可以根据需要增加读副本以提高读取性能,或者在需要时移除节点进行维护,而不会中断服务。

6 透明的数据管理:

当一个新的节点加入组时,它可以自动从其他节点同步数据,实现快速的数据恢复和加入组的过程。综上所述,MySQL组复制通过一系列机制实现了高可用性,确保了在节点故障、网络分割等情况下数据库服务的连续性和数据的一致性,为用户提供了一个高度可靠的数据存储解决方案。

二、MySQL组复制主要步骤(单主模式官方推荐一主两从)

1.设置三台MySQL服务器3306端口能互通

2 配置文件的配置

2.1 主节点[mysqld]下方加入Replication、Multi-threaded Replication、Group Replication setting

2.2 从节点一和从节点二的配置与主节点的配置基本相同,只需要修改report_host server_id loose-group_replication_local_address

3.主库启动组复制

3.1 执行show plugins检查插件是否加载成功

3.2 初始化组复制(只在node1上执行)

set global group_replication_bootstrap_group=on;

start group_replication;

set global group_replication_bootstrap_group=off;

通过perfomance_schema.replication_group_members查看集群的节点信息。主要有member_id,member_host,member_port,member_state,member_role字段

3.3 创建复制用户

create user 'rpl_user'@'%' identified by 'rpl_passpass';

grant replication slave on *.*to 'rpl_user';

grant backup_admin on *.*to 'rpl_user';

3.4 配置恢复通道

change master to master_user='rpl_user', master_password='rpl_passpass' for channel 'group_replication_recovery';

4.添加节点从库一和二

添加节点只需两步:配置恢复通道和启动组复制

在节点从库一和二执行下面两条语句

change master to master_user='rpl_user', master_password='rpl_passpass' for channel 'group_replication_recovery';

start group_replication;

添加完毕后通过perfomance_schema.replication_group_members查看集群的节点信息。主要有member_id,member_host,member_port,member_state,member_role字段

分别在节点从库一和二执行执行查询主库表数据的语句看是否能读取到数据。

三、单主模式和多主模式

在多主模式下所有节点都是主节点(Primary)

1、单主模式和多主模式的区别:本质区别是多主模式会开启冲突检测。另外还有下面几个区别

部署方式,多主模式需额外设置以下两个参数

group_replication_single_primary_mode = OFF

group_replication_enforce_update_everywhere_checks = ON

2、read_only的设置

对于单主模式,组复制会自动将Secondary节点的super_read_only和read_only设置为ON

3、自增主键

在MySQL中自增主键的生成受两个参数的影响:auto_increment_offset(初始值)和auto_increment_increment(步长)。两个参数默认值均为1

多主模式下这两个参数则分别取自 server_id和group_replication_auto_increment_increment(默认为7)。在多主模式下server_id为1和8、2和9的会发生冲突

4、组复制的限制

乐观事务模型、验证阶段不会考虑间隙锁(gap lock)、表锁(lock table)和GET_LOCK操作


单主模式和多主模式的在线切换

在MySQL 8.0.13之前不支持在线调整集群模式。如果要调整,只能重启整个组复制。

#单主模式切换为多主模式

select group_replication_switch_to_multi_primary_mode();

#多主模式切换为单主模式

select group_replication_switch_to_single_primary_mode(member_uuid);

在执行这两个命令时,会同步修改group_replication_single_primary_mode和group_replication_enforce_update_everywhere_checks这两个参数的值,并持久化到mysqld-auto.cnf

可以通过以下命令查看切换进度

select event_name, work_completed, work_estimated from perfomance_schema.events_stages_current where event_name like "%stage/group_rpl%"\G

四、监控组复制

下面6个表用来监控组复制

replication_group_members  replication_group_member_stats

replication_connetction_status  replication_applier_status 

replication_applier_status_by_coordinator replication_applier_status_by_worker

五、单主模式下使用keepalived+VIP虚拟IP+检查主节点脚本来实现应用无缝连接主库。

参考链接

 mysql mgr模式 java连接 mysql mgr配置_mob6454cc788ee7的技术博客_51CTO博客


MySQL MHA(Master High Availability)是一套用于实现MySQL数据库高可用性的解决方案,由youshimaton开发,主要用于在主从复制架构中实现快速的故障切换和数据一致性保证。

MHA的设计目标是在30秒内完成故障切换,并在切换过程中尽可能保证数据的一致性。

MHA的原理MHA主要由两部分组成:

1. MHA Manager(管理节点):•这是一个独立的节点,负责监控MySQL主服务器的状态。•当检测到主服务器故障时,MHA Manager会发起故障切换流程。•它负责选择最佳的从服务器提升为主服务器,并通知其他从服务器切换到新的主服务器。

2. MHA Node(数据节点):•这个组件运行在每个MySQL服务器上,包括主服务器和从服务器。•MHA Node负责在故障切换期间对比和应用差异日志,以确保数据一致性。

部署MySQL MHA(Master High Availability)涉及多个步骤,以下是一个详细的部署流程,假设你已经在所有服务器上完成了基本的MySQL安装和主从复制的配置。

这里我们将使用三个MySQL服务器作为示例:一个主服务器和两个从服务器,以及一个单独的MHA Manager服务器。以下是具体的步骤:

1. 环境准备1.1 时间同步确保所有服务器的时间都同步,可以使用NTP来同步时间。1.2 SSH无密码登录配置MHA Manager能够无密码登录到所有的MySQL服务器。

2. MHA组件安装2.1 安装MHA Node在每个MySQL服务器上安装MHA Node组件。这通常涉及到编译和安装,或者使用预先构建好的包。例如,在RHEL/CentOS系统上可以使用以下命令:# 安装Perl依赖

yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes


# 下载MHA源码

wget https://github.com/youshimaton/mha4mysql/archive/master.zip


# 解压并进入目录

unzip master.zip

cd mha4mysql-master


# 安装Node组件

perl Makefile.PL

make && make install

2.2 安装MHA Manager在MHA Manager服务器上安装MHA Manager组件。同样,这可以通过编译源码或者使用预构建的包来完成:# 如果没有安装Perl依赖,执行相同的安装步骤

# ...


# 安装Manager组件

cd mha4mysql-master

perl Makefile.PL PREFIX=/usr/local

make && make install

bash3. 配置MHA3.1 配置MHA Manager在MHA Manager服务器上编辑app1.cnf文件,这个文件包含了MHA Manager的配置信息,包括MySQL服务器列表、SSH登录信息、数据目录等。[server]

hostname=192.168.1.x # 主服务器地址

port=3306

user=root

password=rootpass

basedir=/usr/local/mysql

datadir=/var/lib/mysql

logdir=/var/log/mysql

ssh_user=root

ssh_port=22

ssh_options=-o StrictHostKeyChecking=no

rpl_user=repl

rpl_password=replpass

3.2 配置MHA Node在每个MySQL服务器上编辑app1.conf文件,配置MHA Node。[server]

hostname=192.168.1.x # 服务器地址

port=3306

user=root

password=rootpass

basedir=/usr/local/mysql

datadir=/var/lib/mysql

logdir=/var/log/mysql

ini

4. 测试MHA4.1 测试SSH连接确认MHA Manager能够无密码登录到所有MySQL服务器。

4.2 测试故障切换在MHA Manager上运行mha_master_switch.pl脚本来模拟故障切换,确认MHA能够正确地选择新的主服务器并完成数据复制。

# 运行故障切换脚本

mha_master_switch.pl --conf=/etc/mha/app1.cnf --do-replication-check --do-stop-slave --do-check-replication-filters --do-diff-log --do-stop-master --do-start-slave --do-update-hosts --do-restart-masters --do-replicate-to-new-master --do-set-primary

5. 监控和维护5.1 设置监控使用监控工具如Nagios或Zabbix来监控MHA的状态。

5.2 定期维护定期检查MHA的日志,更新MHA和MySQL的版本,确保系统的稳定性和安全性。

请注意,以上步骤需要根据实际的环境进行调整,而且在生产环境中部署MHA前,应该在测试环境中充分测试和验证。此外,MHA的配置文件和具体命令可能会随着版本的不同而有所变化,因此在部署时请参照MHA的最新文档。

MHA的部署和配置相对复杂,需要仔细规划和测试,以确保在真正的故障切换中能够顺利运行。在部署MHA时,建议参考官方文档和社区的最佳实践,以确保配置的正确性和有效性。