1. 程式人生 > >我的Redis叢集搭建之路

我的Redis叢集搭建之路

要做一個平臺,設計要求每秒能夠在一個800-1000萬條記錄的資料庫內讀寫1萬次。
我是選用redis叢集。我的做法是按照大神龔-java提供的文件和自己加入的一些發現結合實現的。
首先就是下載redis-3.2.1.tar.gz,這個沒有什麼說的,去官網上找連結然後wget就可以了。
下載完成後tar -zxvf解壓縮,我的習慣是解壓縮之後放到/usr/local/目錄下面。
到/usr/local/redis-3.2.1/目錄下面,如果沒有安裝gcc就需要用命令yum install gcc安裝一下。
gcc裝好後,就在/usr/local/redis-3.2.1/目錄下面編譯,執行make,如果執行失敗看一下錯誤,如果錯誤如下,
編譯中斷。
make[1]: *** [adlist.o] 錯誤 1
make[1]: 離開目錄“/usr/local/redis-stable/src”
make: *** [all] 錯誤 2
解決辦法是:
make MALLOC=libc
編譯完成後執行make install。作用是將 /usr/local/redis/redis-3.2.1/src/相關redis的執行命令複製到/usr/local/bin目錄下
下面就要修改配置檔案了。配置檔案在/usr/local/redis/redis-3.2.1/redis.conf。主要修改下面幾個引數。
bind 0.0.0.0 表示不限制連結本機服務的ip地址。任何計算機都可以發起連線。這裡要特別注意,我一開始以為這裡繫結的ip才能訪問本機的6379埠,結果一修改就啟動不了redis服務,後來仔細看了一下配置檔案上的說明才明白,原來這個bind的不是來訪問的ip,而是本機網絡卡的實體地址。
daemonize yes 表示允許後臺執行
cluster-enabled yes表示開啟叢集
cluster-node-timeout 15000表示設定超時時間
cluster-config-file node儲存叢集配置檔案
配置好之後啟動redis服務,redis-server redis.conf
[
[email protected]
redis-3.2.1]# ps -ef | grep redis
root      2352     1  0 09:39 ?        00:00:00 redis-server 192.168.1.91:7001 [cluster]
root      2450  2006  0 09:56 pts/0    00:00:00 grep --color=auto redis
如果用ps -ef | grep redis,列印上面內容,就表示啟動成功了。
下一步,因為redis cluster的配置是用的ruby指令碼寫得,那麼就需要你最少安裝了ruby (apt-get install ruby )和gem。更主要的是你還要用安裝ruby所需要的redis模組
yum -y install zlib ruby rubygems
# 安裝ruby的redis庫

gem install redis

【補充:如果執行時報錯,無法連線。可以手動下載下來安裝

1、去https://rubygems.org/gems/redis/下載redis-x.x.x.gem檔案

2、gem install -l /root/redis-3.3.1.gem

好了,現在可以開始建立叢集了。我用的是redis-trib.rb create
redis-trib.rb create --replicas 1 192.168.1.91:7001 192.168.1.92:7002 192.168.1.93:7003 192.168.1.94:7004 192.168.1.95:7005 192.168.1.96:7006
建立過程折騰了我好久,一開始總是報錯:
>>> Creating cluster
[ERR] Sorry, can't connect to node 192.168.1.91:7001
我從網上找了很多文章,大部分都是說ruby或者gem的版本太低。我嘗試升級過但還是不行。也就沒再研究原因。因為後來遇到大神龔-java,我完全按照他的文件操作,在一臺伺服器上成功的建立了6個例項的redis叢集。
這時我以為已經大功告成了,沒想到後面的事情真是一波三折。
既然在一臺伺服器上叢集成功了,也應該可以在6臺上實現吧。
我馬上開始部署。結果建立的時候又開始報錯
>>> Creating cluster
[ERR] Sorry, can't connect to node 192.168.1.91:7001
檢查來檢查去,發現原來是我前面提過的配置檔案redis.conf裡面bind 0.0.0.0的問題。經過好多次失敗,才不得不耐心的看看說明,結果才明白。哎,以後真要好好看說明了。
然後執行建立,順利連結,我正高興呢,結果發現執行到Waiting for the cluster to join.........不向下進行了。一直是這個狀態。
沒說的,上網查吧。網上有位兄弟是這麼說的:
建立叢集時一直處於"Waiting for the cluster to join...................................."的狀態
這個問題原因不知,但解決方法是在redis.conf檔案中把bind 127.0.0.1本地環回口改為物理介面.
可是我已經把redis.conf的bind配置好了呀。又是一次次的嘗試,結果我發現,在我建立集群后,叢集成員要通過一個隨機埠,向建立叢集的伺服器通訊。這個通訊不是redis.conf裡面port。
行了,二話不說修改iptables
-A INPUT -s 192.168.1.91 -j ACCEPT
-A INPUT -s 192.168.1.92 -j ACCEPT
-A INPUT -s 192.168.1.93 -j ACCEPT
-A INPUT -s 192.168.1.94 -j ACCEPT
-A INPUT -s 192.168.1.95 -j ACCEPT
-A INPUT -s 192.168.1.96 -j ACCEPT
然後建立叢集,還是老樣子……這時想起了redis叢集通訊方式,叢集成員應該不會只與叢集建立者通訊吧。於是把叢集成員的iptables全都做了相同配置。
然後建立叢集,大功告成!
特別感謝龔-java同志的大力幫助。
附龔-java的文件:https://github.com/gonghard/redis