Keepalived+lvs
Keepalived服务开启的进程:一个父进程;两个子进程 。其中:
(1)父进程监控子进程:通过watchdog向子进程发送socket信息,确认子进程状态,若某端时间内未收到子进程的socket响应,父进程将重启子进程;
(2)两个子进程:VRRP和Hostcheck。其中VRRP检测高可用;Hostcheck:采用IPVS实 现对后端负载的健康检查。
(3)VRRP协议:虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP)。解决静态路由的单点故障问题(若发生单点故障,该结点的服务则被中断),该机制下主结点(MASTER)只进行转发;其余多个备机(BACKUP)接收;当MASTER发生宕掉时,BACKUP接收不到MASTER广播的ARP通告,备机之间进行优先级来选举(selection协议)出当前MASTER,继续“主发备接”;当原来的MASTER恢复正常时,再进行优先级选举MASTER,而原本的MASTER的优先级本来已为最高,所以MASTER将接管服务,继续转发。实现服务器的高可用。
(4)后端负载检查方式有:MISC_CHECK--脚本检查、TCP(四层)、HTTP——CHECK(五层[ios五层模型])、SSL_GET(五层)。
一、Keepalived---------服务器端(server1、server3)
<1>软件安装
1.tar zxf keepalived-1.2.20.tar.gz ##源码安装
2.解压后生产源码包,需要先源码编译
cd keepalived-1.2.20
./configure --prefix=/usr/local/keepalived ##指定安装路径
make && make install ##编译成功后,进行下载
3. ln -s /usr/local/keepalived/sbin/keepalived /sbin
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d
ln -s /usr/local/keepalived/etc/keepalived/ /etc
chmod +x /usr/local/keepalived/etc/rc.d/init.d/keepalived
<2>配置--node1:172.25.90.1(node2:172.25.90.3)
提示:以下配置括弧内是备机与主机的不同之处,请注意备机的配置。
1.cd /etc/keepalived
vim keepalived.conf ##主配置文件
主要配置如下:
! ConfigurationFile for keepalived
global_defs {
notification_email { #接收警报的 email 地址,可以添加多个
root@localhost
}
notification_email_from keepalived@server1 #设置邮件的发送地址
smtp_server 127.0.0.1 #设置 smtp server 地址
smtp_connect_timeout 30 #设置连接 smtp 服务器超时时间
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
##选择node1为主结点(state BACKUP ##设定node2为备机)
interface eth0 ##选择接入点eth0
virtual_router_id 51
Priority 100
##数值越大优先级越高,为MASTER(热备结点优先级低于主结点优先级即可,即<100)
advert_int 1 ##心跳检测时间
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { ##定义虚拟地址,即vip
172.25.90.190
}
}
virtual_server 172.25.90.190 80 { ##服务:vip的80端口
delay_loop 6 ##对realserver的检查频率
lb_algo rr ##后端负载采用轮询算法
lb_kind DR ##选择DR模式,注意该模式下服务器不能监听8084端口
#persistence_timeout 50 ##持续连接时间
##不开启表示不进行持续连接,可当作无缓存,详细内容见下文
protocolTCP ##TC协议
real_server 172.25.90.2 80 { ##定义后端负载Rs,选择httpd服务
weight1 ##权值,可根据负载性能设定,性能越好,权值可设置越大
TCP_CHECK { ##定义健康检查
connect_timeout3 ##连接超时时间
nb_get_retry3 ##重试次数
delay_before_retry3 ##重试间隔
}
}
real_server 172.25.90.4 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry3
}
}
}
:wq
2.开启服务测试配置
(1)先开启主结点的keepalived服务:/etc/init.d/keepalived start
(2)使用命令:tail -f /var/log/message ##查看日志信息检查服务配置是否正确
如下图结果显示:
(3)主结点配置正确,即可开启备机的keepalievd服务。一般来说也可以先开启备机,再开启主结点服务,但此情况下,主结点开启后,集群结点先进行优先级比较,由于主结点的优先级较高,主结点将接管vip,而接管过程极有可能发生损失。
二、负载端------172.25.90.2与172.25.90.4操作均如下,也可参考博客
<1>服务器端选择了lvs的DR模式,因此后端负载需要有虚拟IP:
1.ip addr add 172.25.90.190 dev eth0 ##添加虚拟ip
2.添加策略
arptables -A IN -d 172.25.90.190 -j DROP (nserer2、server4)
arptables -A OUT -s 172.25.90.190 -j mangle --mangle-ip-s 172.25.90.2 #server2端
arptables -A OUT -s 172.25.90.190 -j mangle --mangle-ip-s 172.25.90.4
#server4端
/etc/init.d/arptables save ##保存策略至/etc/sysconfig/arptables
3./etc/init.d/arptables start ##开启服务,具体原理参考博客
4./etc/init.d/httpd start ##一般先开启负载服务,再开启keepalievd服务
三、测试
<1>启动负载端httpd服务
<2>先启动主结点keepalievd服务;再启动备机服务
<3>测试结果
(1)物理机:多次使用命令:curl 172.25.90.190;或使用浏览器多次访问vip(1722.25.90.190)来查看是否可实现负载均衡----上述过程采用的轮询算法。
服务器端:使用ip addr 命令来查看vip的挂载点是否在主结点(server1)上
提示:若出现连接超时,请检查负载端arp策略及httpd服务以及监听端口;若显示内容表示网络不可连接,请检查负载端的是否有添加vip虚拟地址;重新配置后,建议先清空客户端对vip的arp缓存,使用命令:arp -d vip(如:arp -d 172.25.90.190)
(2)关闭主结点服务(server1),查看备结点是否可以接管vip
服务器端:ip addr
客户端:curl 172.25.90.190、arp -an 192.25.90.190 ##查看响应客户请求的主机
(3)开启主结点服务,查看主结点是否会自动接管服务,测试方法同上:
四、附加:可持续连接时间persistence_timeout 50
这个选项对于动态网页是非常有用的,为集群系统中 session 共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话保持时间。需要注意的是,这个会话保持时间,是最大无响应超时时间,也就是说用户在操作动态页面时,如果在 50 秒内没有执行任何操作,那么接下来的操作会被分发到另外节点,但是如果一直在操作动态页面,则不受 50 秒的时间限制。
如ftp服务的使用,我们在使用ftp服务时,一定希望同一ip的请求发送至同一结点;若服务器不与客户端进行持续连接,当客户端有请求时,服务器(keepalievd)将一直进行协议磋商,不能及时选举出某个结点(同一个结点)去调度负载,降低服务性能。此时,就可以使用可持续连接功能,实现过程如下:
1.客户端----(server2、server4)
yum install vsftpd -y
vim /var/ftpd/pub/file ##/var/ftpd/pub为ftp默认发布目录
/etc/init.d/vsftpd start
2.服务器端----(server1、server3)
vim vim/etc/keepalived/keepalived.conf
虚拟ip与realserver配置如下,监听21端口,其余配置见上文:
virtual_server 172.25.90.190 21 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50 ##进行持续连接
protocolTCP
real_server 172.25.90.2 21 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.25.90.4 21 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
:wq
3./etc/init.d/keepalived reload
##若服务本是开启状态,则只需重载即可,重启服务相当于先断开再连接,该过程有一定的损失。
<3>测试:
客户端:lftp 172.25.90.190
##查看是否可以进入发布目录,且可持续连接,即实际访问的是同一后端负载
Keepalived+nginx
keepalived本身不支持nginx,但可以以调用脚本方式来实现keepalived与nginx的整合。
提示:Keepalived+nginx的整合不要求后端负载绑定虚拟ip,由nginx实现对后端负载的调度,也不需要使用命令aptables,可以选择关闭该服务。
一、服务器端----serer1、server3
<1>nginx实现
1.源码安装,操作步骤如下,具体内容可参见博客
(1)tar zxf nginx-1.12.0.tar.gz
(2)vim /root/nginx-1.12.0/src/core/nginx.h
修改版本显示:14 #define NGINX_VER "nginx"
(3)vim /root/nginx-1.12.0/auto/cc/gcc
注释掉调试:172 #CFLAGS="$CFLAGS-g"
(4)cd /root/nginx-1.12.0 ##进行源码编译及安装
./configure --prefix=/usr/local/nginx
编译时会i发现由软件依赖性:yum install gcc-c++ pcre-devel zlib-devel -y
解决软件依赖性后,继续编译
(5)make && make install
2.配置
cd /usr/local/nginx/conf
vim nginx.conf
在http{}模块添加upstream子模块:
http {
upstream westos {
server 172.25.90.2:80; ##后端负载,监听80端口
server 172.25.90.4:80;
}
......
HTTP子模块部分添加内容:
server {
listen 80;
server_name 172.25.90.190; ##一般为域名,此处设置为vip方便测试
location / {
proxy_pass http://westos;
}
}
}
:wq
##访问域名根目录时,通过proxy代理转至upstream模块,实现调度后端负载
3.cd /usr/local/nginx/sbin
./nginx -t ##检查配置文件是否有语法错误
4.开启服务测试:./nginx ##开启服务
客户端访问172.25.90.190 ##检查后端负载
5.测试结果正确时关闭服务,进行keepalived配置
nginx -s stop
<2>Keepalived配置,不再与lvs整合,所以不需要配置realserver
1.cd /etc/keepalived
vim keepalived.conf ##主配置文件
主要配置如下:
vrrp_instanceVI_1 {
state MASTER
##选择server1为主结点(state BACKUP ##设定server3为备机)
interface eth0 ##选择接入点eth0
virtual_router_id 51
Priority 100
##数值越大优先级越高,为MASTER(热备结点优先级低于主结点优先级即可)
advert_int 1 ##心跳检测时间
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { ##定义虚拟地址,即vip
172.25.90.190/24 ##子网掩码可以设置
}
}
:wq
2.测试,启动keepalived服务,命令ip addr查看虚拟ip是否绑定在MASTER(server1)上。
<3>keepalived与nginx整合:keepalived本身不维护nginx,不像与lvs可以实现无缝连接,我们可以选择调用脚本方式来实现keepalived与nginx整合
nginx实现调度后端负载,实现负载均衡、也可实现对负载的健康检查;keepalived调度nginx服务,即实现nginx服务的高可用。客户端访问vip,MASTER(也是由keepalived定义)的keepalived服务调度nginx服务,此处可以做一次联动控制:由keepalived启动nginx服务;当nginx服务宕掉时,keepalived必须能够及时检测到,因此keepalived需要定时对nginx服务进行检测,即定时执行脚本,保证nginx服务保持正常;当nginx服务故障,即不能正常启动时,vip迁移实现高可用。
1.vim /mnt/nginx_check.sh ##编辑脚本
#!/bin/bash
curl http://127.0.0.1//index.html -o /dev/null -s ||/usr/local/nginx/sbin/nginx
if [ $? -ne 0 ];then
/etc/init.d/keepalived stop &> /dev/null
fi
:wq
##curl http://127.0.0.1//index.html表示访问本地服务;-o /dev/null -s将访问显示内容导 入dev/null并保持静默,其返回值为0;开启nginx服务,启动成功时返回值为0,所以总 的返回值为0时表示nginx服务自动开启成功。
##若不为0,表示nginx启动失败,则将keepalived服务关闭,并且不返回结果
2.chmod+x nginx_check.sh ##加可执行权限
3.因为在脚本中以编辑了nginx服务自启。所以应保证未执行脚本前nginx服务是关闭的。
4.keepalived配置:加入脚本检测,实现与nginx联动
vim /etc/keepalived/keepalived.conf ##主配置文件
! Configuration File for keepalived
vrrp_scriptnginx_check { ##定义联动脚本
script /mnt/nginx_check.sh ##指定脚本位置
interval 2 ##每两秒检测一次
}
global_defs{
notification_email {
root@localhost ##检测结果通知本地用户
}
notification_email_from keepalived@server1
smtp_server 127.0.01
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
}
vrrp_instanceVI_1 {
state MASTER ##server1(server3端:state BACKUP)
interface eth0
virtual_router_id 51
priority 100 ##server1(sver3端:小于100即可)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.90.190
}
track_script {
nginx_check
}
}
:wq
二、nginx后端负载配置(serverr2、server4)
vim /var/www/html/index.html ##编辑首页内容
...... ##可任意编辑,建议首页内容尽量保持不同以便测试
:wq
/etc/init.f/httpd start ##开启httpd服务
三、测试
保证nginx服务是关闭状态,检测keepalived对ngnx服务的启动控制:
/usr/local/nginx/sbin/nginx -s stop ##关闭服务
/etc/init.d/keepalived start ##先开启主结点服务,再开启备机的服务
后端负载开启httpd服务(server2、server4)
(1)集群结点端使用命令ip addr 检查vip是否与主结点绑定
(2)客户端访问172.25.90.190或使用命令curl 172.25.90.190,检查nginx服务是否正常 开启
(3)MASTER端(server1):先手动宕掉nginx服务,客户端继续访问vip,查看nginx服务是否正常;集群结点使用ip addr命令查看vip绑定点,来确定keepalived是否对脚本有重复检测和执行功能
(4)由上图结果可知,手动宕掉nginx服务后,keepalived可以启动nginx服务,在MASTER(vip仍在server1)执行:mv /usr/local/nginx/sbin/nginx /opt ;
killall -9 nginx
可理解为nginx服务发生故障,ip addr命令检查vip是否迁移,检查keepalived的高可用。