我們現在在一台伺服器上,通過6個連接埠來類比一下redis叢集部署,要搭建出的模型為:三個主要資料庫7001,7002,7003,它們各有一個從資料庫7004,7005,7006。
首先建立目錄/usr/local/redis-cluster,然後在其中建立6個目錄7001-7006:
然後先複製一份redis設定檔redis.conf到7001目錄下,執行vi命令編輯redis.conf,需要修改的地方為:
daemonize yes(後台運行)port 700* (分別對每個機器的連接埠號碼進行設定)bind 192.168.202.131 (必須綁定當前的主機IP)dir /usr/local/redis-cluster/700*/ (指定資料檔案dump.rdb的存放位置,必須指明,否則資料可能丟失)cluster-enabled yes(啟動叢集模式)cluster-config-file nodes700*.conf (700*最好和port對應上)cluster-node-timeout 5000 (到期時間,可選)appendonly yes (啟動aof持久化,可選)
將編輯好後的redis.conf各複製一份到7002-7006目錄下,再分別修改為對應的連接埠號碼7002-7006,為了方便可以使用全文替換:執行vi命令後,按冒號進入最後行模式,然後執行%s/7001/700*/g。
由於redis叢集需要使用到ruby命令,所以我們需要先安裝ruby,ubuntu下安裝ruby的方式如下:
sudo apt-get updatesudo apt-get install rubysudo apt-get install rubygems
然後執行如下命令安裝redis和ruby的介面:
gem install redis
然後分別啟動6個redis執行個體:(我的redis-server程式安裝在/usr/local/bin/,請對應你自己的)
/usr/local/bin/redis-server /usr/local/redis-cluster/7001/redis.conf /usr/local/bin/redis-server /usr/local/redis-cluster/7002/redis.conf /usr/local/bin/redis-server /usr/local/redis-cluster/7003/redis.conf /usr/local/bin/redis-server /usr/local/redis-cluster/7004/redis.conf /usr/local/bin/redis-server /usr/local/redis-cluster/7005/redis.conf /usr/local/bin/redis-server /usr/local/redis-cluster/7006/redis.conf
開啟好後可以執行ps -el|grep redis查看是否啟動成功。
然後執行redis的src目錄下的redis-trib.rb命令,其中create代表建立叢集,–replicas代表主從結點比例,1代表一主一從:
./usr/redis/redis-3.2.6/src/redis-trib.rb create --replicas 1 192.168.202.131 7001 192.168.202.131 7002 192.168.202.131 7003 192.168.202.131 7004 192.168.202.131 7005 192.168.202.131 7006
通過叢集方式啟動服務,輸入info命令可以查看主從資訊:
輸入cluster info命令可以查看叢集資訊:
通過cluster nodes命令可以查看叢集結點資訊:(redis會給主庫結點分配雜湊槽)
現在開啟多個終端,分別串連7001,7002,7003連接埠的redis服務:
然後在7001中執行set k1 v1,會發現k1被存放到7003的雜湊槽12706中,此時在7001,7002中執行keys *看不到k1,但是可以通過get k1訪問到k1,而且會被重新導向到7003連接埠的redis服務:
現在,我們在7001中執行set k4 v4,發現k4被存放到了7002,然後我們退出7002服務,啟動7002的從庫即7005,執行get k4,會發現仍然需要重新導向到7002去擷取,這是不合理的。我們需要在從庫7005中執行READONLY命令,然後再擷取k4,就可以直接從從庫7005中擷取了:(但是好在在jedis中不需要這樣設定)