redis 集羣搭建

redis集羣配置node

1.1 介紹

redisCluster:python

3.0版本之後支持,無中心,在某種狀況下會形成數據丟失,其也是經過算法將數據分片保存至某個redis服務器,即再也不經過客戶端計算key保存的redis服務器,redis服務器須要提早設置好本身所負責的槽位,好比redis A負責處理0-5000的哈希槽位數據,redis B負責處理5001-10000hash槽位數據,redis C負責處理10001-16384hash槽位數據,redis cluster須要特定的客戶端,要求客戶端必須支持集羣協議,可是目前尚未比較好的客戶端。git

 

這種將哈希槽分佈到不一樣節點的作法使得用戶能夠很容易地向集羣中添加或者刪除節點。好比說:redis

若是用戶將新節點 D 添加到集羣中,那麼集羣只須要將節點 A B C 中的某些槽移動到節點 D 就能夠了。算法

與此相似,若是用戶要從集羣中移除節點 A 那麼集羣只須要將節點 A 中的全部哈希槽移動到節點 B 和節點 C 而後再移除空白(不包含任何哈希槽)的節點 A 就能夠了。ruby

由於將一個哈希槽從一個節點移動到另外一個節點不會形成節點阻塞,因此不管是添加新節點仍是移除已存在節點,又或者改變某個節點包含的哈希槽數量,都不會形成集羣下線。服務器

rediscluster須要專門的客戶端,好比python當中引入的redis模塊也不能使用了,目前官方的客戶端也不是不少,須要本身開發。架構

1.1.1 架構細節

spacer.gif

(1)全部的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.app

(2)節點的fail是經過集羣中超過半數的節點檢測失效時才生效.ide

(3)客戶端與redis節點直連,不須要中間proxy.客戶端不須要鏈接集羣全部節點,鏈接集羣中任何一個可用節點便可

(4)redis-cluster把全部的物理節點映射到[0-16383]slot,cluster 負責維護node<->slot<->value

Redis 集羣中內置了 16384 個哈希槽,當須要在 Redis 集羣中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,而後把結果對 16384 求餘數,這樣每一個 key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大體均等的將哈希槽映射到不一樣的節點

1.1.2 容錯

spacer.gif

(1)領着投票過程是集羣中全部master參與,若是半數以上master節點與master節點通訊超過(cluster-node-timeout),認爲當前master節點掛掉.

(2):何時整個集羣不可用(cluster_state:fail)?

a: 若是集羣任意master掛掉,且當前master沒有slave.集羣進入fail狀態,也能夠理解成集羣的slot映射[0-16383]不完成時進入fail狀態. ps : redis-3.0.0.rc1加入cluster-require-full-coverage參數,默認關閉,打開集羣兼容部分失敗.

b: 若是集羣超過半數以上master掛掉,不管是否有slave集羣進入fail狀態.

ps:當集羣不可用時,全部對集羣的操做作都不可用,收到((error) CLUSTERDOWN Thecluster is down)錯誤

1.2 集羣環境搭建

(要讓集羣正常工做至少須要3個主節點,在這裏咱們要建立6redis節點,其中三個爲主節點,三個爲從節點,對應的redis節點的ip和端口對應關係以下)

10.0.3.56:6001

10.0.3.56:6002

10.0.3.56:6003

10.0.3.56:6004

10.0.3.56:6005

10.0.3.56:6006

1.2.1 redis下載

同上所示,下載官網3.0版本以後,支持集羣模式

http://download.redis.io/releases/

1.2.2 redis源碼安裝

# cd /opt

# wgethttp://download.redis.io/releases/redis-3.0.5.tar.gz

# tar xvf redis-3.0.5.tar.gz

# ln -sv /opt/redis-3.0.5/usr/local/redis

# cd /usr/local/redis/

# make && make install

1.2.3 redis編譯安裝

1.2.3.1 建立集羣軟件存放目錄

 mkdir /application &&cd /application/

 

1.2.3.2 上傳redis軟件(集羣搭建要求版本大於3.0

[root@gxmzd-card-mxkmp application]# ll

total 10876

drwxrwxr-x.  7 root  root    4096 May 16 22:59 redis-3.0.5 

-rw-r--r--.  1 root  root   63488 May 16 23:51 redis-3.0.5.gem

-rw-r--r--.  1 root  root 1366160 May 16 22:50 redis-3.0.5.tar.gz

drwxr-xr-x. 23  1035  1035   4096 Mar 30  2016 ruby-2.1.9

-rw-r--r--.  1 root  root 9395648 May 16 22:50 ruby-2.1.9.tar.xz

drwxr-xr-x.  7 1249840000    4096 May 31  2011 rubygems-1.8.5

-rw-r--r--.  1 root  root  249170 May 16 22:50 rubygems-1.8.5.tgz

 

1.2.3.3 編譯安裝reids

ln -sv /application/redis-3.0.5 /usr/local/redis

cd /usr/local/redis

make && make install

echo $?

#檢查編譯是否報錯

 

1.2.3.4 複製集羣配置文件和建立集羣實例目錄

mkdir redis_cluster && cd redis_cluster

mkdir redis{6001..6006}

 

1.2.3.5 修改redis.conf配置文件

主要針對以下幾項:其它默認便可

bind  0.0.0.0

port 6001

daemonize yes (默認是no,直接運行./redis-server是前臺啓動,在關閉運行的窗口後redis也將關閉,爲了關閉窗口後不關閉redis,須要使用後臺啓動,因此調整爲no)

pidfile /var/run/redis_6001.pid

logfile "/usr/local/redis/redis_cluster/redis6001/redis6001.log" #節點啓動日誌

dir /usr/local/redis/redis_cluster/redis6001/  #保存路徑

maxmemory 512M #限制redis 最大使用內存

appendonly yes #是否開啓AOF

appendfilename "appendonly_6001.aof" #保存路徑,和RDB在一塊兒

appendfsync everysec #每秒執行一次fsync,即將內存更改的數據寫入磁盤

cluster-enabled yes #必須打開cluster功能,不然集羣建立不成功

cluster-config-filenodes-6001.conf#每一個主機一個配置文件,有集羣建立和管理,集羣內的各主機不能重名節點實例啓動配置

 

1.2.3.6 批量生成其餘節點的配置文件

#複製redis6001配置文件爲模板,經過sed批量生成reids 配置文件

cp /usr/local/redis/redis_cluster/redis6001/redis.conf  /application

sed  "s#6001#6002#g"/application/redis.conf >>/usr/local/redis/redis_cluster/redis6002/redis.conf

sed  "s#6001#6003#g"/application/redis.conf  >>/usr/local/redis/redis_cluster/redis6003/redis.conf

sed  "s#6001#6004#g"/application/redis.conf  >>/usr/local/redis/redis_cluster/redis6004/redis.conf

sed  "s#6001#6005#g"/application/redis.conf  >>/usr/local/redis/redis_cluster/redis6005/redis.conf

sed  "s#6001#6006#g"/application/redis.conf  >>/usr/local/redis/redis_cluster/redis6006/redis.conf

 

1.2.3.7 服務器批量啓動redis 服務並驗證端口存在

啓動redis多節點服務

/usr/local/redis/src/redis-server   /usr/local/redis/redis_cluster/redis6001/redis.conf

/usr/local/redis/src/redis-server   /usr/local/redis/redis_cluster/redis6002/redis.conf

/usr/local/redis/src/redis-server   /usr/local/redis/redis_cluster/redis6003/redis.conf

/usr/local/redis/src/redis-server   /usr/local/redis/redis_cluster/redis6004/redis.conf

/usr/local/redis/src/redis-server   /usr/local/redis/redis_cluster/redis6005/redis.conf

/usr/local/redis/src/redis-server   /usr/local/redis/redis_cluster/redis6006/redis.conf

 

#查看進程啓動狀況

[root@gxmzd-card-mxkmp ~]# ps -ef|grep redis

root     46835     1  023:24 ?   00:00:00 /usr/local/redis/src/redis-server0.0.0.0:6001 [cluster]                            

root     46870     1  023:26 ?   00:00:01 /usr/local/redis/src/redis-server0.0.0.0:6002 [cluster]                            

root     46875     1  023:26 ?   00:00:01 /usr/local/redis/src/redis-server0.0.0.0:6003 [cluster]                            

root     46879     1  023:26 ?   00:00:00/usr/local/redis/src/redis-server 0.0.0.0:6004 [cluster]                            

root     46884     1  023:26 ?   00:00:00/usr/local/redis/src/redis-server 0.0.0.0:6005 [cluster]                            

root     46888     1  023:26 ?   00:00:00/usr/local/redis/src/redis-server 0.0.0.0:6006 [cluster]                            

root     47244 43369  0 23:37 pts/2    00:00:00 grep redis

 

1.2.3.8 驗證集羣節點是否能登陸

redis-cli  -h 10.0.3.56 -p6001

redis-cli  -h 10.0.3.56 -p6002

redis-cli  -h 10.0.3.56 -p6003

redis-cli  -h 10.0.3.56 -p6004

redis-cli  -h 10.0.3.56 -p6006

redis-cli  -h 10.0.3.56 -p6005

10.0.3.56:6005>

#出現此界面表示啓動成功,節點正常!

 

1.3 安裝ruby環境

執行上面的命令的時候會報錯,由於是執行的ruby的腳本,須要ruby的環境

錯誤內容:./redis-trib.rb:24:in`require': no such file to load -- rubygems (LoadError)

from./redis-trib.rb:24

1.3.1 yum安裝 ruby

(強烈建議此方法)

yum -y install rubyrubygems

安裝完成後,執行gem軟件安裝

cd /application

gem install redis-3.0.5.gem

 

1.3.2 編譯安裝ruby

安裝ruby

tar xf ruby-2.1.9.tar.xz

cd ruby-2.1.9

./configure

make && make install

安裝rubygems

tar -xf rubygems-1.8.5.tgz

cd rubygems-1.8.5

ruby setup.rb

1.3.3 編譯安裝 gem

需安裝redis-3.0.5.gem軟件包,本地上傳該軟件包後,執行以下操做:

下載:https://rubygems.org/gems/redis/versions/3.0.5

cd /application

gem install redis-3.0.5.gem

 

1.4 建立redis集羣

單機部署redis cluster集羣

輸入 yes並按下回車確認以後, 集羣就會將配置應用到各個節點, 並鏈接起(join)各個節點 ——也便是, 讓各個節點開始互相通信. (通常按如上步驟操做後便可正常安裝)

 

1)複製ruby的管理腳本

cp /usr/local/redis/src/redis-trib.rb  /usr/local/bin/redis-trib

2)執行集羣建立命令

redis-trib create --replicas 1 10.0.3.56:6001 10.0.3.56:6002 10.0.3.56:600310.0.3.56:6004 10.0.3.56:6005 10.0.3.56:6006

#命令在這裏用於建立一個新的集羣, 選項--replicas1 表示咱們但願爲集羣中的每一個主節點建立一個從節點。

問題記錄:

注意:若是建立集羣以前建立過請清空以前的文件,不然出現以下報錯:

 [ERR] Node XXXXXX is not empty.Either the node already knows other nodes (check with CLUSTER NODES) orcontains some key in database 0

解決方法是刪除生成的配置文件nodes.conf,若是不行則說明如今建立的結點包括了舊集羣的結點信息,須要刪除redis的持久化文件後再重啓redis,好比:appendonly.aofdump.rdb 文件(若是擔憂丟失,可執行mv 移動到別的文件夾)

1.5 使用redis-cli命令進入集羣環境

使用客戶端進行連接測試

本地登陸測試 必須加參數「-c」才能進入到集羣環境。

redis-cli -c -p 6005

遠程客戶端登陸

redis-cli -h 10.0.3.56 -p 6001

redis-cli + IP + 端口

執行INFO名稱查看各節點狀態

10.0.3.56:6005> INFO

# Server

redis_version:3.0.5

redis_git_sha1:00000000

redis_git_dirty:0

redis_build_id:fe615b439d6069da

redis_mode:cluster

……

如何關閉redis節點

經過命令redis01/redis-cli -p 7001 shutdown進行關閉,這樣在關閉以前,數據纔可以進行保存。

不能直接kill

相關文章
相關標籤/搜索