MySQL高可用和灾备调研
1.高可用和灾备方案概览
高可用方案的评价以组件能正常对外提供服务为主,而灾备方案的评价以数据稳定同步和恢复时间尽量短为主,其他的还要求方案实现起来较简单,后期运维服务压力较小等。
当下业界比较流行的 mysql高可用灾备方案是主从复制和 galera,这里先对所有的方案进行简要介绍,然后详细介绍 基于主从复制这一种方案。
1.1 主从复制
使用双节点数据库,搭建单向或者双向的半同步复制(semi sync replication)。在 5.7以后的版本中,由于 lossless replication、logical多线程复制等一些列新特性的引入,使得 mysql原生半同步复制更加可靠。
优点:
- 架构比较简单,使用原生半同步复制作为数据同步的依据
- 双节点,没有主机宕机后的选主问题,直接切换即可
- 双节点,需求资源少,部署简单
缺点:
- 完全依赖于半同步复制,如果半同步复制退化为异步复制,数据一致性无法得到保证
- 需要额外考虑 haproxy、keepalived的高可用机制
1.2 MHA
MHA Manager会定时探测集群中的 master节点,当 master出现故障时,它可以自动将最新数据的 slave提升为新的 master,然后将所有其他的 slave重新指向新的 master,整个故障转移过程对应用程序完全透明。
优点:
- 可以进行故障的自动检测和转移;
- 可扩展性较好,可以根据需要扩展 mysql的节点数量和结构;
- 相比于双节点的 mysql复制,三节点/多节点的 mysql发生不可用的概率更低
缺点:
- 至少需要三节点,相对于双节点需要更多的资源;
- 逻辑较为复杂,发生故障后排查问题,定位问题更加困难;
- 数据一致性仍然靠原生半同步复制保证,仍然存在数据不一致的风险;
- 可能因为网络分区发生脑裂现象;
1.3 共享存储
SAN的概念是允许存储设备和处理器(服务器)之间建立直接的高速网络(与 LAN相比)连接,通过这种连接实现数据的集中式存储。
使用共享存储时,mysql服务器能够正常挂载文件系统并操作,如果主库发生宕机,备库可以挂载相同的文件系统,保证主库和备库使用相同的数据。
优点:
- 两节点即可,部署简单,切换逻辑简单;
- 很好的保证数据的强一致性;
- 不会因为 mysql的逻辑错误发生数据不一致的情况;
缺点:
- 需要考虑共享存储的高可用;
- 价格昂贵;
1.4 Galera
基于 Galera的 mysql高可用集群, 是多主数据同步的 mysql集群解决方案,使用简单,没有单点故障,可用性高。
优点:
- 多主写入,无延迟复制,能保证数据强一致性;
- 有成熟的社区,有互联网公司在大规模的使用;
- 自动故障转移,自动添加、剔除节点;
缺点:
- 需要为原生 mysql节点打 wsrep补丁
- 只支持 innodb储存引擎
- 至少三节点;
1.5 Paxos
Paxos 算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。这个算法被认为是同类算法中最有效的。Paxos与 mysql相结合可以实现在分布式的 mysql数据的强一致性。
优点:
- 多主写入,无延迟复制,能保证数据强一致性;
- 有成熟理论基础;
- 自动故障转移,自动添加、剔除节点;
缺点:
- 只支持 innodb储存引擎
- 至少三节点;
上面 5种方案只是介绍了其实现思路,并未描述实现细节,其中共享存储这种方案只适合用于做高可用,用于灾备不太合适。
下面将会详细介绍比较流行的主从复制方案的实现细节,所有步骤均在笔者的环境中验证通过,可以直接使用。
2.基于主从复制的高可用灾备方案
网上如何安装 mysql的文章非常多,这里就不做介绍了。
本方案选用的 mysq-5.7.36+ Keepalived-1.3.5。
方案架构如下(默认这两台服务器上都已安装了 mysql):
- 主库1:192.168.5.21
- 主库2:192.168.5.22
2.1 搭建 MySQL双主备份环境
第1步,修改主1(192.168.5.21)的 my.cnf文件
vim /etc/my.cnf# 内容如下
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid# 配置server-id 每个MySQL实例的server-id都不能相同
server-id=1
# MySQL的日志文件的名字
log-bin=mysql_master
# 作为从库时 更新操作是否写入日志 on:写入 其他数据库以此数据库做主库时才能进行同步
log-slave-updates=on# MySQL系统库的数据不需要同步 我们这里写了3个 更加保险
# 同步数据时忽略一下数据库 但是必须在使用use db的情况下才会忽略;如果没有使用use db 比如create user 数据还是会同步的
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
replicate-ignore-db=performance_schema
replicate-ignore-db=sys
# 使用通配符忽略MySQL系统库的表 这样在create user时也不会进行同步了
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=sys.%
# MySQL系统库的日志不计入binlog 这样更加保险了
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
第2步,修改主2(192.168.5.22)的 my.cnf文件
# 把主1上的配置文件复制到主2
scp /etc/my.cnf 192.168.5.12:/etc# 然后修改下面两个配置即可
# 配置server-id=2
server-id=2
# MySQL的日志文件的名字,这里主要为了区分
log-bin=mysql_slave
第3步,重启MySQL服务并开放防火墙 3306端口
systemctl restart mysqldfirewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload
第4步,配置主从
A.主(192.168.5.21),从(192.168.5.22):
先在主1(192.168.5.21)上执行下面的命令:
mysql -uroot -pqwer2022CREATE USER 'repl_master'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'abcd2022';
GRANT REPLICATION SLAVE ON *.* TO 'repl_master'@'%';
FLUSH PRIVILEGES;# 查看主节点状态
SHOW MASTER STATUS;
+---------------------+----------+--------------+-------------------------------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------------+----------+--------------+-------------------------------------------------+-------------------+
| mysql_master.000001 | 761 | | information_schema,mysql,performance_schema,sys | |
+---------------------+----------+--------------+-------------------------------------------------+-------------------+
这里看到 binlog的文件名称(mysql_master.000001)和位置(761),接下来在主2(192.168.5.22)上进行操作:
mysql -uroot -pqwer2022CHANGE MASTER TO MASTER_HOST='192.168.5.11',MASTER_PORT=3306,MASTER_USER='repl_master',MASTER_PASSWORD='abcd2022',MASTER_LOG_FILE='mysql_master.000001',MASTER_LOG_POS=761;
START SLAVE;# 查看从库的状态,这里可以看下结果里面有没有异常
SHOW SLAVE STATUS;
B.主(192.168.5.22),从(192.168.5.21):
先在主2(192.168.5.22)上执行下面的命令:
mysql -uroot -pqwer2022CREATE USER 'repl_slave'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'abcd2022';
GRANT REPLICATION SLAVE ON *.* TO 'repl_slave'@'%';
FLUSH PRIVILEGES;# 查看主节点状态
SHOW MASTER STATUS;
+---------------------+----------+--------------+-------------------------------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------------+----------+--------------+-------------------------------------------------+-------------------+
| mysql_slave.000001 | 759 | | information_schema,mysql,performance_schema,sys | |
+---------------------+----------+--------------+-------------------------------------------------+-------------------+
这里看到 binlog的文件名称(mysql_slave.000001)和位置(759),接下来在主1(192.168.5.21)上进行操作:
mysql -uroot -pqwer2022CHANGE MASTER TO MASTER_HOST='192.168.5.12',MASTER_PORT=3306,MASTER_USER='repl_slave',MASTER_PASSWORD='abcd2022',MASTER_LOG_FILE='mysql_slave.000001',MASTER_LOG_POS=759;
START SLAVE;# 查看从库的状态,这里可以看下结果里面有没有异常
SHOW SLAVE STATUS;
第5步,验证
在主1(192.168.5.21)上创建一个数据库,然后在主2(192.168.5.22)看是否同步过来,正常同步则成功,反之失败。
2.2 安装配置 Keepalived
注意:一定要确保 SELinux已关闭
第1步,安装 mysql-community-libs-compat
rpm -ivh mysql-community-libs-compat-5.7.36-1.el7.x86_64.rpm
第2步,安装 Keepalived
yum install keepalived,psmisc -y
第3步,配置 Keepalived
A.编辑主1(192.168.5.21)上的配置文件
vim /etc/keepalived/keepalived.conf# 内容如下
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addr#vrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0script_user rootenable_script_security
}vrrp_script chk_mysql {# 用于检测 mysql进程是否存在script "/usr/bin/killall -0 mysqld"interval 3fall 2
}vrrp_instance VI_1 {state MASTERinterface ens192 # 【注意】这个网卡 ens192请用 ip addr中的实际值virtual_router_id 51priority 101advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.5.198 # 【注意】这是一个虚拟IP,需要跟主机在同一个 IP段,且没有被别的机器使用}track_script {chk_mysql}
}
B.编辑主2(192.168.5.22)上的配置文件
把主1上修改过的配置文件复制到主2,然后修改下面几个配置项即可:
state BACKUP
interface ens192
# 数值越大优先级越高,从节点的数值要小于主节点的
priority 99
第4步,启动 Keepalived
systemctl start keepalived
# 查看虚拟IP是否已生效
ip addr
# 能看到这个 inet 192.168.5.198/32 scope global ens192即为正常
第5步,验证
使用一个 mysql的远程连接工具通过虚拟 IP(192.168.5.198)来连接 mysql,当关闭其中一个 mysql服务时,远程连接工具依旧能正常访问到 mysql服务即为正确。
3.总结
mysql 使用主从复制这种方案来实现高可用和灾备,操作简单且运行稳定,后期的运维压力也较小,应对普通的高可用或者灾备场景足矣。对于 Galera这种方案,适合于比较大规模的集群场景,且具有专业的运维人员参与才行。
MySQL高可用和灾备调研相关推荐
- 【软件工程】容错、高可用、灾备の辨析
容错.高可用.灾备 标题里面的三个术语,很容易混淆,专业人员有时也会用错. 本文就用图片解释它们有何区别. 容错 容错(fault tolerance)指的是, 发生故障时,系统还能继续运行. 飞机有 ...
- MySQL高可用之主备同步:电脑安装java步骤
结构化数据.非结构化数据与半结构化数据 文章的开始,聊一下结构化数据.非结构化数据与半结构化数据,因为数据特点的不同,将在技术上直接影响存储引擎的选型. 首先是结构化数据,根据定义结构化数据指的是由二 ...
- MySQL高可用之主备同步:javafor循环乘法表
前言 回顾这一年,我的付出终归是没有白费的!很快,今天是2021年了,激烈的金三银四已经没有多少日子就有上场了!所以今天,我挑选了"美团+字节+腾讯"等三家的一二三面问题,在此篇文 ...
- 从mysql高可用架构看高可用架构设计
高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间. 假设系统一直能够提供服务,我们说系统的可用性是100%.如果 ...
- MySQL 高可用架构在业务层面的应用分析
MySQL 高可用架构在业务层面的应用分析 http://mp.weixin.qq.com/s?__biz=MzAxNjAzMTQyMA==&mid=208312443&idx=1&a ...
- 一文详解 MySQL 高可用之 DRBD | 原力计划
作者 | wzy0623 责编 | 屠敏 出品 | CSDN 博客 大多数MySQL高可用解决方案都是基于MySQL自带的各种复制技术.本质上是将一个实例上的数据更新或事务,在其它实例上进行重放,从而 ...
- MySQL高可用之DRBD
目录 一.DRBD简介 1. 工作原理 2. DRBD 支持的底层设备 3. DRBD资源 4. DRBD 配置工具 5. DRBD与RAID1区别 6. DRBD与共享存储 二.DRBD安装配置 1 ...
- 没有执行此操作所需的足够可用空间。_一文详解 MySQL 高可用之 DRBD | 原力计划...
作者 | wzy0623责编 | 屠敏出品 | CSDN 博客大多数MySQL高可用解决方案都是基于MySQL自带的各种复制技术.本质上是将一个实例上的数据更新或事务,在其它实例上进行重放,从而完成数 ...
- MySQL高可用和读写分离
MySQL 高可用和读写分离 文章目录 MySQL 高可用和读写分离 一.从单机到集群 1.1 单机MySQL数据库到几个问题 1.2 单机MySQL到技术演进 二.MySQL的主从复制 2.1 核心 ...
最新文章
- flutter doctor --android-licenses 报错解决方案
- cesium 加载bim模型_构建统一CIM数字底盘,实现基于BIM的全流程管控
- python【数据结构与算法】树状数组(附例题)
- 机器人演唱邓丽君是真的吗_20年后,高科技让她与邓丽君终相逢
- Angular component的职责
- 结业考试笔记 2014中超联赛项目笔记 0327
- java list 去除 重复值
- 图像处理、语音处理的应用及前沿技术_自主知识产权的2微米级3D视觉相机应用于高精度和高反光物体的缺陷检测...
- 如何配置程序集的版本策略
- python logisticregression_Python机器学习sklearn LogisticRegression用户流失预测模型初探
- 为什么我的devc 调试不了c 语言,devc++为什么调试不了,求大神帮看看!
- Visual Object Classes Challenge 2012 (VOC2012) 简介
- UltraCompare破解流程
- Android播放音频到耳机,Android音乐播放模式切换-外放、听筒、耳机
- 互联网寒冬下如何过冬?厚积薄发还是直接开摆?我选这个
- centos 日志审计_CentOS7下安全审计工具Auditd的简单使用
- CSS | 关于Spirit
- 微信公众号推广技巧之一
- 51单片机auxr寄存器_AT89S51存储器的结构
- centos8使用podman搭建vulhub