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

来源:https://www.cnblogs.com/v-fan/archive/2019/11/17/11878151.html
-Advertisement-
Play Games

系統環境: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主主容易產生問題,不太推薦,個人看法。

 

如有轉載請標明出處

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前部署過BookStore項目,但是換了新電腦也想好好學習下這個示例項目,於是在新電腦上重新拉了Git上的ABP項目代碼,一編譯生成BookStore項目就報錯,可以參考 "abp示例項目BookStore編譯報錯" 。解決了這個問題之後又報錯了,截圖如下: 我一開始以為是我的資料庫鏈接語句配置錯 ...
  • Windows10開始微軟在系統顏色中添加了深色,對於UWP來說很輕鬆就能獲取到系統當前的顏色和主題色,而對於Win32應用就沒有那麼直觀了。 ...
  • 最近做了一個小網站,用到了一個使用sql server 2005的.net cms系統,但是現在我所買虛擬主機的服務商,不給虛擬主機提供sql server服務了,那就轉資料庫吧,轉啥好呢,思來想去,access?剛入行時候用了很久,簡單夠用,不過實在提不起興趣了,sqlite?嗯...還沒用過,只 ...
  • 測試結果如下圖: 測試結果整理後: 結論: 1、這幾個工具中,protobuf-net序列化和反序列化效率是最快的 2、BinaryFormatter和Newtonsoft.Json反序列化慢的比較多 3、Newtonsoft.Json序列化後的文件體積比較大 4、Newtonsoft.Json在序 ...
  • 接上一篇《DataGridView使用自定義控制項實現簡單分頁功能》,本篇使用BindingNavigator來實現簡單分頁功能。其實也只是借用了一個BindingNavigator空殼, 實現原理和代碼與上一篇幾乎一樣,實現方法如下: 1、新建一個WinForm程式,命名為BindingNaviga ...
  • 一、如何理解FIleStream 通過前3章的學些,相信大家對於Stream已經有一定的瞭解,但是又如何去理解FileStream呢?請看下圖: 我們磁碟中的任何文件都是通過二進位數組組成,最為直觀的就是記事本了,當我們新建一個記事本時,它的大小時0KB,我們每次輸入一個數字或字母時,文件便會自動增 ...
  • 一 部署flannel 1.1 安裝flannel kubernetes 要求集群內各節點(包括 master 節點)能通過 Pod 網段互聯互通。flannel 使用 vxlan 技術為各節點創建一個可以互通的 Pod 網路,使用的埠為 UDP 8472。 flanneld 第一次啟動時,從 e ...
  • 需通過SSH或VNC遠程登錄 1)SSH ①把讀卡器插入電腦,點開樹莓派所在的boot盤,新建wpa_supplicant.conf文件 ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev network={ ssid=WiFi賬號1" p ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...