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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 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。

相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4天前
|
开发框架 JavaScript 中间件
node+express搭建服务器环境
node+express搭建服务器环境
node+express搭建服务器环境
|
4天前
|
关系型数据库 MySQL 数据库
卸载云服务器上的 MySQL 数据库
卸载云服务器上的 MySQL 数据库
54 0
|
2天前
|
SQL 分布式计算 关系型数据库
实时计算 Flink版产品使用合集之MySQL CDC Connector是否需要在Flink服务器上单独部署
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
11 0
|
4天前
|
关系型数据库 MySQL Linux
服务器Linux系统配置mysql数据库主从自动备份
这是一个基本的配置主从复制和设置自动备份的指南。具体的配置细节和命令可能因您的环境和需求而有所不同,因此建议在操作前详细阅读MySQL文档和相关资源,并谨慎操作以避免数据丢失或不一致。
16 3
|
4天前
|
PyTorch TensorFlow 算法框架/工具
【科研入门】搭建与配置云服务器的论文环境
本文介绍了如何搭建云服务器并配置论文代码环境,以AutoDL平台为例。首先,租用服务器并选择符合代码需求的镜像版本,如Python 3.7、TensorFlow 1.15和PyTorch。接着,启动服务器进入终端,克隆项目代码并使用Conda创建隔离的环境安装所需包。如果需在Pycharm中工作,还需在Pycharm内创建相同环境。最后,根据项目配置安装Tensorflow和PyTorch,遇到缺失包时通过`pip install`补充。完成配置后,可克隆服务器以备后续使用。遇到版本不兼容问题,可调整Conda环境的Python版本。
48 1
【科研入门】搭建与配置云服务器的论文环境
|
4天前
|
数据安全/隐私保护 Windows
使用Serv-U FTP服务器共享文件,实现无公网IP环境下远程访问-2
使用Serv-U FTP服务器共享文件,实现无公网IP环境下远程访问
|
4天前
|
存储 网络协议 文件存储
使用Serv-U FTP服务器共享文件,实现无公网IP环境下远程访问-1
使用Serv-U FTP服务器共享文件,实现无公网IP环境下远程访问
|
4天前
|
弹性计算 关系型数据库 MySQL
|
4天前
|
Java 应用服务中间件 网络安全
如何配置一个公司服务器的环境
如何配置一个公司服务器的环境
9 0
|
4天前
|
弹性计算 安全 Java
阿里云服务器配置、(xshell)远程连接、搭建环境、设置安全组、域名备案、申请ssl证书
以下是内容的摘要: 在阿里云购买服务器并进行基本配置的步骤如下: 1. **准备工作**: - 注册阿里云账号:访问阿里云官网并注册新账号,输入用户名、手机号和验证码。 - 实名认证:在个人中心进行实名认证,建议选择企业实名,因为个人实名可能无法索取企业发票。

推荐镜像

更多