使用 KeepAlived 来实现高可用的 DR 模型
使用 KeepAlived 来实现高可用的 DR 模型
作者:Grey
原文地址:
博客园:使用 KeepAlived 来实现高可用的 DR 模型
CSDN:使用 KeepAlived 来实现高可用的 DR 模型
操作系统
- CentOS 8
相关工具
-
keepalived
-
ipvsadm
-
httpd
准备工作
准备四个节点,Node01 ~ Node04, 本文默认你会在 VMware Workstation 上安装 Linux 并配置相关信息,可以参考Linux 的安装
预期效果
在 Node01 和 Node02 上配置 LVS,且 Node01 和 Node02 是主备关系,Node01 是主,Node02 是备,Node01 挂了,Node02 可以自动顶上。Node01 和 Node02 是接收请求的入口,接下来,会将请求以负载均衡的方式请求后端的 Node04 和 Node05 服务。
架构图如下
操作步骤
准备 Node03 和 Node04 的服务
在 Node03 和 Node04 上分别执行如下命令:
yum install -y httpd
安装好 httpd 以后,在 Node03 上的/var/www/html
位置
新建一个名为 index.html 页面,并输入如下内容:
<h>from node03</h>
在 Node04 同样的位置,也建立一个 index.html 文件,且文件内容为:
<h>from node04</h>
可以通过如下方式快速将 Node03 的 index.html 复制到Node04, 在 Node03 的var/www/html
目录下,执行
scp index.html root@192.168.98.139:`pwd`
其中
root@192.168.98.139
是对应你的 Node03 的信息,然后就可以把 Node03 的 index.html 复制到 Node04 的对应位置了。
然后改一下 Node04 的 index.html 信息即可。
准备好 index.html 页面后,因为 httpd 服务的默认端口是 80,所以我们需要打开 Node03 和 Node04 上的 80 端口的访问权限,在 Node03 和Node04 上分别执行如下的两条命令:
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
启动 Node04 和 Node03 上的 httpd 服务,在 Node03 和 Node04 上分别执行:
systemctl start httpd
验证是否启动成功
配置Node03和Node04内核参数
arp_ignore 和 arp_announce 两个内核参数的配置说明如下:
arp_ignore
定义接收到 ARP 请求时的响应级别
-
0:只要本地配置的有相应地址,就给予响应;
-
1:仅在请求的目标(MAC)地址配置请求到达的接口上的时候,才给予响应;
arp_announce
定义将自己地址向外通告时的通告级别
-
0:将本地任何接口上的任何地址向外通告;
-
1:试图仅向目标网络通告与其网络匹配的地址;
-
2:仅向与本地接口上地址匹配的网络进行通告;
由于,Node03 和 Node04 上要实现对 IP 的对外隐藏和对内可见,所以我们需要在 Node03 和 Node04 上配置如下参数:
echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
PS:CentOS8 的默认网卡名称是 ens33
可以通过 ifconfig 命令查看到
配置 Node03 和 Node04 的环路接口
要实现 IP 的对内可见,对外隐藏,还需要在 Node03 和 Node04 上配置环路接口, 在 Node04 和 Node03 上分别执行
ifconfig lo:3 192.168.98.100 netmask 255.255.255.255
然后在 Node03 和 Node04 分别执行
ifconfig
查看是否添加成功
自此,Node03 和 Node04 上的所有东西都配置好了。
接下来开始配置 Node01 和 Node02。
安装 ipvsadm
在 Node01 和 Node02 上执行如下命令
yum install -y ipvsadm
安装 keepalived
在 CentOS8 下,我尝试用yum安装keepalived,配置完毕后,启动了keepalived,但是客户端始终无法请求过来。
无奈,尝试编译安装keepalived,问题解决。
步骤如下
在 Node01 和 Node02 上分别执行, 安装一些前置工具
yum install curl gcc openssl-devel libnl3-devel net-snmp-devel make tar ipvsadm -y
然后下载最新的keepalived源码
curl --progress https://www.keepalived.org/software/keepalived-2.2.2.tar.gz | tar xz
cd keepalived-2.2.2
./configure --prefix=/usr/local/keepalived-2.2.2
make
make install
修改 keepalived 配置
在 Node01 上,先备份默认的 keepalived 配置,执行如下命令
cd /usr/local/keepalived-2.2.2/etc/keepalived
cp keepalived.conf keepalived.conf.bak
然后编辑 keepalived.conf 文件, 将其配置成如下信息
Node01 上:
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.98.100/24 dev ens33 label ens33:3
}
}
virtual_server 192.168.98.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
real_server 192.168.98.138 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.98.139 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
Node02 上
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.98.100/24 dev ens33 label ens33:3
}
}
virtual_server 192.168.98.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
real_server 192.168.98.138 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.98.139 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
指定 keepalived 配置文件,在 Node01 和 Node02 上分别执行:
cd /usr/local/keepalived-2.2.2/etc/sysconfig
修改 keepalived 文件
# Options for keepalived. See `keepalived --help' output and keepalived(8) and
# keepalived.conf(5) man pages for a list of all options. Here are the most
# common ones :
#
# --vrrp -P Only run with VRRP subsystem.
# --check -C Only run with Health-checker subsystem.
# --dont-release-vrrp -V Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.
# --dump-conf -d Dump the configuration data.
# --log-detail -D Detailed log messages.
# --log-facility -S 0-7 Set local syslog facility (default=LOG_DAEMON)
#
KEEPALIVED_OPTIONS="-D -f /usr/local/keepalived-2.2.2/etc/keepalived/keepalived.conf"
在 KEEPALIVED_OPTIONS 中增加了-f 选项,指定了 keepalived.conf 的位置
然后打开 Node01 和 Node02 的 80 端口访问权限,分别在 Node01 和 Node02 上执行如下命令
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
启动 keepalived
在 Node01 上执行
systemctl start keepalived
验证
通过浏览器访问:http://192.168.98.100
并且时不时刷新以下页面,可以显示如下结果:
在 Node01 上执行
ipvsadm -lnc
可以看到
在 Node02 上执行
systemctl start keepalived
然后在 Node02 上执行
ipvsadm -lnc
内容是空的,说明 Node02 是备用节点
此时,停掉 Node01,在 Node01 上,执行
systemctl stop keepalived
继续访问浏览器,服务依旧可以访问
验证了主节点(Node01)挂了,备用节点(Node02)顶上这个场景,
此时,在 Node02 上执行
ipvsadm -lnc
可以看到连接情况
说明备机正常提供了服务。
此时,再把主节点(Node01)启动起来,
在 Node01 上执行:
systemctl restart keepalived
服务正常
在主节点(Node01)上执行
ipvsadm -lnc
显示出了连接
说明主节点已经恢复正常。
参考资料
本文来自博客园,作者:Grey Zeng,转载请注明原文链接:https://www.cnblogs.com/greyzeng/p/14623965.html