Redis集羣安裝

Redis集羣的相關概念

redis-cluster架構圖node

 

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

 

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

 

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

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

 

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

 

Key:a微信

計算ahash值,例如值爲100100這個槽在server1上,因此a應該放到server1.架構

Key:helloapp

Hash值:10032,此槽在server2上。Hell能夠應該存在server2.分佈式

redis-cluster投票:容錯

 

(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 The cluster is down)錯誤

個人集羣環境

 操做系統 centos6.5

redis 版本 redis3.0

集羣中有三個節點的集羣,每一個節點有一主一備。須要6臺虛擬機。

 

搭建一個僞分佈式的集羣,使用6redis實例來模擬。

 

搭建集羣須要的環境

 

搭建集羣須要使用到官方提供的ruby腳本。

 

須要安裝ruby的環境。

 

安裝ruby

 

yum install ruby

 

yum install rubygems

 

 

 

redis集羣管理工具redis-trib.rb

 

[root@bogon ~]# cd redis-3.0.0

 

[root@bogon redis-3.0.0]# cd src

 

[root@bogon src]# ll *.rb

 

-rwxrwxr-x. 1 root root 48141 Apr  1 07:01 redis-trib.rb

 

[root@bogon src]#

腳本須要的ruby包:redis-3.0.0.gem

 

須要上傳到linux服務。

 

安裝ruby的包:

 

gem install redis-3.0.0.gem

 

[root@bogon ~]# gem install redis-3.0.0.gem

 

Successfully installed redis-3.0.0

 

1 gem installed

 

Installing ri documentation for redis-3.0.0...

 

Installing RDoc documentation for redis-3.0.0...

集羣環境的搭建

第一步:建立6redis實例,端口號從7001~7006

第二步:修改redis的配置文件

 

1、修改端口號

2打開cluster-enable前面的註釋。

第三步:把建立集羣的ruby腳本複製到redis-cluster目錄下。

 

第四步:啓動6redis實例

 

分別進入70017002...7006目錄,執行:

 

./redis-server ./redis.conf

 

 

第五步:建立集羣。

 

./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005  192.168.25.153:7006

說明:

redis集羣至少須要3個主節點,每一個主節點有一個從節點總共6個節點

replicas指定爲1表示每一個主節點有一個從節點

注意:

若是執行時報以下錯誤:

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

解決方法是刪除生成的配置文件nodes.conf,若是不行則說明如今建立的結點包括了舊集羣的結點信息,須要刪除redis的持久化文件後再重啓redis,好比:appendonly.aofdump.rdb

 

[root@bogon redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005  192.168.25.153:7006

>>> Creating cluster

Connecting to node 192.168.25.153:7001: OK

Connecting to node 192.168.25.153:7002: OK

Connecting to node 192.168.25.153:7003: OK

Connecting to node 192.168.25.153:7004: OK

Connecting to node 192.168.25.153:7005: OK

Connecting to node 192.168.25.153:7006: OK

>>> Performing hash slots allocation on 6 nodes...

Using 3 masters:

192.168.25.153:7001

192.168.25.153:7002

192.168.25.153:7003

Adding replica 192.168.25.153:7004 to 192.168.25.153:7001

Adding replica 192.168.25.153:7005 to 192.168.25.153:7002

Adding replica 192.168.25.153:7006 to 192.168.25.153:7003

M: 5a8523db7e12ca600dc82901ced06741b3010076 192.168.25.153:7001

   slots:0-5460 (5461 slots) master

M: bf6f0929044db485dea9b565bb51e0c917d20a53 192.168.25.153:7002

   slots:5461-10922 (5462 slots) master

M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca 192.168.25.153:7003

   slots:10923-16383 (5461 slots) master

S: 2a61b87b49e5b1c84092918fa2467dd70fec115f 192.168.25.153:7004

   replicates 5a8523db7e12ca600dc82901ced06741b3010076

S: 14848b8c813766387cfd77229bd2d1ffd6ac8d65 192.168.25.153:7005

   replicates bf6f0929044db485dea9b565bb51e0c917d20a53

S: 3192cbe437fe67bbde9062f59d5a77dabcd0d632 192.168.25.153:7006

   replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca

Can I set the above configuration? (type 'yes' to accept): yes

>>> Nodes configuration updated

>>> Assign a different config epoch to each node

>>> Sending CLUSTER MEET messages to join the cluster

Waiting for the cluster to join.....

>>> Performing Cluster Check (using node 192.168.25.153:7001)

M: 5a8523db7e12ca600dc82901ced06741b3010076 192.168.25.153:7001

   slots:0-5460 (5461 slots) master

M: bf6f0929044db485dea9b565bb51e0c917d20a53 192.168.25.153:7002

   slots:5461-10922 (5462 slots) master

M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca 192.168.25.153:7003

   slots:10923-16383 (5461 slots) master

M: 2a61b87b49e5b1c84092918fa2467dd70fec115f 192.168.25.153:7004

   slots: (0 slots) master

   replicates 5a8523db7e12ca600dc82901ced06741b3010076

M: 14848b8c813766387cfd77229bd2d1ffd6ac8d65 192.168.25.153:7005

   slots: (0 slots) master

   replicates bf6f0929044db485dea9b565bb51e0c917d20a53

M: 3192cbe437fe67bbde9062f59d5a77dabcd0d632 192.168.25.153:7006

   slots: (0 slots) master

   replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

[root@bogon redis-cluster]#

到此安裝成功

查看Reids進程

查看進羣信息

集羣建立成功登錄任意redis結點查詢集羣中的節點狀況。

 客戶端以集羣方式登錄:

說明:

./redis-cli -c -h 192.168.101.3 -p 7001 ,其中-c表示以集羣方式鏈接redis-h指定ip地址,-p指定端口號

cluster nodes 查詢集羣結點信息

cluster info 查詢集羣狀態信息

添加主節點

集羣建立成功後能夠向集羣中添加節點,下面是添加一個master主節點

 

添加7007結點,參考集羣結點規劃章節添加一個「7007」目錄做爲新節點。

 

 執行下邊命令:

 

./redis-trib.rb add-node  192.168.101.3:7007 192.168.101.3:7001

查看集羣結點發現7007已添加到集羣中:

 

hash槽從新分配

 

添加完主節點須要對主節點進行hash槽分配這樣該主節才能夠存儲數據。

 

redis集羣有16384個槽,集羣中的每一個結點分配自已槽,經過查看集羣結點能夠看到槽佔用狀況。

給剛添加的7007結點分配槽:

 

第一步:鏈接上集羣

 

./redis-trib.rb reshard 192.168.101.3:7001(鏈接集羣中任意一個可用結點都行)

 

 第二步:輸入要分配的槽數量

輸入 500表示要分配500個槽

 

第三步:輸入接收槽的結點id

這裏準備給7007分配槽,經過cluster nodes查看7007結點id15b809eadae88955e36bcdbb8144f61bbbaf38fb

輸入:15b809eadae88955e36bcdbb8144f61bbbaf38fb

 

第四步:輸入源結點id

這裏輸入all

 

第五步:輸入yes開始移動槽到目標結點id

添加從節點

集羣建立成功後能夠向集羣中添加節點,下面是添加一個slave從節點。

添加7008從結點,將7008做爲7007的從結點。

./redis-trib.rb add-node --slave --master-id 主節點id 添加節點的ip和端口 集羣中已存在節點ip和端口

 

執行以下命令:

 

./redis-trib.rb add-node --slave --master-id cad9f7413ec6842c971dbcc2c48b4ca959eb5db4  192.168.101.3:7008 192.168.101.3:7001

 

cad9f7413ec6842c971dbcc2c48b4ca959eb5db4  7007結點的id,可經過cluster nodes查看。

注意:若是原來該結點在集羣中的配置信息已經生成cluster-config-file指定的配置文件中(若是cluster-config-file沒有指定則默認爲nodes.conf),這時可能會報錯:

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

解決方法是刪除生成的配置文件nodes.conf,刪除後再執行./redis-trib.rb add-node指令

 

 

查看集羣中的結點,剛添加的70087007的從節點:

 

刪除節點

./redis-trib.rb del-node 127.0.0.1:7005 4b45eb75c8b428fbd77ab979b85080146a9bc017

 

刪除已經佔有hash槽的結點會失敗,報錯以下:

[ERR] Node 127.0.0.1:7005 is not empty! Reshard data away and try again.

 

須要將該結點佔用的hash槽分配出去(參考hash槽從新分配章節)。

測試集羣

[root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.153 -p 7002 -c

[root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.153 -p 7002

192.168.25.153:7002> set a 100

(error) MOVED 15495 192.168.25.153:7003

192.168.25.153:7002>

[root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.153 -p 7002 -c

192.168.25.153:7002> set a 100

-> Redirected to slot [15495] located at 192.168.25.153:7003

OK

192.168.25.153:7003>

關閉Redis

redis01/redis-cli -p 7001 shutdown

 

分享

最後分享一個微信公衆賬號騎豬上樹  這是我本身開發的微信機器人謝謝你們

相關文章
相關標籤/搜索