MySQL数据库--主主复制+keepalived高可用
目前成都创新互联已为上千家的企业提供了网站建设、域名、虚拟主机、网站托管运营、企业网站设计、颍上网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
之前我们有学习过mysql的主从复制,主要是在工作环境当中防止数据库读写在一台数据库上容易造成负载,实现读写分离就是为了给服务器减轻工作压力,就好比一个人的工作分成了两个人来做,那么人也减轻了压力。而且工作效率也提高了上去。但是要实现读写分离的前提就是主从复制对吧?
主服务器为master;从服务器为slave。而我们今天带来的和主从复制有点不一样,多用与中小型公司,叫做主主复制。
注:在生产环境中一台MySQL从在单点故障的缺陷,如果一旦发生意外,那么将会发生严重的后果,为公司造成严重的损失。
那么如果两个的话那么将会效果好一点;其中一台宕掉,另一台会马上接替。
既然知道了主主复制的背景了,那么我们来了解下MySQL主主复制的原理以及思路:
1)开启二进制日志文件bin_log、中继日志文件relay-log、server-id号、以及auto-increment-offset和auto-increment-increment(自动增长)
2)设置一个用户并且赋予权限
3)查看二进制文件和ID号,以便后续制定master服务器
4)相互指定对方为master服务器
5)开启slave状态,{start slave}
6)查看sql和i/o状态为yes便成功
以上属于主主复制的基本思路;接下来我们演示一下,让大家看的更直观一些:
准备环境:
两台mysql服务器: 版本5.7
master服务器< ip 192.168.1.10 >
master2服务器 < ip 192.168.1.20 >
一:配置master的配置文件修改内容: vi /etc/my.cnf
log-bin = mysql-bin===========开启binlog日志
binlog_format = mixed========基于混合模式
server-id = 1==========ID号为1
relay-log = relay-bin==========开启中继日志
relay-log-index = slave-relay-bin.index==========中继日志的索引文件
auto-increment-increment = 2 =========整个架构中的服务器台数
auto-increment-offset = 1==========用来设定数据库中自动增长的起点(即初始值)
完成后重启MySQL服务
master2服务器也是如此:{需注意:}
之后重启MySQL服务
二:设置一个用户并且授予权限为后续的链接使用:
首先在master上设置:
三:查看下master的当前binlog状态信息:
在master2上面将master设置为自己的主服务其并且开启slave功能
四:查看下当前的状态,一下两个值必须为yes,代表master2正常链接master服务器
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
master2服务已经成功,
接下来对master服务器进行配置;
将master2设置为master的主服务器
master2上也进行同样的配置;当然用户可以变更
查看master2的binlog状态;
在master服务器上将master2设置为自己的主服务器并且开启slave功能;
查看master服务器的状态,一下两个值必须为yes,代表从服务器可以链接主服务器
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
以上说明master服务器也成功了。
那么接下来我们来测试下主主同步
在master上面创建要同步的数据库tty,并且在tty当中创建一张表tb1
那么我们来查看一下master2上面是否也会存在刚才创建的数据库和表呢?
通过结果我们可以得知在master上创建的库和表可以同步到master2上面,但是master2上的数据可以同步到master上面去吗?
我们在master2上为tty库中的tb1表中插点数据来验证一下:
我们来查看一下在master上面是否会有刚才在master2上面插入的两条数据呢?
由此可见当前我们的数据库主主复制是成功的,
总结一下;
主主复制是两台MySQL服务互相读写同步,互相备份的结果
注:若主MYSQL服务器已经存在,只是后期才搭建从MYSQL服务器,在置配数据同步前应先将主MYSQL服务器的要同步的数据库拷贝到从MYSQL服务器上(如先在主MYSQL上备份数据库,再用备份在从MYSQL服务器上恢复)
二:上面我们介绍了mysql的主主复制,但是如果这两台服务器其中有一台突然宕机了该怎麽办呢?这就需要我们的下一个要讲述的环节了,也就是keepalived,实现这两台数据库的负载均衡。如果有其中的一台突然宕机之后那么另外的一台将会接替,保证服务的不间断性。
Keepalived的原理;
keepalived是集群管理中保证集群高可用的一个软件解决方案,其功能类似于heartbeat,用来防止单点故障
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
基于ARP协议进行组播 发送的,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip,master会发组播(组播地址为224.0.0.18),当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
Keepalived的基本模块:
分别是core、check和vrrp
core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。
check负责健康检查
vrrp模块是来实现VRRP协议的
介绍完keepalived的功能以及模块,接下来我们开始在两台mysql上都配置keepalived
安装keepalived软件包与服务控制
在编译安装Keepalived之前,必须先安装内核开发包kernel-devel以及openssl-devel、popt-devel等支持库。
在这里通过yum安装:
Yum -y install kernel-devel openssl-devel popt-devel
编译安装Keepalived
注意:在centos7.2上安装keepalived不需要添加--with-kernel-dir
[root@localhost keepalived-1.2.20]# ./configure --prefix=/ && make && make install
使用keepalived服务
执行make install操作之后,会自动生成/etc/init.d/keepalived脚本文件,但还需要手动添加为系统服务,这样就可以使用service、chkconfig工具来对keepalived服务程序进行管理了。
Master 和master2 安装keepalived的过程均如上图所示,没有任何差别,
注:如果在centos7.2上安装keepalived防火墙的规则配置如下:
[root@localhost ~]# firewall-cmd --permanent --add-rich-rule="rule family=ipv4 destination address=224.0.0.18 protocol value=ip accept"
success
[root@localhost ~]# firewall-cmd --reload
修改keepalived的配置文件:
keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs、vrrp_instance和virtual_server。
global_defs:主要是配置故障发生时的通知对象以及机器标识。
vrrp_instance:用来定义对外提供服务的VIP区域及其相关属性。
virtual_server:虚拟服务器定义
Master{keepalived}的主配置文件
启动keepalived服务
#/etc/init.d/keepalived start
Master2主机上的keepalived.conf文件的修改:
Master2主机的keepalived.conf文件配置与master1基本相同,只是router_id,priority,real_server三处不同,其他配置都相同
可以使用scp命令把server1主机上配置好的keepalived.conf文件拷贝到server2主机,只要做简单修改即可,如下图所示:
Master2的{keepalived}主配置文件
启动keepalived服务
#/etc/init.d/keepalived start
在上面当中在notify_down指定脚本的路径可以在不使用keepalived的时候杀死keepalived的进程;
之后给脚本一个x的执行权限
Chmod +x /etc/keepalived/bin/mysql.sh
这些工作完成之后可以验证我们之前的mysql+keepalived有没有成功呢?
首先查看下vrrp的虚拟IP
那么master2上面呢?
在这里我们模拟master突然宕机之后看一看master2是否会接替master上面的vrrp漂移ip呢?
首先使用我们的脚本执行以下;
之后呢在查看下master上面的vrrp漂移ip是否存在
可以看得出啦vrrp的漂移ip已经不再master服务器上面了,那么master2上面呢?
可以看到master2成功的接替了master上面的vrrp的漂移ip了,说明我们的高可用服务是成功的
在这里keepalived+mysql服务就讲解到这里,但是呢在前面就曾说过,keepalived使用与小型的公司,在配置keepalived的时候需要有几点的注意事项:
1).采用keepalived作为高可用方案时,两个节点最好都设置成BACKUP模式,避免因为意外情况下(比如脑裂)相互抢占导致往两个节点写入相同数据而引发冲突;
2).把两个节点的auto_increment_increment(自增步长)和auto_increment_offset(自增起始值)设成不同值。其目的是为了避免master节点意外宕机时,可能会有部分binlog未能及时复制到slave上被应用,从而会导致slave新写入数据的自增值和原先master上冲突了,因此一开始就使其错开;当然了,如果有合适的容错机制能解决主从自增ID冲突的话,也可以不这么做;
3).slave节点服务器配置不要太差,否则更容易导致复制延迟。作为热备节点的slave服务器,硬件配置不能低于master节点;
4).如果对延迟问题很敏感的话,可考虑使用MariaDB分支版本,或者直接上线MySQL 5.7最新版本,利用多线程复制的方式可以很大程度降低复制延迟;
这次为大家带来的是小型公司对mysql主要使用架构方案;下次为大家带来的是中大型公司使用的架构MMM,相信大家也有所了解,具体等下次我们细说