vlambda博客
学习文章列表

MySQL双机热备及应用服务的自动切换

有些互联网公司一些重要的服务发布都会采用双机热备。使用两台甚至是多台服务器来互相备份,共同工作。选取其中一台服务器作为主机,一台或者多台服务器作为备用机。备用机实时检测到主机的异常信息,当主机出现故障时,可由备份机接替主机工作。在没有人工的干预下的情况下,自动切换到备用机保证系统可以继续对外提供服务,提高系统的稳定性同时也降低企业的因服务宕机带来的风险和损失。这篇Chat我就给讲解MySQL的双机热备及故障时应用服务如何实现自动切换。

  • 什么是MySQL双机热备(MySQL主从模式有哪些)?

  • 为什么要用MySQL的双机热备?(如何结合实际开发业务选用技术架构)?

  • 如何搭建MySQL的双机热备模式?

  • 测试千万级别数据导入是否可以实现同步复制?

  • 使用Keepalived实现故障时应用服务自动切换与数据库的连接配置。

  • 总结

什么是MySQL双机热备?

双机热备的工作原理是设置一个数据库为主库,另一个数据库为从库。当主库出现故障时,从库能自动接管主库的功能,向外提供服务。两台数据库互相同步,协同工作。另外MySQL主从同步还有一主一从、一主多从、主从从、双主、双主多从等模式。我们今天讲的就是双主结构。另外几种原理都是大同小异。

为什么要用MySQL的双机热备?

在实际应用服务中,数据库是一个很重要的环节,特别在一些实时性较高访问量较大的项目上因为数据库故障,可能导致的数据丢失更是金钱无法换来的。对于企业来说损失也是不可估量。为何会选用这个框架?对于框架比较感兴趣的同学都知道,一个框架的选用也往往项目是否成功上线的基础。
下面就给大家结合我们此次的项目的实际需求选用框架。在服务层框架我们采用的springBoot+consul,网关服务采用的是zuul、数据库是MySQL、文件服务器是Fastdfs。这个项目属于我们公司的重点项目。虽然是内部管理项目却有很多终端要连接到这个平台,实现应用下载,状态上送,设备管理等功能。设备的连接是https这是我为什么确当使用zuul作为网关的原因(审查与监控,动态路由,负载均衡静态响应处理,验证与安全保障)。或许有同学会问既然终端与平台之间的高并发连接为什么采用http而不是Netty框架的sokect。因为涉及有应用下载。(他们希望可以下载到静态的网络资源所以也是我们为什么选用这套架构的原因)。
数据库模式的选取也是这次框架设计的重中之重,因为本次上线项目对于数据存储和读取极为重要。数据库的实时备份放在首位。因此我们采用了MySQL的双主模式。可能有同学在这里会认为既然数据那么重要为什么不采用Oracle或者是MySQL的双主多从模式。其实原因很简单:首先大家都知道Oracle服务是付费。采用双主模式而是因为公司没有更多的服务器资源可以提供给这个项目。其实这也是我今天想表达我做框架这些年小小经验,框架的选用在有限的资源里满足需求或者超于预期需求效果的架构才是最符合项目的架构。相信很多架构都很有感触。

如何搭建MySQL的双机热备模式?

在搭建之前我们先看下主从复制的原理是怎样的:MySQL之间数据复制的其实就是二进制日志文件。一旦MySQL数据库启用二进制日志后(其实就是个配置后面会讲到),这台数据库执行的事件都会写入一个二进制文件中,作为主库。其他的从库通过一个I/O线程与主数据库保持连接。并实时检测这个二进制文件的变化。从库会把这个变化复制到自己的中继日志中,而后会通过sql线程将变化的事件执行到自己的数据库中,从而实现主从同步。
数据库服务器:192.30.40.1
数据库服务器:192.30.40.2
首先在上面两台服务器上先安装MySQL服务(如果有不会的同学可以私我)
1:先进入192.30.40.1这台服务器

vim /etc/my.cnf


MySQL双机热备及应用服务的自动切换

1.png


2:修改完重启mysql


service mysql restart

会发现在你的MySQL安装目录下会多了 mysql-bin.000001和mysql-bin.index文件。
3:再进入192.30.40.2这台服务器

vim /etc/my.cnf

MySQL双机热备及应用服务的自动切换

2.png


然后再重启192.30.40.2这台服务器的MySQL(至此配置数据库结束)。

4:开始搭建主从关系
4.1:这里可以使用可视化连接工具操作:首先操作192.30.40.1

MySQL双机热备及应用服务的自动切换

3.png


4.2:设置主从关系:操作192.30.40.2进入MySQL模式 ,执行指令:


CHANGE MASTER to MASTER_HOST="192.30.40.1",
MASTER_PORT=3306,MASTER_user="root",#
MASTER_PASSWORD="root",
#192.30.40.1执行show master status查询出来的File 和Position
MASTER_LOG_FILE="mysql-bin.000094",
MASTER_LOG_POS=234663832

4.3:开启192.30.40.2(从库模式)

start slave

4.4:查看线程是否开启

MySQL双机热备及应用服务的自动切换

4.png


这就代表主从模式已经配置好了 可以尝试在192.30.40.1新增几张表或者一些数据看有没有同步到192.30.40.2。

5:实现双机热备
5.1:现在查看192.30.40.2状态

MySQL双机热备及应用服务的自动切换

5.png


5.2:设置主从关系:操作192.30.40.1进入MySQL模式 ,执行指令:


CHANGE MASTER to MASTER_HOST="192.30.40.2",
MASTER_PORT=3306,MASTER_user="root",
MASTER_PASSWORD="root",
#192.30.40.2执行show master status查询出来的File 和Position
MASTER_LOG_FILE="mysql-bin.000083",
MASTER_LOG_POS=172980541

5.3:开启192.30.40.1(从库模式)

start slave

5.4:查看线程是否开启

MySQL双机热备及应用服务的自动切换

4.png


两个MySQL数据库互为主从,都可进行写入,读取,实现了数据库的高可用


测试千万级别数据导入是否可以实现同步复制?

(1)进入MySQL模式选择数据库

mysql>use abc;

(2)设置数据库编码

mysql>set names utf8;

(3)导入数据(注意sql文件的路径)

mysql>source /test/test.sql;

MySQL双机热备及应用服务的自动切换

6.png


7.png

可以看到即使是千万级别的数据也可以实现同步复制。(完全可以满足本次需求)

使用Keepalived实现故障时应用服务自动切换与数据库的连接配置。

开发的小伙伴问我是不是数据库挂了 。我们还要重启指定的数据库配置文件。将服务指定到备用服务器。(真是太不让我省心了)。服务的自动切换我们这次采用的Keepalived的ip漂移。