centos7搭建keepalived高可用nginx負載均衡集羣

  昨天在公司內部分享了高可用負載均衡,現將環境搭建過程記錄一下。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

1、web0一、web02環境搭建

  因爲本文主講keepalived高可用,環境搭建過程忽略。web

  web0一、web02各自搭建一個簡單的web,域名均爲:www.test.comcentos

       分別測試單機訪問是否成功。服務器

2、配置nginx負載均衡

  在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; } }

3、安裝配置keepalived

  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

 

  一、安裝keepalived

[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       #若是報錯,就安裝依賴。

  二、配置keepalived爲系統服務

  #配置後便可使用/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
/etc/init.d/keepalived文件內容

  三、編輯keepalived配置文件

[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
    }
}

  四、啓動keepalived

#腳本若是須要用啓停命令,即便用/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說明成功

  五、haproxy_backup機子安裝keepalived

  以一樣的方法在proxy02服務器上安裝nginx跟keepalived。
  keepalived的backup配置文件相對於master修改以下:
  state BACKUP
  priority 50 

  六、查看虛擬ip在哪臺機子

  #使用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腳本

  將4臺機子,所有配置完成。測試便可。

  任意停用一臺服務器,業務正常運轉。可是。

  假如在keepalived主服務器上停掉nginx,可是不停掉keepalived服務。此時,nginx服務不正常,但keepalived是正常的。

因此,會出現這樣狀況,致使業務沒法正常訪問。

  因此要在proxy01上,寫個腳本,內容爲監控自身nginx和keepalived服務,若是nginx或者keepalived不正常,

即要自動作出相應的調整,讓業務可以自動正常運轉。

  我寫了個python腳本,內容以下,通過測試是能夠在定時任務上自動執行的。

  #proxy01監控自身nginx和keepalived腳本:

# 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")
keepalived的python腳本
#!/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

通過測試定時任務是能夠執行的。

相關文章
相關標籤/搜索