1、Keepalived 简介php
Keepalived 是一个用 C 语言编写的路由软件。它最初是专门为 LVS 负载均衡软件设计的,用来管理并监控 LVS 集群系统中各个服务节点的状态,后来又加入了能够实现高可用的 VRRP 功能。mysql
VRRP:虚拟冗余路由协议,它是 IETF 的公共标准,就好像 HSRP(热备份路由协议,思科私有,只可在思科本身的设备上使用。)同样实现高可用。web
因为 VRRP 功能的加入,使得 LVS 和 LVS 集群中的其余服务节点解决了可能出现的单点故障的问题。他可以使集群中个别节点宕机的状况下,整个集群网络不受影响,能够无间断的运行,所以,Keepalived 对于 LVS 负载均衡以及 LVS 负载均衡集群中的其余节点提供了高可用功能。算法
2、Keepalived 高可用故障转移实现的原理sql
Keepalived 高可用服务对节点之间的故障进行切换转移,是经过VRRP来实现的。在 Keepalived 服务工做时,主 Master 节点会不断地向备节点发送心跳(heartbeat)包,用来告诉备 Backup 节点本身还活着。当主节点发生故障时,就没法发送心跳包了,所以,备节点没法继续检测到来自主节点的心跳了。因而就会调用自身的接管程序,接管主节点的IP资源池和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源池和服务,恢复到原来的备用角色。数据库
3、高可用负载均衡集群拓扑后端
由上图可知浏览器
一、LVS-A、LVS-B、Web-A 和 Web-B 共用一个 VIP。bash
二、Web-A 和 Web-B 的 VIP 须要绑定在本机的 loopback 网络接口上,具体绑定方式参见小弟的另外一篇博文 VIP 地址绑定 loopback 接口
服务器
三、LVS-A 和 LVS-B 的 VIP 是浮动的,由 Keepalived 动态分配,不须要手动绑定。
四、MySQL-A 和 MySQL-B 的 VIP 也是是浮动的,由 Keepalived 动态分配,不须要手动绑定。
五、MySQL-A 和 MySQL-B 之间互为主从。
4、高可用负载均衡集群环境准备
如上表:
咱们准备 6 台服务器,分别为 2 台 MySQL 服务器、2 台 Web 服务器和 2 台 LVS 服务器,地址分配如上表所示。
说明:LVS 、WEB 的 RIP 和 VIP 都可使用公网 IP ,MySQL 的 RIP 和 VIP 使用私有 IP ,至于缘由,大佬们都是懂得,在实验环境中为了方便,我就统一使用一个网段的 IP 地址。
至于说服务器环境的安装配置,我这里就再也不啰嗦,有疑问,能够参照小弟的前几篇博文。
5、LVS 安装
分别在 LVS-A 和 LVS-B 服务器中安装 ipvsadm 服务 LVS-A: [root@lvsa ~]# yum -y install ipvsadm LVS-B: [root@lvsb ~]# yum -y install ipvsadm 说明:这里只须要安装便可,不须要进行配置。 6、Keepalived 安装 分别在 LVS-A 、 LVS-B 、MySQL-A 和 MySQL-B 服务器中安装 Keepalived 服务 LVS-A: [root@lvsa ~]# yum -y install keepalived LVS-B: [root@lvsb ~]# yum -y install keepalived MySQL-A: [root@mysqla ~]# yum -y install keepalived MySQL-B: [root@mysqlb ~]# yum -y install keepalived 7、Keepalived 配置 首先,咱们配置 MySQL-A 和 MySQL-B 中的 Keepalived 。 MySQL-A 配置: 如上图,配置文件解释: global #为全局配置 script_user #脚本执行用户,该参数是咱们根据官方说明手动添加的,默认没有,若是不添加,会报错 WARNING - default user 'keepalived_script' for script execution does not exist - please create. enable_script_security #设置脚本的可运行性,该参数是咱们根据官方说明手动添加的,默认没有,若是不添加,会报错 WARNING - default user 'keepalived_script' for script execution does not exist - please create. notification_email #为通知邮件,这里配置报警邮件接收人的邮箱 notification_email_from #为发件人邮箱 smtp_server #为发件服务器 smtp_connect_timeout #smtp服务器链接超时时间 route_id #为路由器 id ,能够自定义修改 vrrp_static #须要注释,要否则服务一启动,会自动配置 iptables 防火墙,会引发 VIP 问题 vrrp_skip_check_adv_addr、vrrp_garp_interval、 vrrp_gna_interval #这三项不用管,保持默认就行。 vrrp_instance #建立一个 vrrp 的实例 VI_1 就是 vrrp_instance 的缩写 state MASTER #状态为 MASTER ,备份路由器须要写 BACKUP,不能写 SLAVE ,7.2以前的版本是 SLAVE ,以后的版本是 BACKUP interface #配置网络接口卡 virrual_route_id #虚拟路由 id 号,这个须要在同类型集群服务器中的 Keepalived 中保持一致,不然没法正常路由,因此,通常不须要修改,注意,咱们这里 MySQL 集群和 LVS 集群中的 id 号不能相同,不然会报错。 priority #优先级,这个能够自定义更改,这个数越大,优先级越高 advert_int #心跳消息发送间隔,通知时间,即 心跳(heartbeat)包 的发送时间,用来检查路由是否处于活跃状态 authentication #集群成员共享密码 auth_type #认证类型,这里为password auth_pass #认证密码,集群中的路由器中这个密码必须保持一致 virtual_ipaddress #虚拟 ip 地址(VIP),注意不要冲突就行 virtual_server #虚拟服务器,后跟 VIP + 空格 + 端口 real_server #后端真实服务器,后跟 RIP + 空格 + 端口 MySQL-B 配置: MySQL-B的配置和 MySQL-A 的配置差很少,个别参数酌情修改便可。 shutdown.sh 脚本内容:
LVS-A 配置: 字段意思同 MySQL-A,只是增长了一条 RealServer 的服务器,这里就很少作解释。 LVS-B 配置: 跟 LVS-A 的配置,基本相同,除了状态和优先级以外,LVS-A 的状态为 MASTER ,这里为 BACKUP ,LVS-A 的优先级为 200 ,这里为 100 。 注意:LVS 的路由器 id 为 51(可自定义),而 MySQL 的路由器 id 为 60 。 8、MySQL 服务器的主主结构配置 关于 MySQL 服务器的主主结构配置请参考小弟的另一篇博文 MySQL 主主结构配置 这里就再也不多作阐述。 9、Keepalived 高可用集群验证 一、Keepalived + MySQL 高可用集群验证 咱们在 Keepalived + MySQL 高可用集群中设置了 VIP 地址 192.168.20.150,首先,咱们来验证一下联通性,在另外的主机或者服务器中用 VIP 进行链接,看可否登录 MySQL 数据库。 [root@client ~]# mysql -h192.168.20.150 -uroot –p123456 如图所示,说明能够正常链接 其次,咱们再中止 MySQL-A 的 MySQL 服务,查看 MySQL-A 中 Keepalived 服务是否有自动中止,是否还能够经过 VIP 地址 192.168.20.150 链接到 MySQL 数据库。 [root@mysqla ~]# service mysqld stop [root@mysqla ~]# systemctl status keepalived 如上图所示,MySQL-A 的 MySQL 服务中止,随之 MySQL-A 中 Keepalived 服务自动中止,下面再经过 VIP 地址 192.168.20.150 链接 MySQL 数据库。 [root@client ~]# mysql -h192.168.20.150 -uroot –p123456 如上图所示,能够正常链接。 最后,咱们开启 MySQL-A 的 MySQL 服务和 Keepalived 服务,并关闭 MySQL-B 的 MySQL 服务,查看 MySQL-B 中 Keepalived 服务是否有自动中止,是否还能够经过 VIP 地址 192.168.20.150 链接到 MySQL 数据库。 [root@mysqlb ~]# service mysqld stop [root@mysqlb ~]# systemctl status keepalived 如上图所示,MySQL-B 的 MySQL 服务中止,随之 MySQL-B 中 Keepalived 服务自动中止,下面再经过 VIP 地址 192.168.20.150 链接 MySQL 数据库。 [root@client ~]# mysql -h192.168.20.150 -uroot –p123456 如上图所示,也能够正常链接,说明,咱们的 MySQL 高可用集群配置是 OK 的。 在验证过程当中,咱们还能够看一下 VIP 地址的切换状况,能够在 MySQL-A 和 MySQL-B 中使用命令 ip a s ens33 来查看,这里就不演示了,ens33 是网卡名称,固然大部分主机或者服务器的网卡名称多是 eth0 。 二、Keepalived + LVS 高可用负载均衡集群验证 a、查看 LVS 集群状态是否正常或者是否有 LVS 集群存在,分别在 LVS-A 和 LVS-B 中执行 ipvsadm –Ln 命令 LVS-A 结果: LVS-B 结果: 如上图所示, LVS 集群存在且正常,说明 Keepalived 配置生效。 b、验证 LVS 负载均衡及故障转移 首先,咱们在 Web-A 和 Web-B 中站点目录下编写 index.php 文件,内容以下:
其次,咱们在浏览器中输入咱们配置的 VIP 地址 192.168.20.135,查看结果。 如上图所示,说明咱们的负载均衡 OK ,接下来咱们验证故障转移 首先,咱们关闭 Web-A 的 http 服务和 MySQL–A 的 MySQL 服务,刷新页面,查看网页结果返回和 LVS-A 和 LVS-B 中的 LVS 集群状态。 如上三图所示,MySQL 能够正常链接,Web 也能够正常链接到 Web-B 服务器,说明故障转移 OK 。而 LVS 负载均衡集群中已经自动删掉了 Web-A 的地址。 其次,咱们开启 Web-A 的 http 服务和 MySQL–A 的 MySQL 服务,查看 LVS-A 和 LVS-B 中的 LVS 集群状态。 如上两图所示,Web-A 的地址已自动添加到 LVS 负载均衡集群中。 最后,咱们关闭 Web-B 的 http 服务和 MySQL–B 的 MySQL 服务,再刷新页面,查看网页结果返回和 LVS-A 和 LVS-B 中的 LVS 集群状态。 如上三图所示,MySQL 能够正常链接,Web 也能够正常链接到 Web-A 服务器,说明故障转移 OK 。而 LVS 负载均衡集群中已经自动删掉了 Web-B 的地址。 咱们再开启 Web-B 的 http 服务和 MySQL–B 的 MySQL 服务,查看 LVS-A 和 LVS-B 中的 LVS 集群状态。 如上两图所示,Web-B 的地址已自动添加到 LVS 负载均衡集群中。 通过一番的验证,咱们的负载均衡 OK ,故障转移也 OK ,说明咱们的 Keepalived + LVS + LAMP 高可用集群部署是成功的。固然了,集群的其余一些性能调优,还须要根据线上实际状况来进行调整,这里也就不进行赘述 了。 10、查看咱们在验证过程当中是否有收到邮件 咱们再配置 Keepalived 的时候,配置告警邮件的接收邮箱,理论上,咱们在验证过程当中频繁的关闭和开启各个节点的服务,就应该能收到 Keepalived 的告警邮件,如今咱们登录咱们配置的邮箱进行查看。 如上图所示,咱们每次对节点服务的关闭和开启都会收到 DOWN 和 UP 的邮件,这代表,咱们的邮箱配置是生效的。 到此为止,咱们的 Keepalived + LVS + LAMP 高可用负载均衡集群部署完成,过程当中有可能会遇到不少坑,可是作为运维,踩坑能够说是屡见不鲜了,最重要的总结经验,才知道哪里容易出问题。因为小弟我文笔拙劣,欢迎各位大佬留言指正。 |