用haproxy+redis實現分散式redis伺服器
redis是一個非常強大的nosql服務,不僅能替代memcache這樣的key/value服務,也具有強大的佇列功能,在普通應用上可以替代activemq/rabbitmq一類佇列服務
但是目前為止,redis都沒有實現真正有效的叢集功能,redis的作者承諾會在redis 3.0的時候將名為“redis-cluster”的叢集功能加入redis,但是截至目前,redis還是2.8版本
redis本身不具有叢集,不代表我們不能實現redis叢集,通過思考,我選擇使用流行的負載均衡器+redis的組合來實現
在負載均衡器的選擇上,我選擇haproxy。目前圈內流行的負載均衡器有lvs、nginx、haproxy,lvs的資料相對較少,nginx只支援http和email的負載均衡,相較之下,只有haproxy比較適合我們的應用場景。
多的不說了,我們馬上開始
實驗過程全部在一臺伺服器上進行:
192.168.1.168
在這臺伺服器上只裝了一個redis
/usr/local/redis
但是通過使用不同的配置檔案(實際只是copy了同一份配置檔案,改一下監聽埠),開啟了兩個redis監聽例項,就等於兩個redis了
192.168.1.168:6379
192.168.1.168:6378
我們的haproxy裝在
/usr/local/haproxy
安裝過程很簡單
到http://download.chinaunix.net/download/0013000/12508.shtml下載haproxy的最新版本,我選擇下載http://down1.chinaunix.net/distfiles/haproxy-1.4.21.tar.gz這個
tar zxvf haproxy-1.4.21.tar.gz
mv haproxy-1.4.21 /usr/local/haproxy
cd /usr/local/haproxy
make install
這樣就裝好了,簡單不
接下來要寫配置檔案
cd /usr/local/haproxy
mkdir conf log
cd conf
vim haproxy.cfg
配置內容如下:
global
log 127.0.0.1 local0 #日誌輸出配置,所有日誌都記錄在本機,通過local0輸出
maxconn 4096 #最大連線數
chroot /usr/local/haproxy #改變當前工作目錄
user haproxy #所屬執行的使用者
group haproxy #所屬執行的使用者組
daemon #以後臺形式執行ha-proxy
nbproc 4 #啟動4個ha-proxy例項
pidfile /usr/local/haproxy/log/haproxy.pid #pid檔案位置
defaults
log 127.0.0.1 local3 #日誌檔案的輸出定向
mode tcp #{ tcp|http|health } 設定啟動的例項的協議型別,此處要選擇tcp,因為redis是基於tcp協議執行的
option dontlognull #保證HAProxy不記錄上級負載均衡傳送過來的用於檢測狀態沒有資料的心跳包
option redispatch #當serverId對應的伺服器掛掉後,強制定向到其他健康的伺服器
retries 2 #重試2次連線失敗就認為伺服器不可用,主要通過後面的check檢查
maxconn 2000 #最大連線數
balance roundrobin #負載均衡演算法,roundrobin表示輪詢,source表示按照IP
contimeout 5000 #連線超時時間
clitimeout 50000 #客戶端連線超時時間
srvtimeout 50000 #伺服器端連線超時時間
listen proxy 192.168.1.168:6300
server redis_192.168.1.168_6378 192.168.1.168:6378 check inter 2000 rise 2 fall 5 #你的均衡節點
server redis_192.168.1.168_6379 192.168.1.168:6379 check inter 2000 rise 2 fall 5
配置檔案儲存,然後來啟動haproxy
/usr/local/haproxy/haproxy -f /usr/local/haproxy/conf/haproxy.cfg
如果修改了配置檔案要重新執行,先要結束haproxy的所有程序
killall haproxy
然後再重新執行啟動haproxy的命令
這樣redis的叢集就搭好了!
現在來試驗一下,php程式碼:
$redis = new Redis();
$redis->connect('192.168.1.168',6300);
$r = $redis->info();
print_r($r);
打印出來的狀態陣列,能看得出來是不同的例項,process_id是不同的程序id
以上是為實現redis叢集目的進行的haproxy配置,haproxy是一款非常強大的負載均衡器,功能不止於此
更多的haproxy配置方法請參考:
更詳細的haproxy配置引數解釋請參考: