keepalived+lvs實現高可用負載均衡集群
阿新 • • 發佈:2018-05-27
keepalived+lvs實現高可用LVS實戰篇
第1章 環境準備
1.1 系統環境
1.1.1 系統版本
[root@lb01 ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@lb01 ~]# uname -r 2.6.32-696.el6.x86_64 [root@lb01 ~]# uname -m x86_64
1.1.2 關閉安全機制
[root@lb01 ~]# sed -i "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/sysconfig/selinux [root@lb01 ~]# setenforce 0 [root@lb01 ~]# /etc/init.d/iptables stop
1.1.3 更換yum源並添加epel源
[root@lb01 ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak [root@lb01 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo [root@lb01 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
1.2 主機及IP地址規劃
主機名 | IP地址 | 說明 |
lb01 | 10.0.0.5 | 負載1 |
lb02 | 10.0.0.6 | 負載2 |
web02 | 10.0.0.7 | web服務1 |
web01 | 10.0.0.8 | web服務2 |
第2章 安裝ipvsadm
2.1 yum安裝
[root@lb01 ~]# yum install -y ipvsadm ==》四臺服務器都要執行 [root@web02 ~]# rpm -qa ipvsadm ==》四臺服務器都要執行 ipvsadm-1.26-4.el6.x86_64
2.2 做軟連接並查看是否加載內核模塊
[root@lb01 ~]# ln -s /usr/src/kernels/`uname -r` /usr/src/linux ==》只需在負載上執行即可 [root@lb01 ~]# ll /usr/src/ [root@lb01 ~]# lsmod |grep ip_vs ==》四臺服務器都要執行 ip_vs 126705 0 libcrc32c 1246 1 ip_vs ipv6 336368 272 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6,ib_ipoib,ib_addr
註意:若用lsmod |graep ip_vs沒出現上述內容,則執行ipvsadm或者modprobe ip_vs命令即可 然後在執行lsmod |graep ip_vs即可出現上述內容
2.3 在負載上添加VIP
[root@lb01 ~]# ip addr add 10.0.0.3/24 dev eth0 label eth0:0 或者 [root@lb02 ~]# ifconfig eth0:0 10.0.0.3/24 up
2.4 在負載上添加節點
[root@lb01 ~]# ipvsadm -C ==》清空 [root@lb01 ~]# ipvsadm -A -t 10.0.0.3:80 -s wrr ==》增加vserver [root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1 ==》添加節點 [root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1 [root@lb01 ~]# ipvsadm --set 30 5 60 ==》優化 [root@lb01 ~]# ipvsadm -Ln ==》查看 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.0.0.3:80 wrr -> 10.0.0.7:80 Route 1 0 0 -> 10.0.0.8:80 Route 1 0 0
2.5 在RS上綁定VIP和一直ARP
[root@web01 ~]# ip addr add 10.0.0.3/32 dev lo label lo:0 ==》綁定VIP 或者 [root@web01 ~]# ifconfig lo:0 10.0.0.3/32 up [root@web01 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore ==》抑制ARP [root@web01 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce [root@web01 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore [root@web01 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce ## [root@web02 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore [root@web02 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce [root@web02 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore [root@web02 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce ## [root@web01 ~]# route add -host 10.0.0.3 lo ==》增加一條路由 不是必須的
2.6在RS上搭建Web服務
詳細搭建過程在前面的nginx基礎篇已經介紹過,可以點擊下面的連接進行查看
http://blog.51cto.com/lzhnb/2095335
2.7 測試
在瀏覽器中輸入10.0.0.3進行訪問
可以在命令行輸入下面的命令進行監視
[root@lb01 ~]# watch -n 1 ipvsadm -Ln Every 1.0s: ipvsadm -Ln Sat May 26 21:15:56 2018 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.0.0.3:80 wrr -> 10.0.0.7:80 Route 1 1 0 -> 10.0.0.8:80 Route 1 2 0
第3章 ipvsadm常用參數總結
[root@lb01 ~]# ipvsadm --help ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1) Usage: ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] ipvsadm -D -t|u|f service-address ipvsadm -C ipvsadm -R ipvsadm -S [-n] ipvsadm -a|e -t|u|f service-address -r server-address [options] ipvsadm -d -t|u|f service-address -r server-address ipvsadm -L|l [options] ipvsadm -Z [-t|u|f service-address] ipvsadm --set tcp tcpfin udp ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid] ipvsadm --stop-daemon state ipvsadm -h 命令: 允許長或短選項。 --add-service -A添加具有選項的虛擬服務 --edit-service -E使用選項編輯虛擬服務 --delete-service -D刪除虛擬服務 --clear -C清除整個表 --restore -R從stdin恢復規則 --save -S將規則保存到stdout --add-server -a添加帶有選項的實服務器 --edit-server -e編輯帶有選項的實服務器 --delete-server -d刪除真實服務器 --list -L | -l列出表 --zero -Z零計數器在服務或所有服務 --set tcp tcpfin udp設置連接超時值 --start-daemon啟動連接同步守護程序 --stop-daemon停止連接同步守護程序 --help -h顯示此幫助消息 選項: --tcp-service -t service-address service-address是host [:port] --udp-service -u service-address service-address是host [:port] --fwmark-service -f fwmark fwmark是一個大於零的整數 --scheduler -s調度程序rr | wrr | lc | wlc | lblc | lblcr | dh | sh | sed | nq默認調度程序是wlc。 --persistent -p [timeout]持久服務 --netmask -M netmask持久粒度掩碼 --real-server -r服務器地址服務器地址是主機(和端口) --gatewaying -g網關(直接路由)(默認) --ipip -i ipip encapsulation(tunneling) --masquerading -m偽裝(NAT) --weight -w實服務器的權重 --syncid sid syncid用於連接同步(默認值= 255) --ipip -i ipip encapsulation(tunneling) 指定LVS的工作模式為隧道模式 --masquerading -m偽裝(NAT) 指定LVS的工作模式為NAT模式 --u-threshold -x連接的閾值上限閾值 --l-threshold -y lthreshold連接的下限閾值 --mcast-interface接口用於連接同步的組播接口 指定組播的同步接口 --syncid sid syncid用於連接同步(默認值= 255) --connection -c當前IPVS連接的輸出 顯示LVS目前的連接如:ipvsadm -L -c 超時輸出超時(tcp tcpfin udp) 顯示tcp tcpfin udp的超時值如:ipvsadm -L --timeout --daemon輸出守護進程信息 顯示同步守護進程狀態 統計信息的統計輸出 顯示統計信息 速率信息的速率輸出 顯示速率信息 閾值輸出閾值信息 --persistent-conn輸出持久連接信息 服務/服務器條目的排序輸出 對虛擬服務器和真實服務器排序輸出 --ops -O單分組調度 --numeric -n地址和端口的數字輸出 輸出IP地址和端口的數字形式 -numeric -n輸出IP地址和端口的數字形式 --stat選項是統計自那條轉發規則生效以來的包 Conns(connections scheduled)已經轉發過的連接數 InPkts(incoming packets)入包個數 OutPkts(outgoing packets)出包個數 InBytes(傳入字節)入流量(字節) OutBytes(outgoing bytes)出流量(字節) --rate選項是顯示速率信息 CPS(current connection rate)每秒連接數 InPPS(當前包速率)每秒的入包個數 OutPPS(當前輸出包速率)每秒的出包個數 InBPS(字節速率)每秒入流量(字節) OutBPS(current out byte rate)每秒入流量(字節)
第4章keepalived+lvs
4.1 安裝keepalived服務
[root@lb01 ~]# yum install keepalived -y == 》在負載上安裝
4.2 配置keepalived
[root@lb01 keepalived]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } } virtual_server 10.0.0.3 80 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 10.0.0.7 80 { weight 1 TCP_CHECK { connect_timeout 5 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 10.0.0.8 80 { weight 1 TCP_CHECK { connect_timeout 5 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
4.3 在RS節點執行下面的腳本
[root@web02 init.d]# cat /etc/init.d/lvs
#!/bin/bash #description Config LVS to realserver lo and apply noarp #Written by LZH VIP=10.0.0.3 . /etc/init.d/functions case "$1" in start) ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP #/sbin/route add -host $SNS_VIP dev lo:0 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 sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) ifconfig lo:0 down # route del $VIP >/dev/null 2>&1 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0
註意需要給該腳本加上可執行權限!!!
[root@web02 init.d]# chmod +x /etc/init.d/lvs
keepalived+lvs 是生產中常用的實現lvs負載均衡的方法
第5章 lvs故障排錯思路
5.1 導致負載不均衡的原因
q LVS自身的會話保持參數設置(-p 300),優化:大公司常用cookies代替session
q LVS調度算法設置,如rr、wrr、wlc、lc
q 後端RS節點的會話保持參數,如apache的keepalived參數
q 用戶發送請求時間短,請求資源的大小
5.2 排錯思路
q 調度器上LVS調度規則及IP的正確性
q RS節點上VIP綁定和arp的抑制檢查
vip綁定處理方案:
? 對RS綁定的VIP做實時監控
? 把RS綁定的VIP 做成配置文件,/etc/sysconfig/network-scripts/ifcfg-lo:0
arp抑制處理方案:
? 如果是單個VIP,則可以用stop傳參設置0
? 若果RS有多個VIP綁定,即使stop也一定不要設置為0
q RS節點上自身提供服務的檢查(DR不能進行端口轉換)
q 利用輔助工具tcpdump、ping等進行排查
keepalived+lvs實現高可用負載均衡集群