【Docker】基於例項專案的叢集部署(六)資料庫負載均衡 | Haproxy分發機制 | 監控負載狀況
從上一篇中我們知道,PXC叢集中任何一個節點都是可以讀寫的,但是,一旦PXC叢集上線後,我們不能把所有的資料庫請求全部傳送給一個資料庫節點,而是這個PXC叢集中的資料庫節點都應該參與到請求的處理。那麼負載均衡的工作,就是讓每個請求均勻的傳送給每個資料庫節點。
負載均衡的必要性
- 雖然搭建了叢集,但是不使用資料庫負載均衡,單節點處理所有請求,會造成負載高、效能差等問題。如圖:
- 使用Haproxy做負載均衡,請求被均勻分發給每個節點,單節點負載低,效能好。如下圖:
你可能會問:為什麼不用Nginx作負載均衡?
原因:每個中介軟體的選擇都是需要進行考量的,如下圖所示,Nginx對TCP/IP協議的支援的比較晚,而Haproxy是一個老牌的中介軟體產品,雖然不支援外掛,但其成熟性使得它很可靠。
下面,我們列出負載均衡中介軟體的對比圖:
安裝Haproxy映象
到Docker倉庫下載即可:docker pull haproxy
haproxy是這個映象的縮寫。
現在,我們下載好了haproxy映象,但是別急,我們先把Haproxy的配置檔案(haproxy.cfg)建立好,再去建立容器
:
建立Haproxy配置檔案
touch /home/soft/haproxy.cfg
首先現在宿主機上通過touch指令建立一個配置檔案haproxy.cfg
,然後通過 目錄對映技術把soft目錄對映到haproxy容器裡面。這樣,資Haproxy容器就可以找到這個配置檔案,然後啟動Haproxy的服務,自然而然就會有配置檔案。
關於詳細的配置檔案編寫,請參考:https://zhangge.net/5125.html
我們重點來看下資料庫負載均衡這塊:
解釋:
listen proxy-mysql
:定義一個配置,名稱叫proxy-mysql
bing 0.0.0.0:3306
開放的埠為3306,0.0.0.0表示任何IP地址都能訪問3306埠mode tcp
表示3306支援的協議是tcp,例如有應用程式向3306埠發起資料庫請求,它就會把請求轉發給具體的PXC資料庫例項。
同時,Haproxy自帶了轉發演算法:
因為PXC容器裡跑的資料庫硬體配置都是相同的,所以不需要使用權重演算法,只有當主機的硬體配置不同時,才需要採用權重演算法。如,主機硬體配置高的,可以把它的權重設定的高些,這樣它可以處理更多的資料庫請求;硬體配置低的資料庫節點,就分配低一些的權重。
balance roundrobin 這裡採用的是輪詢演算法
- 心跳檢測:
option mysql-check user haproxy
//給資料庫建立一個叫haproxy的賬戶,密碼為空,不分配任何許可權。Haproxy通過這個賬戶登入到Mysql上,傳送心跳檢測。這樣它就知道Mysql是在執行,還是當機。
連線到資料庫上 要傳送心跳檢測,那麼要提供一個Haproxy能登入的賬號user,後面跟的haproxy是你在PXC資料庫上建立的使用者,使用者名稱可以隨意取,如你叫abc,那麼就是 user abc。
再往下,配置要進行負載均衡的資料庫節點:
server MySQL_1(自定義名字) 172.18.0.2:3306(資料庫節點的地址,容器的埠是3306)check(傳送心跳檢測,可以具體設定每隔幾毫秒檢測一次,具體設定可以在百度上搜下) weight 1(權重。如果採用的是輪詢演算法,即使寫上權重,也不會生效)maxconn 2000 (最大連線數,這裡為2000)
接下來,如果你已經配置好了Haproxy配置檔案,我們就可以建立Haproxy容器:
這裡給出一份參考的配置檔案:
# 啟動容器時使用目錄對映技術使容器讀取該配置檔案
# $ touch /home/haproxy/haproxy.cfg
# haproxy.cfg
global
#工作目錄
chroot /usr/local/etc/haproxy
#日誌檔案,使用rsyslog服務中local5日誌裝置(/var/log/local5),等級info
log 127.0.0.1 local5 info
#守護程式執行
daemon
defaults
log global
mode http
#日誌格式
option httplog
#日誌中不記錄負載均衡的心跳檢測記錄
option dontlognull
#連線超時(毫秒)
timeout connect 5000
#客戶端超時(毫秒)
timeout client 50000
#伺服器超時(毫秒)
timeout server 50000
#監控介面
listen admin_stats
#監控介面的訪問的IP和埠
bind 0.0.0.0:8888
#訪問協議
mode http
#URI相對地址
stats uri /dbs
#統計報告格式
stats realm Global\ statistics
#登陸帳戶資訊
stats auth admin:abc123456
#資料庫負載均衡
listen proxy-mysql
#訪問的IP和埠
bind 0.0.0.0:3306
#網路協議
mode tcp
#負載均衡演算法(輪詢演算法)
#輪詢演算法:roundrobin
#權重演算法:static-rr
#最少連線演算法:leastconn
#請求源IP演算法:source
balance roundrobin
#日誌格式
option tcplog
#在MySQL中建立一個沒有許可權的haproxy使用者,密碼為空。Haproxy使用這個賬戶對MySQL資料庫心跳檢測
option mysql-check user haproxy
server MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000
server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000
server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
server MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
server MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
#使用keepalive檢測死鏈
option tcpka
建立Haproxy容器
docker run -it -d
-p 4001:888 -p 4002:3306
-v /home/soft/haproxy:/usr/local/etc/haproxy
--name haproxy --privileged --net=net1
haproxy
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
解釋:
- Haproxy提供了一個後臺監控的畫面(能檢視資料庫負載均衡的狀況),這個畫面在配置檔案裡定義的就是
8888埠
(可以在Haproxy的配置檔案中檢視) -v /home/soft/happroxy:/usr/local/etc/haproxy
目錄對映,把宿主機的haproxy對映到容器的/usr/local/etc/haproxy
目錄上。--name h1 --privileged --net=net1
給容器起一個名字h1,許可權,net1網段(跟資料庫例項在同一個網段上)- 啟動haproxy:
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
實際操作:
- 首先,在伺服器上新建一個soft/haproxy資料夾,並把haproxy.cfg配置檔案放到haproxy資料夾下:
- 然後使用xshell 進入到/home/soft/haproxy資料夾下:
- 然後,建立Haproxy容器,使用指令:
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.2(注:選擇一個適合的子網地址) haproxy
我是根據我這邊的網段進行設定的,如圖:
執行指令,執行後:
-
由於建立的容器在後臺執行,我必須要進入到後臺的容器,執行指令:
docker exec -it (注:有互動介面) h1(注:容器名字) bash(注:互動指令型別)
此時,我們就進入到剛才啟動的Haproxy容器裡面。 -
執行啟動Haproxy的指令:
haproxy -f(表示載入配置檔案) /usr/local/etc/haproxy/haproxy.cfg(配置檔案的路徑)
這樣,我們就啟動了haproxy。一會我們切換到瀏覽器上檢視監控畫面,我們就會知道資料庫的負載均衡是否已經執行起來了。
現在我們需要在Mysql資料庫上建立一個名叫 haproxy的賬號,因為Haproxy中介軟體要用這個賬號登入資料庫,然後傳送心跳檢測。
- 在瀏覽器中輸入:
宿主機地址:監控埠/dbs
,然後回車,如下圖我的宿主機IP是這樣的:(你要輸入你自己宿主機的地址
)
注:這些可以在haproxy.cfg配置檔案中定義:
- 輸入使用者名稱和密碼後,我們就可以進入到監控畫面:
- 從上圖監控畫面中我們可以看到,裡面有5個資料庫節點。我們把node1 關掉,再看看:
docker stop node1
- 最後我們在主機上新建一個Haproxy資料庫,並連線到CentOS中的宿主機IP,埠號也是宿主機對映的埠:
然後,我們可以在H1中對test表進行增刪操作,此時H1會把這條操作轉發
給D1至D5的其中一個節點(實際上H1是不儲存任何真實資料的,它只是進行分發操作
),這個節點就會進行更新,然後由於這個節點具備PXC同步機制,它會把這次操作同步給其他4個節點。
由此可見,這樣就完成了負載均衡的操作。
下一篇中,我們將探索負載均衡高可用方案
。
參考
相關文章
- haproxy(單機)+mysql叢集負載均衡MySql負載
- Haproxy+Keepalived高可用負載均衡叢集負載
- docker初體驗:docker部署nginx負載均衡叢集DockerNginx負載
- 負載均衡叢集負載
- docker+mysql叢集+讀寫分離+mycat管理+垂直分庫+負載均衡DockerMySql負載
- mysql負載均衡搭建(haproxy)MySql負載
- dubbo叢集和負載均衡負載
- Docker Swarm :gRPC 基於 DNS 的負載均衡DockerSwarmRPCDNS負載
- HaProxy 實現 MySQL 負載均衡MySql負載
- 負載均衡之--Nginx、LVS、HAProxy負載Nginx
- 基於滴滴雲部署 HAProxy 實現 7 層和 4 層負載均衡負載
- 3.RabbitMQ高階叢集搭建(Haproxy負載均衡、Keepalived高可用)MQ負載
- nginx部署基於http負載均衡器NginxHTTP負載
- orleans叢集及負載均衡實現負載
- 負載均衡服務之HAProxy基礎入門負載
- octavia的實現與分析(一)·openstack負載均衡的現狀與發展以及lvs,Nginx,Haproxy三種負載均衡機制的基本架構和對比負載Nginx架構
- 在docker中haproxy的安裝以及mysql的負載均衡配置DockerMySql負載
- Java程式設計解密-Dubbo負載均衡與叢集容錯機制Java程式設計解密負載
- windows第七層負載均衡 基於IIS的ARR負載均衡詳解Windows負載
- 資料庫的讀寫分離與負載均衡策略資料庫負載
- Haproxy搭建 Web 群集實現負載均衡Web負載
- 叢集,lvs負載均衡的四種工作模式負載模式
- RabbitMQ(四):使用Docker構建RabbitMQ高可用負載均衡叢集MQDocker負載
- kubernetes叢集內排程與負載均衡負載
- 負載均衡 - MQTT Broker 叢集詳解(一)負載MQQT
- 服務發現與負載均衡機制-Service負載
- AutoScaling彈性伸縮附加與分離負載均衡例項負載
- dubbo容錯機制和負載均衡負載
- LVS負載均衡群集概念、NAT模式LVS負載均衡實戰部署負載模式
- HAProxy高效能軟負載均衡器負載
- RHEL 7配置HAProxy實現Web負載均衡Web負載
- windows伺服器第四層負載均衡_基於NLB負載均衡詳解Windows伺服器負載
- Nginx+Tomcat實現負載均衡、動靜分離叢集部署NginxTomcat負載
- Dapr + .NET Core實戰(十一)單機Dapr叢集負載均衡負載
- 負載均衡和動態負載均衡分別是什麼?-VeCloud負載Cloud
- gRPC負載均衡(自定義負載均衡策略)RPC負載
- gRPC負載均衡(客戶端負載均衡)RPC負載客戶端
- Nginx+Tomcat部署負載均衡NginxTomcat負載