【Nginx+Keepalived】
【keepalived系统】
keepalived用简单明了一句话来说就是:
在一台工作的Nginx崩溃的情况下,系统能够检测到,并自动将请求切换到另外一台备份的Nginx服务器上
keepalived有两个服务端即:Master 和BACKUP (主和备)
两台主备对外有一个共同的浮动IP以接收来自外部的数据包。
www.keepalived.org 下载安装包地址,建议下载稳定版本。
当然如果在LVS配置了keepalived那么在nginx就没必要再做keepalived了。
运行的原理请见下图:
【Nginx进程检测机制】
当然这个脚本是参考的别人的博客所写,非常感谢,记录下来当为自用。
参考博客地址:
http://blog.csdn.net/yinwenjie/article/details/47130609
这个脚本的作用是判断nginx的进程是否在运行,当然是通过统计正常列的值来判断,如果检查到没有启动,就启动nginx,
如果启动不了,则停止keepalived的响应,从而让keepalived知道一端的keepalived服务宕掉了,就启动备用keepalived端,
从而自动化切换,当然keepalived本身也是有检测机制,但是没有这个深入。这个很有意思,由于不怎么会写脚本,所以这个思
路很值得我借鉴,具体如下:
脚本:
------------------------------------------------------ #!/bin/bash if [ $(ps -C nginx --no-heading|wc -l) -eq 0 ];then #注意中括号左右的空格 /usr/local/nginx/sbin/nginx fi sleep 2 if [ $(ps -C nginx --no-heading|wc -l) -eq 0 ];then service keepalived stop fi ------------------------------------------------------ 解析脚本: ------------------------------------------------------ ps -C nginx 意为检查进程名字为nginx的进程 [root@SLC-one sbin]# ps -C nginx PID TTY TIME CMD 1180 ? 00:00:00 nginx 1181 ? 00:00:00 nginx --------------------------------------------------------------- ps -C nginx --no-heading 意为检查进程名字为nginx的进程并去除头部 [root@SLC-one sbin]# ps -C nginx --no-heading 1180 ? 00:00:00 nginx 1181 ? 00:00:00 nginx --------------------------------------------------- | 管道符的作为是将上次的输出作为下次的输入 wc -l 意为同级列表数量 ps -C nginx --no-heading | wc -l 意为检查进程名字为nginx的进程并去除头部最终统计出有几行 [root@SLC-one sbin]# ps -C nginx --no-heading | wc -l 2 ------------------------------------------------------------------------------------------------ -eq 0 是等于零的意思 $ 是调用linux下的变量引用操作符,可调用系统变量。 所以最终: [ $(ps -C nginx --no-heading | wc -l) -eq 0 ] 的意思为: 检查进程名字为nginx的进程并去除头部最终统计出有几行,而统计的行数是否等于零。 (如果最终的值为零,表示没有nginx的进程,如果不为零,则表示nginx有相应进程在运行中。同时说明了nginx在正常运行。) ---------------------------------------------------------------------------------------------------------------- then 表示然后的意思 /usr/local/nginx/sbin/nginx 所以这意为:然后执行/usr/local/nginx/sbin/nginx 从而启动nginx ---------------------------------------------------------------
由此可见:
这里的脚本是为了判断nginx是否有进程在运行。如果没有运行则进行启动,
然后 sleep 2 等待2秒钟后(是为了给予nginx的启动时间)
继续检查nginx的进程是否有启动成功,如果仍然没有启动,则停止keepalived服务
service keepalived stop
以便让keepalived的服务可以检查到有一端的keepalived宕机了,然后自动切换到备用的keepalived服务器。
【Nginx+keepalived前期准备】
1.准备两台安装过Nginx的服务器,并保证服务器正常,如果是VMware虚拟机安装,请保证可以通过本地电脑正常访问Nginx首页
2.下载keepalived稳定版的安装包
【Keepalived安装】
1. 这里使用的是keepalived-1.2.23.tar.gz版本
分别在两台Nginx服务器上面安装keepalived-1.2.23.tar.gz过程如下:
tar -zxvf keepalived-1.2.23.tar.gz cd keepalived-1.2.23 ./configure --prefix=/usr/local/keepalived make && make install
2. 接下来写入上面的脚本到/usr/local/keepalived/script(当然两台Nginx的服务器上面都要有这个脚本)
这个script目录是我自建的,因为我觉得对应软件的脚本文件就放入到软件的安装目录下就好了,方便查找,个人习惯。
--------------------------------------------------- touch chknginx /usr/local/keepalived/script/chknginx cd /usr/local/keepalived/script/ vim chknginx --------------------------------------------------------- #!/bin/bash if [ $(ps -C nginx --no-heading|wc -l) -eq 0 ];then /usr/local/nginx/sbin/nginx fi sleep 2 if [ $(ps -C nginx --no-heading|wc -l) -eq 0 ];then service keepalived stop fi -------------------------------------------------------------- 注意加入完成以后给文件的可执行权限,我这里是全给的,如下所示: chmod 777 chknginx -rwxrwxrwx. 1 root root 184 Aug 3 00:13 chknginx ---------------------------------------------------------------
【Keepalived配置文件更改】
1. keepalived的配置文件在 /usr/local/keepalived/etc/keepalived/keepalived.conf
首先确立大的方向即:
哪台来做主备,以及浮动IP
192.168.60.90 浮动ip
192.168.60.107 Master
192.168.60.108 BACKUP
2. 接下来进行配置文件的更改,在Nginx+keepalived这里只用配置前面的两个部分,即Global部分和Vrouter部分。
-----------------------------------Global全局配置部分---------------------------------------------- ------------------------------------------------- [root@SLC-one keepalived]# less keepalived.conf ! Configuration File for keepalived #全局设置 global_defs { #存在于同一个网段中,一组keepalived的各个节点都有不同的名字 #在全局设置中,这里可以设置管理员的email邮箱信息 notification_email { #通知邮件 acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc #通知邮件来源 smtp_server 127.0.0.1 #设置邮件服务器地址为本地 smtp_connect_timeout 30 #设置连接超时时间 router_id LVS_nginx_kpone #设置本keepalived的ID名称 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chknginx #这一段如果在配置文件里面没有,就自行加入进去,是为了激活上面加入的chknginx脚本 { script "/usr/local/keepalived/script/chknginx" #脚本所在地址 interval 10 #设置检测时间间隔为每10秒一次 } ----------------------------------------Vrouter的配置部分----------------------------------------------- ------------------------------------------------------------ vrrp_instance VI_1 { #设置第一个实例 state MASTER #设置本机keepalived角色为MASTER(如果是另一台则设置为BACKUP) interface eth0 #绑定网卡为eth0(可以用ifconfig命令查看当前使用的网卡名称及地址) virtual_router_id 51 #虚拟路由节点ID,在同一组keepalived中,这个ID一定必须要一样,才会被识别 nopreempt #如果不希望在MASTER恢复后重新抢占,那么这里一定要配置非抢占模式(一般默认为抢占模式) priority 100 #设置此MASTER的优先级(MASTER的优先级一定比SLAVE的优先级高,值越大优先级越高) advert_int 1 #设置组播信息发送间隔,两台主从也必须一样 authentication { #认证信息 auth_type PASS #只有两边的认证信息一致才能加入到同一个组中 auth_pass 1111 } virtual_ipaddress { #浮动虚拟ip设置,这个原本的配置文件里面有三个,可目前我们只需要一个 192.168.60.90 #设置浮动ip } track_script { #关联上面的vrrp_script chknginx chknginx } }
3. 将keepalived做成系统服务
如果万一将服务器重新启动了,如果不是系统服务,keepalived是不是会起不来,需要手动启动,岂不是太麻烦,
所以还是要将它做成系统的服务,这样就不必担心了。
因为我在上面安装的时候是将keepalived安装在/usr/local/keepalived下面的,所以如要注册成为系统服务,
需要做以下更改:
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/keepalived cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived mkdir /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf ---------------------------这样就可以将keepalived做成系统服务了----- /etc/rc.d/init.d/keepalived 加入init.d的启动列表,如果后面加上start可以启动 chkconfig keepalived on 加入开机启动
4. 启动keepalived的服务
先启动MASTER:service keepalived start
再启动BACKUP:service keepalived start
可以通过查看动态日志来看启动的状态:tail -f /var/log/messages
经过反复试验可以实现:
a. 当192.168.60.107宕机的时候,访问192.168.60.90,依然可以访问到nginx的首页,
只是是由192.168.60.108传过来,证明服务已经切换到60.108.
b. 当192.168.60.107恢复的时候,访问192.168.60.90,当然依然可以访问,只是通过首页可以看到是由
192.168.60.107传回来的,服务又切换回来了。
c. 将两台nginx服务器进行重启,脚本生效,可以正常访问nginx的首页,说明chknginx的脚本文件和keepalived
的服务都是正常可行的。
也可以通过查看进程判断nginx和keepalived是否已启动
[root@SLC-one ~]# ps -C nginx PID TTY TIME CMD 1033 ? 00:00:00 nginx 1035 ? 00:00:00 nginx [root@SLC-one ~]# ps -C keepalived PID TTY TIME CMD 986 ? 00:00:00 keepalived 992 ? 00:00:00 keepalived 993 ? 00:00:00 keepalived 或者也可以使用/etc/init.d/keepalived status 来查看
5. 配置过程注意事项:
a. 注意防火墙的开关 service iptables start/stop
b. 注意备用的keepalived为BACKUP而不是SLAVE,尤其是更改配置文件的时候
c. 注意脚本文件的添加,知道bash脚本的就知道在if之后的[]的中括号的左右必须留有空格,否则会报错
d. BACKUP端可以不止有一个,可以有多个
e. 局域网的组播地址要可用,因为局域网内的所有keepalived节点都是依靠组播地址来寻找对方的。
f. 脚本存放的位置一定要跟配置文件里面的vrrp_script chknginx 内里地址对应
【主节点的抢占与非抢占模式】
先来看原来主节点的配置文件段落: vrrp_script chknginx #这一段如果在配置文件里面没有,就自行加入进去,是为了激活上面加入的chknginx脚本 { script "/usr/local/keepalived/script/chknginx" #脚本所在地址 interval 10 #设置检测时间间隔为每10秒一次 weight -2 #权重值减2,一旦节点失效,那么它优先级就会自动减少2,建议最好有多少个节点的数量,这里就减几 #这样可以一直保证这个节点的优先级比其他节点都低 #fall 1 #表示多少次检查失败,就算为节点失效。默认为1 } 同时需要加入nopreempt非抢占模式的更改,配置问价里面如果没有就手动加入这一项。 vrrp_instance VI_1 { #设置第一个实例 nopreempt #如果不希望在MASTER恢复后重新抢占,那么这里一定要配置非抢占模式(一般默认为抢占模式) track_script { chknginx } } 这个nopreempt和上面的weight、fall都可以在主和备端同时配置,谁失效谁就减权重值。从而达到服务器的更高可用性能。