做者: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
顯示出了鏈接
說明主節點已經恢復正常。