(一)使用主主复制
在前面的文章里我们搭建了mysql主从复制,主主复制,多从节点的负载均衡,下面我们用图来表示出来:
如图,所有的读操作到haproxy,写操作到Master主库,读写库分离,提高性能,同时,多个从库能提高读性能,而且还实现了数据备份。
那么,主主复制在上述架构中体现什么作用呢?为什么要使用两个Master主主同步呢?
是实现数据热备吗?不是,因为主从就实现了热备。
在图中可以看到写操作的目标只有一个库,如果这个库宕机或者出现问题了,那么会导致我们整个项目都瘫痪,直接导致项目的所有写操作不能正常使用,虽然能读数据。
所以可以使用另外一个Master库做备库,如果第一个Master宕机,就实时把所有写操作切换到预备好的Master库,这样,就算其中有一个出问题也能保证整个项目正常运作。
怎么保证出现问题时两个Master之间实现智能切换?实现高可用?
我们使用Keepalived实现。
(二)Keepalived是什么
Keepalived是Linux下一个轻量级别的高可用解决方案。高可用(High Avalilability,HA),其实两种不同的含义:广义来讲,是指整个系统的高可用行,狭义的来讲就是之主机的冗余和接管。
Keepalived高可用故障切换转移原理:
Keepalived高可用服务对之间的故障切换转移,是通过 VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)来实现的。
在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活看,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。
(三)Keepalived搭建
引入keepalived之后,我们重新架构上图:
接下来我们来搭建Keepalived,实现高可用
首先搭建好两Master,Master1和Master2,实现主主复制,之前的文章中有过程。
下载Keepalived,http://www.keepalived.org/download.html,下载keepalived-2.0.8.tar
(由于最新版本2.0.8安装出现问题,改用了1.3.5版本安装)
把tar包传输到Master1和Master2节点linux服务器中,这里都放在/root/soft下:
进行解压:
进入到解压目录,运行configure检测安装环境:
检测,没有c编译器,使用yum安装编译器yum install gcc-c++;
还需要安装openssl:yum install openssl openssl-devel
再次./configure检测发现this build will not support ipvs with ipv6,依次安装:yum -y install libnl libnl-devel,yum install -y libnfnetlink-devel可解决
然后再编译和安装Keepalived:make && make install
安装完查看Keepalived的配置文件和可执行文件:
配置文件:/usr/local/etc/keepalived/keepalived.conf
执行文件:/usr/local/sbin/keepalived
安装完keepalived之后进行配置:
分配ip:Master1的Iip为:192.168.199.166,Master2的ip为192.168.199.167
我们还需要虚拟出一个节点,我们设定它的ip为192.168.199.200
再来编辑keepalived.conf配置文件,先只保以下内容:
激活的节点(主库)配置:
备份的节点配置:
两个节点的happalived的配置有所不同,virtual_ipaddress中的ip为之前指定好的虚拟节点的ip
再启动两keepalived,./keepalived -D -f /usr/local/etc/keepalived/keepalived.conf
启动成功
启动之后查看keepalived进程,有三个进程:
再看主库的ip信息,用命令ip a查看信息,可以看到多了一个inet,这就是之前配置的虚拟节点,而备库节点则没有:
表示启动成功。
接下来我们用虚拟ip来连接mysql,用户名密码为两主节点mysql共同有的用户,即可登陆msyql
我们用一张表的有无来区别两msyql,激活的有product表,备库没有product表:
我们用另外一个虚拟机的mysql来连接我们在keepalived中设定的ip,连接之后:
连接之后发现有product表,说明正是我们要连接的主库。
(三)验证Keepalived
搭建完成,我们来验证keepalived
我们手动的模拟主库节点出现问题,宕机了,再看连接的是哪个库
把主库的keepalived进程直接关闭:
可以看到把keepalived进程kill之后,ip a中没有了虚拟节点。
再看备库节点:
在备库节点中出现了虚拟节点。
我们再来连接设定的虚拟节点:
可以看到,此时连接到的是备库
当主库宕机时,keepalived自动的连接到了备用库,验证结果为通过。