1. 程式人生 > >Ubuntu編譯安裝HAprox+Keepalived+MySQL負載高可用架構(結合Docker容器配置)

Ubuntu編譯安裝HAprox+Keepalived+MySQL負載高可用架構(結合Docker容器配置)

系統環境:Ubuntu16.04(Docker容器)

架構環境:

Keepalived/HAproxy MASTER: 172.17.0.4

Keepalived/HAproxy BACKUP: 172.17.0.6

MySQL MASTER: 172.17.0.2

MySQL SLAVE: 172.17.0.3

HAproxy版本:haproxy-2.0.8.tar.gz

Keepalived版本:keepalived-2.0.19.tar.gz

 

一、安裝HAproxy(MASTER/BACKUP兩臺都要裝)

1、前往官網https://www.haproxy.org/ 下載HAproxy

解壓,進入haproxy-2.0.8目錄

vim INSTALL;檢視安裝說明

 

 

2、編譯安裝HAproxy

(1)編譯

報錯1:bash: make: command not found

 

我直接用docker容易,make命令沒安裝,安裝一下:

apt-get -y install make

然後執行:

make -j 2 TARGET=generic USE_GZIP=1

 

報錯2:/bin/sh: 1: gcc: not found

 

未安裝gcc,安裝gcc:

apt-get -y install gcc

然後再執行:

make -j 2 TARGET=generic USE_GZIP=1

 

暫時未報錯:

 

 

 

 

(2)安裝

直接執行:

make install PREFIX=/usr/local/HAproxy2.0.8

 

 

(3)複製命令至/usr/local/sbin/下

 

 

3、新增服務啟動指令碼檔案

 vim /etc/init.d/haproxy

#!/bin/bash
#
# chkconfig: 2345 85 15
# descrition: haproxy loadbalancer
 
DAEMON=haproxy
PROG_DIR=/usr/local/HAproxy2.0.8
RETVAL=0
 
success() {                       #跟朋友的探討,使用shell本身來實現;當然也可以使用for的遍歷迴圈, 
                                    總之方法有很多種
for ((i=0;i<=5;i++))
do
sleep 0.2
echo -n "."
done
}
 
start ()
{
    PROG_STAT=$(netstat -tlnp | grep ${DAEMON})
    if [ -z "$PROG_STAT" ]; then
  $PROG_DIR/sbin/$DAEMON -f $PROG_DIR/conf/${DAEMON}.cfg
        echo -ne "Starting ${DAEMON}......\t\t\t"  && success
  echo -e "\e[32m[OK]\e[0m" 
    else
        echo "$DAEMON is already running"
RETVAL=65
    fi
}
 
stop ()
{
    PROG_STAT=$(netstat -tlnp | grep ${DAEMON})
    if [ -n "$PROG_STAT" ]; then
        echo -ne "stopping ${DAEMON}......\t\t\t"  && success
        PROG_PID=$(cat $PROG_DIR/run/${DAEMON}.pid)
        kill $PROG_PID
        echo -e "\e[32m[OK]\e[0m"
    else
        echo "$DAEMON is already stopped"
RETVAL=66
    fi
}
 
restart()
{
    echo -ne "restarting ${DAEMON}......\t\t\t"   && success
    PROG_PID=$(cat $PROG_DIR/run/${DAEMON}.pid)
    $PROG_DIR/sbin/$DAEMON -f $PROG_DIR/conf/${DAEMON}.cfg -st $PROG_PID
    echo -e "\e[32m[OK]\e[0m"
}
 
status ()
{
    PROG_STAT=$(netstat -tlnp | grep ${DAEMON})
    if [ -z "$PROG_STAT" ]; then
        echo "${DAEMON} stopped"
    else
        echo "${DAEMON} running"
    fi
}
 
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    status)
        status
        ;;
    *)
        echo "Usage /etc/init.d/$DAEMON {start | stop | restart | status}"
RETVAL=67
esac
exit $RETVAL

賦予執行許可權:

chmod +x /etc/init.d/haproxy

 

4、新增haproxy.conf配置檔案

先建立haproxy使用者與組:

 

 

再建立配置檔案:

mkdir -p /etc/haproxy

vim /etc/haproxy/haproxy.conf

global
    log 127.0.0.1 local2 info    # 設定日誌檔案輸出定向,info為日誌級別
    chroot /usr/local/HAproxy2.0.8    # 改變當前工作目錄
    pidfile /usr/local/HAproxy2.0.8/run/haproxy.pid    #PID檔案位置
    user haproxy    # 使用者與使用者組
    group haproxy
    daemon    # 守護程序啟動,運維方式為後臺工作
    maxconn 4000    # 最大連線數

# 作用於其後緊跟的listen塊,直至下一個defaults 塊,下一個default 將替換上一個塊作用於以後的listen
defaults
        log global      #啟動每個例項日誌記錄事件和流量
        mode http       #預設的模式mode {tcp|http|health},tcp是四層,http是七層,health只會返回ok
        retries 3       #對server的connection失敗後,重試的次數
        option redispatch       #啟用或禁止在連線故障情況下的會話重新分配
        maxconn 4096    #maxconn每個程序可用的最大連線數
        timeout http-request    10s
        timeout queue   1m
        timeout connect 10s
        timeout client 1m
        timeout server 1m
        timeout http-keep-alive 10s

frontend main
        bind 0.0.0.0:3307
        default_backend mysql

backend mysql
        balance leastconn    #演算法:最少連線數
        server mysql1 172.17.0.2:3306 check port 3306 maxconn 300
        server mysql2 172.17.0.3:3306 check port 3306 maxconn 300

複製一份配置檔案到該目錄:

cp -a /etc/haproxy/haproxy.conf /usr/local/HAproxy2.0.8/conf/haproxy.cfg

來啟動haproxyd服務

/etc/init.d/haproxy start

 

顯示服務啟動成功,埠也在

 

二、安裝Keepalived

1、前往官網下載所需版本https://www.keepalived.org/

同樣解壓,進入目錄,檢視安裝說明文件(此處忽略)

 

2、編譯扮裝

(1)檢查環境

./configure --prefix=/usr/local/keepalived-2.0.19

 

報錯1:Can not include OpenSSL headers files

 

沒有openssl,執行:

apt-get -y install openssl libssl-dev

注意:redhat和centos中是需要安裝openssl和openssl-devel的,在ubuntu中,openssl-devel被libssl-dev所代替,安裝libssl-dev即可

再重新檢查環境~

 

ok,每問題,警告忽視

 

(2)編譯、編譯安裝

make && make install

 

ok,編譯安裝完成

 

3、編輯配置檔案

cp /usr/local/keepalived-2.0.19/etc/keepalived/keepalived.conf /etc/keepalived/  #複製配置檔案

cp /usr/local/keepalived-2.0.19/sbin/keepalived /usr/local/sbin/

cp /usr/local/keepalived-2.0.19/etc/rc.d/init.d/keepalived /etc/init.d/  #複製服務啟動檔案

chmod +x /etc/init.d/keepalived

 

vim /etc/keepalived/keepalived.conf(MASTER機)

! Configuration File for keepalived

global_defs {
   router_id r1         #虛擬路由名稱,master和backup不能一致
}

vrrp_script chk_haproxy {       #定義檢查指令碼
        script "/etc/keepalived/chk_haproxy.sh"         #指令碼位置
        interval 3      #每3秒檢測一次
        fall 3          #失敗判斷3次
#       weight  -2      #失敗後權重-2
}

vrrp_instance VI_1 {
    state MASTER        #狀態,只有MASTER或BACKUP
    interface eth0      #網絡卡名稱,注意一定要是自己正在使用的網絡卡名稱
    virtual_router_id 53        #虛擬路由id,是虛擬路由的mac最後兩位
    priority 100                #優先順序
    advert_int 1                #通告間隔時間
    authentication {            #認證
        auth_type PASS
        auth_pass 1111
    }

    track_script {     #執行以上指令碼
        chk_haproxy
    }

    virtual_ipaddress {         #VIP地址,同網段
        172.17.0.253
    }
#   notify_master "/etc/init.d/haproxy start"   #當 當前節點成為master時,執行的任務
#   notify_backup "/etc/init.d/haproxy restart" #當 當前節點成為backup時,執行的任務
#   notify_fault  "/etc/init.d/haproxy stop"    #當 當前節點出現故障時,執行的任務    
}

ok,建立健康檢查指令碼檔案

vim /etc/keepalived/chk_haproxy.sh

#/bin/bash

STAT=`ps -C haproxy --no-header | wc -l`

if [[ ! "$STAT" -eq 1  ]];then
        /etc/init.d/keepalived stop
fi

如果程序未在,直接關閉keepalived

chmod +x chk_haproxy.sh #給個執行許可權

 

4、啟動keepalived服務

啟動檔案中某些檔案不存在,需要手動連結一下(ubuntu就是麻煩):

 

ln -s /lib/lsb/init-functions /etc/init.d/functions

mkdir /etc/rc.d

ln -s /etc/init.d /etc/rc.d/

cp /src/keepalived-2.0.19/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

 

然後安裝daemon命令:

apt-get -y install daemon

注意圖中,daemon -- keepalived 之前是 daemon keepalived,加了兩條橫槓

這個命令是有問題的,其中的-D本來是給keepalived用的,但這樣組合後被認為是daemon命令的引數。這會導致服務不能啟動。  如果不修改,會提示啟動失敗,但卻不輸出具體資訊。

 

注意,由於我是使用docker容器安裝的keepalived,所以我需要將此容器儲存成映象,然後再重新docker run,要加上--privileged這個引數,才能顯示keepalived的VIP(不是用容器安裝的可以忽略)

docker run -dit --privileged --name ha_keep  -p 3308:3307 ha_keep

 

下邊啟動服務:

/etc/init.d/keepalived start

 

執行:ip addr

 

 

5、配置BACKUP機

haproxy服務於MASTER機一致,keepalived服務主要修改主配置檔案

Keepalived/BACKUP機配置檔案:

! Configuration File for keepalived

global_defs {
   router_id r2         #虛擬路由名稱,master和backup不能一致
}

vrrp_script chk_haproxy {       #定義檢查指令碼
        script "/etc/keepalived.chk_haproxy.sh"         #指令碼位置
        interval 3      #每3秒檢測一次
        fall 3          #失敗判斷3次
#       weight  -2      #失敗後權重-2
}

vrrp_instance VI_1 {
    state BACKUP        #狀態,只有MASTER或BACKUP
    interface eth0      #網絡卡名稱,注意一定要是自己正在使用的網絡卡名稱
    virtual_router_id 53        #虛擬路由id,是虛擬路由的mac最後兩位
    priority 99                 #優先順序
    advert_int 1                #通告間隔時間
    authentication {            #認證
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_haproxy
    }

    virtual_ipaddress {         #VIP地址,同網段
        172.17.0.253
    }
#   notify_master "/etc/init.d/haproxy start"   #當 當前節點成為master時,執行的任務
#   notify_backup "/etc/init.d/haproxy restart" #當 當前節點成為backup時,執行的任務
#   notify_fault  "/etc/init.d/haproxy stop"    #當 當前節點出現故障時,執行的任務
} 

其他配置相同,然後啟動keepalived

 

6、測試將MASTER機的haproxy服務stop,會不會自動將keepalived服務關掉,將VIP轉移到BAKUP機

下圖所示VIP到BACKUP機就說明配置ok

 

 

7、負載均衡高可用配置完畢,不過此架構適用於mysql主主複製或有共享儲存伺服器,個人感覺mysql主主容易產生問題,不太推薦,個人看法。

 

如有轉載請標明出處

&n