[2022版] 最細(xì)致的HAProxy + KeepAlived + Docker + Tomcat搭建高可用集群教程

最近在工作中遇到需要搭建一個高可用集群的需求,查看了網(wǎng)上的一些資料,發(fā)現(xiàn)都相對比較陳舊秧均,步驟也不是非常的詳細(xì)。于是就寫了這篇搭建教程号涯,方便有同樣需求的同學(xué)參考

下載并安裝VirtualBox

https://www.virtualbox.org/wiki/Downloads

本次搭建教程使用的版本是Virtual Box 6.1版本

下載CentOS鏡像

https://mirrors.aliyun.com/centos/7/isos/x86_64/

本次搭建教程使用的版本是其中的CentOS-7-x86_64-DVD-2009.iso

配置安裝第一臺CentOS虛擬機(jī) (下文中用Node01表示)
  1. 打開VirtualBox應(yīng)用程序目胡,點(diǎn)擊下方圖中的New來創(chuàng)建一臺新的虛擬機(jī)Node01


    p1.png
  2. 隨后參考下圖進(jìn)行虛擬機(jī)的類型,版本選擇


    p2.png
  3. 之后可以一路維持默認(rèn)選項(xiàng)點(diǎn)擊下一步链快,在完成創(chuàng)建后誉己,在左側(cè)列表里可以看到新的虛擬機(jī)。雙擊該虛擬機(jī)之后域蜗,會讓你選擇用于啟動的ISO文件巨双,此時就可以選中我們之前下載的CentOS 7的ISO文件進(jìn)行系統(tǒng)安裝


    p3.png
  4. 整個安裝過程也非常的便捷,基本上和安裝Windows系統(tǒng)差不多


    p5.png
  5. 注意在安裝時候可以去設(shè)置root用戶的密碼霉祸,便于后續(xù)登陸系統(tǒng)


    p6.png
  6. 安裝結(jié)束后筑累,按照提示重啟CentOS系統(tǒng)


    p7.png
配置網(wǎng)絡(luò)接口
  1. 安裝完系統(tǒng)之后,如果嘗試執(zhí)行ping www.baidu.com丝蹭,會提示如下錯誤

    p8.png

  2. 這是因?yàn)榇藭r網(wǎng)絡(luò)還沒有被正確的配置慢宗,通過執(zhí)行sudo nmcli d可以發(fā)現(xiàn)網(wǎng)絡(luò)接口確實(shí)處于未連接狀態(tài)

    p10.png

  3. 執(zhí)行sudo nmtui進(jìn)入如下圖的配置界面, 隨后依次選擇

Edit a connection

enp0s3

其中有部分操作需要用空格鍵進(jìn)行選擇, 可以自己嘗試下

p11.png

  1. 將下圖中的Automatically connect勾選上,選擇OK

    p12.png

  2. 配置完之后奔穿,輸入reboot重啟系統(tǒng)镜沽,再次執(zhí)行sudo nmcli d以及ping www.baidu.com,可以發(fā)現(xiàn)網(wǎng)絡(luò)已經(jīng)連通了

    image-20220821214531474.png

配置阿里云的yum源

依次執(zhí)行下列命令并等待至完成

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
安裝Docker

可以參考官方文檔贱田,或者也可以直接按照下面的步驟進(jìn)行安裝

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl start docker
啟動微服務(wù)容器

為了節(jié)省本教程的復(fù)雜度缅茉,我已經(jīng)提前準(zhǔn)備好了兩個微服務(wù)鏡像方便測試,分別命名為

chuckge/spring-jib-app
chuckge/spring-jib-app-v2

兩個服務(wù)都提供了一個路徑為\helloworld的Endpoint男摧,差別在于spring-jib-app-v2在調(diào)用后會返回"V2"字樣便于區(qū)分

執(zhí)行docker run -dp 8080:8080 chuckge/spring-jib-app后等待容器啟動完成

此時宾舅,可以嘗試在虛擬機(jī)中執(zhí)行curl localhost:8080/helloworld, 會發(fā)現(xiàn)返回了一個IP地址的字符串

創(chuàng)建第二臺虛擬機(jī) (下文中用Node02表示)

按照上面的步驟創(chuàng)建第二臺虛擬機(jī),唯一不同之處是在這臺虛擬機(jī)上運(yùn)行以spring-jib-app-v2為鏡像的容器彩倚,用于和第一臺虛擬機(jī)Node01后續(xù)進(jìn)行區(qū)分,在完成上述的步驟之后扶平,在Node02上執(zhí)行下面的命令運(yùn)行該V2版本的微服務(wù)容器

docker run -dp 8080:8080 chuckge/spring-jib-app-v2

下文中如果不特殊說明帆离,所有的步驟都需要再兩個Node上均操作

虛擬機(jī)的兩種網(wǎng)絡(luò)鏈接模式

在VirtualBox中選中某臺虛擬機(jī),點(diǎn)擊Settings -> Network之后结澄,可以進(jìn)行網(wǎng)絡(luò)適配器的配置

在本次實(shí)驗(yàn)中哥谷,會用到其中兩種 (切換模式后岸夯,記得通過reboot重啟虛擬機(jī))

image-20220823133406623.png

  1. NAT

    在這個模式下,虛擬機(jī)可以直接連接Internet们妥,在使用yum等進(jìn)行安裝的時候需要切換到此模式

  2. Host-only Adapter

    • 在這個模式下猜扮,宿主機(jī)以及虛擬機(jī)會處于同一網(wǎng)段,并且互相之間可以Ping通监婶,在全部安裝配置完畢之后可以切換到此模式再宿主機(jī)上進(jìn)行訪問測試

    • 下文中在haproxy.cfg配置文件中的兩臺虛擬機(jī)IP(192.168.56.101和192.168.56.102)旅赢,需要在這個模式下,通過ip addr命令獲取后按照實(shí)際情況進(jìn)行配置

      image-20220823134126057.png

安裝HAProxy
  1. 關(guān)閉SELINUX

    編輯/etc/selinux/config文件惑惶,將SELINUX=enforcing修改成SELINUX=disabled

  2. 關(guān)閉IP Tables (防火墻)

    systemctl stop firewalld.service
    systemctl disable firewalld.service
    
  3. 通過yum安裝haproxy

    yum -y install haproxy
    
  4. 創(chuàng)建haproxy的日志文件

    mkdir /var/log/haproxy
    chmod a+w /var/log/haproxy
    
  5. 開啟rsyslog記錄haproxy日志功能

    vi /etc/rsyslog.conf
    將下面兩行的注釋去掉(#號)
    $ModLoad imudp
    $UDPServerRun 514
    在文件的末尾添加
    local3.*                       /var/log/haproxy/haproxy.log
    
    vi /etc/sysconfig/rsyslog
    修改 SYSLOGD_OPTIONS="-r -m 0 -c 2"
    
    vi /etc/haproxy/haproxy.cfg
    將`log 127.0.0.1 local2`改成`log 127.0.0.1 local3 info`
    
    重啟日志服務(wù)
    systemctl restart rsyslog.service
    
  6. 修改haproxy配置

    vi /etc/haproxy/haproxy.cfg
    
    #---------------------------------------------------------------------
    # Example configuration for a possible web application.  See the
    # full configuration options online.
    #
    #   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
    #
    #---------------------------------------------------------------------
    
    #---------------------------------------------------------------------
    # Global settings
    #---------------------------------------------------------------------
    global
        # to have these messages end up in /var/log/haproxy.log you will
        # need to:
        #
        # 1) configure syslog to accept network log events.  This is done
        #    by adding the '-r' option to the SYSLOGD_OPTIONS in
        #    /etc/sysconfig/syslog
        #
        # 2) configure local2 events to go to the /var/log/haproxy.log
        #   file. A line like the following can be added to
        #   /etc/sysconfig/syslog
        #
        #    local2.*                       /var/log/haproxy.log
        #
        log         127.0.0.1 local3 info
    
        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     4000
        user        haproxy
        group       haproxy
        daemon
    
        # turn on stats unix socket
        stats socket /var/lib/haproxy/stats
    
    #---------------------------------------------------------------------
    # common defaults that all the 'listen' and 'backend' sections will
    # use if not designated in their block
    #---------------------------------------------------------------------
    defaults
        mode                    http
        log                     global
        option                  httplog
        option                  dontlognull
        option http-server-close
        option forwardfor       except 127.0.0.0/8
        option                  redispatch
        retries                 3
        timeout http-request    10s
        timeout queue           1m
        timeout connect         10s
        timeout client          1m
        timeout server          1m
        timeout http-keep-alive 10s
        timeout check           10s
        maxconn                 3000
    
    #---------------------------------------------------------------------
    # main frontend which proxys to the backends
    #---------------------------------------------------------------------
    frontend  main *:80
        acl url_static       path_beg       -i /static /images /javascript /stylesheets
        acl url_static       path_end       -i .jpg .gif .png .css .js
    
        use_backend static          if url_static
        default_backend             app
    
    #---------------------------------------------------------------------
    # static backend for serving up images, stylesheets and such
    #---------------------------------------------------------------------
    backend static
        balance     roundrobin
        server      static1 192.168.56.101:8080 check
        server      static2 192.168.56.102:8080 check
    
    #---------------------------------------------------------------------
    # round robin balancing between the various backends
    #---------------------------------------------------------------------
    backend app
        balance     roundrobin
        server  app1 192.168.56.101:8080 check
        server  app2 192.168.56.102:8080 check
    
    listen stats
        bind :10086
        stats uri /admin?stats
        stats auth admin:admin
        stats admin if TRUE
        
    
安裝keepalived
  1. 通過yum進(jìn)行安裝

    yum -y install keepalived

  2. 配置keepalived (Node 1)

    vi /etc/keepalived/keepalived.conf
    
    global_defs {
       notification_email {
         root@localhost
       }
       notification_email_from keepalived@localhost
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node01
    }
    
    vrrp_instance VI_1 {
        state MASTER
        interface enp0s3
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
        }
        virtual_ipaddress {
            192.168.56.105
        }
    }
    
  3. 配置keepalived (Node 2)

    vi /etc/keepalived/keepalived.conf
    
    global_defs {
       notification_email {
         root@localhost
       }
       notification_email_from keepalived@localhost
       smtp_server 127.0.0.1
       smtp_connect_timeout 30
       router_id node02
    }s
    
    vrrp_instance VI_1 {
        state BACKUP
        interface enp0s3
        virtual_router_id 51
        priority 98
        advert_int 1
        authentication {
            auth_type PASS
        }
        virtual_ipaddress {
            192.168.56.105
        }
    }
    
啟動Docker, Docker container, HAProxy, Keepalived (Node01)
systemctl start docker
docker run -dp 8080:8080 chuckge/spring-jib-app
systemctl start haproxy
systemctl status haproxy #查看haproxy啟動狀態(tài)煮盼,如果有綠色active,說明成功啟動
systemctl start keepalived
systemctl status keepalived #查看keepalived啟動狀態(tài)带污,如果有綠色active僵控,說明成功啟動
啟動Docker, Docker container, HAProxy, Keepalived (Node02)
systemctl start docker
docker run -dp 8080:8080 chuckge/spring-jib-app-v2 #注意此處和上面Node01的不同
systemctl start haproxy
systemctl status haproxy #查看haproxy啟動狀態(tài),如果有綠色active鱼冀,說明成功啟動
systemctl start keepalived
systemctl status keepalived #查看keepalived啟動狀態(tài)报破,如果有綠色active,說明成功啟動

下面開始進(jìn)行測試

首先查看當(dāng)前VIP(192.168.56.105)在哪臺虛擬機(jī)上

由于Node01的priority數(shù)值較高千绪,所以會被選作Master充易,在Node01上執(zhí)行ip addr可以看到持有該VIP

image-20220823153642932.png

通過VIP訪問HAProxy的控制臺頁面

http://192.168.56.105:10086/admin?stats

用戶名: admin

密碼: admin

在這個頁面中,可以清晰的看到HAProxy的一些實(shí)時統(tǒng)計(jì)數(shù)據(jù)


image-20220823153939241.png
通過VIP訪問后端服務(wù)

注意此處使用的是192.168.56.105進(jìn)行訪問翘紊,而并不是真實(shí)的IP(101和102)蔽氨,這樣才能實(shí)現(xiàn)和具體實(shí)例IP解耦,實(shí)現(xiàn)高可用

http://192.168.56.105/helloworld

多次刷新后帆疟,可以看到請求被均勻分發(fā)到兩個后端服務(wù)上


image-20220823154120828.png

image-20220823154157960.png
將Node01上的HAProxy和Keepalived停止鹉究,查看VIP是否能自動漂移到Node02

在Node01上執(zhí)行

systemctl stop haproxy
systemctl stop keepalived

在Node02上執(zhí)行ip addr,可以發(fā)現(xiàn)VIP已經(jīng)自動漂移到Node02上

image-20220823155001825.png

再次通過VIP訪問后端服務(wù)驗(yàn)證

http://192.168.56.105/helloworld

多次訪問會發(fā)現(xiàn)踪宠,請求仍然能被正常處理自赔,并且均勻的分發(fā)到兩個后端服務(wù)上,不過此時工作的已經(jīng)Node02上的HAProxy了

TIPS:
  1. 如果遇到啟動haproxy報錯 HAProxy cannot bind socket [0.0.0.0:10086]

    在虛擬機(jī)命令行執(zhí)行setsebool -P haproxy_connect_any=1

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末柳琢,一起剝皮案震驚了整個濱河市绍妨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柬脸,老刑警劉巖他去,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異倒堕,居然都是意外死亡灾测,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門垦巴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媳搪,“玉大人铭段,你說我怎么就攤上這事∏乇” “怎么了序愚?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長等限。 經(jīng)常有香客問我爸吮,道長,這世上最難降的妖魔是什么精刷? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任拗胜,我火速辦了婚禮,結(jié)果婚禮上怒允,老公的妹妹穿的比我還像新娘埂软。我一直安慰自己,他們只是感情好纫事,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布勘畔。 她就那樣靜靜地躺著,像睡著了一般丽惶。 火紅的嫁衣襯著肌膚如雪炫七。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天钾唬,我揣著相機(jī)與錄音万哪,去河邊找鬼。 笑死抡秆,一個胖子當(dāng)著我的面吹牛奕巍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播儒士,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼的止,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了着撩?” 一聲冷哼從身側(cè)響起诅福,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拖叙,沒想到半個月后氓润,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡薯鳍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年旺芽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡采章,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壶辜,到底是詐尸還是另有隱情悯舟,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布砸民,位于F島的核電站抵怎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏岭参。R本人自食惡果不足惜反惕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望演侯。 院中可真熱鬧姿染,春花似錦、人聲如沸秒际。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娄徊。三九已至闽颇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寄锐,已是汗流浹背兵多。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留橄仆,地道東北人剩膘。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像沿癞,于是被迫代替她去往敵國和親援雇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容