使用keepalived工具实现集群节点的高可用
1.前言
在集群当中离不开的一个词就是是高可用,用本文来简单聊聊keepalived是什么、keepalived如何实现高可用、keepalived的使用场景。
- 首先,假设一个应用场景,内网有一台tomcat服务器,随着业务的增加、流量的增加一台tomcat服务器就变得不够用了,因此需要增加多台tomcat服务器,他们拥有相同的业务处理能力,为了可以统一对这些tomcat的访问同时更好地调度到不同的tomcat完成业务,可以添加一台nginx服务器。它的作用是为内网中的多台tomcat服务器提供负载均衡的动态访问,通过nginx,我们可以以不同的调度方式来到不同的tomcat来进行下一步的操作。
- 但这种模式是十分脆弱的,如果此时nginx宕机了,tomcat服务器就都访问不了了,假设也增加一台nginx赋予这台nginx相同的业务能力,那就又涉及到了这个问题,它需要一个统一的入口,如果在这两台nginx服务器的前面再放一台nginx或者是一台lvs服务器做这两台nginx的调度,只会使得这种部署方案进入一个死循环,变成一个无解的答案。
- 可以试着换一种思路,我就让这台nginx作为主机进行工作,同时为这台nginx准备一台备机,当主机宕机了,这台备机就可以及时顶替主机的工作。当然还需要考虑到这两台服务器是不同的ip,客户访问的是主机,怎么变成访问备机呢?如果要把备机的ip“换成主机的”显然不可取,有可能主机只是过热的短暂故障,如果ip被备机使用了,主机又突然恢复了,这个时候问题又出现了,因此,我们需要使用一个虚拟ip。
因此,实现的效果应是一主一备,主机宕机备机上线提供服务,不可能同时提供服务。访问业务通过的入口为vip,因此我们引入keepalived,让其跑在两台nginx上,达到keepalived之间的相互通信,检测心跳,如果主机宕机,keepalived就将主机的vip漂移到备机上,这样就可以实现不需要关注这两台nginx的具体ip地址是多少就可以实现来者之间高可用的切换。至于宕机的服务器恢复以后重新上线是否作为主机就要根据配置文件里面的优先级进行竞选。
2.keepalived介绍
keepalived是一款保证集群高可用的一个服务软件,用来防止单点故障。keepalived是以VRRP(Virtual Router Redundancy Protocol)协议(虚拟路由冗余协议)为实现基础的。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
3.keepalived部署
假设nginx服务器为192.168.1.1、192.168.1.2,vip为192.168.1.200:
为机子安装环境,采用yum源安装:
[root@localhost ~]# yum -y install kernel-devel*
[root@localhost ~]# yum -y install openssl-*
[root@localhost ~]# yum -y install popt-devel
[root@localhost ~]# yum -y install lrzsz
[root@localhost ~]# yum -y install openssh-clients
[root@localhost ~]# yum -y install libnl libnl-devel popt
[root@localhost ~]# yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
- 进入
/usr/local/
目录:
[root@localhost ~]# cd /usr/local/
- 把下载“keepalived-1.2.15.tar.gz”放入目录下,解压:
[root@localhost local]# tar zxvf keepalived-1.2.15.tar.gz
- 进入目录:
[root@localhost local]# cd keepalived-1.2.15/
[root@localhost keepalived-1.2.15]#
- 通过configure进行安装:
[root@localhost keepalived-1.2.15]# ./configure --prefix=/usr/local/keepalived
- 进行编译安装:
[root@localhost keepalived-1.2.15]# make
[root@localhost keepalived-1.2.15]# make install
- 拷贝执行文件:
[root@localhost keepalived-1.2.15]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
- 将init.d文件拷贝到etc下,加入开机启动项:
[root@localhost keepalived-1.2.15]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived/etc/init.d/keepalived
- 将keepalived文件拷贝到etc下,加入网卡配置:
[root@localhost keepalived-1.2.15]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
- 创建keepalived文件夹,将keepalived配置文件拷贝到etc下:
[root@localhost keepalived-1.2.15]# mkdir -p /etc/keepalived
[root@localhost keepalived-1.2.15]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
- 添加可执行权限,同时加入开机启动:
[root@localhost keepalived-1.2.15]# chmod +x /etc/init.d/keepalived
# 添加时必须保证/etc/init.d/keepalived存在
[root@localhost keepalived-1.2.15]# chkconfig --add keepalived
[root@localhost keepalived-1.2.15]# chkconfig keepalived on
# 添加完可查询系统服务是否存在
[root@localhost keepalived-1.2.15]# chkconfig --list
- 使用:
启动:service keepalived start
停止:service keepalived stop
重启:service keepalived restart
- 将keepalived日志输出到local0:
[root@localhost keepalived-1.2.15]# vi /etc/sysconfig/keepalived
# 添加:
KEEPALIVED_OPTIONS="-D -d -S 0"
- .在/etc/rsyslog.conf里添加配置:
[root@localhost keepalived-1.2.15]# vi /etc/rsyslog.conf
# 内容:
local0.* /var/log/keepalived.log
- 重新启动keepalived和rsyslog服务后配置防火墙通讯地址:
[root@localhost keepalived-1.2.15]# service rsyslog restart
[root@localhost keepalived-1.2.15]# service keepalived restart
- 主机配置文件:
! Configuration File for keepalived
global_defs {
router_id NG_DEVEL1
}
vrrp_instance NG {
# 标示为主nginx
state MASTER
# HA检测端口,查看主机服务器的网卡
interface eth33
# 主备上的id必须相同
virtual_router_id 51
# 配置优先级,本示例备机比主机优先级小
priority 100
# VRRP Multicast 广播周期秒数
advert_int 1
# 定义认证
authentication {
# 认证方式为口令认证
auth_type PASS
# 定义口令
auth_pass 1111
}
# 定义vip,可以设置多个
virtual_ipaddress {
192.168.1.200
}
}
- 备机配置文件:
! Configuration File for keepalived
global_defs {
router_id NG_DEVEL2
}
vrrp_instance NG {
# 标示为备nginx
state BACKUP
# HA检测端口,查看主机服务器的网卡
interface eth33
# 主备上的id必须相同
virtual_router_id 51
# 配置优先级,本示例备机比主机优先级小
priority 50
# VRRP Multicast 广播周期秒数
advert_int 1
# 定义认证
authentication {
# 认证方式为口令认证
auth_type PASS
# 定义口令
auth_pass 1111
}
# 定义vip,可以设置多个
virtual_ipaddress {
192.168.1.200
}
}
- 重启服务:
[root@localhost keepalived-1.2.15]# service keepalived restart
- 可以进行简单的测试,当主机宕机后,vip成功漂移到备机
4.结语
keepalived的使用不止局限于nginx,他的作用是作用于服务器,去检测服务器来实现单点访问的高可用,因此可以使用keepalived的场景就十分丰富了,lvs可以使用,也可以通过keepalived来实现MySQL的双主模式切换,也可以设置多个vip绑定在不同的机器上,通过dns轮询的方式访问vip,如果发生宕机就把宕机的主机vip漂移到其他主机上。在由文章中的模拟实验环境搭建可以参考上一篇文章《搭建基于lvs+nginx的负载均衡服务集群》。
keepalived的原理其实很简单就是通过服务器上的keepalived进程进行相互通信,这个时候需要注意,假设服务器没有宕机当服务器的主业务报错了,这个时候没有实现切换,可以写相应的运维脚本,通过脚本检测当前的业务是否出现错误,出现错误就将keepalived进程kill掉来实现切换。这里就不继续展开了。
文章转载自公众号:GreatSQL社区