集羣(cluster)就是一組計算機,它們做爲一個總體向用戶提供一組網絡資源。這些單個的計算機系統就是集羣的節點(node)。一個理想的集羣是,用戶歷來不會意識到集羣系統底層的節點,在他們看來,集羣是一個系統,而非多個計算機系統。而且集羣系統的管理員能夠隨意增長和刪改集羣系統的節點
集羣根據功能劃分爲兩大類:高可用和負載均衡。
高可用集羣 html
高可用集羣一般爲2臺服務器,一臺工做,另外一臺做爲冗餘,當提供服務的機器宕機時,冗餘將接替繼續提供服務。
實現高可用的開源軟件有:heartbeat、Keepalived,其中heartbeat已無人維護,因此從此使用Keepalived來搭建高可用集羣。
負載均衡集羣node
負載均衡集羣,須要有1臺服務器做爲分發器,它負責把用戶的請求分發給後端的服務器處理,在這個集羣裏,除了分發器外就是給用戶提供服務的服務器了,這些服務器數量至少爲2臺,因此負載均衡集羣至少要3臺服務器。
實現負載均衡的開源軟件有:LVS、Keepalived、haproxy、nginx;商業軟件有:F五、Netscaler。linux
1.keepalived經過VRRP協議來實現高可用nginx
2.在VRRP協議裏,將多臺功能相同的集齊組成一個小組,這個小組會又一個master角色和backup角色(N>=1)這個角色能夠多個。web
3.master會經過組播的形式向各個backup發現VRRP協議的數據包,當backup收不到master發來的VPPR數據包時,就會認爲master宕機了,這時backup就會啓動服務來替換新的master,若是有多臺backup就要看優先級來決定。算法
4.keepalived要有三個模塊:apache
core :核心,負責主進程的啓動、維護以及全局配置文件的加載和解析 check:負責模塊的健康檢查 vrrp:提供VPPR協議
這裏用keppalived實現nginx服務的高可用,由於nginx在生產環境中,不少企業把nginx作一個負載均衡器 ,假設nginx一旦掛掉,那麼後端全部的web,即便說是正常的,那也沒法訪問到
一、首先準備兩臺機器,都安裝keepalived
master:192.168.66.128
backup:192.168.66.129vim
[root@master ~]# yum install -y keepalived [root@backup ~]# yum install -y keepalived
二、兩臺機分別安裝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
三、master192.168.66.128配置
(1)修改keppalived默認配置文件/etc/keepalived/keepalived.confcentos
[root@master ~]# > /etc/keepalived/keepalived.conf #清空默認配置文件 [root@master ~]# vi /etc/keepalived/keepalived.conf #添加下面的內容,記得把註釋去掉 global_defs { //global_defs 全局配置標識 notification_email { //notification_email用於設置報警郵件地址 luo@qq.com //能夠設置多個,每行一個 } notification_email_from root@luo.com //設置郵件發送地址 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
四、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 { luo@qq.com } 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
說明測試是成功的
注意事項:
一、keepalived配置文件中的角色master和backup,網卡名字,權重和virtual_router_id
二、vip要用ip add命令查看
三、注意selinux和防火牆設置
四、keepalived服務日誌記錄在/var/log/message上
主流開源軟件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層的更加靈活,能實現更多的個性化需求
•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模式的特色
一、LVS NAT模式是經過一個分發器(Load Balancer);把用戶的請求,分發給後端的Real Server ,Real Server這些服務器接收到請求之後,處理好用戶請求之後,就從新丟回給分發器;最後分發器再返回給用戶;
二、LVS NAT模式的弊端是分發器會成爲整個網絡的瓶頸,當訪問量、請求量、反饋量大的時候,分發器的壓力會很大
三、LVS NAT模式的規模,通常最多支持10來臺服務器,超過10臺的話就會有力不從心;
四、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地址進行分發。
• 輪詢 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種爲經常使用的調度算法
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已經部署成功了