簡介
這種方案,使用兩個VIP地址驯嘱,前端使用2臺機器镶苞,互為主備,同時有兩臺機器工作鞠评,當其中一臺機器出現故障茂蚓,兩臺機器的請求轉移到一臺機器負擔,非常適合于生產架構環(huán)境剃幌。
一聋涨、網絡拓撲
四臺虛擬機如下所示:
為什么使用keepalived呢?
使用keepalived就用來做高可用的负乡,提供虛擬VIP
二牍白、配置
將兩臺機器上的/etc/keepalived/keepalived.conf配置文件修改成如下:
Nginx-A:
[root@Nginx-A src]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
############################ 全局配置 #############################
global_defs {
# 定義管理員郵件地址,表示keepalived在發(fā)生諸如切換操作時需要發(fā)送email通知,以及email發(fā)送給哪些郵件地址,可以有多個,每行一個
notification_email {
#設置報警郵件地址,可以設置多個抖棘,每行一個茂腥。 需開啟本機的sendmail服務
13020176132@163.com
}
#keepalived在發(fā)生諸如切換操作時需要發(fā)送email通知地址,表示發(fā)送通知的郵件源地址是誰
notification_email_from 13020176132@163.com
#指定發(fā)送email的smtp服務器
smtp_server 127.0.0.1
#設置連接smtp server的超時時間
smtp_connect_timeout 30
#運行keepalived的機器的一個標識切省,通匙罡冢可設為hostname。故障發(fā)生時朝捆,發(fā)郵件時顯示在郵件主題中的信息般渡。
router_id swarm01
}
############################ VRRPD配置 #############################
# 定義chk_http_port腳本,腳本執(zhí)行間隔10秒,權重-5芙盘,檢測nginx服務是否在運行诊杆。有很多方式,比如進程何陆,用腳本檢測等等
vrrp_script chk_http_port {
#這里通過腳本監(jiān)測
script "/opt/chk_nginx.sh"
#腳本執(zhí)行間隔晨汹,每2s檢測一次
interval 2
#腳本結果導致的優(yōu)先級變更,檢測失敶ぁ(腳本返回非0)則優(yōu)先級 -5
weight -5
#檢測連續(xù)2次失敗才算確定是真失敗淘这。會用weight減少優(yōu)先級(1-255之間)
fall 2
#檢測1次成功就算成功。但不修改優(yōu)先級
rise 1
}
#定義vrrp實例巩剖,VI_1 為虛擬路由的標示符铝穷,自己定義名稱,keepalived在同一virtual_router_id中priority(0-255)最大的會成為master佳魔,也就是接管VIP曙聂,當priority最大的主機發(fā)生故障后次priority將會接管
vrrp_instance VI_1 {
#指定keepalived的角色,MASTER表示此主機是主服務器鞠鲜,BACKUP表示此主機是備用服務器宁脊。注意這里的state指定instance(Initial)的初始狀態(tài)断国,就是說在配置好后,這臺服務器的初始狀態(tài)就是這里指定的榆苞,
#但這里指定的不算稳衬,還是得要通過競選通過優(yōu)先級來確定。如果這里設置為MASTER坐漏,但如若他的優(yōu)先級不及另外一臺薄疚,那么這臺在發(fā)送通告時,會發(fā)送自己的優(yōu)先級赊琳,另外一臺發(fā)現優(yōu)先級不如自己的高遇绞,
#那么他會就回搶占為MASTER
state MASTER
#指定HA監(jiān)測網絡的接口暴构。與本機 IP 地址所在的網絡接口相同,可通過ip addr 查看
interface ens33
# 發(fā)送多播數據包時的源IP地址,這里注意了俊抵,這里實際上就是在哪個地址上發(fā)送VRRP通告爪膊,這個非常重要谜诫,
#一定要選擇穩(wěn)定的網卡端口來發(fā)送牵祟,這里相當于heartbeat的心跳端口,如果沒有設置那么就用默認的綁定的網卡的IP弱卡,也就是interface指定的IP地址
mcast_src_ip 192.168.182.110
#虛擬路由標識乃正,這個標識是一個數字,同一個vrrp實例使用唯一的標識婶博。即同一vrrp_instance下瓮具,MASTER和BACKUP必須是一致的
virtual_router_id 51
#定義優(yōu)先級,數字越大凡人,優(yōu)先級越高名党,在同一個vrrp_instance下,MASTER的優(yōu)先級必須大于BACKUP的優(yōu)先級
priority 101
#設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔挠轴,單位是秒
advert_int 1
#設置驗證類型和密碼传睹。主從必須一樣
authentication {
#設置vrrp驗證類型,主要有PASS和AH兩種
auth_type PASS
#設置vrrp驗證密碼岸晦,在同一個vrrp_instance下欧啤,MASTER與BACKUP必須使用相同的密碼才能正常通信
auth_pass 1111
}
#VRRP HA 虛擬地址 如果有多個VIP,繼續(xù)換行填寫
#設置VIP启上,它隨著state變化而增加刪除邢隧,當state為master的時候就添加,當state為backup的時候則刪除冈在,由優(yōu)先級決定
virtual_ipaddress {
192.168.182.156
}
#執(zhí)行nginx檢測腳本倒慧。注意這個設置不能緊挨著寫在vrrp_script配置塊的后面(實驗中碰過的坑),否則nginx監(jiān)控失效!纫谅!
track_script {
#引用VRRP腳本炫贤,即在 vrrp_script 部分指定的名字。定期運行它們來改變優(yōu)先級系宜,并最終引發(fā)主備切換照激。
chk_http_port
}
}
#定義vrrp實例发魄,VI_2 為虛擬路由的標示符盹牧,自己定義名稱,keepalived在同一virtual_router_id中priority(0-255)最大的會成為master励幼,也就是接管VIP汰寓,當priority最大的主機發(fā)生故障后次priority將會接管
vrrp_instance VI_2 {
#指定keepalived的角色,MASTER表示此主機是主服務器苹粟,BACKUP表示此主機是備用服務器有滑。注意這里的state指定instance(Initial)的初始狀態(tài),就是說在配置好后嵌削,這臺服務器的初始狀態(tài)就是這里指定的毛好,
#但這里指定的不算,還是得要通過競選通過優(yōu)先級來確定苛秕。如果這里設置為MASTER肌访,但如若他的優(yōu)先級不及另外一臺,那么這臺在發(fā)送通告時艇劫,會發(fā)送自己的優(yōu)先級吼驶,另外一臺發(fā)現優(yōu)先級不如自己的高,
#那么他會就回搶占為MASTER
state BACKUP
#指定HA監(jiān)測網絡的接口店煞。與本機 IP 地址所在的網絡接口相同蟹演,可通過ip addr 查看
interface ens33
# 發(fā)送多播數據包時的源IP地址,這里注意了顷蟀,這里實際上就是在哪個地址上發(fā)送VRRP通告酒请,這個非常重要,
#一定要選擇穩(wěn)定的網卡端口來發(fā)送鸣个,這里相當于heartbeat的心跳端口蚌父,如果沒有設置那么就用默認的綁定的網卡的IP,也就是interface指定的IP地址
mcast_src_ip 192.168.182.110
#虛擬路由標識毛萌,這個標識是一個數字苟弛,同一個vrrp實例使用唯一的標識。即同一vrrp_instance下阁将,MASTER和BACKUP必須是一致的
virtual_router_id 52
#定義優(yōu)先級膏秫,數字越大,優(yōu)先級越高,在同一個vrrp_instance下缤削,MASTER的優(yōu)先級必須大于BACKUP的優(yōu)先級
priority 100
#設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔窘哈,單位是秒
advert_int 1
#設置驗證類型和密碼。主從必須一樣
authentication {
#設置vrrp驗證類型亭敢,主要有PASS和AH兩種
auth_type PASS
#設置vrrp驗證密碼滚婉,在同一個vrrp_instance下,MASTER與BACKUP必須使用相同的密碼才能正常通信
auth_pass 1111
}
#VRRP HA 虛擬地址 如果有多個VIP帅刀,繼續(xù)換行填寫
#設置VIP让腹,它隨著state變化而增加刪除,當state為master的時候就添加扣溺,當state為backup的時候則刪除骇窍,由優(yōu)先級決定
virtual_ipaddress {
192.168.182.157
}
#執(zhí)行nginx檢測腳本。注意這個設置不能緊挨著寫在vrrp_script配置塊的后面(實驗中碰過的坑)锥余,否則nginx監(jiān)控失效8鼓伞!
track_script {
#引用VRRP腳本驱犹,即在 vrrp_script 部分指定的名字嘲恍。定期運行它們來改變優(yōu)先級,并最終引發(fā)主備切換雄驹。
chk_http_port
}
}
Nginx-B:
[root@Nginx-B src]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
13020176132@163.com
}
notification_email_from 13020176132@163.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id swaram02
}
vrrp_script chk_http_port {
script "/opt/chk_nginx.sh"
interval 2
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
mcast_src_ip 192.168.182.111
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.182.156
}
track_script {
chk_http_port
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
mcast_src_ip 192.168.182.111
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.182.157
}
track_script {
chk_http_port
}
}
然后修改兩臺機器上的nginx首頁
[root@Nginx-A html]# vim /usr/local/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Nginx-Master!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to Nginx-A!</h1>
<h1><b>Nginx-A:192.168.182.110</b></h1>
<p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p>
<p>For online documentation and support please refer to <a >nginx.org</a>.<br /> Commercial support is available at <a >nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@Nginx-B html]# vim /usr/local/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Nginx-Master!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to Nginx-B!</h1>
<h1><b>Nginx-B:192.168.182.111</b></h1>
<p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p>
<p>For online documentation and support please refer to <a >nginx.org</a>.<br /> Commercial support is available at <a >nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
chk_nginx.sh腳本也不用改佃牛,然后重啟keepalived
[root@Nginx-A keepalived]# systemctl start keepalived.service
[root@Nginx-A keepalived]# systemctl status keepalived.service
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
Active: active (running) since 二 2018-05-29 14:46:25 CST; 4s ago
Process: 10590 ExecStart=/usr/local/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 7396 (keepalived)
Tasks: 6
Memory: 3.0M
CGroup: /system.slice/keepalived.service
├─ 7396 /usr/local/keepalived/sbin/keepalived -D
├─ 7397 /usr/local/keepalived/sbin/keepalived -D
├─ 7398 /usr/local/keepalived/sbin/keepalived -D
├─ 99999 nginx: master process /usr/local/nginx/sbin/nginx
├─100001 nginx: worker process
└─100002 nginx: worker process
5月 29 14:46:25 Nginx-A systemd[1]: Starting LVS and VRRP High Availability Monitor...
5月 29 14:46:25 Nginx-A Keepalived[10590]: Starting Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
5月 29 14:46:25 Nginx-A Keepalived[10590]: Unable to resolve default script username
[root@Nginx-B conf]# /etc/init.d/keepalived status
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
Active: active (running) since 二 2018-05-29 14:45:34 CST; 4min 17s ago
Process: 5770 ExecStart=/usr/local/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 2771 (keepalived)
Tasks: 3
Memory: 960.0K
CGroup: /system.slice/keepalived.service
├─2771 /usr/local/sbin/keepalived -D
├─2772 /usr/local/sbin/keepalived -D
└─2773 /usr/local/sbin/keepalived -D
5月 29 14:45:34 Nginx-B systemd[1]: Starting LVS and VRRP High Availability Monitor...
5月 29 14:45:34 Nginx-B Keepalived[5770]: Starting Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
5月 29 14:45:34 Nginx-B systemd[1]: Started LVS and VRRP High Availability Monitor.
三、keepalived+nginx的高可用測試
3.1 查看服務器上的IP地址
查看Nginx-A的地址:
[root@Nginx-A keepalived]# ip addr
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e0:69:a0 brd ff:ff:ff:ff:ff:ff
inet 192.168.182.110/24 brd 192.168.182.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.182.156/32 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.182.157/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::3064:9b6a:9819:180a/64 scope link noprefixroute
valid_lft forever preferred_lft forever
查看Nginx-B的地址:
[root@Nginx-B keepalived]# ip addr
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:25:44:71 brd ff:ff:ff:ff:ff:ff
inet 192.168.182.111/24 brd 192.168.182.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::2818:83f9:1989:3130/64 scope link noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::3064:9b6a:9819:180a/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
會多出兩個虛擬IP
inet 192.168.182.156/32 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.182.157/32 scope global ens33
首先通過兩個VIP地址訪問如下:
3.2荠医、關閉Nginx-A上的nginx吁脱,keepalived將在2s內將它重新啟動
[root@Nginx-A keepalived]# /usr/local/nginx/sbin/nginx -s stop
3.3、關閉Nginx-A上的keepalived彬向,VIP會切換到Nginx-B上
[root@Nginx-A keepalived]# service keepalived stop
不管訪問的是:http://192.168.182.157/ 還是http://192.168.182.156/ 都將導到Nginx-B上去兼贡。
同時會發(fā)現Nginx-A上的虛擬IP會消失
[root@Nginx-A keepalived]# ip addr
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e0:69:a0 brd ff:ff:ff:ff:ff:ff
inet 192.168.182.110/24 brd 192.168.182.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::3064:9b6a:9819:180a/64 scope link noprefixroute
valid_lft forever preferred_lft forever