keepalived+lvs实验案例

 

第一部分:配置Web节点服务器

Realserver1 192.168.170.10

安装httpd服务,配置Web节点服务器

[root@node3 ~]# yum -y install httpd
[root@node3 ~]# vi /etc/httpd/conf/httpd.conf 
ServerName www.node3.com

配置默认测试页

[root@node3 ~]# echo "<h1>Realserver1</h1>" > /var/www/html/index.html

启动http服务,查看端口服务状态

[root@node3 ~]# systemctl start httpd.service
[root@node3 ~]# ss -tunlp | grep 80
tcp    LISTEN     0      128      :::80                   :::*                   users:(("httpd",pid=20029,fd=4),("httpd",pid=1676,fd=4),("httpd",pid=588,fd=4),("httpd",pid=585,fd=4),("httpd",pid=584,fd=4),("httpd",pid=583,fd=4),("httpd",pid=582,fd=4))

客户端测试正常

[root@node6 ~]# curl http://192.168.170.10
<h1>Realserver1</h1>

配置DR模式,编辑配置文件,执行脚本。

[root@node3 ~]#vi web.sh
#!/bin/bash
#
vip=192.168.170.80
mask='255.255.255.255'

case $1 in
start)
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

        ifconfig lo:0 $vip netmask $mask broadcast $vip up
        route add -host $vip dev lo:0
        ;;
stop)
        ifconfig lo:0 down

        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

        ;;
*) 
        echo "Usage $(basename $0) start|stop"
        exit 1
        ;;
esac
[root@node3 ~]# bash web.sh start

查看虚拟接口状态

[root@node3 ~]# ifconfig
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.170.80  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)

查看路由状态

[root@node3 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.170.254 0.0.0.0         UG    100    0        0 ens192
192.168.70.0    0.0.0.0         255.255.255.0   U     101    0        0 ens224
192.168.170.0   0.0.0.0         255.255.255.0   U     100    0        0 ens192
192.168.170.80  0.0.0.0         255.255.255.255 UH    0      0        0 lo
[root@node3 ~]# 

Realserver2 192.168.170.11

安装httpd作为realserver服务,配置启动服务,查看服务状态

[root@node4 ~]# yum -y install httpd
[root@node4 ~]# vi /etc/httpd/conf/httpd.conf 
ServerName www.node4.com

配置默认测试页

[root@node4 ~]# echo "<h1>Realserver2</h1>" > /var/www/html/index.html

启动服务并查看接口状态

[root@node4 ~]# systemctl start httpd.service
[root@node4 ~]# ss -tunlp | grep 80
tcp    LISTEN     0      128      :::80                   :::*                   users:(("httpd",pid=20029,fd=4),("httpd",pid=1676,fd=4),("httpd",pid=588,fd=4),("httpd",pid=585,fd=4),("httpd",pid=584,fd=4),("httpd",pid=583,fd=4),("httpd",pid=582,fd=4))

查看虚拟接口状态

[root@node4 ~]# ifconfig
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.170.80  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)

客户端测试正常

[root@node6 ~]# curl http://192.168.170.11
<h1>Realserver2</h1>
[root@node6 ~]# 

配置DR模式,编辑配置文件,执行脚本。

[root@node4 ~]#vi web.sh
#!/bin/bash
#
vip=192.168.170.80
mask='255.255.255.255'

case $1 in
start)
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

        ifconfig lo:0 $vip netmask $mask broadcast $vip up
        route add -host $vip dev lo:0
        ;;
stop)
        ifconfig lo:0 down

        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

        ;;
*) 
        echo "Usage $(basename $0) start|stop"
        exit 1
        ;;
esac
[root@node4 ~]# chmod +x web.sh
[root@node4 ~]# bash web.sh start

第二部分:配置Keepalived搭建双机热备

主节点配置Keepalived服务

安装keepalived所依赖的程序包

[root@node1 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel

安装管理软件ipvsadm和keepalived服务

[root@node1 ~]# yum -y install keepalived ipvsadm 

配置服务状态通告脚本

[root@node1 keepalived]# vi notify.sh 
#!/bin/bash
#
contact='root@localhost'

notify() {
        local mailsubject="$(hostname) to be $1, vip floating"
        local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
        echo "$mailbody" | mail -s "$mailsubject" $contact
}

case $1 in
master)
        notify master
        ;;
backup)
        notify backup
        ;;
fault)
        notify fault
        ;;
*)
        echo "Usage: $(basename $0) {master|backup|fault}"
        exit 1
        ;;
esac
[root@node1 keepalived]# 

配置主调度器调用后端Realserver服务器做高可用

[root@node1 keepalived]# vi keepalived.conf
! 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 node1
  vrrp_mcast_group4 224.0.100.78
}

vrrp_instance VI_1 {
  state MASTER
  interface ens192
  virtual_router_id 51
  priority 100
  advert_int 1
  authentication {
      auth_type PASS
      auth_pass 1111
  }
  virtual_ipaddress {
    192.168.170.80/24 dev ens192 label ens192:0
  }
  notify_master "/etc/keepalived/notify.sh master" #主机状态改变时,做通知消息的发送。
  notify_backup "/etc/keepalived/notify.sh backup"  #备机状态改变时,做通知消息的发送。
  notify_fault "/etc/keepalived/notify.sh fault"
}   
virtual_server 192.168.170.80 80 {
  delay_loop 1
  lb_algo rr
  lb_kind DR
  persistence_timeout 60
  protocol TCP
  sorry_server 127.0.0.1 80

  real_server 192.168.170.10 80 {
    weight 1
    HTTP_GET {
      url {
	path /
	status_code 200
      }
      connect_timeout 1
      nb_get_retry 3
      delay_before_retry 1
    }
  }
  real_server 192.168.170.11 80 {
    weight 1
    HTTP_GET {
      url {
        path /index.html
        status_code 200
      }
    connect_timeout 1
    nb_get_retry 3
    delay_before_retry 1
    }
  }
}

启动服务并查看状态

[root@node1 keepalived]# systemctl start keepalived 
[root@node1 keepalived]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2019-04-26 09:53:54 CST; 10h ago
  Process: 20829 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 20830 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─20830 /usr/sbin/keepalived -D
           ├─20831 /usr/sbin/keepalived -D
           └─20832 /usr/sbin/keepalived -D

Apr 26 09:53:55 node1 Keepalived_vrrp[20832]: Sending gratuitous ARP on ens192 for 192.168.170.80
Apr 26 09:53:55 node1 Keepalived_vrrp[20832]: Sending gratuitous ARP on ens192 for 192.168.170.80
Apr 26 09:53:55 node1 Keepalived_vrrp[20832]: Sending gratuitous ARP on ens192 for 192.168.170.80
Apr 26 09:53:55 node1 Keepalived_vrrp[20832]: Sending gratuitous ARP on ens192 for 192.168.170.80
Apr 26 09:54:00 node1 Keepalived_vrrp[20832]: Sending gratuitous ARP on ens192 for 192.168.170.80
Apr 26 09:54:00 node1 Keepalived_vrrp[20832]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens192 for ...70.80
Apr 26 09:54:00 node1 Keepalived_vrrp[20832]: Sending gratuitous ARP on ens192 for 192.168.170.80
Apr 26 09:54:00 node1 Keepalived_vrrp[20832]: Sending gratuitous ARP on ens192 for 192.168.170.80
Apr 26 09:54:00 node1 Keepalived_vrrp[20832]: Sending gratuitous ARP on ens192 for 192.168.170.80
Apr 26 09:54:00 node1 Keepalived_vrrp[20832]: Sending gratuitous ARP on ens192 for 192.168.170.80
Hint: Some lines were ellipsized, use -l to show in full.

验证物理接口是否已经虚拟地址

[root@node1 keepalived]# ip addr show dev ens192
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:a3:50:cf brd ff:ff:ff:ff:ff:ff
    inet 192.168.170.8/24 brd 192.168.170.255 scope global ens192
       valid_lft forever preferred_lft forever
    inet 192.168.170.80/24 scope global secondary ens192:0
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:fea3:50cf/64 scope link 
       valid_lft forever preferred_lft forever
[root@node1 keepalived]# 
查看后端服务器状态
[root@node1 keepalived]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.170.80:80 rr persistent 60
  -> 192.168.170.10:80            Route   1      0          0         
  -> 192.168.170.11:80            Route   1      0          0 

BACKUP 192.168.170.9

安装keepalived所依赖的程序包

[root@node2 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel
安装管理软件ipvsadm和keepalived程序包
[root@node2 ~]# yum -y install keepalived ipvsadm 

配置服务状态通知脚本

[root@node2 keepalived]# vi notify.sh 
#!/bin/bash
#
contact='root@localhost'

notify() {
        local mailsubject="$(hostname) to be $1, vip floating"
        local mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
        echo "$mailbody" | mail -s "$mailsubject" $contact
}

case $1 in
master)
        notify master
        ;;
backup)
        notify backup
        ;;
fault)
        notify fault
        ;;
*)
        echo "Usage: $(basename $0) {master|backup|fault}"
        exit 1
        ;;
esac

配置从调度器调用后端realserver服务器做高可用

[root@node2 keepalived]# vi keepalived.conf
! 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 node2
  vrrp_mcast_group4 224.0.100.78
}

vrrp_instance VI_1 {
  state BACKUP
  interface ens192
  virtual_router_id 51
  priority 98
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress {
    192.168.170.80/24 dev ens192 label ens192:0
  }
  notify_master "/etc/keepalived/notify.sh master"
  notify_backup "/etc/keepalived/notify.sh backup"
  notify_fault "/etc/keepalived/notify.sh fault"
}
virtual_server 192.168.170.80 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 60
    protocol TCP
  real_server 192.168.170.10 80 {
    weight 1
    HTTP_GET {
      url {
        path /
        status_code 200
      }
    connect_timeout 1
    nb_get_retry 3
    delay_before_retry 1
    }
  }
  real_server 192.168.170.11 80 {
    weight 1
    HTTP_GET {
      url {
        path /
        status_code 200
      }
    connect_timeout 1
    nb_get_retry 3
    delay_before_retry 1
    }
  }
}

启动服务并查看状态

[root@node2 keepalived]# systemctl start keepalived 
[root@node2 keepalived]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2019-04-26 20:35:02 CST; 6s ago
  Process: 22038 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 22039 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─22039 /usr/sbin/keepalived -D
           ├─22040 /usr/sbin/keepalived -D
           └─22041 /usr/sbin/keepalived -D

Apr 26 20:35:02 node2 Keepalived_vrrp[22041]: Opening file '/etc/keepalived/keepalived.conf'.
Apr 26 20:35:02 node2 Keepalived_vrrp[22041]: WARNING - default user 'keepalived_script' for script execution doe...eate.
Apr 26 20:35:02 node2 Keepalived_vrrp[22041]: SECURITY VIOLATION - scripts are being executed but script_security...bled.
Apr 26 20:35:02 node2 Keepalived_vrrp[22041]: VRRP_Instance(VI_1) removing protocol VIPs.
Apr 26 20:35:02 node2 Keepalived_vrrp[22041]: Using LinkWatch kernel netlink reflector...
Apr 26 20:35:02 node2 Keepalived_vrrp[22041]: VRRP_Instance(VI_1) Entering BACKUP STATE
Apr 26 20:35:02 node2 Keepalived_vrrp[22041]: Opening script file /etc/keepalived/notify.sh
Apr 26 20:35:02 node2 Keepalived_vrrp[22041]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
Apr 26 20:35:02 node2 Keepalived_healthcheckers[22040]: Activating healthchecker for service [192.168.170.80]:80
Apr 26 20:35:02 node2 Keepalived_healthcheckers[22040]: Activating healthchecker for service [192.168.170.80]:80

验证物理接口是否已经存在虚拟地址

[root@node2 keepalived]# ip addr show dev ens192
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:ba:d9:07 brd ff:ff:ff:ff:ff:ff
    inet 192.168.170.9/24 brd 192.168.170.255 scope global ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feba:d907/64 scope link 
       valid_lft forever preferred_lft forever
[root@node2 keepalived]# 
查看虚拟服务表中的所有虚拟服务
[root@node2 keepalived]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.170.80:80 rr persistent 60
  -> 192.168.170.10:80            Route   1      0          0         
  -> 192.168.170.11:80            Route   1      0          4 

第三步:验证结果

node1主服务器keepalived服务关闭,验证node2从服务器状态

[root@node1 keepalived]# systemctl stop keepalived

备机自己切换到主机状态,并受到邮件通知自己切换到主状态

[root@node2 keepalived]# ifconfig
ens192:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.170.80  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:0c:29:ba:d9:07  txqueuelen 1000  (Ethernet)

[root@node2 keepalived]# mail 
 U 14 root                  Fri Apr 26 21:01  19/691   "node2 to be master, vip floating"
& 14
Message 14:
From root@node2.localdomain  Fri Apr 26 21:01:09 2019
Return-Path: <root@node2.localdomain>
X-Original-To: root@localhost
Delivered-To: root@localhost.localdomain
Date: Fri, 26 Apr 2019 21:01:09 +0800
To: root@localhost.localdomain
Subject: node2 to be master, vip floating
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: root@node2.localdomain (root)
Status: RO

2019-04-26 21:01:09: vrrp transition, node2 changed to be master

& quit
Held 14 messages in /var/spool/mail/root
[root@node2 keepalived]# 

第四部分 测试LVS+Keepalived高可用群集

客户端,能够通过LVS+Keepalived群集的漂移地址(192.168.170.80)正常访问web页面内容,则验证群集构建成功。

验证两台Web服务器轮询工作

[root@node5 ~]# for i in {1..20}; do curl http://192.168.170.80; done
<h1>Realserver1</h1>
<h1>Realserver1</h1>
<h1>Realserver1</h1>
<h1>Realserver1</h1>
<h1>Realserver1</h1>
<h1>Realserver1</h1>
<h1>Realserver1</h1>
<h1>Realserver1</h1>

由于设置了连接保持时间为60秒,一分钟后再重新访问该地址
[root@node5 ~]# for i in {1..20}; do curl http://192.168.170.80; done
<h1>Realserver2</h1>
<h1>Realserver2</h1>
<h1>Realserver2</h1>
<h1>Realserver2</h1>
<h1>Realserver2</h1>
<h1>Realserver2</h1>
<h1>Realserver2</h1>
<h1>Realserver2</h1>
<h1>Realserver2</h1>
可以看到客户端的请求是自动轮询到一台Web服务器

模拟主调度器故障,验证结果

[root@node1 keepalived]# systemctl stop keepalived
[root@node1 keepalived]# tail -f /var/log/messages
Apr 26 21:34:23 node1 Keepalived_vrrp[22871]: VRRP_Instance(VI_1) sent 0 priority
Apr 26 21:34:23 node1 Keepalived_vrrp[22871]: VRRP_Instance(VI_1) removing protocol VIPs.
Apr 26 21:34:23 node1 Keepalived_healthcheckers[22870]: Removing service [192.168.170.10]:80 from VS [192.168.170.80]:80
Apr 26 21:34:23 node1 Keepalived_healthcheckers[22870]: Removing service [192.168.170.11]:80 from VS [192.168.170.80]:80
Apr 26 21:34:23 node1 Keepalived_healthcheckers[22870]: Stopped
Apr 26 21:34:24 node1 Keepalived_vrrp[22871]: Stopped
Apr 26 21:34:24 node1 Keepalived[22869]: Stopped Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
Apr 26 21:34:24 node1 systemd: Stopped LVS and VRRP High Availability Monitor.

验证绑定虚拟地址

[root@node2 keepalived]# ifconfig ens192:0
ens192:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.170.80  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:0c:29:ba:d9:07  txqueuelen 1000  (Ethernet)

客户端访问http://192.168.170.80,查看结果

[root@node5 ~]# curl http://192.168.170.80
<h1>Realserver1</h1>
一分钟后,重新访问http://192.168.170.80,查看结果
[root@node5 ~]#curl http://192.168.170.80
<h1>Realserver2</h1>

恢复主调度器正常,查看状态

[root@node1 keepalived]# systemctl start keepalived
[root@node1 keepalived]# tail -f /var/log/messages
Apr 26 21:45:30 node1 Keepalived_healthcheckers[24150]: Activating healthchecker for service [192.168.170.80]:80
Apr 26 21:45:30 node1 Keepalived_vrrp[24151]: VRRP_Instance(VI_1) Transition to MASTER STATE
Apr 26 21:45:31 node1 Keepalived_vrrp[24151]: VRRP_Instance(VI_1) Entering MASTER STATE
Apr 26 21:45:31 node1 Keepalived_vrrp[24151]: VRRP_Instance(VI_1) setting protocol VIPs.
Apr 26 21:45:31 node1 Keepalived_vrrp[24151]: Sending gratuitous ARP on ens192 for 192.168.170.80

验证绑定虚拟地址

[root@node1 keepalived]# ifconfig ens192:0
ens192:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.170.80  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 00:50:56:a3:50:cf  txqueuelen 1000  (Ethernet)

[root@node1 keepalived]# 

客户端访问http://192.168.170.80,查看结果

[root@node5 ~]# curl http://192.168.170.80
<h1>Realserver1</h1>
一分钟后,重新访问http://192.168.170.80,查看结果
[root@node5 ~]# curl http://192.168.170.80
<h1>Realserver2</h1>
可以看到每间隔一分钟将会轮询调度一次后端服务器,到此为止实验结束。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值