1. 程式人生 > >saltstack實現一鍵部署keepalived+haproxy的高可用負載均衡叢集

saltstack實現一鍵部署keepalived+haproxy的高可用負載均衡叢集

配置環境

主機名 ip 服務
server1 172.25.1.1 salt-master、salt-minion haproxy、keepalived
server2 172.25.1.2 salt-minion , httpd
server3 172.25.1.3 salt-minion , nginx
server4 172.25.1.4 salt-minion , haproxy、keepalived

keepalived的安裝部署

建立salt指令碼存放目錄

[[email protected] salt]# cd /srv/salt
[[email protected] salt]# mkdir keepalived
[[email protected] keepalived]# mkdir file   #配置檔案和軟體包存放目錄

編輯安裝指令碼

[[email protected] keepalived]# vim make.sls    #編輯安裝指令碼 
include:
  - haproxy.yum    #使用了haproxy中的yum源安裝指令碼

/mnt/libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm:    #依賴性,映象中沒有,因此需要手動裝
  file.managed:
    - source: salt://keepalived/file/libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm
keepalived-install:
  pkg.installed:   #依賴性
    - pkgs:
      - libnl-devel
      - openssl-devel
      - iptables-devel
      - gcc
  file.managed:    #keepalived的安裝包
    - name: /mnt/keepalived-2.0.6.tar.gz
    - source: salt://keepalived/file/keepalived-2.0.6.tar.gz
  cmd.run:   #需要執行的shell命令
    - name: cd /mnt && yum install -y libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm && tar zxf keepalived-2.0.6.tar.gz && cd keepalived-2.0.6 && ./configure --prefix=/usr/local/keepalived --with-init=SYSV && make && make install 
    - create: /usr/local/keepalived    #如果此目錄存在則不進行安裝

/etc/keepalived:    #修改檔案許可權
  file.directory:
    - mode: 755

/etc/sysconfig/keepalived:    #建立檔案軟連結,將target中的目錄連結到此位置
  file.symlink:
    - target: /usr/local/keepalived/etc/sysconfig/keepalived

/sbin/keepalived:
  file.symlink:
    - target: /usr/local/keepalived/sbin/keepalived

keepalived服務的啟動指令碼

[[email protected] keepalived]# vim service.sls 
include:
  - keepalived.make    #包含了keepalived的安裝指令碼,實現一鍵部署
/etc/keepalived/keepalived.conf:
  file.managed:    #檔案管理
    - source: salt://keepalived/file/keepalived.conf
    - template: jinja   #使用了jinja模組
    - context:
      STATE: {{ pillar['state'] }}    #使用了pillar定義變數
      PRIORITY: {{ pillar['priority'] }}
/opt/check_haproxy.sh:
  file.managed:
    - source: salt://keepalived/file/check_haproxy.sh
    - mode: 755
keepalived-service:
  file.managed:
    - name: /etc/init.d/keepalived
    - source: salt://keepalived/file/keepalived
    - mode: 755

  service.running:
    - enable: keepalived
    - name: keepalived
    - reload: True
    - watch: 
      - file: /etc/keepalived/keepalived.conf

keepalived指令碼中需要的file

[[email protected] file]# cd /srv/salt/keepalived/file
[[email protected] file]# ls
check_haproxy.sh         keepalived.conf
keepalived               libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm
keepalived-2.0.6.tar.gz

keepalived中對haproxy的健康檢查指令碼

[[email protected] file]# cat check_haproxy.sh  
#!bin/bash

/etc/init.d/haproxy status &> /dev/null || /etc/init.d/haproxy restart &> /dev/null
# 如果haproxy的狀態是開啟的,不做任何事情,如果haproxy的狀態是關閉的,那麼重新開啟haproxy
if [ $? -ne 0 ];then
/etc/init.d/keepalived stop &> /dev/null
fi
# 如果重新開啟haproxy的操作返回值非0,那麼說明haproxy出現故障,此時由指令碼關閉keepalived,將提供服務的節點轉移

keepalived的配置檔案

[[email protected] file]# cat keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
	[email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script check_haproxy {   
        script "/opt/check_haproxy.sh"
        interval 2 
        weight 2
}

vrrp_instance VI_1 {
    state {{ STATE }}    #pillar值
    interface eth0
    virtual_router_id 51 
    priority {{ PRIORITY }}   #pillar值
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
	172.25.1.100
    }

   track_script {   #需要寫在vip的後面
        check_haproxy
    }
}


}

keepalived的啟動指令碼

[[email protected] file]# cat 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

keepalived中需要用到的pillar定義

[[email protected] web]# vim /srv/pillar/web/install.sls
{% if grains['fqdn'] == 'server1' %}
state: MASTER
priority: 100
{% elif grains['fqdn'] == 'server4' %}
state: BACKUP
priority: 50
{% endif %}

[[email protected] pillar]# cd /srv/pillar
[[email protected] pillar]# vim top.sls 
base:
  '*':
    - web.install

全域性推送指令碼

[[email protected] salt]# vim /srv/salt/top.sls 
base:
  'server1':
    - haproxy.service
    - keepalived.service
  'server4':
    - haproxy.service
    - keepalived.service
  'server2':
    - apache.install
  'server3':
    - nginx.service

測試

訪問vip,實現了nginx和apache輪詢訪問

[[email protected] ~]# curl 172.25.1.100
this is nginx!!!!
[[email protected] ~]# curl 172.25.1.100
this is apache
[[email protected] ~]# curl 172.25.1.100
this is nginx!!!!
[[email protected] ~]# curl 172.25.1.100
this is apache
[[email protected] ~]# curl 172.25.1.100
this is nginx!!!!

vip新增到了master(server1)中

[[email protected] salt]# ip add show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:37:6b:32 brd ff:ff:ff:ff:ff:ff
    inet 172.25.1.1/24 brd 172.25.1.255 scope global eth0
    inet 172.25.1.100/32 scope global eth0
    inet6 fe80::5054:ff:fe37:6b32/64 scope link 
       valid_lft forever preferred_lft forever

keepalived中對haproxy健康檢查指令碼

[[email protected] ~]# /etc/init.d/haproxy stop
Shutting down haproxy:                                     [確定]
[[email protected] ~]# /etc/init.d/haproxy status   #發現停掉haproxy以後,服務自動啟動
haproxy (pid  13370) 正在執行...

使haproxy無法自動啟動

[[email protected] init.d]# mv haproxy /mnt
[[email protected] mnt]# ./haproxy stop
Shutting down haproxy:                                     [確定]
[[email protected] mnt]# ./haproxy status
haproxy 已停
[[email protected] mnt]# ip add   #vip轉移
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:37:6b:32 brd ff:ff:ff:ff:ff:ff
    inet 172.25.1.1/24 brd 172.25.1.255 scope global eth0
    inet6 fe80::5054:ff:fe37:6b32/64 scope link 
       valid_lft forever preferred_lft forever


##vip轉移到server4中
[[email protected] rpmbuild]# ip add show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:59:6c:d8 brd ff:ff:ff:ff:ff:ff
    inet 172.25.1.4/24 brd 172.25.1.255 scope global eth0
    inet 172.25.1.100/32 scope global eth0
    inet6 fe80::5054:ff:fe59:6cd8/64 scope link 
       valid_lft forever preferred_lft forever