keepalived是分佈式部署解決系統高可用的軟件,結合lvs(LinuxVirtual Server)使用,解決單機宕機的問題。前端
keepalived是一個基於VRRP協議來實現IPVS的高可用的解決方案。對於LVS負載均衡來講,若是前端的調度器direct發生故障,則後端的realserver是沒法接受請求並響應的。所以,保證前端direct的高可用性是很是關鍵的,不然後端的服務器是沒法進行服務的。而咱們的keepalived就能夠用來解決單點故障(如LVS的前端direct故障)問題。keepalived的主要工做原理是:運行keepalived的兩臺服務器,其中一臺爲MASTER,另外一臺爲BACKUP,正常狀況下,全部的數據轉換功能和ARP請求響應都是由MASTER完成的,一旦MASTER發生故障,則BACKUP會立刻接管MASTER的工做,這種切換時很是迅速的。linux
LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統,LVS工做在ISO模型中的第四層,因爲其工做在第四層,所以與iptables相似,必須工做在內核空間上。所以lvs與iptables同樣,是直接工做在內核中的,叫ipvs,主流的linux發行版默認都已經集成了ipvs,所以用戶只需安裝一個管理工具ipvsadm便可。nginx
經過網絡地址轉換,調度器重寫請求報文的目標地址,根據預設的調度算法,將請求分派給後端真實服務器;真實服務器的響應報文經過調度器時,報文源地址被重寫再返回給客戶,完成整個負載調度過程。但一般在流量比較大的狀況下會形成調度器的瓶頸。由於服務數據的返回必須經過調度器出去。c++
採用NAT技術時,因爲請求和響應報文都必須通過調度器地址重寫,當客戶請求愈來愈多時,調度器的處理能力將成爲瓶頸。爲了解決這個問題,調度器 把請求報文經過IP隧道轉發至真實服務器,而真實服務器將響應直接返回給客戶,因此調度器只處理請求報文。因爲通常網絡服務應答比請求報文大許多,採用 VS/TUN技術後,集羣系統的最大吞吐量能夠提升10倍。可是目前支持TUN 只有Linux系統web
VS/DR經過改寫請求報文的MAC地址,將請求發送到真實服務器,而真實服務器將響應直接返回給客戶。同VS/TUN技術同樣,VS/DR技術 可極大地提升集羣系統的伸縮性。這種方法沒有IP隧道的開銷,對集羣中的真實服務器也沒有必須支持IP隧道協議的要求,可是要求調度器與真實服務器都有一塊網卡連在同一物理網段上。也就是說,在這種結構中,數據從外部到內部真實服務器的訪問會經過調度器進來,可是真實服務器對其的應答不是經過調度器出去。 即在大多數狀況下,真實服務器能夠經過各自的網關或者專用的網關對數據進行外發,從而下降調度器負載。 算法
針對不一樣的網絡服務和配置須要,LVS調度器提供多種不一樣的負載調度算法,其中最經常使用的四種算法包括輪詢、加權輪詢、最少鏈接和加權最少鏈接。數據庫
將收到的訪問請求按照順序輪流分配給羣集中的各節點(真實服務器)。後端
根據真實服務器的處理能力輪流分配收到的訪問請求,調度器能夠自動查詢各節點的負載狀況,並動態調整其權重。這樣能夠保證處理能力強的服務器承擔更多的訪問流量。centos
根據真實服務器已創建的鏈接數進行分配,將收到的訪問請求優先分配給鏈接數最少的節點。服務器
在服務器節點的性能差別較大的狀況下,能夠爲真實服務器自動調整權重,權重較高的節點將承擔更大比例的活動鏈接負載。
由於lvs工做方式的邏輯是很是之簡單,並且工做在網絡4層僅作請求分發之用,沒有流量,因此在效率上基本不須要太過考慮。在我手裏的 lvs,僅僅出過一次問題:在併發最高的一小段時間內均衡器出現丟包現象,據分析爲網絡問題,即網卡或linux2.4內核的承載能力已到上限,內存和 cpu方面基本無消耗。
這一般是一大劣勢,但同時也是一大優點,由於沒有太多可配置的選項,因此除了增減服務器,並不須要常常去觸碰它,大大減小了人爲出錯的概率。
由於其自己抗負載能力很強,因此穩定性高也是瓜熟蒂落,另外各類lvs都有完整的雙機熱備方案,因此一點不用擔憂均衡器自己會出什麼問題,節點出現故障的話,lvs會自動判別,因此係統總體是很是穩定的。
上面已經有所說起了。lvs僅僅分發請求,而流量並不從它自己出去,因此能夠利用它這點來作一些線路分流之用。沒有流量同時也保住了均衡器的IO性能不會受到大流量的影響。
由於lvs工做在4層,因此它能夠對幾乎全部應用作負載均衡,包括http、數據庫、聊天室等等。
注:LVS須要手工動態增長命令,因此須要Keepalived來實現自動配合。
系統版本:centos7x3.10.0-514.el7.x86_64
Keepalived版本:keepalived.x86_64 0:1.3.5-6.el7(yum)
Lvs版本:ipvsadm-1.27-7.el7(yum)
Nginx版本:nginx-1.14.0
關閉防火牆並禁止開機自啓
systemctl stop firewalld.service
systemctl disable firewalld
關閉selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
重啓 reboot
IP:192.168.152.170
主要組件: keepalived lvs(ipvsadm)
主要依賴包: gcc openssl openssl-devel
yum -y install keepalived ipvsadm gcc openssl openssl-devel
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.backup
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lvs_clu_1
}
virrp_sync_group Prox {
group {
}
}
vrrp_instance mail {
state MASTER
interface ens33
lvs_sync_daemon_interface ens33
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.152.100
}
}
virtual_server 192.168.152.100 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.152.168 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.152.169 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
1)添加配置文件
echo "net.ipv4.ip_forward = 1">>/etc/sysctl.conf
2)刷新配置
sysctl –p
1)重啓keepalived
systemctl restart keepalived
2)開機自啓keepalived
systemctl enable keepalived
注:若是服務啓動不起來,並報錯/usr/lib64/perl5/CORE/libperl.so: file too short,那就必須先升級perl,而後在從新安裝這些步驟哦!
ipvsadm -l
IP:192.168.152.91
主要組件: keepalived lvs(ipvsadm)
主要依賴包: gcc openssl openssl-devel
yum -y install keepalived ipvsadm gcc openssl openssl-devel
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.backup
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lvs_clu_1
}
virrp_sync_group Prox {
group {
}
}
vrrp_instance mail {
state backup
interface ens33
lvs_sync_daemon_interface ens33
virtual_router_id 50
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.152.100
}
}
virtual_server 192.168.152.100 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.152.168 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.152.169 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
1)添加配置文件
echo "net.ipv4.ip_forward = 1">>/etc/sysctl.conf
2)刷新配置
sysctl –p
1)重啓keepalived
systemctl restart keepalived
2)開機自啓keepalived
systemctl enable keepalived
注:若是服務啓動不起來,並報錯/usr/lib64/perl5/CORE/libperl.so: file too short,那就必須先升級perl,而後在從新安裝這些步驟哦!
ipvsadm -l
web1的IP:192.168.152.168
web2的IP:192.168.152.169
主要組件:nginx
主要依賴包:gcc gcc-c++ pcre pcre-devel zlib zlib-devel
yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel
wget https://nginx.org/download/nginx-1.14.0.tar.gz
1)解壓nginx壓縮包
tar zxf nginx-1.14.0.tar.gz
2)進入解壓目錄
cd nginx-1.14.0
3)配置nginx
./configure
4)編譯安裝nginx
make && make install
vi /etc/init.d/nginx
注:腳本太長這裏就不寫了,能夠訪問nginx啓動腳本查看!
chmod +x /etc/init.d/nginx
1)設置開機自啓
chkconfig nginx on
2)啓動nginx
/etc/init.d/nginx start
3)重啓nginx
/etc/init.d/nginx restart
4)查看nginx服務啓動狀態
chkconfig --list
5)查看nginx服務是否開啓
netstat -antupl | grep nginx
vi /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.ip_forward = 0
vi /etc/sysconfig/network-scripts/ifcfg-lo
TYPE=Ethernet
OTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
NAME=lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.152.100
NETMASK=255.255.255.255
1)臨時添加
routeadd -host 192.168.152.100 dev lo:0
2)永久添加
vi /etc/sysconfig/network-scripts/route-lo:0
193.192.168.152.100 dev lo:0
注:我這裏不用添加,由於我用的IP爲同一網段因此不添加也行!