デュアルプライマリKeepaliveとlvsによるホスト状態の自動監視とリアルタイム切り替え
14303 ワード
環境: 202.106.0.17: as Client 202.106.0.27: as router 192.168.205.37: as lvs1 192.168.205.47: as lvs2 192.168.205.57: as websrv1 192.168.205.67: as websrv2 192.168.205.77: as websrv3 192.168.205.87:as websrv 4注:すべてのオペレーティングシステムはデフォルトでfirewalldを無効にし、iptableは空で、selinux を閉じます.
バージョン: OS: centos 7 1810 with mini install keepalived httpd
宛先:
keepalivedを使用して4台のwebサーバを監視し、2台を1組とし、それぞれ1つの仮想IPアドレスを使用し、lvs 1はvip 1の主vip 2の従であり、lvs 2はvip 2の主であり、vip 1の従であり、互いに主備し、lvsを負荷均衡として使用し、サービスdown機を自動的に発見し、故障ホストを自動的に除去することができ、それによって故障のないスケジューリングを実現する.
構成routerルーティング転送機能 がオン.は、routerのeth 1に10.1.1.1を追加しました.lvs 1とlvs 2サーバに行くにはルーティングが必要です.2つのホストの仮想Ipはフローティングする可能性が高いので、そのうちの1つのdownではどのホストにあるか分からないので、安全のためにルーティングを追加しないで、IPで直接接続します. を配置する app 1の2台のサーバ192.168.205.57/67で、次のスクリプト が実行されます. app 2の2台のサーバ192.168.205.77/87で次のスクリプト を行う. httpdサービスをインストールし、sorry serverをローカルの2台のホストに 配置するデフォルトルーティングをrouterに追加する必要があります.正しく設定すると動作しますが、sorry serverは正常ではありません. アクセスを容易にするためには、2つのlvsサーバ間でssh key検証を行うことが望ましい.以下の方法で47でもう一度する必要はなく、真接は相互認証 を実現する.ホスト名解析 にhostファイルを追加することが望ましい. keepaliveをインストールし、どのようにlvsポリシーを追加するかを見極めるために、iplvadmも にインストールします. lvs 1でプロファイル を変更する keepalivedサービス を開始 lvs 1で状態がRRスケジューリング であることがわかる. lvs 1では10.1.1.100 IPのみ、Lvs 2では10.1.1.200 IP のみが表示されます. client上で1サイクル実行してテスト を行う.はweb 1を停止して、更にテストして、web 2 にスケジューリングすることしかできないことを発見します web 2を停止してからテストすると、sorry serverが交代して動作していることがわかり、lvs 1では127.0.0.1ロード が表示されます.は2つのwebsrv 1とwebsrv 2を復元しlvs 2を停止し、影響はないことが分かったが、2つのvipはすべてlvs 1上の に戻ることが分かった.はlvs 2を状態に戻します.プリエンプト機能があるため、元のプライマリおよびバックアップの に戻ります.
バージョン:
宛先:
keepalivedを使用して4台のwebサーバを監視し、2台を1組とし、それぞれ1つの仮想IPアドレスを使用し、lvs 1はvip 1の主vip 2の従であり、lvs 2はvip 2の主であり、vip 1の従であり、互いに主備し、lvsを負荷均衡として使用し、サービスdown機を自動的に発見し、故障ホストを自動的に除去することができ、それによって故障のないスケジューリングを実現する.
構成router
[root@router data]#ech 1 > /proc/sys/net/ipv4/ip_forward
[root@router data]#ip a a 10.1.1.1/24 dev eth0:1
まず4台real server [root@websrv1 data]#cat lvs_dr_rs.sh
#!/bin/bash
vip=10.1.1.100
gateway=192.168.205.27
mask='24'
dev=lo:1
rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
service httpd start &> /dev/null && echo "The httpd Server is Ready!"
echo "this is `hostname`" > /var/www/html/index.html
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
ip a a $vip/$mask dev $dev #broadcast $vip up
ip route add default via $gateway dev eth0
#route add -host $vip dev $dev
echo "The RS Server is Ready!"
;;
stop)
systemctl restart network
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 "The RS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
[root@websrv3 data]#cat lvs_dr_rs.sh
#!/bin/bash
vip=10.1.1.200
gateway=192.168.205.27
mask='24'
dev=lo:1
rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
service httpd start &> /dev/null && echo "The httpd Server is Ready!"
echo "this is `hostname`" > /var/www/html/index.html
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
ip address add $vip/$mask dev $dev #broadcast $vip up
ip route add default via $gateway dev eth0
#route add -host $vip dev $dev
echo "The RS Server is Ready!"
;;
stop)
systemctl restart network
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 "The RS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
を実行し、2台のlvsで同様の動作(特別な説明を除く)yum install httpd
echo server under maintenance > /var/www/html/index.html
ip route add default via 192.168.205.27 dev eth0
ssh-keygen
ssh-copy-id 127.0.0.1
scp -r /root/.ssh 192.168.205.47:/root
vi /etc/hosts
192.168.205.37 websrv1
192.168.205.47 websrv2
scp /etc/hosts 192.168.205.47:/etc
yum install keepalived ipvsadm
[root@lsv1 ~]#vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalive@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS1
vrrp_mcast_group4 224.0.0.100
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 37
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass centos
}
virtual_ipaddress {
10.1.1.100/24 dev eth0 label eth0:0
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 47
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass centos
}
virtual_ipaddress {
10.1.1.200/24 dev eth0 label eth0:1
}
}
virtual_server 10.1.1.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.205.57 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.205.67 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
virtual_server 10.1.1.200 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.205.77 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.205.87 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
11. lsv1 keepalive.conf lvs2 ,
[root@lvs2 ~]#vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalive@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS2
vrrp_mcast_group4 224.0.0.100
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 37
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass centos
}
virtual_ipaddress {
10.1.1.100/24 dev eth0 label eth0:0
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 47
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass centos
}
virtual_ipaddress {
10.1.1.200/24 dev eth0 label eth0:1
}
}
virtual_server 10.1.1.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.205.57 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.205.67 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
virtual_server 10.1.1.200 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
sorry_server 127.0.0.1 80
real_server 192.168.205.77 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.205.87 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
systemctl start keepalived
[root@lsv1 ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.1.100:80 rr
-> 192.168.205.57:80 Route 1 0 0
-> 192.168.205.67:80 Route 1 0 0
TCP 10.1.1.200:80 rr
-> 192.168.205.77:80 Route 1 0 0
-> 192.168.205.87:80 Route 1 0 0
[root@lsv1 ~]#ip a
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:56:e1:ea brd ff:ff:ff:ff:ff:ff
inet 192.168.205.37/24 brd 192.168.205.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 10.1.1.100/24 scope global eth0:0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe56:e1ea/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@lvs2 ~]#ip a
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:37:f9:93 brd ff:ff:ff:ff:ff:ff
inet 192.168.205.47/24 brd 192.168.205.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 10.1.1.200/24 scope global eth0:1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe37:f993/64 scope link noprefixroute
valid_lft forever preferred_lft forever
テスト[root@client ~]#while : ;do curl 10.1.1.100; sleep 0.5; done
this is websrv1
this is websrv2
this is websrv1
this is websrv2
this is websrv1
this is websrv2
[root@client ~]#while : ;do curl 10.1.1.200; sleep 0.5; done
this is websrv4
this is websrv3
this is websrv4
this is websrv3
this is websrv4
[root@websrv1 data]#systemctl stop httpd
[root@client ~]#while : ;do curl 10.1.1.100; sleep 0.5; done
this is websrv2
this is websrv2
this is websrv2
this is websrv2
this is websrv2
[root@websrv2 ~]#systemctl stop httpd
[root@client ~]#while : ;do curl 10.1.1.100; sleep 0.5; done
server under maintenance
server under maintenance
server under maintenance
server under maitnenance
[root@lsv1 ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.1.100:80 rr
-> 127.0.0.1:80 Route 1 0 4
TCP 10.1.1.200:80 rr
-> 192.168.205.77:80 Route 1 0 0
-> 192.168.205.87:80 Route 1 0 0
[root@websrv1 ~]#systemctl start httpd
[root@websrv2 ~]#systemctl start httpd
[root@lvs2 ~]#systemctl stop keepalived
[root@client ~]#while : ;do curl 10.1.1.100; sleep 0.5; done
this is websrv2
this is websrv1
this is websrv2
this is websrv1
[root@client ~]#while : ;do curl 10.1.1.200; sleep 0.5; done
this is websrv3
this is websrv4
this is websrv3
this is websrv4
[root@lsv1 ~]#ip a
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:56:e1:ea brd ff:ff:ff:ff:ff:ff
inet 192.168.205.37/24 brd 192.168.205.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 10.1.1.100/24 scope global eth0:0
valid_lft forever preferred_lft forever
inet 10.1.1.200/24 scope global secondary eth0:1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe56:e1ea/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@client ~]#while : ;do curl 10.1.1.100; sleep 0.5; done
this is websrv2
this is websrv1
this is websrv2
[root@client ~]#while : ;do curl 10.1.1.200; sleep 0.5; done
this is websrv4
this is websrv3
this is websrv4
[root@lsv1 ~]#ip a
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:56:e1:ea brd ff:ff:ff:ff:ff:ff
inet 192.168.205.37/24 brd 192.168.205.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 10.1.1.100/24 scope global eth0:0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe56:e1ea/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@lvs2 ~]#ip a
2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:37:f9:93 brd ff:ff:ff:ff:ff:ff
inet 192.168.205.47/24 brd 192.168.205.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 10.1.1.200/24 scope global eth0:1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe37:f993/64 scope link noprefixroute
valid_lft forever preferred_lft forever