码迷,mamicode.com
首页 > 其他好文 > 详细

高可用Keepalived

时间:2016-12-21 03:20:32      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:lvs



安装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_id  LVS_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地址  

    }  

}  



我们来看一下日志:

[root@ltos ~]# tail /var/log/messages  

Oct 6 03:25:03 ltos avahi-daemon[2306]: Registering new address record for 192.168.0.188 on eth0.  

Oct 6 03:25:03 ltos avahi-daemon[2306]: Registering new address record for 192.168.0.154 on eth0.  

Oct 6 03:25:03 ltos avahi-daemon[2306]: Registering HINFO record with values ‘I686‘/‘LINUX‘.  

Oct 6 03:25:23 ltos avahi-daemon[2306]: Withdrawing address record for fe80::20c:29ff:feb9:eeab on eth0.  

Oct 6 03:25:23 ltos avahi-daemon[2306]: Withdrawing address record for 192.168.0.154 on eth0.  

Oct 6 03:25:23 ltos avahi-daemon[2306]: Host name conflict, retrying with <ltos-31> 

很显然vrrp已经启动,我们还可以通过命令来检查

[root@ltos html]# 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:0  down


前面的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



本文出自 “比尔linux运维笔记” 博客,请务必保留此出处http://chenshoubiao.blog.51cto.com/6159058/1884474

高可用Keepalived

标签:lvs

原文地址:http://chenshoubiao.blog.51cto.com/6159058/1884474

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!