系統環境: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 ...
系統環境: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主主容易產生問題,不太推薦,個人看法。
如有轉載請標明出處