最近在工作中遇到需要搭建一個高可用集群的需求,查看了網(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表示)
-
打開VirtualBox應(yīng)用程序目胡,點(diǎn)擊下方圖中的New來創(chuàng)建一臺新的虛擬機(jī)Node01
p1.png -
隨后參考下圖進(jìn)行虛擬機(jī)的類型,版本選擇
p2.png -
之后可以一路維持默認(rèn)選項(xiàng)點(diǎn)擊下一步链快,在完成創(chuàng)建后誉己,在左側(cè)列表里可以看到新的虛擬機(jī)。雙擊該虛擬機(jī)之后域蜗,會讓你選擇用于啟動的ISO文件巨双,此時就可以選中我們之前下載的CentOS 7的ISO文件進(jìn)行系統(tǒng)安裝
p3.png -
整個安裝過程也非常的便捷,基本上和安裝Windows系統(tǒng)差不多
p5.png -
注意在安裝時候可以去設(shè)置root用戶的密碼霉祸,便于后續(xù)登陸系統(tǒng)
p6.png -
安裝結(jié)束后筑累,按照提示重啟CentOS系統(tǒng)
p7.png
配置網(wǎng)絡(luò)接口
-
安裝完系統(tǒng)之后,如果嘗試執(zhí)行
ping www.baidu.com
丝蹭,會提示如下錯誤
p8.png -
這是因?yàn)榇藭r網(wǎng)絡(luò)還沒有被正確的配置慢宗,通過執(zhí)行
sudo nmcli d
可以發(fā)現(xiàn)網(wǎng)絡(luò)接口確實(shí)處于未連接狀態(tài)
p10.png 執(zhí)行
sudo nmtui
進(jìn)入如下圖的配置界面, 隨后依次選擇
Edit a connection
enp0s3
其中有部分操作需要用空格鍵進(jìn)行選擇, 可以自己嘗試下
-
將下圖中的
Automatically connect
勾選上,選擇OK
p12.png -
配置完之后奔穿,輸入
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ī))
-
NAT
在這個模式下,虛擬機(jī)可以直接連接Internet们妥,在使用yum等進(jìn)行安裝的時候需要切換到此模式
-
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
-
關(guān)閉SELINUX
編輯
/etc/selinux/config
文件惑惶,將SELINUX=enforcing
修改成SELINUX=disabled
-
關(guān)閉IP Tables (防火墻)
systemctl stop firewalld.service systemctl disable firewalld.service
-
通過yum安裝haproxy
yum -y install haproxy
-
創(chuàng)建haproxy的日志文件
mkdir /var/log/haproxy chmod a+w /var/log/haproxy
-
開啟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
-
修改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
-
通過yum進(jìn)行安裝
yum -y install keepalived
-
配置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 } }
-
配置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
通過VIP訪問HAProxy的控制臺頁面
http://192.168.56.105:10086/admin?stats
用戶名: admin
密碼: admin
在這個頁面中,可以清晰的看到HAProxy的一些實(shí)時統(tǒng)計(jì)數(shù)據(jù)
通過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ù)上
將Node01上的HAProxy和Keepalived停止鹉究,查看VIP是否能自動漂移到Node02
在Node01上執(zhí)行
systemctl stop haproxy
systemctl stop keepalived
在Node02上執(zhí)行ip addr
,可以發(fā)現(xiàn)VIP已經(jīng)自動漂移到Node02上
再次通過VIP訪問后端服務(wù)驗(yàn)證
http://192.168.56.105/helloworld
多次訪問會發(fā)現(xiàn)踪宠,請求仍然能被正常處理自赔,并且均勻的分發(fā)到兩個后端服務(wù)上,不過此時工作的已經(jīng)Node02上的HAProxy了
TIPS:
-
如果遇到啟動haproxy報錯 HAProxy cannot bind socket [0.0.0.0:10086]
在虛擬機(jī)命令行執(zhí)行
setsebool -P haproxy_connect_any=1