昨天在公司內部分享了高可用負載均衡,現將環境搭建過程記錄一下。node
本文主要講keepalived高可用,與keepalived自檢的腳本。python
環境:
web01: 10.8.8.51 centos7.3 #web服務器01
web02: 10.8.8.52 centos7.3 #web服務器02
proxy01:10.8.8.90 centos7.3 vip:10.8.8.55 #nginx負載均衡主服務器,keepalived主服務器
proxy02:10.8.8.91 centos7.3 vip:10.8.8.55 #nginx負載均衡備服務器,keepalived備服務器nginx
因爲本文主講keepalived高可用,環境搭建過程忽略。web
web0一、web02各自搭建一個簡單的web,域名均爲:www.test.comcentos
分別測試單機訪問是否成功。服務器
在10.8.8.90和10.8.8.91主機上,分別配置nginx負載均衡。簡單配置以下。分別測試負載均衡是否成功。負載均衡
upstream backend { server 10.8.8.51:80 max_fails=3 fail_timeout=30s; server 10.8.8.52:80 max_fails=3 fail_timeout=30s; } server { listen 80; server_name www.test.com; location / { proxy_pass http://backend;
proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } }
keepalived官網:www.keepalived.orgcurl
由於是測試用,因此用最新版本:ide
下載地址:http://www.keepalived.org/software/keepalived-2.0.6.tar.gz測試
#iptables防火牆互相容許對方ip經過
#在proxy02機子上: -I INPUT -s 10.8.8.90 -j ACCEPT #在proxy01機子上: -I INPUT -s 10.8.8.91 -j ACCEPT
[root@proxy01 ~]# mkdir /home/tools [root@proxy01 ~]# cd /home/tools/ [root@proxy01 tools]# wget http://www.keepalived.org/software/keepalived-2.0.6.tar.gz [root@proxy01 tools]# tar xf keepalived-2.0.6.tar.gz [root@proxy01 tools]# cd keepalived-2.0.6 [root@proxy01 keepalived-2.0.6]# ./configure --prefix=/usr/local/keepalived [root@proxy01 keepalived-2.0.6]# make [root@proxy01 keepalived-2.0.6]# make install
#個人安裝過lnmp環境,沒有報錯,若是編輯或安裝時報錯,先安裝依賴。
yum install openssl-devel psmisc libnl* libnfnetlink-devel -y #若是報錯,就安裝依賴。
#配置後便可使用/etc/init.d/keepalived啓停keepalived服務,必須配置,在腳本中須要用到,若是使用service命令啓停服務,crontab定時任務不會執行。
[root@proxy01 ~]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ [root@proxy01 ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ [root@proxy01 ~]# touch /etc/init.d/keepalived [root@proxy01 ~]# chmod +x /etc/init.d/keepalived [root@proxy01 ~]# vi /etc/init.d/keepalived
#/etc/init.d/keepalived內容以下:
#!/bin/sh # # Startup script for the Keepalived daemon # # processname: keepalived # pidfile: /var/run/keepalived.pid # config: /etc/keepalived/keepalived.conf # chkconfig: - 21 79 # description: Start and stop Keepalived # Source function library . /etc/rc.d/init.d/functions # Source configuration file (we set KEEPALIVED_OPTIONS there) . /etc/sysconfig/keepalived RETVAL=0 prog="keepalived" start() { echo -n $"Starting $prog: " daemon keepalived ${KEEPALIVED_OPTIONS} RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog } stop() { echo -n $"Stopping $prog: " killproc keepalived RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog } reload() { echo -n $"Reloading $prog: " killproc keepalived -1 RETVAL=$? echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) stop start ;; condrestart) if [ -f /var/lock/subsys/$prog ]; then stop start fi ;; status) status keepalived RETVAL=$? ;; *) echo "Usage: $0 {start|stop|reload|restart|condrestart|status}" RETVAL=1 esac exit $RETVAL
[root@proxy01 ~]# mkdir /etc/keepalived/ [root@proxy01 ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ [root@proxy01 ~]# vi /etc/keepalived/keepalived.conf
#keepalived.conf主配置文件內容以下:
global_defs { router_id node_01 #id能夠不一樣 } vrrp_instance VI_1 { interface ens33 state MASTER # BACKUP for slave routers priority 101 # 100 for BACKUP virtual_router_id 51 garp_master_delay 1 authentication { auth_type PASS auth_pass password } track_interface { ens33 } virtual_ipaddress { 10.8.8.55/24 } }
#腳本若是須要用啓停命令,即便用/etc/init.d/keepalived start等方式。
$ service keepalived start #啓動keepalived
$ service keepalived stop #停用keepalived
$ service keepalived status #查看keepalived
$ service keepalived restart #重啓keepalived
[root@proxy01 ~]# ps -ef|grep keepalived | grep -v grep
[root@proxy01 ~]# /etc/init.d/keepalived start
Starting keepalived (via systemctl): [ OK ]
[root@proxy01 ~]# ps -ef|grep keepalived | grep -v grep
root 7558 1 0 16:13 ? 00:00:00 /usr/local/keepalived/sbin/keepalived -D
root 7559 7558 0 16:13 ? 00:00:00 /usr/local/keepalived/sbin/keepalived -D
#查看keepalived進程,有3個或2個-D說明成功
以一樣的方法在proxy02服務器上安裝nginx跟keepalived。
keepalived的backup配置文件相對於master修改以下:
state BACKUP
priority 50
#使用ip add查看虛擬ip是否啓用
[root@proxy01 ~]# ip add sh ens33 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:e7:6a:1a brd ff:ff:ff:ff:ff:ff inet 10.8.8.90/24 brd 10.8.8.255 scope global ens33 valid_lft forever preferred_lft forever inet 10.8.8.55/24 scope global secondary ens33 valid_lft forever preferred_lft forever inet6 fe80::32e6:c2a4:3a3f:904a/64 scope link valid_lft forever preferred_lft forever inet6 fe80::b86b:7472:ada:f610/64 scope link tentative dadfailed valid_lft forever preferred_lft forever inet6 fe80::16e3:b3e1:8fd3:81e4/64 scope link tentative dadfailed valid_lft forever preferred_lft forever
將4臺機子,所有配置完成。測試便可。
任意停用一臺服務器,業務正常運轉。可是。
假如在keepalived主服務器上停掉nginx,可是不停掉keepalived服務。此時,nginx服務不正常,但keepalived是正常的。
因此,會出現這樣狀況,致使業務沒法正常訪問。
因此要在proxy01上,寫個腳本,內容爲監控自身nginx和keepalived服務,若是nginx或者keepalived不正常,
即要自動作出相應的調整,讓業務可以自動正常運轉。
我寫了個python腳本,內容以下,通過測試是能夠在定時任務上自動執行的。
# keepalived的python腳本
#!/usr/bin/env python # -*- conding:utf-8 -*- import os v = os.system("curl 127.0.0.1") if v != 0: nginx = os.system("/usr/local/tengine/sbin/nginx") if nginx != 0: os.system("/etc/init.d/keepalived stop") else: k = os.system("netstat -anp|grep keepalived | grep 112") if k != 0: k2 = os.system("/etc/init.d/keepalived start") if k2 != 0: os.system("/etc/init.d/keepalived stop") else: s = os.system("netstat -lntp|grep 80") if s == 0: k3 = os.system("netstat -anp|grep keepalived | grep 112") if k3 != 0: k4 = os.system("/etc/init.d/keepalived start") if k4 != 0: os.system("/etc/init.d/keepalived stop")
#!/usr/bin/env python # -*- conding:utf-8 -*- import os v = os.system("curl 127.0.0.1") # 測試本機nginx服務是否正常 if v != 0: # 若是nginx不正常 nginx = os.system("/usr/local/tengine/sbin/nginx") # 啓動nginx if nginx != 0: # 若是啓動nginx失敗 os.system("/etc/init.d/keepalived stop") # 停用keepalived服務,ip自動跳轉。 else: # 若是啓動nginx成功 k = os.system("netstat -anp|grep keepalived | grep 112") # 檢查keepalived是否正常 if k != 0: # 若是keepalived不正常 k2 = os.system("/etc/init.d/keepalived start") # 啓動keepalived if k2 != 0: # 若是啓動keepalived失敗 os.system("/etc/init.d/keepalived stop") # 停用keepalived,ip自動跳轉 else: # 若是nginx正常 s = os.system("netstat -lntp|grep 80") # 查看80端口 if s == 0: # 若是80端口正常 k3 = os.system("netstat -anp|grep keepalived | grep 112") # 檢查keepalived服務是否正常 if k3 != 0: # 若是keepalived服務不正常 k4 = os.system("/etc/init.d/keepalived start") # 啓動keepalived if k4 != 0: # 若是啓動keepalived失敗 os.system("/etc/init.d/keepalived stop") # 停用keepalived
通過測試定時任務是能夠執行的。