簡介
根據功能劃分爲兩大類:高可用和負載均衡
高可用集羣一般爲兩臺服務器,一臺工做,另一臺做爲冗餘,當提供服務的機器宕機,冗餘將接替繼續提供服務html
負載均衡集羣,須要有一臺服務器做爲分發器,它負責把用戶的請求分發給後端的服務器處理,在這個集羣裏,除了分發器外,就是給用戶提供服務的服務器了,這些服務器數量至少爲2linux
高可用開源軟件:keepalived
keepalived經過VRRP(Virtual Router Redundancy Protocl)來實現高可用。
在這個協議裏會將多臺功能相同的路由器組成一個小組,這個小組裏會有1個master角色和N(N>=1)個backup角色。
master會經過組播的形式向各個backup發送VRRP協議的數據包,當backup收不到master發來的VRRP數據包時,就會認爲master宕機了。此時就須要根據各個backup的優先級來決定誰成爲新的mater。
Keepalived要有三個模塊,分別是core、check和vrrp。其中core模塊爲keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析,check模塊負責健康檢查,vrrp模塊是來實現VRRP協議的。nginx
配置
準備兩臺機器(ip第四段爲)131和130,131做爲master,130做爲backup
兩臺機器都執行yum install -y keepalived
兩臺機器都安裝nginx,其中131上已經編譯安裝過nginx,130上須要yum安裝nginx: yum install -y nginx
設定vip(虛擬ip,主從共用的對外的ip,主機正常時vip對應主機,主機宕機時按照此ip繼續解析能夠從機接上)爲100,vip只能用ipadd查看,不能用ifconfig看
vim /etc/keepalived/keepalived.conf刪除原有內容,編輯131上keepalived配置文件,內容從https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_keepalived.conf 獲取
global_defs 全局參數
notification_email 出問題時發郵件
vrrp_script chk_nginx 檢測服務是否正常,引用下面腳本
vrrp_instance VI_1 定義master相關參數
vim /usr/local/sbin/check_ng.sh 131編輯監控腳本,內容從https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_check_ng.sh 獲取
用處在於檢測nginx服務是否啓動,若沒有啓動且啓動不了,須要關掉keepalived
給腳本755權限
systemctl start keepalived 131啓動服務
從上配置:
130上編輯配置文件,內容從https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_keepalived.conf 獲取
130上編輯監控腳本,內容從https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_check_ng.sh 獲取
給腳本755權限
130上也啓動服務 systemctl start keepalived
測試
1.分別在主從上關閉nginx,因爲腳本的存在,keepalived會自動啓動nginx。
2.主機增長規則iptables -I OUTPUT -p vrrp -j DROP不能達到切換資源目的,恢復之
3.停掉主機的keepalived,此時vip切換到從上,再啓動主機上的keepalived,當即恢復主機vipgit
均衡負載開源軟件:LVS
三個模式介紹:
a. NAT模式
這種模式藉助iptables的nat表來實現
用戶的請求到分發器後,經過預設的iptables規則,把請求的數據包轉發到後端的rs上去
rs須要設定網關爲分發器的內網ip
用戶請求的數據包和返回給用戶的數據包所有通過分發器,因此分發器成爲瓶頸
在nat模式中,只須要分發器有公網ip便可,因此比較節省公網ip資源
b. IP Tunnel 模式
這種模式,須要有一個公共的IP配置在分發器和全部rs上,咱們把它叫作vip
客戶端請求的目標IP爲vip,分發器接收到請求數據包後,會對數據包作一個加工,會把目標IP改成rs的IP,這樣數據包就到了rs上
rs接收數據包後,會還原原始數據包,這樣目標IP爲vip,由於全部rs上配置了這個vip,因此它會認爲是它本身
c. DR 模式
這種模式,也須要有一個公共的IP配置在分發器和全部rs上,也就是vip
和IP Tunnel不一樣的是,它會把數據包的MAC地址修改成rs的MAC地址
rs接收數據包後,會還原原始數據包,這樣目標IP爲vip,由於全部rs上配置了這個vip,因此它會認爲是它本身。算法
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 shvim
配置
NAT模式
三臺機器
分發器,也叫調度器(簡寫爲dir)
內網:133.130,外網:142.147(vmware僅主機模式)
rs1
內網:133.132,設置網關爲133.130
rs2
內網:133.133,設置網關爲133.130
檢測網關命令 route -n
三臺機器上都執行執行(關防火牆)
systemctl stop firewalld; systemc disable firewalld
systemctl start iptables; iptables -F; service iptables save
在dir(分發器)上安裝ipvsadm(實現LVS的工具)
yum install -y ipvsadm
在dir上編寫腳本,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
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
#注意區分網卡名字,阿銘的兩個網卡分別爲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.133.0/24 -j MASQUERADE //能夠將源地址爲網段192.168.133.0/24的修改爲外網地址,達成內網rs鏈接外網的目的
#director設置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C 清空規則
$IPVSADM -A -t 192.168.147.144:80 -s wlc -p 3 // -A表示增長規則,-t後跟外網IP,-s算法,-p必定時間內將同ip請求發到同一rs(沒有也行)
$IPVSADM -a -t 192.168.147.144:80 -r 192.168.133.132:80 -m -w 1 //-r後跟rs,-m表示NAT模式(masquerade),-w表示權重
$IPVSADM -a -t 192.168.147.144:80 -r 192.168.133.133:80 -m -w 1
另外兩臺不須要特別設置,安裝nginx就能夠後端
DR模式
三臺機器
分發器,也叫調度器(簡寫爲dir)
133.130
rs1
133.132
rs2
133.133
vip
133.200
dir上編寫腳本 vim /usr/local/sbin/lvs_dr.sh //內容以下
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.133.200
rs1=192.168.133.132
rs2=192.168.133.133
#注意這裏的網卡名字
ifdown ens33
ifup ens33 //重啓網卡,能夠把以前設置的ip清空,避免重複設置ip,不重啓也行
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up //綁定vip的命令,ifconfig設置虛擬網卡
route add -host $vip dev ens33:2 //
$ipv -C
$ipv -A -t $vip:80 -s wrr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1 //-g DR模式(gateway)
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
兩臺rs上也編寫腳本 vim /usr/local/sbin/lvs_rs.sh//內容以下
#/bin/bash
vip=192.168.133.200
#把vip綁定在lo上,是爲了實現rs直接把結果返回給客戶端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#如下操做爲更改arp內核參數,目的是爲了讓rs順利發送mac地址給客戶端
#參考文檔 www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
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
分別在dir上和兩個rs上執行這些腳本bash
Keepalived+LVS
完整架構須要兩臺服務器(角色爲dir)分別安裝keepalived軟件,目的是實現高可用,但keepalived自己也有負載均衡的功能,因此本次實驗能夠只安裝一臺keepalived
keepalived內置了ipvsadm的功能,因此不須要再安裝ipvsadm包,也不用編寫和執行那個lvs_dir的腳本
三臺機器分別爲:
dir(安裝keepalived)133.130
rs1 133.132
rs2 133.133
vip 133.200
編輯keepalived配置文件 vim /etc/keepalived/keepalived.conf//內容請到https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/lvs_keepalived.conf 獲取
須要更改裏面的ip信息
執行ipvsadm -C 把以前的ipvsadm規則清空掉
systemctl restart network 能夠把以前的vip清空掉·
兩臺rs上,依然要執行/usr/local/sbin/lvs_rs.sh腳本,但dir上只須要執行部分:echo 1 > /proc/sys/net/ipv4/ip_forward
keepalived有一個比較好的功能,能夠在一臺rs宕機時,再也不把請求轉發過去服務器