lvs+keepalived 高可用及負載均衡
一、環境準備
VIP:10.18.43.30
dr1:10.18.43.10
dr2:10.18.43.20
web1:10.18.43.13
web2:10.18.43.14
結構圖
(一)、預處理
(1)、關閉所有機器selinux,
vim /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected .
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
-------------------------------------------------------------
setenforce 0 #退出保存,執行setenforce 0 當前生效
(2)、關閉所有機器firewalld
systemctl stop firewalld.service
(3)、添加網卡
在DR1與DR2機器添加個添加一張網卡,(也可以不用添加使用本機網卡,主機有兩塊網卡,其中一塊可以用來檢測心跳,MASTER和BACKUP如果無法接收到彼此的組播通知,但是兩個節點實際上都處於工作狀態,這時兩個節點均為MASTER強行綁定虛擬IP,從而導致腦裂。)
(二)、部署處理
部署要使用的相關軟件;
(1)、後端部署
nginx編譯安裝,(在web1和web2執行相同的操作,此處省略web2操作步驟)
groupadd nginx #創建nginx組
useradd -r -g nginx -s /bin/nologin nginx #創建nginx用戶並取消shell
wget http://nginx.org/download/nginx-1.14.0.tar.gz #下載nginx軟件包
tar xf nginx-1.14.0.tar.gz -C /tpm/ #解壓nginx源碼包
cd /tmp/nginx-1.14.0/
./configure --prefix=/usr/local/nginx --without-select_module --without-poll_module --with-debug --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_xslt_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --with-cc=`which gcc`
make -j 2 && make install
(2)、啟動nginx服務
cd /usr/local/nginx/
sbin/nginx
[root@web1-1 nginx]# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1134 root 6u IPv4 27680 0t0 TCP *:http (LISTEN)
nginx 1135 nginx 6u IPv4 27680 0t0 TCP *:http (LISTEN)
(3)、設置lo回環地址
(在web1和web2,執行相同的操作)
[root@web1-1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@web1-1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web1-1 ~]# ip a a dev lo 10.18.43.30/32
[root@web1-1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.18.43.30/32 scope global lo
valid_lft forever preferred_lft forever
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 group default qlen 1000
link/ether 52:54:00:ed:d6:71 brd ff:ff:ff:ff:ff:ff
inet 10.18.43.13/24 brd 10.18.43.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:feed:d671/64 scope link
valid_lft forever preferred_lft forever
測試後端web服務是否正常,(web1,web2執行相同操作)
[root@web1-1 ~]# curl 10.18.43.13
web1
(4)、負載均衡
下載ipvsadm,keepalived,
yum -y install ipvsadm keepalived
(5)、keepalived部署詳解
[root@DR-1-1 ]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id lvs #全局配置
}
vrrp_instance lvs_keepalived { #庫名稱
state BACKUP #角色:MASTER BACKUP
interface eth0 #網卡:這裏我們拿eth0做為心跳測試,檢測另一臺BACKUP存活狀態
virtual_router_id 51 #小組段:默認是51
priority 100 # 服務的優先權最高255
nopreempt # BACKUP 不搶IP
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 #小組密碼
}
virtual_ipaddress {
10.18.43.30/32 dev eth1 # 虛擬ip
}
}
virtual_server 10.18.43.30 80 {
delay_loop 6 #延時環 6秒
lb_algo rr #輪詢規則rr
lb_kind DR #使用的工作模式
persistence_timeout 50 #連接超時 時間
protocol TCP #使用的協議
real_server 10.18.43.13 80 {
weight 1 #權重
TCP_CHECK {
connect_port 80 #監聽端口
connect_timeout 3 #連接超時3秒
nb_get_retry 3 #重試連接3次
delay_before_retry 3 #連接超時3重試連接3次
}
}
real_server 10.18.43.14 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
將這份配置發給dr2,只需要修改優先級;
[root@DR-2-2 ]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id lvs #全局配置,全局必須一致
}
vrrp_instance lvs_keepalived { #庫名稱
state BACKUP #角色:MASTER BACKUP
interface eth0 #網卡:這裏我們拿eth0做為心跳測試,檢測另一臺BACKUP存活狀態
virtual_router_id 51 #小組段:默認是51
priority 150 #註意這裏的優先級
nopreempt # BACKUP 不搶IP
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 #小組密碼
}
virtual_ipaddress {
10.18.43.30/32 dev eth1 # 虛擬ip
}
}
virtual_server 10.18.43.30 80 {
delay_loop 6 #延時環 6秒
lb_algo rr #輪詢規則rr
lb_kind DR #使用的工作模式
persistence_timeout 50 #連接超時 時間
protocol TCP #使用的協議
real_server 10.18.43.13 80 {
weight 1 #權重
TCP_CHECK {
connect_port 80 #監聽端口
connect_timeout 3 #連接超時3秒
nb_get_retry 3 #重試連接3次
delay_before_retry 3 #連接超時3重試連接3次
}
}
real_server 10.18.43.14 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
(6)、啟動keepalived
(在DR1和DR2執行相同操作)
[root@DR-1-1 ~]# systemctl start keepalived.service
[root@DR-2-2 ~]# systemctl start keepalived.service
(7)、查看結果
DR1與RD2先啟動那個機器,虛擬VIP就會在那個主機的第二張網卡上,(第一張網卡是用來做心跳測試的,)
[root@DR-1-1 keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
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 52:54:00:c9:8e:89 brd ff:ff:ff:ff:ff:ff
inet 10.18.43.10/24 brd 10.18.43.255 scope global dynamic eth0
valid_lft 41215sec preferred_lft 41215sec
inet6 fe80::70de:1853:c4c6:aa/64 scope link
valid_lft forever preferred_lft forever
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:51:4b:4f brd ff:ff:ff:ff:ff:ff
inet 10.18.43.12/24 brd 10.18.43.255 scope global dynamic eth1
valid_lft 43069sec preferred_lft 43069sec
inet 10.18.43.30/32 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::e958:18e:3504:b3f/64 scope link
valid_lft forever preferred_lft forever
二、概念補充
(1)、腦裂
一般來說,腦裂的發生,有一下幾種原因;
1、高可用服務器對之間心跳線鏈路發生故障,導致無法正常通信;
2、因心跳線壞了,(包括斷了,老化等一些物理上的原因)
3、因網卡及相關驅動壞了,IP配置及沖突問題(網卡直連)
4、因心跳線間鏈接的設備故障(網卡及交換機)
5、因仲裁的機器出問題(采用仲裁的方案)
6、高可用服務器上開啟了iptables防火強阻擋了心跳消息傳輸
7、高可用服務器上心跳網卡地址等信息配置不正確,導致心跳失敗;
8、其他服務配置不當等原因,如心跳方式不同,心跳廣播沖突,軟件Bug等。
提示:keepalived配置裏同一VRRP實例如果virtual_router_id兩端參數配置不一致也後悔導致腦裂問題發生;
(2)、常見解決方案
在實際生產環境中,我們可以從以下幾個方面來防止腦裂問題的發生;
1、同時使用串行電纜和以太網電纜鏈接,同時使用兩跳心跳線路,這樣一條線路壞了,另一條還是好的,依然能傳送心跳消息
2、當檢測到腦裂時,強行關閉一個心跳節點,
3、做好對腦裂的監控報警,在問題發生時人為第一時間介入仲裁,降低損失。
(3)、keepalived配置
在這裏主要解釋一下我的配置沒有寫入MASTER,在有nopreempt參數的情況下,是可以不要MASTER,為了確保vip在一臺機器上的穩定性,我們需要在配置文件中添加nopreempt參數,而且取消MASTER角色;
如果MASTER角色存在,那麽MASTER角色宕機之後,他的vip會漂移到BACKUP角色主機上,這時如果是以為網絡抖動的原因造成的,當MASTER服務鏈接正常時,MASTER角色就會將原有的vip搶回來,反復來回幾次之後,keepalived就會宕機,造成不可設想的後果;
如果取消MASTER角色,添加nopreempt參數,vip會按照服務啟動的先回順序和優先級來決定他在那臺機器上,有一臺keepalived宕機,vip就會漂移到另一臺BACKUP機器上,當另一臺keepalived正常只會,他不會去搶vip,這樣就不會造成vip來回在keepalived機器上飄來飄去;
lvs+keepalived 高可用及負載均衡