在这里我们要讲Keepalived的使用,在讲Keepalived之前,我们要先讲讲VRRP的使用。因为Keepalived加入VRRP功能,使得现在的Keepalived具有服务器运行检测功能与HA Cluster功能。
一、VRRP定义
VRRP(Virtual Routing Redundent Protocol):虚拟路由冗余协议,它是一种协议,将多态物理设备组合成一台虚拟设备。
1、备份组中路由器的优先级
在一个备份组中,有一个主(master),多个从(slave),当主服务器(master)宕机了,从服务器就要取而代之,但是那么多从服务哪个取代呢?它有一个根据优先级的选举协议,优先级高的谁就成为主的了,或者让它工作在抢占模式下,谁反应快,谁就成为主的了。所以它是一主多从的工作机制,但是多个从平时都不上线,这就造成了资源的浪费,所以我们常见的就是一主一从,实际它是可以实现一主多从的。
VRRP优先级的取值范围为0~255(数值越大表名优先级越高),可配置的范围是1~254,优先级0为形同保留,255则是系统保留给IP地址拥有者,当路由器为IP地址拥有者时,其优先级始终为255,所以,当备份组内存在IP地址拥有者时,只要其工作正常,则为Master路由器。
在一个物理设备上,可以配置多个组,靠组ID区别不同的组。在同一个组内,所有的工作都在同一个组内工作的。
2、VRRP工作过程
(1)路由器使用VRRP功能后,会根据优先级确定自己在备份中的角色。优先级高的为Master,低的为Backup,Master定义发送VRRP通告报文,通知备份组中的其它路由器自己工作正常。Backup则启动定时器等待通告报文的到来。
(2)在抢占模式下,当Backup收到VRRP通告的报文后,会拿自己的优先级比较通报报文中的优先级,如果大于通告报文中的优先级,则成为Master ,如果小于通告报文中的优先级,则还是Backup。
(3)在非抢占模式下,只要Master路由器没有出现问题,备份组中的路由器始终保持着自己原来的状态,即使后来有的Backup有更高的优先级也不会成为Master。
(4)如果Backup的定时超时后仍然没有收到Master路由器发送来的VRRP通告报文,则认为Master已经无法正常工作了,此时Backup会认为自己是Master,并对外发送VRRP通告报文,备份组内的路由会根据优先级选举出来Master,承担报文的转发功能。
二、Keepalived定义及主要功能
Keepalived:最初目的为ipvs提供高可用功能的,所以我们实现ipvs高可用的时候我们使用Keepalived来配置更简
主要提供三个功能
1、IP:对IP地址实现飘移,依赖于ARRP协议
2、lvs:重新启用一份ipvs规则
3、health check:健康检查
三、配置安装Keepalived实现LVS服务的高可用
我们这里使用四台虚拟机,其中HA1和HA2当做高可用的Web服务,另外两个做成real server。这里我们要先在HA1和HA2上面安装keepalived,这个软件我们这些下载到本地了,大家配置了上官网上下载(keepalived-1.2.7-5.el5.i386.rpm) 软件包,因为安装这个包还需要解决依赖关系,所以这里我们还需要安装yum库,安装完成后我们就开始安装keepalived。
1、安装yum库
我们这里用挂载光盘来安装yum库,进而安装开发环境,需要安装Development Libraries和Development Tools,但是Development Tools默认都安装过了,所以我们这里安装一个就行了。安装完成后开发环境就安装成功了。
[root@localhost ~]# mkdir /mnt/cdrom ###创建cdrom目录 [root@localhost ~]# mount /dev/cdrom /mnt/cdrom ###挂载光盘(当场有效,开机无效) [root@localhost ~]# vim /etc/fstab ###在配置文件中挂载光盘(当场无效,开机有效) /dev/cdrom /mnt/cdrom ext3 defaults 0 0 [root@localhost ~]# cd /etc/yum.repos.d/ ###进入yum.repos.d目录下面 [root@localhost yum.repos.d]# vim server.repo ###编辑server.repo [base] name=Server baseurl=file:///mnt/cdrom/Server enabled=1 gpgcheck=0 [root@localhost yum.repos.d]# yum groupinstall "Development Libraries"
2、安装keepalived
# yum -y--nogpgcheck localinstall keepalived-1.2.7-5.el5.i386.rpm # rpm -qlkeepalived ###查看配置文件 /etc/keepalived ###配置文件目录 /etc/keepalived/keepalived.conf ###主配置文件 /etc/keepalived/keepalived.conf.haproxy_example ###自己设置的主配置文件将haproxy配置成高可用功能了 /etc/keepalived/notify.sh ###这里我们设置的脚本,网上下载是没有的。 # scpkeepalived-1.2.7-5.el5.i386.rpm node1:/root ###把下载的软件包给前HA2发过去。
3、查看并解释配置文件。
四、配置real server
我们需要设置IP地址与director在同一个网段内,首先我们要先关闭selinux,然后安装http服务器进行访问测试,然后编辑网页,网页编辑完成后我们就要开启服务,下来进行网页测试。
#setenforce0 ###关闭selinux # yum installhttpd ###安装http服务 # vim /var/www/html/index.html ###编辑网页 # service httpdrestart ###开启服务
我们这里使用的是一个脚本,此脚本只需要在real server中使用就行了。
# vim start.sh###编辑脚本,脚本内容如下:
#!/bin/bash # # Script to start LVS DR real server. # description: LVS DR real server # . /etc/rc.d/init.d/functions VIP=172.16.58.1 host=`/bin/hostname` case "$1" in start) # Start LVS-DR real server on this machine. /sbin/ifconfig lo down /sbin/ifconfig lo up echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore ###设置相应级别 echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ###设置通告级别 echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:0 ;; stop) # Stop LVS-DR real server loopback device(s). /sbin/ifconfig lo:0 down echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce ;; status) # Status of LVS-DR real server. islothere=`/sbin/ifconfig lo:0 | grep $VIP` isrothere=`netstat -rn | grep "lo:0" | grep $VIP` if [ ! "$islothere" -o ! "isrothere" ];then # Either the route or the lo:0 device # not found. echo "LVS-DR real server Stopped." else echo "LVS-DR real server Running." fi ;; *) # Invalid entry. echo "$0: Usage: $0 {start|status|stop}" exit 1 ;; esac
## chmod +x start.sh # ./start.sh start # ifconfig (显示的是只是添加的内容)
# scp start.sh172.16.58.10:/root/ ###将脚本复制到另一个real server上进行执行。
五、修改主配置文件
1、修改HA1中的keepalived的配置文件
下面我们就去HA1和HA2中修改主配置文件,我们在修改主配置文件的时候首先就是要将主配置文件复制一份,然后在修改,这样避免出错后,无法修改。
! Configuration File for keepalived ###表示注释信息,#也表是注释 global_defs { ###这里面都是全局默认 notification_email { root@localhost } notification_email_from root@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { ###定义虚拟路由(可以定义多个虚拟路由组) state MASTER ###状态(有两种,一种MASTER另一种BACKUP)【提示:只在初始的时候定义主、从】 interface eth0 ###在哪个接口上实现配置地址和完成选举 virtual_router_id 77 ###在VI_1下面定义的虚拟ID,必须要和别的人不一样 priority 101 ###优先级 advert_int 1 ###多长时间通告一次(这里是1秒钟) authentication { ###认证 auth_type PASS ###表示用字符串来认证 auth_pass password ###生成随机串(最好是随机的) } virtual_ipaddress { ###提供虚拟IP(可以是一个,也可以是多个) 172.16.58.1 } } virtual_server 172.16.58.1 80 { ###定义虚拟服务器,后面是VIP,最后面是端口【提示:可以定义多个集群服务】 delay_loop 6 lb_algo wlc ####负载均衡调度方法,rr为轮询 lb_kind DR ###LVS的类型 nat_mask 255.255.0.0 protocol TCP ###端口协议使用TCP real_server 172.16.58.8 80 { ###real server地址,端口 weight 1 ###权重 url { path / ###获取web服务器的根目录,直接获取主页,显示200正常,显示404等为不正常 status_code 200 } connect_timeout 2 ###多长时间探测一次(2s),如果3s中后获取不到,则为不健康 nb_get_retry 3 ###在探测不健康的时候要尝试几次(3次) delay_before_retry 1 ###每一次尝试之前要延迟多长时间 (1s) } virtual_server 172.16.58.1 80 { delay_loop 6 lb_algo wlc lb_kind DR nat_mask 255.255.0.0 protocol TCP real_server 172.16.58.10 80 { weight 1 url { path / status_code 200 } connect_timeout 2 nb_get_retry 3 delay_before_retry 1 } }
2、将HA1中配置文件复制到HA2中
修改好配置文件后,我们还需要将这个配置文件复制到HA2一份,不只是复制过去就行了,我们还需要修改配置文件的。
3、开启两个HA服务
#service keepalived start ###启动keepalived #ip add show ###查看网络状态
4、安装ipvsadm (两个服务上都要安装)
# ip add show # servicekeepalived restart ###重启keepalived # ipvsadm -L –n ###查看每一个real server对外所提供用户请求的次数
六、实现基于web服务的高可用集群(在HA1和HA2上)
1、工作图
简述:当客户端通过路由器访问我们的服务器的时候,只能访问到我们的MASTER服务器上,当MASTER出现问题的时候,它的VIP会飘移到BACKUP上,会替代MASTER而成为MASTER的。
2、编辑网页并进行测试
# service keepalived stop ###停止keepalived # yum -y install httpd ###装好web服务 # vim /var/www/html/index.html ###编辑网页 <h1>node1</h1> ###HA1网页内容 <h1>node2</h1> ###HA2网页内容 # service httpd start ###启动服务
首先确保服务不会成为高可用集群的故障,我们首先要启动服务,然后进行测试。
3、修改keepalived配置文件并设置脚本
这里我们还需要将配置文件中的内容修改,我们修改后的内容如下:
! Configuration File for keepalived global_defs { notification_email { linuxedu@foxmail.com mageedu@126.com } notification_email_from kanotify@magedu.com smtp_connect_timeout 3 smtp_server 127.0.0.1 router_id LVS_DEVEL } vrrp_script chk_httpd{ script "killall -0 httpd" interval 2 # check every 2 seconds weight -2 # if failed, decrease 2 of the priority fall 2 # require 2 failures for failures rise 1 # require 1 sucesses for ok } vrrp_script chk_schedown { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 2 weight -2 } vrrp_instance VI_1 { interface eth0 # interface for inside_network, bound by vrrp state MASTER # Initial state, MASTER|BACKUP # As soon as the other machine(s) come up, # an election will be held and the machine # with the highest "priority" will become MASTER. # So the entry here doesn't matter a whole lot. priority 101 # for electing MASTER, highest priority wins. # to be MASTER, make 50 more than other machines. virtual_router_id 51 # arbitary unique number 0..255 # used to differentiate multiple instances of vrrpd # running on the same NIC (and hence same socket). garp_master_delay 1 authentication { auth_type PASS auth_pass password } track_interface { eth0 } # optional, monitor these as well. # go to FAULT state if any of these go down. virtual_ipaddress { 172.16.58.1/16 dev eth0 label eth0:0 } #addresses add|del on change to MASTER, to BACKUP. #With the same entries on other machines, #the opposite transition will be occuring. #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL> track_script { chk_httpd chk_schedown } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } #vrrp_instance VI_2 { # interface eth0 # state MASTER # BACKUP for slave routers # priority 101 # 100 for BACKUP # virtual_router_id 52 # garp_master_delay 1 # # authentication { # auth_type PASS # auth_pass password # } # track_interface { # eth0 # } # virtual_ipaddress { # 172.16.58.2/16 dev eth0 label eth0:1 # } # track_script { # chk_httpd # chk_mantaince_down # } # # notify_master "/etc/keepalived/notify.sh master eth0:1" # notify_backup "/etc/keepalived/notify.sh backup eth0:1" # notify_fault "/etc/keepalived/notify.sh fault eth0:1" #}
开始的时候我就说过,我们这里自己设置的有脚本,大家如果想配置,脚本的内容如下:
#vim notify.sh 脚本内容如下: #!/bin/bash # Author: MageEdu <linuxedu@foxmail.com> # description: An example of notify script # ifalias=${2:-eth0:0} interface=$(echo $ifalias | awk -F: '{print $1}') vip=$(ip addr show $interface | grep $ifalias | awk '{print $2}') #contact='linuxedu@foxmail.com' contact='root@localhost' workspace=$(dirname $0) notify() { subject="$ip change to $1" body="$ip change to $1 $(date '+%F %H:%M:%S')" echo $body | mail -s "$1 transition" $contact } case "$1" in master) notify master exit 0 ;; backup) notify backup /etc/rc.d/init.d/httpd restart exit 0 ;; fault) notify fault exit 0 ;; *) echo 'Usage: $(basename $0) {master|backup|fault}' exit 1 ;; esac
4、在HA2上编辑keepalived的配置文件,完成后进行测试
# vim keepalived.conf
# service keepalived start ###启动keepalived # ifconfig ###在主服务器上使用它
这时候我们给HA1上使用了别名,我们使用别名访问一下。
5、模拟MASTER出故障
这时候我们把主服务器的Web服务器停了,我们看看ip地址是否会飘移到从服务器上。从下面的两个图可以看到,它真的转移了,如果不相信我们可以测试下网页,我们可以看到它的页面内容也是我们原来设置从服务器的内容。
# service httpd stop ###停止主服务器的Web服务
主服务器上:
从服务器上:
6、测试一下:
七、双主模型
1、工作图:
简述:当客户端发送访问上面的服务器时,上面的服务器比较繁忙,我们就要用两台主机都进行工作,不过这里我们要使用两个虚拟IP地址,这两个虚拟IP地址是不一样的。我们这里是两个组,第一个组上面是主,下面是从,第二组下面是主,上面是从。如果有一个组中的MASTER挂了,它的VIP就会飘移到另一个组的上面。
2、修改配置文件
在上面基于web服务的高可用集群中,我们把keepalived配置文件中的最下面#开头的行开启了,开启后我们还要进行编辑,在HA1中将VI_2我们需要将state MASTER改为state BACKUP,我们把优先级改为100,只要比MASTER的优先级小就行。内容如下:
vrrp_instance VI_2 { interface eth0 state BACKUP # BACKUP for slave routers priority 100 # 100 for BACKUP virtual_router_id 52 garp_master_delay 1 authentication { auth_type PASS auth_pass password } track_interface { eth0 } virtual_ipaddress { 172.16.58.2/16 dev eth0 label eth0:1 } track_script { chk_httpd chk_mantaince_down } notify_master "/etc/keepalived/notify.sh master eth0:1" notify_backup "/etc/keepalived/notify.sh backup eth0:1" notify_fault "/etc/keepalived/notify.sh fault eth0:1" } # service keepalived restart ###启动keepalived服务器 #ifconfig
3、查看IP地址配置
查看HA1的IP地址配置:
查看HA2的IP地址配置:
4、测试:
5、模拟HA1发生故障
# cd /etc/keepalived/ # touch down
查看HA2上IP地址配置:
6、测试一下
我们会发现用172.16.58.6和172.16.58.7访问的都是由HA2返回的结果。
转载于:https://blog.51cto.com/lzysg172/1202943