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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...