做者:Greyhtml
原文地址:使用KeepAlived来实现高可用的DR模型node
准备四个节点,如上图,Node01 ~ Node04, 本文默认你会在VMWare上安装Linux并配置相关信息,若是这块内容不清楚,能够参考Linux学习笔记后端
咱们会在Node01和Node02上配置LVS,且Node01和Node02是主备关系,Node01是主,Node02是备,Node01挂了,Node02能够自动顶上。Node01和Node02是接收请求的入口,接下来,会将请求以负载均衡的方式请求后端的Node04和Node05服务。浏览器
示例图bash
在Node03和Node04上分别执行以下命令:网络
yum install -y httpd
安装好httpd之后,在Node03上的以下位置并发
/var/www/html
新建一个名为index.html页面,而且在index.html中输入以下内容:负载均衡
<h>from node03</h>
在Node04一样的位置,也创建一个index.html文件,且文件内容为:curl
<h>from node04</h>
能够经过以下方式快速将Node03的index.html复制到Node04, 在Node03的tcp
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
验证是否启动成功
arp_ignore和arp_announce两个内核参数的配置说明以下:
arp_ignore
定义接收到ARP请求时的响应级别
arp_announce
定义将本身地址向外通告时的通告级别
因为,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命令查看到
要实现IP的对内可见,对外隐藏,还须要在Node03和Node04上配置环路接口, 在Node04和Node03上分别执行
ifconfig lo:3 192.168.98.100 netmask 255.255.255.255
而后在Node03和Node04分别执行
ifconfig
查看是否添加成功
自此,Node03和Node04上的全部东西都配置好了。
接下来开始配置Node01和Node02。
在Node01和Node02上执行以下命令
yum install -y ipvsadm
在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
在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
在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
显示出了链接
说明主节点已经恢复正常。