Interesting things
接着上一篇。
What did you do today
Keepalived是一個高性能的服務器高可用解決方案,Keepalived主要防止服務器單點故障的發生問題,可以通過Nginx的配合實現web服務端的高可用。
還記得我們空出來的192.168.12.77和192.168.12.88嗎?這2臺設備就是用來配置nginx的集羣和高可用。我們可以虛擬出來一個192.168.12.XX,外界請求訪問虛擬ip而不是真正的Nginx。
那什麼是高可用呢?
高可用是指同一時間提供服務的只有一臺設備,主服務器掛掉後,備用服務器便開始提供服務。
老操作, yum install pcre、yum install pcre-devel、yum install zlib、yum install zlib-devel、yum install openssl、openssl-devel(openssl 現在我可能還用不上)爲什麼要安裝這些?我前幾篇博客沒有講,現在來講講。
nginx的http模塊使用pcre來解析正則表達式
pcre-devel是使用pcre開發的一個二次庫,nginx也需要。
zlib提供了很多種壓縮的方式,nginx使用zlib對http包的內容進行gzip
nginx支持https,所以需要安裝openssl庫。把keepalived-1.2.18.tar.gz拷貝到/usr/local/software/目錄下
解壓keepalived-1.2.18.tar.gz到/usr/local/,命令:tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/
進入/usr/local/keepalived-1.2.18/,進行配置檢查。命令:./configure –prefix=/usr/local/keepalived
老操作編譯安裝,make && make install
創建/etc/keepalived目錄,我們需要把keepalived做成一個服務,這樣可以開機自行啓動。
進入/usr/local/keepalived/etc/keepalived/,將keepalived.conf拷貝到/etc/keepalived/目錄下。
進入/usr/local/keepalived/etc/rc.d/init.d/目錄下,將keepalived拷貝到/etc/init.d/目錄下
進入/usr/local/keepalived/etc/sysconfig目錄下,將keepalived拷貝到/etc/sysconfig/目錄下。
創建第一個軟鏈接,ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
設置爲keepalived開機啓動,chkconfig keepalived on
開啓keepalived服務, service keepalived start.
現在192.168.12.77修改/etc/keepalived/keepalived.conf文件。修改後的配置內容如下:
! Configuration File for keepalived
global_defs {
router_id nginx_cx_7_no_1
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 77
mcast_src_ip 192.168.12.77
priority 100
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.12.111
}
}
下面我們就具體的講講配置內容。
1.global_defs代表配置中的主機名,我就把192.168.12.77設置爲nginx_cx_7_no_1把,所以router_id的值爲nginx_cx_7_no_1global_defs {
router_id nginx1
}2.每隔2s去執行/etc/keepalived/nginx_check.sh腳本,這一項檢查從開始便一直進行,interval表示間隔時間,weight -20代表腳本執行成功後192.168.12.77這個節點的優先級降低20.
vrrp_script chk_nginx {
script “/etc/keepalived/nginx_check.sh”
interval 2
weight -20
}
3.state MASTER表示該節點角色爲master,interface eth0表示設備的網卡是eth0,virtual_router_id 77是取自當前設備的ip也就是192.168.12.77的後兩位。mcast_src_ip 192.168.12.7指定當前設備的ip,priority 100代表優先級是100,優先級在keepalived實現高可用方面超級重要。keepalived是根據優先級來選擇當前提供服務的設備。- 我們這裏用192.168.12.77指A設備,用192.168.12.88指B設備。假設A設備的優先級是100,B設備的優先級是90,那麼keepalived服務器一開始去檢查優先級,發現A設備的優先級很高,於是讓A設備當大哥,讓它去提供服務。當A設備的nginx掛了後,由於nginx_check腳本每2秒執行一次,發現A設備沒有nginx進程後,先會嘗試重新啓動nginx,如果重新啓動還是不行,這就很皮了!然後大發雷霆,就會殺掉所有的keepalived進程。然後回調給keepalived服務器,告知大哥的nginx掛掉了。keepalived服務器得知後,會把A設備的優先級減20,從而A設備的優先級爲80。這樣下次keepalived來檢查優先級時,B設備的優先級比A設備搞,那麼B設備就可以對外提供服務。美滋滋,這就實現了高可用。
5.這段配置,2個節點要一樣,表示它們屬於一個組,keepalived會同一組中去做檢查並保持高可用。
authentication {
auth_type PASS
auth_pass 1111
}- 我們這裏用192.168.12.77指A設備,用192.168.12.88指B設備。假設A設備的優先級是100,B設備的優先級是90,那麼keepalived服務器一開始去檢查優先級,發現A設備的優先級很高,於是讓A設備當大哥,讓它去提供服務。當A設備的nginx掛了後,由於nginx_check腳本每2秒執行一次,發現A設備沒有nginx進程後,先會嘗試重新啓動nginx,如果重新啓動還是不行,這就很皮了!然後大發雷霆,就會殺掉所有的keepalived進程。然後回調給keepalived服務器,告知大哥的nginx掛掉了。keepalived服務器得知後,會把A設備的優先級減20,從而A設備的優先級爲80。這樣下次keepalived來檢查優先級時,B設備的優先級比A設備搞,那麼B設備就可以對外提供服務。美滋滋,這就實現了高可用。
6.track_script裏面的chk_nginx要與前面定義的定時執行腳本名(vrrp_script chk_nginx { } )保持一致。
- 自己定義對外提供服務的虛擬ip。
virtual_ipaddress {
192.168.12.111
}
接着我們也修改192.168.12.88的keepalived.conf的內容。如下文所示:
global_defs {
router_id nginx_cx_8_no_2
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 77
mcast_src_ip 192.168.12.88
priority 90
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.12.111
}
}
我們發現192.168.12.88的keepalived的router_id 是nginx_cx_8_no_2,state是BACKUP(備用),priority是90。這些和192.168.12.77是不一樣的。這裏要注意的是virtual_router_id必須要保持一致。
192.168.12.77和192.168.12.88設備中我們還沒有配置nginx,我們需要解壓編譯安裝nginx。
- 解壓nginx-1.6.2.tar.gz到/usr/local/
- 解壓nginx-1.6.2.tar.gz到/usr/local/
進入/usr/local/nginx-1.6.2/目錄,輸入 ./configure –prefix=/usr/local/nginx進行驗證nginx
。
輸入make && make install 編譯安裝nginx
*在/etc/keepalived/目錄下,創建nginx_check.sh,命令:touch nginx_check.sh,然後寫入以下腳本:
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
老操作,在iptables添加80端口策略,命令:-A INPUT -p tcp -m state –state NEW -m tcp –dport 80 -j ACCEPT,然後重啓防火牆,讓策略生效。
爲了區分歡迎頁是哪個節點下的歡迎頁,我先修改192.168.12.77的歡迎頁。我們進入/usr/local/nginx/html/目錄下,修改index.html,如圖所示。
同樣的,在192.168.12.88設備中修改nginx的html目錄下的index.html.
啓動192.168.12.77和192.168.12.88的nginx。
訪問192.168.12.77
訪問192.168.12.88
然後我們啓動192.168.12.77、192.168.12.88的keepalived,service keepalived start
啓動keepalived後,我們發現兩個節點輸入ip a,發現都可以看到共同的虛擬ip 192.168.12.111。可是這是不合理的,正確情況下只有master角色的節點上纔有虛擬ip
造成這個原因的是防火牆,我們可以試着把2個節點的防火牆都關閉,命令是:service iptables stop.
關閉之後,我們再在2個節點輸入ip a命令。發現只有master有虛擬ip,而backup沒有虛擬ip。這纔是正確的。我們可以禁止iptables開機啓動。命令:chkconfig iptables off.
我們用虛擬ip(192.168.12.111)去訪問。我們發現啓動的是192.168.12.77設備的nginx,裏面它的優先級是100,而192.168.12.88設備的nginx優先級是90.
我們可以演示一下keepalived的高可用,我們把192.168.12.77的keepalived服務關閉,看keepalived服務器會不會自動切換到192.168.12.88的nginx爲我們提供服務。
我們再來訪問192.168.12.111.此時我們發現是192.168.12.88的nginx爲我們提供服務。
我們再把192.168.12.77(master)的keepalived服務打開。
我們再次訪問192.168.12.111.我又發現又切換到nginx master,也就是192.168.12.77
我們可以重啓192.168.12.77和192.168.12.88。
我們使用service keepalived status查看keepalived服務是否自動啓動。結果證明自動啓動了,美滋滋。
我們之前不是說過了嗎?nginx_check.sh腳本每隔2s就會檢測是否存在nginx進程,如果該節點的nginx進程爲0,會嘗試重啓nginx,如果重啓失敗的話,則抹殺keepalived進程。我們可以用192.168.12.77做一個測試。
先關閉nginx,命令:/usr/local/nginx/sbin/nginx -s stop。很糟糕的事情發生了,出現了一個錯誤” [error] open() “/usr/local/nginx/logs/nginx.pid” failed (2: No such file or directory)”. 很簡單,這說明在/usr/local/nginx/logs/目錄下面,缺少nginx.pid文件。
我們只需要輸入命令”/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf”即可生成nginx.pid.
然後再次輸入命令 /usr/local/nginx/sbin/nginx -s stop,就可以關閉nginx了,啦啦啦。
接着我們進入/usr/local/nginx/conf/目錄下面,修改nginx.conf文件,添加一個小錯誤,比如添加”cmazxiaoma is handsome”
保存nginx.conf後,重新啓動nginx,肯定會報錯。美滋滋。
最後我們查看keepalived進程,發現尼瑪還有keepalived進程。
我第一反應想到會不會是nginx_check.sh腳本寫錯了呢?我進入/etc/keepalived/目錄,輸入命令”sh nginx_check.sh”,發現拋出“killall 未知的命令”。
我摸了摸腦袋發現,我的虛擬機都是精簡把,沒有安裝psmisc.那麼我們就安裝它把。yum install psmisc.
安裝完畢,我們再查看keepalived進程。發現keepalived進程還是存在的。
我覺得nginx_check.sh沒有問題,我懷疑它沒有得到執行。那麼我們就自己執行nginx_check.sh。執行結果如下:
我們再次查看keepalived進程,發現keepalived進程都被抹殺了。這證明我的直覺沒有問題,nginx_check沒有得到執行。
我又有一個大膽的想法,會不會是後臺執行nginx_check,sh腳本時,沒有權限。
我們輸入nohup /etc/keepalived/nginx_check.sh,提示我們沒有權限。
權限不夠,怎麼辦?加唄!使用chmod 777 nginx_check.sh,使其他程序能夠對nginx_check.sh進行讀、寫、執行。
我們查看keepavlied進程,發現已被nginx_check.sh所抹殺。
- 哈哈哈,192.168.12.77掛了,那麼我們再訪問192.168.12.111,nginx有沒有切換到192.168.12.88的nginx。結果很讓我滿意!
Summary
美滋滋,Nginx高可用集羣已被搞定。下一篇講如何把Nginx高可用集羣應用到FastDFS集羣當中。