18.1 集羣介紹
集羣(cluster)就是一組計算機,它們作爲一個整體向用戶提供一組網絡資源。這些單個的計算機系統就是集羣的節點(node)。一個理想的集羣是,用戶從來不會意識到集羣系統底層的節點,在他們看來,集羣是一個系統,而非多個計算機系統。並且集羣系統的管理員可以隨意增加和刪改集羣系統的節點
集羣根據功能劃分爲兩大類:高可用和負載均衡。
高可用集羣
高可用集羣通常爲2臺服務器,一臺工作,另一臺作爲冗餘,當提供服務的機器宕機時,冗餘將接替繼續提供服務。
實現高可用的開源軟件有:heartbeat、Keepalived,其中heartbeat已無人維護,所以今後使用Keepalived來搭建高可用集羣。
負載均衡集羣
負載均衡集羣,需要有1臺服務器作爲分發器,它負責把用戶的請求分發給後端的服務器處理,在這個集羣裏,除了分發器外就是給用戶提供服務的服務器了,這些服務器數量至少爲2臺,所以負載均衡集羣至少要3臺服務器。
實現負載均衡的開源軟件有:LVS、Keepalived、haproxy、nginx;商業軟件有:F5、Netscaler。
18.2 keepalived介紹
1.keepalived通過VRRP協議來實現高可用
2.在VRRP協議裏,將多臺功能相同的集齊組成一個小組,這個小組會又一個master角色和backup角色(N>=1)這個角色可以多個。
3.master會通過組播的形式向各個backup發現VRRP協議的數據包,當backup收不到master發來的VPPR數據包時,就會認爲master宕機了,這時backup就會啓動服務來替換新的master,如果有多臺backup就要看優先級來決定。
4.keepalived要有三個模塊:
core :核心,負責主進程的啓動、維護以及全局配置文件的加載和解析
check:負責模塊的健康檢查
vrrp:提供VPPR協議
18.3/18.4/18.5 用keepalived配置高可用集羣
這裏用keppalived實現nginx服務的高可用,因爲nginx在生產環境中,很多企業把nginx做一個負載均衡器 ,假設nginx一旦掛掉,那麼後端所有的web,即使說是正常的,那也無法訪問到
1、首先準備兩臺機器,都安裝keepalived
master:192.168.66.128
backup:192.168.66.129
[root@master ~]# yum install -y keepalived
[root@backup ~]# yum install -y keepalived
2、兩臺機分別安裝nginx,可以源碼安裝,也可以直接yum安裝,安裝nginx需要epel擴展源
yum install -y epel-release
yum install -y nginx
[root@master ~]# nginx -v
nginx version: nginx/1.10.2
[root@backup ~]# nginx -v
nginx version: nginx/1.10.2
3、master192.168.66.128配置
(1)修改keppalived默認配置文件/etc/keepalived/keepalived.conf
[root@master ~]# > /etc/keepalived/keepalived.conf #清空默認配置文件
[root@master ~]# vi /etc/keepalived/keepalived.conf #添加下面的內容,記得把註釋去掉
global_defs { //global_defs 全局配置標識
notification_email { //notification_email用於設置報警郵件地址
[email protected] //可以設置多個,每行一個
}
notification_email_from [email protected] //設置郵件發送地址
smtp_server 127.0.0.1 //設置郵件的smtp server地址,這裏爲本機
smtp_connect_timeout 30 //設置連接smtp sever超時時間
router_id LVS_DEVEL
}
####################### check模塊配置 ######################
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh" //檢查服務是否正常,通過寫腳本實現,腳本檢查服務健康狀態
interval 3 //檢查的時間間斷是3秒
}
####################### vrrp模塊配置 ######################
vrrp_instance VI_1 { //VRRP配置標識 VI_1是實例名稱
state MASTER //定義master相關
interface eth0 //網卡名稱,這裏我的爲eth0,通過vrrp協議去通信、去發廣播
virtual_router_id 51 //定義路由器ID ,配置的時候和從機器一致
priority 100 //權重,主角色和從角色的權重是不同的
advert_int 1 //設定MASTER與BACKUP主機質檢同步檢查的時間間隔,單位爲秒
authentication { //認證相關信息
auth_type PASS //這裏認證的類型是PASS
auth_pass 123456 //密碼的形式是一個字符串
}
virtual_ipaddress { //設置虛擬IP地址 (VIP),又叫做漂移IP地址
192.168.66.100 //更改爲192.168.66.100
}
track_script { //加載腳本
chk_nginx
}
}
注意:需要把註釋去掉後保存退出,虛擬IP地址是一個共有地址,當主機宕機後,備機Nginx啓動,如果備機Nginx解析地址依然爲源主機IP,則依舊無法正常訪問(源主機宕機,IP地址失效)。爲解決上述問題,主機和備機都解析到一個公共IP地址,在主機宕機後備機Nginx服務啓動即可解析到正常可以訪問的IP地址
(2)編輯上面keppalived配置中定義的檢查nginx的腳本,路徑也是在上面定義的
[root@master ~]# vi /usr/local/sbin/check_ng.sh #添加下面的內容
#!/bin/bash
#時間變量,用於記錄日誌
d=`date --date today +%Y%m%d_%H:%M:%S`
#計算nginx進程數量
n=`ps -C nginx --no-heading|wc -l`
#如果進程爲0,則啓動nginx,並且再次檢測nginx進程數量,
#如果還爲0,說明nginx無法啓動,此時需要關閉keepalived
if [ $n -eq "0" ]; then
/etc/init.d/nginx start
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
如果不停止keepalived服務,則容易使服務器發生腦裂,在高可用(HA)系統中,當聯繫2個節點的“心跳線”斷開時,本來爲一整體、動作協調的HA系統,就分裂成爲2個獨立的個體。由於相互失去了聯繫,都以爲是對方出了故障。兩個節點上的HA軟件像“裂腦人”一樣,爭搶“共享資源”、爭起“應用服務”,就會發生嚴重後果——或者共享資源被瓜分、2邊“服務”都起不來了;或者2邊“服務”都起來了,但同時讀寫“共享存儲”,導致數據損壞。
如何判斷腦裂?
分別在兩臺機查看當前服務器是否擁有虛擬IP,如果兩臺服務器都擁有,則說明發生了腦裂,證明目前雙機通信出現問題,產生此問題的原有在於 兩臺服務器都探測不到組內其他服務器的狀態(心跳請求無法正常響應),私自判定另一臺服務器掛起,則搶佔虛擬IP,腦裂的出現是不被允許的,解決此問題的方法爲檢查防火牆設置(關閉防火牆)或者使用串口通信。
注:需要注意腳本中nginx的啓動方式,如果是自定義腳本啓動的用上面的方式,yum 安裝使用service 或者systemctl啓動
keepalived的停止方式,因爲是centos7所以用 systemctl stop
(3)給腳本加上執行權限
[root@master ~]# chmod 755 /usr/local/sbin/check_ng.sh
(4)啓動keepalived
主機和備機啓動keepalived服務前都要先檢查selinux以及防火牆是否關閉,防止兩邊檢測不到對方的狀態
[root@master ~]# systemctl start keepalived
[root@master ~]# ps aux |grep keepalived
root 3386 0.0 0.1 17224 1100 ? Ss 16:41 0:00 /usr/sbin/keepalived -D
root 3388 0.0 0.2 17308 2660 ? S 16:41 0:00 /usr/sbin/keepalived -D
root 3389 0.1 0.1 17308 1920 ? S 16:41 0:00 /usr/sbin/keepalived -D
root 3678 0.0 0.0 6044 812 pts/0 S+ 16:43 0:00 grep keepalived
(5)測試監控腳本可用性
因爲在keepalived配置中定義了nginx檢查腳本,並加載,所以啓動keepalived會去檢查nginx的進程,沒有會自動啓動nginx,這裏已經把nginx也帶起來,說明腳本正常
[root@master ~]# ps aux |grep nginx
root 3417 0.0 0.1 15776 1560 ? Ss 16:41 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 3420 0.0 0.2 15940 2388 ? S 16:41 0:00 nginx: worker process
root 4366 0.0 0.0 6044 808 pts/0 S+ 16:49 0:00 grep nginx
(6)keepalived相關的日誌會記錄在/var/log/messages下,可以看到vip已經添加
[root@master ~]# cat /var/log/messages
Jul 16 16:41:41 localhost Keepalived_healthcheckers[3388]: Opening file '/etc/keepalived/keepalived.conf'.
Jul 16 16:41:41 localhost Keepalived_healthcheckers[3388]: Configuration is using : 6710 Bytes
Jul 16 16:41:41 localhost Keepalived_healthcheckers[3388]: Using LinkWatch kernel netlink reflector...
Jul 16 16:41:41 localhost Keepalived_healthcheckers[3388]: Netlink reflector reports IP 192.168.66.100 added
Jul 16 16:41:45 localhost Keepalived_vrrp[3389]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.66.100
(7)查看vip地址
[root@master ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:95:62:81 brd ff:ff:ff:ff:ff:ff
inet 192.168.66.128/24 brd 192.168.66.255 scope global eth0
inet 192.168.66.100/32 scope global eth0
inet6 fe80::20c:29ff:fe95:6281/64 scope link
valid_lft forever preferred_lft forever
可以看到eth0已經有兩個地址192.168.66.128和192.168.66.100
(8)檢查防火牆
[root@master ~]# iptables -nvL
Chain INPUT (policy ACCEPT 35856 packets, 38M bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 13895 packets, 2078K bytes)
pkts bytes target prot opt in out source destination
[root@master ~]# getenforce
Disabled
4、backup192.168.66.129配置
(1)修改keppalived默認配置文件/etc/keepalived/keepalived.conf
[root@backup ~]# > /etc/keepalived/keepalived.conf
[root@backup ~]# vi /etc/keepalived/keepalived.conf #添加下面的內容
global_defs {
notification_email {
[email protected]
}
notification_email_from luo.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh"
interval 3
}
vrrp_instance VI_1 {
state BACKUP #這裏需要注意設置成大寫BACKUP
interface eth0 #注意網卡的名字
virtual_router_id 51 #設置成和MASTER相同的,纔會認爲是一組
priority 90 #權重設置的比MASTER低
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.66.100
}
track_script {
chk_nginx
}
}
把註釋去掉後保存退出,注意註釋的內容
說明: 如果是多臺服務器,權重決定了master宕機後,backup接管master角色的順序
(2)編輯上面keppalived配置中定義的檢查nginx的腳本,路徑也是在上面定義的
[root@backup ~]# vi /usr/local/sbin/check_ng.sh #添加下面的內容
#!/bin/bash
#時間變量,用於記錄日誌
d=`date --date today +%Y%m%d_%H:%M:%S`
#計算nginx進程數量
n=`ps -C nginx --no-heading|wc -l`
#如果進程爲0,則啓動nginx,並且再次檢測nginx進程數量,
#如果還爲0,說明nginx無法啓動,此時需要關閉keepalived
if [ $n -eq "0" ]; then
/etc/init.d/nginx start
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
(3)給腳本加上執行權限
[root@backup ~]# chmod 755 /usr/local/sbin/check_ng.sh
(4)檢查selinux和防火牆相關的配置
[root@backup ~]# iptables -nvL
Chain INPUT (policy ACCEPT 35856 packets, 38M bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 13895 packets, 2078K bytes)
pkts bytes target prot opt in out source destination
[root@master ~]# getenforce
Disabled
(5)啓動keepalived,並查看
[root@backup ~]# systemctl start keepalived
[root@backup ~]# ps aux |grep keepalived
root 3697 0.0 0.1 17532 1084 ? Ss 01:23 0:00 /usr/sbin/keepalived -D
root 3699 0.0 0.2 17616 2628 ? S 01:23 0:00 /usr/sbin/keepalived -D
root 3700 0.0 0.1 17616 1884 ? S 01:23 0:00 /usr/sbin/keepalived -D
root 3705 0.0 0.0 5980 776 pts/2 S+ 01:26 0:00 grep keepalived
(6)查看腳本是否有效,看nginx有沒自動啓動
[root@backup ~]# ps aux |grep nginx
root 3746 0.0 0.1 16072 1548 ? Ss 01:27 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 3749 0.0 0.1 16236 1972 ? S 01:27 0:00 nginx: worker process
root 4241 0.0 0.0 5980 776 pts/2 S+ 01:31 0:00 grep nginx
測試
(1)在master和backup上創建一個nginx默認索引頁,用來區分主和從的nginx服務
[root@master ~]# vi /usr/share/nginx/html/index.html
[root@master ~]# cat /usr/share/nginx/html/index.html
Master Master
[root@backup ~]# vi /usr/share/nginx/html/index.html
[root@backup ~]# cat /usr/share/nginx/html/index.html
backup backup
(2)用瀏覽器訪問VIP
因爲VIP是在主上,所以訪問到主的nginx默認索引頁
(3)模擬主宕機,把主上的keepalived服務停掉,再訪問VIP,看有沒漂移到backup上
[root@master ~]# systemctl stop keepalived
可以看到訪問是backup的nginx的默認索引頁,說明VIP已經漂移到backup上
(4)模擬主已經恢復好,把主上的keepalived服務啓動,看vip會不會自動漂移到master上
[root@master ~]# systemctl start keepalived
訪問vip
說明測試是成功的
注意事項:
1、keepalived配置文件中的角色master和backup,網卡名字,權重和virtual_router_id
2、vip要用ip add命令查看
3、注意selinux和防火牆設置
4、keepalived服務日誌記錄在/var/log/message上
18.6 負載均衡集羣介紹
主流開源軟件LVS、keepalived、haproxy、nginx等
①其中LVS屬於4層(網絡OSI 7層模型),nginx屬於7層,haproxy既可以認爲是4層,也可以當做7層使用
②keepalived的負載均衡功能其實就是lvs,lvs是keepalived內置的
③lvs這種4層的負載均衡是可以分發TCP協議,web服務是80端口,除了分發80端口,還有其他的端口通信的,比如MySQL的負載均衡,就可以用LVS實現,而nginx僅僅支持http,https,mail,haproxy;haproxy也支持MySQL這種TCP負載均衡的
④7層有限制,不過有些更高級的功能,nginx可以通過站點目錄,去區分網站服務器之前,LVS4層的就不支持
⑤相比較來說,LVS這種4層的更穩定,能承受更多的請求,承載的併發量更高,而nginx這種7層的更加靈活,能實現更多的個性化需求
18.7 LVS介紹
•LVS是由國人章文嵩開發
• 流行度不亞於apache的httpd,基於TCP/IP做的路由和轉發,穩定性和效率很高
• LVS最新版本基於Linux內核2.6,有好多年不更新了
• LVS有三種常見的模式:NAT、DR、IP Tunnel
• LVS架構中有一個核心角色叫做分發器(Load balance),它用來分發用戶的請求,還有諸多處理用戶請求的服務器(Real Server,簡稱rs)
• 這種模式藉助iptables的nat表來實現
• 用戶的請求到分發器後,通過預設的iptables規則,把請求的數據包轉發到後端的rs上去
• rs需要設定網關爲分發器的內網ip
• 用戶請求的數據包和返回給用戶的數據包全部經過分發器,所以分發器成爲瓶頸
• 在nat模式中,只需要分發器有公網ip即可,所以比較節省公網ip資源
LVS NAT模式的特點
1、LVS NAT模式是通過一個分發器(Load Balancer);把用戶的請求,分發給後端的Real Server ,Real Server這些服務器接收到請求以後,處理好用戶請求以後,就重新丟回給分發器;最後分發器再返回給用戶;
2、LVS NAT模式的弊端是分發器會成爲整個網絡的瓶頸,當訪問量、請求量、反饋量大的時候,分發器的壓力會很大
3、LVS NAT模式的規模,一般最多支持10來臺服務器,超過10臺的話就會有力不從心;
4、LVS NAT模式這個結構,只需要有一個公網IP,其他real server服務器全部在內網就可以實現。可以節省很多的公網IP資源
• 這種模式,需要有一個公共的IP配置在分發器和所有rs上,我們把它叫做vip
• 客戶端請求的目標IP爲vip,分發器接收到請求數據包後,會對數據包做一個加工,會把目標IP改爲rs的IP,這樣數據包就到了rs上
• rs接收數據包後,會還原原始數據包,這樣目標IP爲vip,因爲所有rs上配置了這個vip,所以它會認爲是它自己
LVS IP Tunnel模式的特點
在分發器(load balancer)與真實服務器(real server)之間建立了虛擬通道,叫做 ip tunnel ;實際上是更改了數據包目的IP;請求過來通過分發器,通過在真實服務器上配置的VIP;用戶請求的時候,數據包裏面包好的目的IP,當數據包到達分發器的時候,分發器會進行一個數據包目的IP的更改,然後發送到具體的真實服務器上,通過lvs的自己的算法,進行實現到底傳輸到哪臺真實服務器上;然後真實服務器再解包處理,再通過一個VIP直接通過公網返回到用戶,這樣省略數據回到分發器的過程,減小了分發器的壓力,解決了分發器的瓶頸。
• 這種模式,也需要有一個公共的IP配置在分發器和所有rs上,也就是vip
• 和IP Tunnel不同的是,它會把數據包的MAC地址修改爲rs的MAC地址
• rs接收數據包後,會還原原始數據包,這樣目標IP爲vip,因爲所有rs上配置了這個vip,所以它會認爲是它自己
LVS DR模式的特點
與IP Tunnel模式整體過程相同,不同的是,它會把數據包的MAC地址修改爲rs的MAC地址進行分發。
18.8 LVS調度算法
• 輪詢 Round-Robin rr
• 加權輪詢 Weight Round-Robin wrr
• 最小連接 Least-Connection lc
• 加權最小連接 Weight Least-Connection wlc
• 基於局部性的最小連接 Locality-Based Least Connections lblc
• 帶複製的基於局部性最小連接 Locality-Based Least Connections with Replication lblcr
• 目標地址散列調度 Destination Hashing dh
• 源地址散列調度 Source Hashing sh
注:前4種爲常用的調度算法
18.9/18.10 LVS NAT模式搭建
lvs的nat模式,其實就是iptables端口轉發,把請求轉發到後端的的主機上
準備三臺機器
• 分發器,也叫調度器(簡寫爲dir)
內網 192.168.66.130,外網:192.168.159.100(vmware僅主機模式)這個IP更據你虛擬機IP段來設置
• rs1
內網:192.168.66.131,設置網關爲192.168.66.130也就是分發器的IP
• rs2
內網:192.168.66.132,設置網關爲192.168.66.130
增加網卡時需要注意:
在虛擬機增加一個新的網卡之後,並設置爲僅主機模式
開啓虛擬機,用ifconfig命令,查看是否已經加載了網卡——>安裝ifconfig包:yum install -y net-tools
複製網卡配置文件到新的網卡里面,並更改配置文件中的IP,刪除UUID,更改mac
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens37
[root@localhost network-scripts]# vim ifcfg-ens37
更改mac,可以使用ip add命令查看,新的網卡的mac,並在配置文件中更改
重啓網卡
ifup ens37
重啓網絡服務
systemctl restart network
用物理機嘗試新的網卡IP是否能通信
三臺機器上都執行執行
systemctl stop firewalld
systemc disable firewalld
systemctl start iptables
iptables -F
service iptables save
在分發器192.168.66.130上安裝ipvsadm
[root@localhost network-scripts]# yum install -y ipvsadm
在分發器192.168.66.130上編寫腳本
vim /usr/local/sbin/lvs_nat.sh
內容如下
#! /bin/bash
# director 服務器上開啓路由轉發功能
echo 1 > /proc/sys/net/ipv4/ip_forward //對內核參數修改,打開路由轉發
# 關閉icmp的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects //僞裝操作,不然不能轉發rs的數據
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects //僞裝操作,不然不能轉發rs的數據
# 注意區分網卡名字,兩個網卡分別爲ens33和ens37
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
# director 設置nat防火牆
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.66.0/24 -j MASQUERADE
//MASQUERADE實現同網段的機器去上網,路由器使用的就是這個功能
# director設置ipvsadm
IPVSADM='/usr/sbin/ipvsadm' //定義一個變量,方便下面命令引用
$IPVSADM -C //清空規則
$IPVSADM -A -t 192.168.159.100:80 -s wlc -p 3 //用來定義lvs的模式;wlc爲算法,可以按需求選擇lvs裏面適合的算法
$IPVSADM -a -t 192.168.159.100:80 -r 192.168.66.131:80 -m -w 1 //詳細規則,-r 指定rs機器IP,-m 指定nat模式,-w指定rs權重
$IPVSADM -a -t 192.168.159.100:80 -r 192.168.66.132:80 -m -w 1 //詳細規則,-r 指定rs機器IP,-m 指定nat模式,-w指定rs權重
-A增加一個規則,-t 制定lvs 模式,之後IP 就是分發器的IP,-s 指定算法;-p 指定超時時間(數據包轉發超時時間),例如用戶1訪問的是a機器,-p 的意思就是在同一個時間,一直在同一臺機器上進行請求
測試腳本
[root@localhost network-scripts]# sh /usr/local/sbin/lvs_nat.sh
執行腳本,若是沒輸出,表示腳本沒有錯誤
效果測試
使用curl模擬公網IP進行訪問
[root@localhost ~]# curl 192.168.159.100
master master
[root@localhost ~]# curl 192.168.159.100
backup backup
[root@localhost ~]# curl 192.168.159.100
master master
[root@localhost ~]# curl 192.168.159.100
backup backup
[root@localhost ~]# curl 192.168.159.100
master master
通過上述結果,說明lvs已經部署成功了