fdsdff 发表于 2016-12-21 09:50:09

高可用Keepalived

安装Keepalived
安装配置例一:
Keepalived的官方站点是http://www.keepalived.org,可以在这里下载到各种版本,我们这里下载的是
keepalived-1.1.19.tar.gz,安装步骤如下:
wget http://www.keepalived.org/software/keepalived-1.1.19.tar.gz
tar xf keepalived-1.1.19.tar.gz
cd keepalived-1.1.19
uname -r
yum install popt popt-devel -y
./configure   --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64
make && make install
ln -s /usr/local/sbin/keepalived/sbin/

在编译选项中,“--sysconf”指定了Keepalived配置文件的安装路径,即路径为/etc/Keepalived/Keepalived.conf,“--with-kernel-dir”这是个很重要的参数,但这个参数并不是要把Keepalived编译进内核,而是指定使用内核源码里面的头文件,就是include目录。如果要使用LVS时,才需要用到此参数,否则是不需要的.

/etc/init.d/keepalived start

配置Keepalived
Keepalived的配置非常简单,仅仅需要一个配置文件即可完成HA cluster和lvs服务节点监控功能,Keepalived的安装已经在上面章节进行了介绍,在通过Keepalived搭建高可用的LVS集群实例中,主、备Director Server都需要安装Keepalived软件,安装成功后,默认的配置文件路径为vi /etc/keepalived/keepalived.conf。一个完整的keepalived配置文件,有三个部分组成,分别是全局定义部分、vrrp实例定义部分以及虚拟服务器定义部分,下面详细介绍下这个配置文件中每个选项的详细含义和用法:


vi /etc/keepalived/keepalived.conf   参数说明
#全局定义部分
global_defs {
   notification_email {
   dba.gao@gmail.com   
   ixdba@163.com    #设置报警邮件地址,可以设置多个,每行一个。注意,如果要开启邮件报警,需要开启本机的sendmail服务。
   
   }
   notification_email_from Keepalived@localhost   #设置邮件的发送地址。
   smtp_server 192.168.200.1 #设置smtp server地址。
   smtp_connect_timeout 30 #设置连接smtp服务器超时时间。
   router_idLVS_MASTER    #运行Keepalived服务器的一个标识。发邮件时显示在邮件标题中的信息
}

#vrrp实例定义部分
vrrp_instance VI_1 {
state MASTER#指定Keepalived的角色,MASTER表示此主机是主用服务器,BACKUP表示是备用服务器。
    interface eth0      #指定HA监测网络的接口。
    virtual_router_id 51 #虚拟路由标识,这个标识是一个数字,并且同一个vrrp实例使用唯一的标识,即同一个vrrp_instance下,MASTER和BACKUP必须是一致的。
priority 100 #定义优先级,数字越大,优先级越高,在一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。
    advert_int 1   #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒。
    authentication {      #设定验证类型和密码。
      auth_type PASS   #设置验证类型,主要有PASS和AH两种。
      auth_pass 1111 #设置验证密码,在一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信。
    }
    virtual_ipaddress {#设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个。
      192.168.12.135
    }
}
#虚拟服务器定义部分
virtual_server 192.168.12.135 80 {       #设置虚拟服务器,需要指定虚拟ip地址和服务端口,ip与端口之间用空格隔开。
    delay_loop 6      #设置健康检查时间,单位是秒。
    lb_algo rr#设置负载调度算法,这里设置为rr,即轮询算法。
    lb_kind DR                     #设置LVS实现负载均衡的机制,可以有NAT、TUN和DR三个模式可选。
persistence_timeout 50                  #会话保持时间,单位是秒,这个选项对于动态网页是非常有用的,为集群系统中session共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话保持时间。需要注意的是,这个会话保持时间,是最大无响应超时时间,也就是说用户在操作动态页面时,如果在50秒内没有执行任何操作,那么接下来的操作会被分发到另外节点,但是如果一直在操作动态页面,则不受50秒的时间限制。
    protocol TCP       #指定转发协议类型,有tcp和udp两种。
real_server 192.168.12.246 80 { #配置服务节点1,需要指定real server的真实IP地址和端口,ip与端口之间用空格隔开。
weight 3 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值的大小可以为不同性能的服务器分配不同的负载,可以对性能高的服务器设置较高的权值,而对性能较低的服务器设置相对较低的权值,这样就合理的利用和分配了系统资源。
      TCP_CHECK {   #realserve的状态检测设置部分,单位是秒
            connect_timeout 10   #10秒无响应超时
            nb_get_retry 3#重试次数
            delay_before_retry 3    #重试间隔
      }
    }
    real_server 192.168.12.237 80 {#配置服务节点2
      weight 1   
      TCP_CHECK {
            connect_timeout 3   
            nb_get_retry 3            
            delay_before_retry 3
      }
    }
}
         
在配置Keepalived.conf时,需要特别注意配置文件的语法格式,因为Keepalived在启动时并不检测配置文件的正确性,即使没有配置文件,Keepalived也照样能启动起来,因而配置文件一定要正确。
在默认情况下,Keepalived在启动时会查找/etc/Keepalived/Keepalived.conf配置文件,如果你的配置文件放在了其它路径下,可以通过“Keepalived-f”参数指定你所在的配置文件路径即可。
Keepalived.conf配置完毕后,将此文件拷贝到备用Director Server对应的路径下,然后做两个简单的修改即可:
将“state MASTER”更改为“state BACKUP”
将priority 100更改为一个较小的值,这里改为“priority 80”
最后,还要配置集群的Real server节点,以达到与Director Server相互广播通信并忽略arp的目的,脚本的内容已经在前面文章中进行过介绍,这里不做解释。





让其分别作web及Nginx的HA
global_defs {
   notification_email {
   yuhongchun027@163.com
      }
   notification_email_from keepalived@chtopnet.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    mcast_src_ip 192.168.0.154    <==主nginx的IP地址
    priority 100
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass chtopnet
    }
    virtual_ipaddress {
      192.168.0.188                      <==vip地址
    }
}


我们来看一下日志:
# tail /var/log/messages
Oct 6 03:25:03 ltos avahi-daemon: Registering new address record for 192.168.0.188 on eth0.
Oct 6 03:25:03 ltos avahi-daemon: Registering new address record for 192.168.0.154 on eth0.
Oct 6 03:25:03 ltos avahi-daemon: Registering HINFO record with values 'I686'/'LINUX'.
Oct 6 03:25:23 ltos avahi-daemon: Withdrawing address record for fe80::20c:29ff:feb9:eeab on eth0.
Oct 6 03:25:23 ltos avahi-daemon: Withdrawing address record for 192.168.0.154 on eth0.
Oct 6 03:25:23 ltos avahi-daemon: Host name conflict, retrying with <ltos-31>
很显然vrrp已经启动,我们还可以通过命令来检查
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue   
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host   
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:ba:9b:e7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.154/24 brd 192.168.0.255 scope global eth0
    inet 192.168.0.188/32 scope global eth0
    inet6 fe80::20c:29ff:feba:9be7/64 scope link   
       valid_lft forever preferred_lft forever
3: sit0: <NOARP> mtu 1480 qdisc noop   
    link/sit 0.0.0.0 brd 0.0.0.0


说明vip已经启动,这样主服务器就配置好了,辅机的配置大致一样,除了配置文件有少部分的变化,下面贴出辅机的配置文件:
global_defs {
   notification_email {
   yuhongchun027@163.com
      }
   notification_email_from keepalived@chtopnet.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    mcast_src_ip 192.168.0.155            <==辅nginx的IP的地址
    priority 100
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass chtopnet
    }
    virtual_ipaddress {
      192.168.0.188
    }
}


针对Keepalived的不足,用Nginx_pid.sh来监控nginx进程,实现真正意义上的负载均衡高可用。
针对Nginx+Keepalived,编写nginx监控脚本nginx_pid.sh,此脚本思路其实也很简单,即放置在后台一直监控nginx进程;如进程消失,尝试重启nginx,如是失败则立即停掉本机的keepalived服务,让另一台负载均衡器接手,此脚本直接从生产环境下载:
vim /root/nginx_pid.sh   
#!/bin/bash
while:
do
nginxpid=`ps -C nginx --no-header | wc -l`
if [ $nginxpid -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 5
nginxpid=`ps -C nginx --no-header | wc -l`
   if [ $nginxpid -eq 0 ];then
   /etc/init.d/keepalived stop
   fi
fi
sleep 5   
done

我稍为解释一下,这是一个无限循环的脚本,放在主Nginx机器上(因为目前主要是由它提供服务),每隔5秒执行一次,用ps -C 命令来收集nginx的PID值到底是否为0,如果是0的话(即Nginx进程死掉了),尝试启动nginx进程;如果继续为0,即nginx启动失改,则关闭本机的Keeplaived进程,VIP地址则会由备机接管,当然了,整个网站就会由备机的Nginx来提供服务了,这样保证Nginx进程的高可用

然后置于后台运行 sh /root/nginx_pid.sh &,这种写法是错误的,这样你用root用户logout后,此进程会消失;正确写法为nohup/bin/bash /root/nginx_pid.sh &,附带下注释:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出root帐户之后继续运行相应的进程。nohup就是不挂起的意思( no hang up),哈哈,差点老马失蹄了。
后记:
我的线上环境网络非常复杂,这也是LVS+Keepalived失败的原因。目前此套架构在1000并发的电子商务网站非常稳定,带来的直接影响就是nginx_backup一直处于闲置状态。相对于张宴的双机轮询而言,我感觉他的可能更加完美,因为目前我的Nginx仅仅只做了负载均衡器,如果以后有机会我会尝试做负载均衡器/反向代理加速。




安装配置二:
LVS/DR + keepalived配置
接上上面rs1和rs2的vim /usr/local/sbin/lvs_dr_rs.sh配置
注意:前面虽然我们已经配置过一些操作,但是下面我们使用keepaliave操作和之前的操作是有些冲突的,所以若是之前配置过DR,请首先做如下操作:dr上执行:

$ipv -C
ifconfig eth0:0down

前面的lvs虽然已经配置成功也实现了负载均衡,但是我们测试的时候发现,当某台real server把httpd进程停掉,那么director照样会把请求转发过去,这样就造成了某些请求不正常。所以需要有一种机制用来检测real server的状态,这就是keepalived。它的作用除了可以检测rs状态外,还可以检测备用director的状态,也就是说keepalived可以实现ha集群的功能,当然了也需要一台备用director.
备用director也需要安装一下keepalived软件

yum install -y keepalived
安装好后,编辑配置文件
vim /etc/keepalived/keepalived.conf   //加入如下:
vrrp_instance VI_1 {
    state MASTER   #备用服务器上为 BACKUP
    interface eth0
    virtual_router_id 51
    priority 100#备用服务器上为90
    advert_int 1
    authentication {
      auth_type PASS
      auth_pass 1111
    }
    virtual_ipaddress {
      192.168.3.135         #vip的ip
    }
}
virtual_server 192.168.3.135 80 {
    delay_loop 6                  #(每隔10秒查询realserver状态)
    lb_algo wlc                  #(lvs 算法)
    lb_kind DR                  #(Direct Route)
    persistence_timeout 60      #(同一IP的连接60秒内被分配到同一台realserver)
    protocol TCP                #(用TCP协议检查realserver状态)

    real_server 192.168.3.138 80 {
      weight 100               #(权重)
      TCP_CHECK {
      connect_timeout 10       #(10秒无响应超时)
      nb_get_retry 3
      delay_before_retry 3
      connect_port 80
      }
    }
real_server 192.168.3.168 80 {
      weight 100
      TCP_CHECK {
      connect_timeout 10
      nb_get_retry 3
      delay_before_retry 3
      connect_port 80
      }
   }
}


/etc/init.d/keepalived start
ipvsadm -ln

ifconfig
ip add

以上为主director的配置文件,从director的配置文件只需要修改
state MASTER-> state BACKUP
priority 100 -> priority 90

配置完keepalived后,需要开启端口转发(主从都要做):
echo 1 > /proc/sys/net/ipv4/ip_forward
然后,两个rs上执行 /usr/local/sbin/lvs_dr_rs.sh 脚本
最后,两个director上启动keepalived服务(先主后从):
/etc/init.d/keepalived start


页: [1]
查看完整版本: 高可用Keepalived