Haproxy 雖然帶著ha,但它做的確是負載平衡。haproxy是工作在四層之上的,這也就意味著它可以代理的服務要比nginx更廣泛,效能比nginx也要更高一些。相比較lvs,可配置性又比較好,需要的機器沒有lvs那麼多。因此haproxy在一定需求下使用還是不錯的。比如使用haproxy來對mysql的從節點進行負載平衡。下面我們就來簡單的使用haproxy來進行MySQL的負載平衡。
環境準備
| IP地址 |
職能 |
| 192.168.111.100 |
負載平衡伺服器 |
| 192.168.111.101 |
MySQL伺服器 |
| 192.168.111.102 |
MySQL伺服器 |
我們這裡假設兩台節點的MySQL伺服器都已經安裝完畢了。而且進行了如下配置
1.MySQL的連接埠都為3306 2.伺服器開啟了 3306 連接埠 3.建立MySQL使用者 test ,密碼 test ,可被 192.168.111.* 下的主機訪問 4.為了顯示負載到兩個不同的機器,在一個機器中建立一個不同於另一個機器的資料庫,用以區分。一個是MySQL1,一個是MySQL2
下面主要針對的是負載平衡節點的安裝以及配置,也就是本筆記的核心。
先來下載haproxy,下載地址
http://www.haproxy.org/
解壓
tar -zxvf haproxy-1.7.8.tar.gz
安裝(編譯的時候需要指定核心的版本,安裝的時候需要指定安裝的路徑)
make TARGET=linux26make install PREFIX=/usr/local/haproxy
在make的過程中需要指定linux的核心版本,可以通過下面的命令來查看核心版本
cat /proc/version
安裝成功資訊(下面的安裝資訊是不指定PREFIX的情況下的)
[root@m007 haproxy-1.7.8]# make installinstall -d "/usr/local/sbin"install haproxy "/usr/local/sbin"install -d "/usr/local/share/man"/man1install -m 644 doc/haproxy.1 "/usr/local/share/man"/man1install -d "/usr/local/doc/haproxy"for x in 51Degrees-device-detection architecture close-options configuration cookie-options DeviceAtlas-device-detection intro linux-syn-cookies lua management netscaler-client-ip-insertion-protocol network-namespaces proxy-protocol SPOE WURFL-device-detection; do \ install -m 644 doc/$x.txt "/usr/local/doc/haproxy" ; \ done
在這裡,我先說說我的目錄結構的規劃,我在學習的過程中,感覺在目錄結構上遇到了很多坑。在這裡把我的目錄結構列出來,我的haproxy是放到usr/local/haproxy下的
/usr/local/haproxy sbin 這裡放的是可執行檔,就是haproxy (安裝的過程中建立的) haproxy logs 這裡放的是記錄的日誌(自己建立的) haproxy.log conf 這裡放置的是設定檔(自己建立的) haproxy.cnf haproxy.pid doc 我還沒用到過,看名字應該是存放的文檔(安裝過程中建立的) haproxy share 這個我也沒用到過也是在安裝過程中建立的 man 也就是說,我們這裡要自己建立兩個檔案夾,一個是logs,一個是conf。在這兩個檔案夾下,要建立一個log檔案,一個cnf主設定檔和一個pid檔案。
安裝成功之後就是要進行配置,配置的過程還是比較麻煩的。首先1.7.8這個版本我並沒有找到它提供的設定檔。我確實找了examples下的設定檔,沒有找到。於是我在網上找到的一些配置進行的拼湊出來的。下面列出haproxy最簡單的配置資訊。這個配置的內容是放到/usr/local/haproxy/conf/haproxy.cnf檔案中的。其中這裡用到了pid檔案,我在pid中就儲存了一個1.
global daemon # 後台方式運行 nbproc 1 pidfile /usr/local/haproxy/conf/haproxy.piddefaults mode tcp #預設的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK retries 2 #兩次串連失敗就認為是伺服器不可用,也可以通過後面設定 option redispatch #當serverId對應的伺服器掛掉後,強制定向到其他健康的伺服器 option abortonclose #當伺服器負載很高的時候,自動結束掉當前隊列處理比較久的連結 maxconn 4096 #預設的最大串連數 timeout connect 5000ms #連線逾時 timeout client 30000ms #用戶端逾時 timeout server 30000ms #伺服器逾時 #timeout check 2000 #=心跳檢測逾時 log 127.0.0.1 local0 err #[err warning info debug]########test1配置#################listen test1 #這裡是配置負載平衡,test1是名字,可以任意 bind 0.0.0.0:3306 #這裡是監聽的IP地址和連接埠,連接埠號碼可以在0-65535之間,要避免連接埠衝突 mode tcp #串連的協議,這裡是tcp協議 #maxconn 4086 #log 127.0.0.1 local0 debug server s1 192.168.111.101:3306 #負載的機器 server s2 192.168.111.102:3306 #負載的機器,負載的機器可以有多個,往下排列即可 這樣就配置好了。下面來啟動haproxy
./usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cnf
-f 是指定我們的設定檔的路徑。
啟動過程中沒有任何日誌資訊列印,安靜到讓你懷疑沒有啟動成功,然後本都的你去查看日誌,發現日誌裡沒有任何資訊,不知道是你的日誌沒有配置正確還是系統啟動沒有問題,茫茫然的感覺,不知該從哪裡下手。但作為程式員的你思維還是敏捷的,咱先測測能不能負載平衡啊,於是使用MySQL的用戶端工具,輸入本地機器的ip,加上監聽的連接埠號碼,發現連上了,然後再退出重新連,發現連了另外的一台機器,到這裡,我們發現這個實驗已經成功了。但作為程式員的你仍心有不甘,我們要監控,我們還要查看日誌。下面來繼續
配置監控 haproxy帶有監控功能,而且配置簡單,直接在主設定檔中加入一下配置即可,格式就是這麼縮排的,非拷貝出現問題。這個配置中可以看到,項目的名稱使用的是haproxy,訪問的時候在瀏覽器中輸入原生IP地址加連接埠加上uri就可以了。例如:http://192.168.111.100:8888/haproxy
listen admin_stats bind 0.0.0.0:8888 mode http stats uri /haproxy stats realm Global\ statistics stats auth admin:admin
下面配置日誌
日誌暫時沒還搞定(跟著網上的步驟在做,但始終就是不給我記錄,我也沒轍啊,研究完再單獨寫一個記錄日誌的吧)
連接埠檢測 haproxy可以檢測我們的服務是否宕機,檢測的方式就是通過指定檢測連接埠。配置非常簡單
listen test1 bind 0.0.0.0:3306 mode tcp #maxconn 4086 #log 127.0.0.1 local0 debug server s1 192.168.111.101:3306 check port 3306 server s2 192.168.111.102:3306 check port 3306
當我們停止一個服務的時候,監控視圖如下(很快把我們關掉的機器就標記為紅色了)
查看haproxy的進程狀態
ps -ef | grep haproxy
殺掉haproxy進程
kill -9 pid