在ECS上自建MySQL手工容灾环境

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 1.环境介绍 很多云上的客户因为数据库规模小,可能最开始只购买了ECS,而他们也需要数据库服务器,很可能会采用自建MySQL来实现。阿里云RDS已经提供了完全的数据库运维服务,包括监控、优化、主备高可用等。而对小白用户来说,为了自己业务连续性和学习的需要,也是很有必要了解如何自建MySQL主备的。

1.环境介绍
很多云上的客户因为数据库规模小,可能最开始只购买了ECS,而他们也需要数据库服务器,很可能会采用自建MySQL来实现。阿里云RDS已经提供了完全的数据库运维服务,包括监控、优化、主备高可用等。而对小白用户来说,为了自己业务连续性和学习的需要,也是很有必要了解如何自建MySQL主备以及主备切换流程的。在主从复制实施前,单机单实例缺乏实时数据复制方案来保证实例出现故障时提供另一个完好且独立的实例迅速切换,短时间内恢复客户业务。

2.数据库主从复制实施
2.1.主从复制原理
MySQL提供简单可靠的主从复制机制供用户使用,基本原理如下图所示,分三个步骤:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将改变反映它自己的数据。
mysql复制.jpg
2.2.主从复制规划
MySQL提供了主从复制组件,但是并不提供HA的自动监控切换。阿里集团内部有自研工具可以实现HA功能,开源组件keepalived + lvs也提供类似功能。这里我们提一个带SLB的方案,自动HA的实现留给读者去研究。假设我们有2个MySQL实例,一个实例为A,一个为B,我们考虑使用主从双向复制,即MM(Master-Master)的方案进行部署,前端挂给SLB,在同一个时刻,SLB只设置一个主用的实例权重为100,另一个备用实例权重为0,且将该实例的read_only参数打开。在发生故障时,将备用实例的权重设成100,主用实例设成0,这样通过SLB来实现手工的HA处理。对应用来说,将出现短时间(1-2分钟)的不可用,当SLB的切换完成后,应用通过连接池的重连机制,能重新恢复业务。
2.3.主从复制实施
(1) 生产实例在一个已经存在的ECS上已经准备好,申请一个新的ECS,保证该ECS不与生产实例的ECS在同一个物理机NC。如果生产实例的MySQL是安装在系统盘,可以从系统盘创建快照后打镜像,新ECS依旧该自定义镜像进行创建,这样可以省略步骤
(2) 在新的ECS上安装配置MySQL,尽可能保证配置与生产实例完全一致;
(3) 编辑生产实例的的/etc/my.cnf文件,加入如下内容:
log-bin=/home/mysql/log/mysql-bin
server_id=1241823306
binlog_cache_size=32K
max_binlog_cache_size=2G
max_binlog_size=500M
binlog-format=ROW
sync_binlog=1
log-slave-updates=1
expire_logs_days=0
以上内容重点配置binlog,除server_id需要修改成IP地址后两位+端口号以外,其他直接复制。比如示例中的3017441834的含义就是该mysql所在服务器IP地址为:*.*.124.182,mysql占用的端口是3306。
同时,需要保证/home/mysql/log目录存在,mysql的起停用户必须拥有对该目录的权限。
(4) 快速重启MySQL生产实例,然后登录mysql查看配置是否生效。
mysql数据库都支持下面语句来停止实例:
mysqladmin -h127.0.0.1 -uroot -P3306 shutdown
查看配置生效与否采用类似下列的语句进行检查:
show variables like ’ log-bin%’
(5) 如果配置在生产实例生效,同样的操作请在备用实例也操作一遍;
(6) 执行flush tables with read lock锁定生产实例;
(7) 将生产实例的数据同步到备用实例,至少有两种方案:对于生产实例与备用实例部署完全一样的,可以直接将datadir目录下所有文件和目录远程复制到备用实例。对于生产实例和备用实例部署并不相同的,可以采用mysqldump将生产实例数据按DB导出,然后再导入到备用实例中。整个过程生产实例不能解锁;
(8) 解锁生产实例:unlock tables;
(9) 查询生产实例的master状态,记录下来binlog日志文件名以及对应的position编号;
(10) 在备用实例执行以下语句:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 10000;
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
grant replication slave,replication client on . to repuser@'%'identified by 'repuser';
这里,默认repuser的密码也是repuser,但是mysql5.7版本的强制要求,密码复杂度必须比较高,所以密码需要设置成复杂密码。
change master to master_host='生产实例IP',master_port=3306(生产实例端口),master_user='repuser',master_password='repuser', master_log_file=’步骤9记录下的binlog文件名’, master_log_pos=’步骤9记录下的binlog position编号’;
(11) 启动备用实例slave,从生产实例复制数据。执行:start slave
(12) 检查备用实例slave状态:show slave status \G;重点看两个参数:
Slave_IO_Running和Slave_SQL_Running,如果这两个参数值都为yes。则配置正确,已经开始复制;
(13) 接下来配置从备用实例到生产实例的反向数据复制,在备用实例检查master状态:show master status;同样记录下binlog文件名和位点信息;
(14) 在生产实例重复步骤10-12完成反向复制配置。
(15) 结合SLB进行业务测试,观察生产实例的数据是否实时同步到备用实例;
(16) 最后需要向所有实例的/etc/my.cnf文件添加以下内容:
rpl_semi_sync_master_enabled=ON
rpl_semi_sync_slave_enabled=ON
同时,我们将备用实例设成只读状态:
set global read_only=1
3.灾备切换流程
灾备切换流程.jpg
流程图里A实例代表生产实例,实例B代表备用实例。
(1) 当A实例发生故障时,首先考虑重启或者修复A,如果在短时间(30分钟内)实例A能正常启动,且启动日志和业务侧检查没有问题,那么证明业务恢复正常,紧急处理成功;
(2) 如果实例A紧急重启成功,但是发现日志中有报错,请分析日志报错,判断问题的影响范围和大小,以决定忽略报错或者修复报错。如果在30分钟内完成,依然可以认为业务成功恢复;
(3) 如果紧急重启实例A成功,日志中的报错无法在30分钟内修复,那么我们启动切换流程。即:
将备用实例可读可写打开:set global read_only=0
在SLB将A实例的权重从100调成0,将B实例的权重从0调成100。保证业务先恢复起来;
(4) 实例B升成主实例对外提供服务时,我们在后台尽快想办法修复A实例,如果A实例修复成功,检查BA两个实例之间的复制关系是否正常,如果复制恢复正常,我们的紧急处理结束;
(5) 如果实例B生成主实例对外提供服务时,尽管我们修复了实例A。但是两个实例间的复制关系无法再恢复正常,请根据2.3节中的步骤重新配置主从复制;
(6) 如果实例A在发生故障时完全无法恢复,比如ECS已经不能启动。那么直接进入切换流程,将实例B升级成主实例。然后在后台紧急处理和恢复原来的A实例。

4.MySQL同步失败修复
4.1.同步初始化失败
在从库上面执行:show slave status\G;
正常情况:
复制情况.png
错误情况:有NO出现。
修复方式:
在主库上面执行:
Reset master;
在从库上面执行:
Stop slave;
Reset slave;
Change master to master_host='10.101.3.10',master_port=3301,master_user='repuser',master_password='repuser',master_auto_position=1;
4.2.同步了部分数据中断
在从库上面执行 show slave status\G;
例如:
复制出错.png
对于Slave_SQL_Running: No 的情况可以做如下处理:
在从库上面执行:
slave stop;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
slave start;
然后通过show slave status\G; 检查是否有两个YES。

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
监控 安全 Linux
RHEL 环境下 Subversion 服务器部署与配置
【10月更文挑战第18天】在RHEL环境下部署Subversion服务器需依次完成安装Subversion、创建版本库、配置服务器、启动服务、客户端连接及备份维护等步骤。确保遵循安全最佳实践,保障数据安全。
|
2月前
|
SQL 机器学习/深度学习 分布式计算
大数据-81 Spark 安装配置环境 集群环境配置 超详细 三台云服务器
大数据-81 Spark 安装配置环境 集群环境配置 超详细 三台云服务器
63 1
|
20天前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
43 3
|
20天前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
32 3
|
27天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
71 1
|
2月前
|
安全 Linux 数据安全/隐私保护
RHEL 环境下 Subversion 服务器部署与配置
【10月更文挑战第17天】在RHEL环境下部署Subversion服务器包括安装Subversion、创建和配置版本库、启动服务器、客户端连接以及备份与恢复等步骤。通过这些步骤,可确保服务器的安全性和稳定性,满足版本控制需求。
|
2月前
|
网络安全 虚拟化 Docker
SSH后判断当前服务器是云主机、物理机、虚拟机、docker环境
结合上述方法,您可以对当前环境进行较为准确的判断。重要的是理解每种环境的特征,并通过系统的响应进行综合分析。如果在Docker容器内,通常会有明显的环境标志和受限的资源视图;而在云主机或虚拟机上,虽然它们也可能是虚拟化的,但通常提供更接近物理机的体验,且可通过硬件标识来识别虚拟化平台。物理机则直接反映硬件真实信息,较少有虚拟化痕迹。通过这些线索,您应该能够定位到您所处的环境类型。
39 2
|
2月前
|
IDE 网络安全 开发工具
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
本文介绍了如何在PyCharm专业版中连接远程服务器并配置远程Python环境解释器,以便在服务器上运行代码。
348 0
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
62 3
|
2月前
|
Oracle 关系型数据库 MySQL
Mysql(1)—简介及Windows环境下载安装
MySQL 是一个流行的关系型数据库管理系统(RDBMS),基于 SQL 进行操作。它由瑞典 MySQL AB 公司开发,后被 Sun Microsystems 收购,现为 Oracle 产品。MySQL 是最广泛使用的开源数据库之一,适用于 Web 应用程序、数据仓库和企业应用。
55 2