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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
传统型负载均衡 CLB,每月750个小时 15LCU
简介: 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。

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
16天前
|
传感器 网络协议 物联网
手把手教你在 Windows 环境中搭建 MQTT 服务器
手把手教你在 Windows 环境中搭建 MQTT 服务器
|
9天前
|
关系型数据库 MySQL 应用服务中间件
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
这篇文章介绍了如何在Windows 7系统上搭建PHP、MySQL和Apache环境,并部署ECShop项目,包括安装配置步骤、解决常见问题以及使用XAMPP集成环境的替代方案。
22 1
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
|
12天前
|
关系型数据库 MySQL 网络安全
有关使用Navicat 无法成功连接腾讯云服务器上Mysql的问题解决
这篇文章提供了解决Navicat无法连接腾讯云服务器上MySQL问题的步骤,包括调整防火墙设置、更新MySQL权限和检查远程连接配置。
有关使用Navicat 无法成功连接腾讯云服务器上Mysql的问题解决
|
17天前
|
NoSQL 关系型数据库 MySQL
《花100块做个摸鱼小网站! 》第一篇—买云服务器和初始化环境
本文是技术博主summo分享的个人网站搭建教程。从选择阿里云免费试用或付费的云服务器开始,逐步介绍如何搭建网站所需的基础环境。作者选择了2核2G、3M固定带宽的配置,并使用CentOS 7.9 64位作为操作系统镜像。接着详细说明了JDK 8、Redis和MySQL 8.0的安装过程,包括配置与启动服务、设置远程访问等关键步骤。特别强调了阿里云安全组规则的重要性,确保服务器端口正确开放。通过本教程,即使是初学者也能跟随步骤轻松完成环境搭建,为后续的网站开发打下坚实的基础。
75 5
《花100块做个摸鱼小网站! 》第一篇—买云服务器和初始化环境
|
9天前
|
关系型数据库 MySQL Linux
在Linux中,如何配置数据库服务器(如MySQL或PostgreSQL)?
在Linux中,如何配置数据库服务器(如MySQL或PostgreSQL)?
|
2月前
|
缓存 运维 关系型数据库
数据库容灾 | MySQL MGR与阿里云PolarDB-X Paxos的深度对比
经过深入的技术剖析与性能对比,PolarDB-X DN凭借其自研的X-Paxos协议和一系列优化设计,在性能、正确性、可用性及资源开销等方面展现出对MySQL MGR的多项优势,但MGR在MySQL生态体系内也占据重要地位,但需要考虑备库宕机抖动、跨机房容灾性能波动、稳定性等各种情况,因此如果想用好MGR,必须配备专业的技术和运维团队的支持。 在面对大规模、高并发、高可用性需求时,PolarDB-X存储引擎以其独特的技术优势和优异的性能表现,相比于MGR在开箱即用的场景下,PolarDB-X基于DN的集中式(标准版)在功能和性能都做到了很好的平衡,成为了极具竞争力的数据库解决方案。
107540 33
|
13天前
|
关系型数据库 MySQL Linux
数据类型和运算符(MySQL服务器的安装,MySQL客户端,数据类型,运算符,MySQL的语法规范)
无论是对于初学者还是有经验的开发者,了解MySQL的安装、客户端使用、数据类型、运算符和语法规范都是至关重要的。这不仅有助于高效地管理和查询数据,而且对于设计和实现数据库解决方案来说是基础工作。通过深入学习和实践这些知识,您可以更好地发挥MySQL数据库的强大功能。
13 2
|
22天前
|
存储 关系型数据库 MySQL
"Linux环境下MySQL数据库名及表名大小写敏感性设置详解:从配置到影响,确保数据库操作的准确与高效"
【8月更文挑战第9天】在Linux环境中,MySQL数据库名及表名的大小写敏感性是一项重要配置。默认情况下,MySQL在Linux上区分大小写,但这可通过配置文件 `/etc/my.cnf` 中的 `lower_case_table_names` 参数调整。该参数设为0时,名称存储时保持原样,查询时不区分大小写;设为1则全部转换为小写。通过编辑配置文件并重启MySQL服务,可根据需求灵活控制名称的大小写敏感性,确保数据一致性和应用兼容性。
38 3
|
2月前
|
弹性计算 Ubuntu 开发工具
云服务器 ECS产品使用问题之如何在Docker环境中修改配置文件
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
|
29天前
|
存储 Unix 数据挖掘
服务器数据恢复—SAN环境下LUN Mapping出错导致文件系统一致性出错的数据恢复案例
服务器存储数据恢复环境: 一台存储中有一组由6块硬盘组成的RAID6,划分为若干LUN,MAP到不同业务的SOLARIS操作系统服务器上。 服务器存储故障: 由于业务变化需要增加一台服务器,在存储在线的状态下将该存储中的某个LUN映射到这台新增加的服务器上并开始初始化,不料映射的这个LUN已经MAP到其他SOLARIS服务器上了。由于该LUN已经进行了部分的初始化,磁盘报错,重启后发现卷无法挂载。

热门文章

最新文章

下一篇
云函数