【Docker】基於例項專案的叢集部署(六)資料庫負載均衡 | Haproxy分發機制 | 監控負載狀況

ImagineCode發表於2019-01-17

從上一篇中我們知道,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個節點。

由此可見,這樣就完成了負載均衡的操作。

下一篇中,我們將探索負載均衡高可用方案

參考

深入理解負載均衡的點點滴滴

相關文章