基本的な環境の準備
2つのサーバー:192.168.199.101(マスター)と192.168.199.102(スレーブ)。各サーバーにnginxとkeepalivedをインストールします。
安装nginx:
yum -y install nginx
启动nginx:
systemctl start nginx
安装keepalived:
yum -y install keepalived
启动keepalived:
systemctl start keepalived
マスタースレーブ構成:
ノード計画
CPU名 | ip | ソフトウェア | 港 | キャラクター |
---|---|---|---|---|
yfm01 | 192.168.199.101 | nginx、キープアライブ | 80 | マスターノード |
yfm02 | 192.168.199.102 | nginx、キープアライブ | 80 | スレーブノード |
VIP | 192.168.199.99 |
キープアライブログを個別に保存するように設定します
默认keepalived日志存放在/var/log/messages
sed -i s#KEEPALIVED_OPTIONS=\"-D\"#KEEPALIVED_OPTIONS=\"-D\ -d\ -S\ 0\"#g /etc/sysconfig/keepalived
echo "local0.* /var/log/keepalived.log" >> /etc/rsyslog.conf
修改/lib/systemd/system/keepalived.service
sed -i s#EnvironmentFile=-/etc/sysconfig/keepalived#EnvironmentFile=/etc/sysconfig/keepalived#g /lib/systemd/system/keepalived.service
重新加载service:systemctl daemon-reload #这种我试了不行
重启机器reboot
主192.168.199.101、/ etc / keepalived / keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.199.101 #指定smtp服务器地址
smtp_connect_timeout 30
router_id LVS_DEVEL1 #负载均衡标识,在局域网内应该是唯一的
#vrrp_strict 不要开启
}
vrrp_script chk_http_port {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER #指定该keepalived节点的初始状态
interface ens33
virtual_router_id 51 #指定VRRP实例ID
priority 100 #指定优先级,优先级高的将成为MASTER
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.199.99 #指定VIP地址
}
}
から192.168.199.102、/ etc / keepalived / keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.199.101
smtp_connect_timeout 30
router_id LVS_DEVEL2
}
vrrp_script chk_http_port {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.199.99
}
}
nginx_check.sh
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/usr/sbin/nginx
sleep 2
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
systemctl stop keepalived
fi
fi
総括する:
- マスターがハングアップしていない場合、マスターはvipを占有し、nginxはマスター上で実行されます
- マスターがハングし、スレーブがvipをプリエンプトし、スレーブでnginxサービスを実行します
- マスターのnginxサービスがハングすると、nginxは自動的に再起動します。再起動が失敗すると、keepalivedは自動的に閉じられるため、VIPリソースもスレーブに転送されます。
- マスターとスレーブの両方がnginxサービスを開始します。マスターまたはスレーブに関係なく、キープアライブサービスの1つが停止すると、VIPはキープアライブサービスがまだ存在するノードにドリフトします。
- nginxサービスをハングアップさせ、vipを別のノードにドリフトさせる場合は、スクリプトを使用するか、構成ファイルでシェルコマンドを使用して制御する必要があります。(nginxサービスは、ダウンすると自動的に開始され、開始に失敗するとkeepalivedが強制的に閉じられるため、vipリソースが別のマシンにドリフトします)
マスタースレーブの欠点は、マスターが常に安定している場合、スレーブは常にアイドル状態になり、リソースの浪費につながることです。
マスターマスター構成
ノード計画
CPU名 | ip | ソフトウェア | 港 | キャラクター |
---|---|---|---|---|
yfm01 | 192.168.199.101 | nginx、キープアライブ | 80 | マスターノードとスレーブノード |
yfm02 | 192.168.199.102 | nginx、キープアライブ | 80 | スレーブ、スレーブノード |
VIP | 192.168.199.99、192.168.199.98 |
192.168.199.101
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.199.101 #指定smtp服务器地址
smtp_connect_timeout 30
router_id LVS_DEVEL1 #负载均衡标识,在局域网内应该是唯一的
}
vrrp_script chk_http_port {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER #指定该keepalived节点的初始状态
interface ens33
virtual_router_id 51 #指定VRRP实例ID
priority 100 #指定优先级,优先级高的将成为MASTER
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.199.99 #指定VIP地址
}
track_script {
chk_http_port
}
}
vrrp_instance VI_2 {
state BACKUP #这里修改为BACKUP
interface ens33
virtual_router_id 52 #这里修改为52
priority 90 #修改优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.199.98 #绑定另外一个VIP
}
track_script {
chk_http_port
}
}
192.168.199.102
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.199.101
smtp_connect_timeout 30
router_id LVS_DEVEL2
}
vrrp_script chk_http_port {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.199.99
}
track_script {
chk_http_port
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.199.98
}
track_script {
chk_http_port
}
}
nginx_check.sh
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/usr/sbin/nginx
sleep 2
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
systemctl stop keepalived
fi
fi
VRRP_Instance(VI_1)の場合、192.168.199.101がマスターです。VRRP_Instance(VI_2)の場合、192.168.199.102がマスターです。
ブラウザがhttp://192.168.199.99/にアクセスすると、192.168.199.101のnginxがリクエストを処理します。ブラウザがhttp://192.168.199.98/にアクセスすると、192.168.199.102のnginxがリクエストを処理します。
いずれかのサーバーのキープアライブサービスが停止すると、他のサーバーのキープアライブはMASTER状態になり、要求を処理します。192.168.199.101でkeepalivedサービスを停止すると、192.168.199.102でのkeepalivedサービスのVRRP_Instance(VI_1)がMASTER状態になり、http://192.168.199.99/とhttp://192.168.199.98/を処理します。
http://192.168.199.99/にアクセスします
http://192.168.199.98/にアクセスします
lvs + keepalived + nginxマスタースレーブモード
ノード計画
CPU名 | ip | ソフトウェア | 港 | キャラクター |
---|---|---|---|---|
yfm01 | 192.168.199.101 | lvs、キープアライブ | 80 | 主人 |
yfm02 | 192.168.199.102 | lvs、キープアライブ | 80 | スレーブ |
yfm03 | 192.168.199.103 | nginx | 80 | realserver1 |
yfm04 | 192.168.199.104 | nginx | 80 | realserver2 |
VIP | 192.168.199.99 |
在yfm01、yfm02节点安装lvs
yum -y install ipvsadm
加载ipvsadm模块进系统
ipvsadm
在yfm03、yfm04节点安装nginx
yum -y install nginx
192.168.199.101、/ etc / keepalived / keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_Master
}
vrrp_instance VI_1 {
state MASTER #指定instance初始状态,实际根据优先级决定.backup节点不一样
interface ens33 #虚拟IP所在网
virtual_router_id 51 #VRID,相同VRID为一个组,决定多播MAC地址
priority 100 #优先级,另一台改为90.backup节点不一样
advert_int 1 #检查间隔
authentication {
auth_type PASS #认证方式,可以是pass或ha
auth_pass 1111 #认证密码
}
virtual_ipaddress {
192.168.199.99 #VIP
}
}
virtual_server 192.168.199.99 80 {
delay_loop 6 #服务轮询的时间间隔
lb_algo wrr #加权轮询调度,LVS调度算法 rr|wrr|lc|wlc|lblc|sh|sh
lb_kind DR #LVS集群模式 NAT|DR|TUN,其中DR模式要求负载均衡器网卡必须有一块与物理网卡在同一个网段
#nat_mask 255.255.255.0
persistence_timeout 50 #会话保持时间
protocol TCP #健康检查协议
## Real Server设置,80就是MySQL连接端口
real_server 192.168.199.103 80 {
weight 3 ##权重
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.199.104 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
192.168.199.102、/ etc / keepalived / keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_Backup
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.199.99
}
}
virtual_server 192.168.199.99 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.199.103 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.199.104 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
192.168.199.103、192.168.199.104
新建/etc/init.d/realserver脚本
#!/bin/sh
#chkconfig: 2345 90 10
VIP=192.168.199.99
. /etc/rc.d/init.d/functions
case "$1" in
# 禁用本地的ARP请求、绑定本地回环地址
start)
/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/sysctl -p >/dev/null 2>&1
/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up #在回环地址上绑定VIP,设定掩码,与Direct Server(自身)上的IP保持通信
/sbin/route add -host $VIP dev lo:0
echo "LVS-DR real server starts successfully.\n"
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/route del $VIP >/dev/null 2>&1
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
echo "LVS-DR real server stopped.\n"
;;
status)
isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"`
isRoOn=`/bin/netstat -rn | grep "$VIP"`
if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then
echo "LVS-DR real server has run yet."
else
echo "LVS-DR real server is running."
fi
exit 3
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0
赋予可执行权限
chomd +x realserver
开机启动
chkconfig realserver on
ip addrコマンドを使用してyfm01とyfm02を表示します。VIPはyfm01にバインドされていますが、yfm02はバインドされていないことがわかります。
yfm01でipvsadm-lnを実行して、接続を確認します
yfm03、yfm04、nginxウェルカムインターフェイスを変更し、ローカルIPを追加します
whereis nginx
[root@yfm03 nginx]# whereis nginx
nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man3/nginx.3pm.gz /usr/share/man/man8/nginx.8.gz
可以看到nginx配置文件在 /etc/nginx目录
ブラウザで192.168.199.103、192.168.199.104、および192.168.199.99にアクセスすることで、nginxサービスにアクセスできます(
外部リンクの画像転送が失敗し、ソースサイトにヒル防止メカニズムがある可能性があります。画像を保存することをお勧めします。直接アップロード(img-17J8MdJC-1614507612061)(https://s3.ax1x.com/2021/01/20/sRwCsP.png)]
総括する:
- MASTERサーバーがサービスを提供できない場合、VIPは自動的にMASTERから削除され、BACKUPサーバーはMASTER状態にアップグレードされ、VIPをバインドしてサービスを引き継ぎます。
- MASTERが修復してネットワークに参加すると、自動的にVIPを取り戻し、MASTERIDになります。
- バックエンドによって提供されるnginxサービスが一時停止されると、他のnginxサーバーに自動的に切り替わります。
lvs + keepalived + nginxメインマスターモード
マスタースレーブ環境と比較すると、主な違いは
- LVSロードバランシングレイヤーには2つのVIPが必要です。例:192.168.199.98および192.168.199.99
- バックエンドの実サーバーは、これら2つのVIPをローカルループバックポートにバインドする必要があります。
- Keepalived.confの構成も、上記のマスタースレーブモードとは異なります。
yfm03、/ etc /init.dディレクトリに新しいrealserver98とrealserver99を作成します
realserver98
#!/bin/sh
#chkconfig: 2345 90 10
VIP=192.168.199.98
. /etc/rc.d/init.d/functions
case "$1" in
start)
/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/sysctl -p >/dev/null 2>&1
/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
echo "LVS-DR real server starts successfully.\n"
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/route del $VIP >/dev/null 2>&1
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
echo "LVS-DR real server stopped.\n"
;;
status)
isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"`
isRoOn=`/bin/netstat -rn | grep "$VIP"`
if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then
echo "LVS-DR real server has run yet."
else
echo "LVS-DR real server is running."
fi
exit 3
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0
realserver99
#!/bin/sh
#chkconfig: 2345 90 10
VIP=192.168.199.99
. /etc/rc.d/init.d/functions
case "$1" in
start)
/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/sysctl -p >/dev/null 2>&1
/sbin/ifconfig lo:1 $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:1
echo "LVS-DR real server starts successfully.\n"
;;
stop)
/sbin/ifconfig lo:1 down
/sbin/route del $VIP >/dev/null 2>&1
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
echo "LVS-DR real server stopped.\n"
;;
status)
isLoOn=`/sbin/ifconfig lo:1 | grep "$VIP"`
isRoOn=`/bin/netstat -rn | grep "$VIP"`
if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then
echo "LVS-DR real server has run yet."
else
echo "LVS-DR real server is running."
fi
exit 3
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0
赋予可执行权限
chomd +x realserver9*
在yfm04执行以下命令,复制刚刚新建的文件
scp [email protected]:/etc/init.d/realserver9* /etc/init.d/
在yfm03、yfm04执行以下命令
service realserver99 start
service realserver98 start
2つのVIPが正常にloにバインドされていることがわかります
yfm01、/ etc / keepalived / keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_Master
}
vrrp_instance VI_1 {
state MASTER #指定instance初始状态,实际根据优先级决定.backup节点不一样
interface ens33 #虚拟IP所在网
virtual_router_id 51 #VRID,相同VRID为一个组,决定多播MAC地址
priority 100 #优先级,另一台改为90.backup节点不一样
advert_int 1 #检查间隔
authentication {
auth_type PASS #认证方式,可以是pass或ha
auth_pass 1111 #认证密码
}
virtual_ipaddress {
192.168.199.99 #VIP
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 52
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.199.98
}
}
virtual_server 192.168.199.99 80 {
delay_loop 6 #服务轮询的时间间隔
lb_algo wrr #加权轮询调度,LVS调度算法 rr|wrr|lc|wlc|lblc|sh|sh
lb_kind DR #LVS集群模式 NAT|DR|TUN,其中DR模式要求负载均衡器网卡必须有一块与物理网卡在同一个网段
#nat_mask 255.255.255.0
persistence_timeout 50 #会话保持时间
protocol TCP #健康检查协议
## Real Server设置,80就是MySQL连接端口
real_server 192.168.199.103 80 {
weight 3 ##权重
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.199.104 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
virtual_server 192.168.199.98 80 {
delay_loop 6 #服务轮询的时间间隔
lb_algo wrr #加权轮询调度,LVS调度算法 rr|wrr|lc|wlc|lblc|sh|sh
lb_kind DR #LVS集群模式 NAT|DR|TUN,其中DR模式要求负载均衡器网卡必须有一块与物理网卡在同一个网段
#nat_mask 255.255.255.0
persistence_timeout 50 #会话保持时间
protocol TCP #健康检查协议
## Real Server设置,80就是MySQL连接端口
real_server 192.168.199.103 80 {
weight 3 ##权重
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.199.104 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
yfm02、/ etc / keepalived / keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_Backup
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.199.99
}
}
vrrp_instance VI_2 {
state Master
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
182.148.15.235
}
}
virtual_server 192.168.199.99 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.199.103 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.199.104 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
virtual_server 192.168.199.98 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.199.103 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.199.104 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
在yfm01,打开ip_forward路由转发功能
echo "1" > /proc/sys/net/ipv4/ip_forward
在yfm01、yfm02上启动keepalived
service keepalived start
ご覧のとおり、yfm01は2つのVIPを正常にバインドしましたが、yfm02はバインドされていません。
参照:
LVS + Keepalived高可用性環境デプロイメントコーミング(マスター-マスターおよびマスター-スレーブモード)