搭建高可用負載均衡器: haproxy+keepalived
搭建高可用負載均衡器: haproxy+keepalived
2018-07-117060
簡介:企業業務量比較小的時候,單臺伺服器就可以滿足業務需要了。但是隨著業務發展,單伺服器的問題就凸顯出來了,如何透明的擴充套件伺服器和頻寬,增加伺服器吞吐量呢?負載均衡器可以解決以上問題。企業業務量比較小的時候,單臺伺服器就可以滿足業務需要了。但是隨著業務發展,單伺服器的問題就凸顯出來了:
- 當伺服器掛掉時,業務就會中斷
- 當業務量增加,單臺伺服器效能變差,如何透明的擴充套件伺服器和頻寬,增加伺服器吞吐量
負載均衡器可以解決以上問題
1 負載均衡器拓撲圖
本文會根據拓撲圖,用haproxy和keepalived搭建一個負載均衡器
2 準備
2.1 準備環境
準備5臺CentOS7.3主機和一個VIP地址:
-
準備一個可用IP用作虛擬IP(VIP):
- VIP: 192.168.1.100
-
負載均衡器會用到2臺主機,一主一備的架構
- lb1(預設為主): 192.168.1.101
- lb2(預設為備): 192.168.1.102
-
後端伺服器叢集中主機的IP地址
- s1: 192.168.1.2
- s2: 192.168.1.3
- s3: 192.168.1.4
2.2 主機配置
2.2.1 所有主機上關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
2.2.2 所有主機關閉selinux
setenforce 0
vi /etc/selinux/config
SELINUX=disabled
2.3 安裝haproxy和keepalived
lb1和lb2上安裝haproxy和keepalived
yum install haproxy keepalived -y
2.4 安裝nginx(有其他後端測程式,可省略此步)
s1 s2 s3上安裝nginx,目的是把nginx作為後端,如果有其他後端程式,這一步可以省略
yum install epel-release -y
yum install nginx -y
2.3 配置keepalived
KeepAlived是基於VRRP(Virtual Router Redundancy Protocol,虛擬路由冗餘協議)實現的一個高可用方案,通過VIP(虛擬IP)和心跳檢測來實現高可用
Keepalived有兩個角色,Master和Backup。一般會是1個Master,多個Backup。
Master會繫結VIP到自己網絡卡上,對外提供服務。Master和Backup會定時確定對方狀態,當Master不可用的時候,Backup會通知閘道器,並把VIP繫結到自己的網絡卡上,實現服務不中斷,高可用
2.3.1 配置Master
編輯lb1(192.168.1.101)上的/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
# 通知郵件伺服器的配置
notification_email {
# 當master失去VIP或則VIP的時候,會發一封通知郵件到[email protected]
[email protected]
}
# 發件人資訊
notification_email_from [email protected]
# 郵件伺服器地址
smtp_server 127.0.0.1
# 郵件伺服器超時時間
smtp_connect_timeout 30
# 郵件TITLE
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
# 主機: MASTER
# 備機: BACKUP
state MASTER
# 例項繫結的網絡卡, 用ip a命令檢視網絡卡編號
interface eno16777984
# 虛擬路由標識,這個標識是一個數字(1-255),在一個VRRP例項中主備伺服器ID必須一樣
virtual_router_id 88
# 優先順序,數字越大優先順序越高,在一個例項中主伺服器優先順序要高於備伺服器
priority 100
# 主備之間同步檢查的時間間隔單位秒
advert_int 1
# 驗證型別和密碼
authentication {
# 驗證型別有兩種 PASS和HA
auth_type PASS
# 驗證密碼,在一個例項中主備密碼保持一樣
auth_pass 11111111
}
# 虛擬IP地址,可以有多個,每行一個
virtual_ipaddress {
192.168.1.100
}
}
virtual_server 192.168.1.100 443 {
# 健康檢查時間間隔
delay_loop 6
# 排程演算法
# Doc: http://www.keepalived.org/doc/scheduling_algorithms.html
# Round Robin (rr)
# Weighted Round Robin (wrr)
# Least Connection (lc)
# Weighted Least Connection (wlc)
# Locality-Based Least Connection (lblc)
# Locality-Based Least Connection with Replication (lblcr)
# Destination Hashing (dh)
# Source Hashing (sh)
# Shortest Expected Delay (seq)
# Never Queue (nq)
# Overflow-Connection (ovf)
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
# 通過排程演算法把Master切換到真實的負載均衡伺服器上
# 真實的主機會定期確定進行健康檢查,如果MASTER不可用,則切換到備機上
real_server 192.168.1.101 443 {
weight 1
TCP_CHECK {
# 連線超埠
connect_port 443
# 連線超時時間
connect_timeout 3
}
}
real_server 192.168.1.102 443 {
weight 1
TCP_CHECK {
connect_port 443
connect_timeout 3
}
}
}
2.3.2 配置BACKUP
編輯lb2(192.168.1.102)上的/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
# 通知郵件伺服器的配置
notification_email {
# 當master失去VIP或則VIP的時候,會發一封通知郵件到[email protected]
[email protected]
}
# 發件人資訊
notification_email_from [email protected]
# 郵件伺服器地址
smtp_server 127.0.0.1
# 郵件伺服器超時時間
smtp_connect_timeout 30
# 郵件TITLE
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
# 主機: MASTER
# 備機: BACKUP
state BACKUP
# 例項繫結的網絡卡, 用ip a命令檢視網絡卡編號
interface eno16777984
# 虛擬路由標識,這個標識是一個數字(1-255),在一個VRRP例項中主備伺服器ID必須一樣
virtual_router_id 88
# 優先順序,數字越大優先順序越高,在一個例項中主伺服器優先順序要高於備伺服器
priority 99
# 主備之間同步檢查的時間間隔單位秒
advert_int 1
# 驗證型別和密碼
authentication {
# 驗證型別有兩種 PASS和HA
auth_type PASS
# 驗證密碼,在一個例項中主備密碼保持一樣
auth_pass 11111111
}
# 虛擬IP地址,可以有多個,每行一個
virtual_ipaddress {
192.168.1.100
}
}
virtual_server 192.168.1.100 443 {
# 健康檢查時間間隔
delay_loop 6
# 排程演算法
# Doc: http://www.keepalived.org/doc/scheduling_algorithms.html
# Round Robin (rr)
# Weighted Round Robin (wrr)
# Least Connection (lc)
# Weighted Least Connection (wlc)
# Locality-Based Least Connection (lblc)
# Locality-Based Least Connection with Replication (lblcr)
# Destination Hashing (dh)
# Source Hashing (sh)
# Shortest Expected Delay (seq)
# Never Queue (nq)
# Overflow-Connection (ovf)
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
# 通過排程演算法把Master切換到真實的負載均衡伺服器上
# 真實的主機會定期確定進行健康檢查,如果MASTER不可用,則切換到備機上
real_server 192.168.1.101 443 {
weight 1
TCP_CHECK {
# 連線超埠
connect_port 443
# 連線超時時間
connect_timeout 3
}
}
real_server 192.168.1.102 443 {
weight 1
TCP_CHECK {
connect_port 443
connect_timeout 3
}
}
}
2.4 配置haproxy
編輯lb1(192.168.1.101)和lb2(192.168.1.102)上的/etc/haproxy/haproxy.cfg
把後端伺服器IP(192.168.1.2, 192.168.1.3, 192.168.1.4)加到backend裡
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4096
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
listen stats
bind *:9000
mode http
stats enable
stats hide-version
stats uri /stats
stats refresh 30s
stats realm Haproxy\ Statistics
stats auth admin:admin
frontend k8s-api
bind *:443
mode tcp
option tcplog
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
default_backend k8s-api-backend
backend k8s-api-backend
mode tcp
option tcplog
option tcp-check
balance roundrobin
server master1 192.167.1.2:80 maxconn 1024 weight 5 check
server master2 192.167.1.3:80 maxconn 1024 weight 5 check
server master3 192.167.1.4:80 maxconn 1024 weight 5 check
2.5 配置nginx
給nginx新增SSL證書,配置過程略
vi /usr/share/nginx/html/index.html
把index.html裡面字串Welcome to nginx改成Welcome to nginx HA
3 啟動服務
3.1 啟動nginx
sudo systemctl start nginx
sudo systemctl enable nginx
3.2 啟動haproxy
sudo systemctl start haproxy
sudo systemctl enable haproxy
3.3 啟動keepalived
sudo systemctl start keepalived
sudo systemctl enable keepalived
在MASTER上執行ip a
eno16777984: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 00:xx:xx:xx:3d:0c brd ff:ff:ff:ff:ff:ff
inet 192.168.1.101/24 brd 192.168.1.255 scope global eno16777984
valid_lft forever preferred_lft forever
inet 192.168.1.100/32 scope global eno16777984
valid_lft forever preferred_lft forever
inet6 eeee:eeee:1c9d:2009:250:56ff:fe9c:3d0c/64 scope global noprefixroute dynamic
valid_lft 7171sec preferred_lft 7171sec
inet6 eeee::250:56ff:eeee:3d0c/64 scope link
valid_lft forever preferred_lft forever
會發現VIP(192.168.1.100)已經繫結好了
inet 192.168.1.100/32 scope global eno16777984
valid_lft forever preferred_lft forever
如果發現VIP無法繫結
vi /etc/sysctl.conf
新增兩行
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
讓新配置生效
sysctl -p
4 驗證
4.1 檢視狀態
1. 在瀏覽器輸入 http://192.168.1.100:9000/stats 檢視haproxy狀態
2. 在瀏覽器輸入 https://192.168.1.100 檢視服務狀態
是否成功顯示為nginx歡迎頁面
4.2 主備切換
1. 在瀏覽器輸入 https://192.168.1.100 檢視是否成功顯示nginx歡迎頁面
2. lb1(192.168.1.101)關機,檢視是否還可以訪問https://192.168.1.100, 如果成功,則說明VIP成功切換到備機
3. 在lb2(192.168.1.102)上執行ip a,檢視網絡卡是否繫結VIP(192.168.1.100)
3. 啟動lb1(192.168.1.101)
目的是為了驗證VIP是否切回MASTER主機(因為MASTER端的配置檔案中priority為100,而BACKUP為99,health check會自動把VIP繫結到priority高的主機上)