Redis 單機集羣搭建與遠程訪問開啓

開啓遠程訪問

解決辦法:修改 redis.conf 配置文件:

  1. 註釋掉 bind 127.0.0.1
  2. protected-mode yes 改爲 protected-mode no
  3. 重啓服務 src/redis-server redis.conf &
(error) DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.

搭建 Redis 單機集羣

解決辦法:修改 redis.config,添加 cluster-enabled yes

(error) ERR This instance has cluster support disabled

第一步:安裝 Redis

Reids 安裝包裏有個集羣工具,要複製到 /usr/local/bin 裏去 cp redis-3.2.9/src/redis-trib.rb /usr/local/bin

第二步:修改配置,創建節點

我們現在要搞六個節點,三主三從,端口規定分別是 7001,7002,7003,7004,7005,7006

我們先在 root 目錄下新建一個 redis_cluster 目錄,然後該目錄下再創建 6 個目錄,分別是 7001,7002,7003,7004,7005,7006,用來存在 redis 配置文件;

這裏我們要使用 redis 集羣,要先修改 redis 的配置文件 redis.conf

[root@localhost ~]# mkdir redis_cluster 新建目錄
[root@localhost ~]# cd redis_cluster/
[root@localhost redis_cluster]# mkdir 7001 7002 7003 7004 7005 7006
[root@localhost redis_cluster]# ll
總用量 0
drwxr-xr-x. 2 root root 6 727 17:18 7001
drwxr-xr-x. 2 root root 6 727 17:18 7002
drwxr-xr-x. 2 root root 6 727 17:18 7003
drwxr-xr-x. 2 root root 6 727 17:18 7004
drwxr-xr-x. 2 root root 6 727 17:18 7005
drwxr-xr-x. 2 root root 6 727 17:18 7006

先複製一份配置文件到 7001 目錄下:

[root@localhost redis_cluster]# cd
[root@localhost ~]# cp redis-3.2.9/redis.conf redis_cluster/7001/

我們修改下這個配置文件

vim redis_cluster/7001/redis.conf

修改以下幾個配置參數:

  • port 7001: 6 個節點配置文件分別是 7001-7006
  • daemonize yes: redis 後臺運行
  • pidfile /var/run/redis_7001.pid : pidfile文件對應 7001-7006
  • cluster-enabled yes: 開啓集羣
  • cluster-config-file nodes_7001.conf: 保存節點配置,自動創建,自動更新對應 7001-7006
  • cluster-node-timeout 5000: 集羣超時時間,節點超過這個時間沒反應就斷定是宕機
  • appendonly yes: 存儲方式,aof,將寫操作記錄保存到日誌中

7001 下的修改完後,我們把7001下的配置分別複製到 7002-7006 然後對應的再修改下配置即可, 編輯後面 5 個配置文件,把 port ,pidfile,cluster-config-file 分別修改下即可;

[root@localhost ~]# cp redis_cluster/7001/redis.conf redis_cluster/7002/
[root@localhost ~]# cp redis_cluster/7001/redis.conf redis_cluster/7003/
[root@localhost ~]# cp redis_cluster/7001/redis.conf redis_cluster/7004/
[root@localhost ~]# cp redis_cluster/7001/redis.conf redis_cluster/7005/
[root@localhost ~]# cp redis_cluster/7001/redis.conf redis_cluster/7006/
[root@localhost ~]# vim redis_cluster/7002/redis.conf 
[root@localhost ~]# vim redis_cluster/7003/redis.conf 
[root@localhost ~]# vim redis_cluster/7004/redis.conf 
[root@localhost ~]# vim redis_cluster/7005/redis.conf 
[root@localhost ~]# vim redis_cluster/7006/redis.conf 

第三步:啓動 6 個節點的 redis

[root@localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7001/redis.conf 
[root@localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7002/redis.conf 
[root@localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7003/redis.conf 
[root@localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7004/redis.conf 
[root@localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7005/redis.conf 
[root@localhost ~]# /usr/local/redis/bin/redis-server redis_cluster/7006/redis.conf 

啓動六個節點,查找下 redis 進程信息,顯示以下信息,說明都啓動成功了

[root@localhost ~]# ps -ef | grep redis  

root    9501    1   0   17:38   ?   00:00:00    /usr/local/redis/bin/redis-server 127.0.0.1:7001 [cluster]
root    9512    1   0   17:45   ?   00:00:00    /usr/local/redis/bin/redis-server 127.0.0.1:7002 [cluster]
root    9516    1   0   17:45   ?   00:00:00    /usr/local/redis/bin/redis-server 127.0.0.1:7003 [cluster]
root    9520    1   0   17:45   ?   00:00:00    /usr/local/redis/bin/redis-server 127.0.0.1:7004 [cluster]
root    9524    1   0   17:45   ?   00:00:00    /usr/local/redis/bin/redis-server 127.0.0.1:7005 [cluster]
root    9528    1   0   17:45   ?   00:00:00    /usr/local/redis/bin/redis-server 127.0.0.1:7006 [cluster]

第四步:創建集羣

redis官方提供了 redis-trib.rb 工具,第一步裏已經房到裏 bin 下 ;

但是在使用之前 需要安裝ruby,以及 redis 和 ruby 連接:

[root@localhost ~]# yum -y install ruby ruby-devel rubygems rpm-build
[root@localhost ~]# gem install redis

創建集羣:

[root@localhost ~]# redis-trib.rb create --replicas 1  127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
Adding replica 127.0.0.1:7006 to 127.0.0.1:7003
M: bfcfcdc304b011023fa568e044ea23ea6bc03c3c 127.0.0.1:7001
   slots:0-5460 (5461 slots) master
M: d61e66e49e669b99d801f22f6461172696fdd1c9 127.0.0.1:7002
   slots:5461-10922 (5462 slots) master
M: aa6bc3f1e1174c3a991c01882584707c2408ec18 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
S: 7908a60306333c5d7c7c5e7ffef44bdf947ef0a4 127.0.0.1:7004
   replicates bfcfcdc304b011023fa568e044ea23ea6bc03c3c
S: 1d2341fd3b79ef0fccb8e3a052bba141337c6cdd 127.0.0.1:7005
   replicates d61e66e49e669b99d801f22f6461172696fdd1c9
S: f25b35f208dc96605ee4660994d2ac52f39ac870 127.0.0.1:7006
   replicates aa6bc3f1e1174c3a991c01882584707c2408ec18
Can I set the above configuration? (type 'yes' to accept): 

最後問我們是否接受上面的設置,輸入yes 就表示接受,我們輸入 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 127.0.0.1:7001)
M: bfcfcdc304b011023fa568e044ea23ea6bc03c3c 127.0.0.1:7001
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: f25b35f208dc96605ee4660994d2ac52f39ac870 127.0.0.1:7006
   slots: (0 slots) slave
   replicates aa6bc3f1e1174c3a991c01882584707c2408ec18
M: d61e66e49e669b99d801f22f6461172696fdd1c9 127.0.0.1:7002
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 1d2341fd3b79ef0fccb8e3a052bba141337c6cdd 127.0.0.1:7005
   slots: (0 slots) slave
   replicates d61e66e49e669b99d801f22f6461172696fdd1c9
M: aa6bc3f1e1174c3a991c01882584707c2408ec18 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 7908a60306333c5d7c7c5e7ffef44bdf947ef0a4 127.0.0.1:7004
   slots: (0 slots) slave
   replicates bfcfcdc304b011023fa568e044ea23ea6bc03c3c
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

從運行結果看主節點就是 7001, 7002, 7003 從節點分別是 7004, 7005, 7006

7001 分配到的哈希槽是 0-5460

7002 分配到的哈希槽是 5461-10922

7003 分配到的哈希槽是 10923-16383

顯示配置哈希槽,以及集羣創建成功,可以用了。

第五步:集羣數據測試**

我們先連接任意一個節點,然後添加一個 key:

redis-cli 是 redis 默認的客戶端工具,啓動時加上`-c`參數,-p指定端口,就可以連接到集羣。

連接任意一個節點端口, 我們連接 7002:

[root@localhost ~]# /usr/local/redis/bin/redis-cli -c -p 7002
127.0.0.1:7002> set xxx  'fdafda'
-> Redirected to slot [4038] located at 127.0.0.1:7001
OK
127.0.0.1:7001> 

前面說過 Redis Cluster 值分配規則,所以分配 key 的時候,它會使用 CRC16(‘my_name’)%16384 算法,來計算,將這個 key 放到哪個節點,這裏分配到了4038slot 就分配到了 7001(0-5460) 這個節點上。所以有:Redirected to slot [4038] located at 127.0.0.1:7001

我們從其他集羣節點 ,都可以獲取到數據

127.0.0.1:7001> exit
[root@localhost ~]# /usr/local/redis/bin/redis-cli -c -p 7005
127.0.0.1:7005> get xxx
-> Redirected to slot [4038] located at 127.0.0.1:7001
"fdafda"
127.0.0.1:7001> 

第六步:集羣宕機測試

假如我們幹掉一個節點,比如 7002 這個主節點

[root@localhost ~]#  ps -ef | grep redis
root       9501      1  0 17:38 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7001 [cluster]
root       9512      1  0 17:45 ?        00:00:01 /usr/local/redis/bin/redis-server 127.0.0.1:7002 [cluster]
root       9516      1  0 17:45 ?        00:00:01 /usr/local/redis/bin/redis-server 127.0.0.1:7003 [cluster]
root       9520      1  0 17:45 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7004 [cluster]
root       9524      1  0 17:45 ?        00:00:01 /usr/local/redis/bin/redis-server 127.0.0.1:7005 [cluster]
root       9528      1  0 17:45 ?        00:00:01 /usr/local/redis/bin/redis-server 127.0.0.1:7006 [cluster]
root       9601   2186  0 18:12 pts/0    00:00:00 grep --color=auto redis
[root@localhost ~]# kill -9 9512
[root@localhost ~]#  ps -ef | grep redis
root       9501      1  0 17:38 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7001 [cluster]
root       9516      1  0 17:45 ?        00:00:01 /usr/local/redis/bin/redis-server 127.0.0.1:7003 [cluster]
root       9520      1  0 17:45 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7004 [cluster]
root       9524      1  0 17:45 ?        00:00:01 /usr/local/redis/bin/redis-server 127.0.0.1:7005 [cluster]
root       9528      1  0 17:45 ?        00:00:01 /usr/local/redis/bin/redis-server 127.0.0.1:7006 [cluster]
root       9603   2186  0 18:12 pts/0    00:00:00 grep --color=auto redis

然後再來看下集羣的情況

[root@localhost ~]# redis-trib.rb check 127.0.0.1:7001
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: bfcfcdc304b011023fa568e044ea23ea6bc03c3c 127.0.0.1:7001
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: f25b35f208dc96605ee4660994d2ac52f39ac870 127.0.0.1:7006
   slots: (0 slots) slave
   replicates aa6bc3f1e1174c3a991c01882584707c2408ec18
M: 1d2341fd3b79ef0fccb8e3a052bba141337c6cdd 127.0.0.1:7005
   slots:5461-10922 (5462 slots) master
   0 additional replica(s)
M: aa6bc3f1e1174c3a991c01882584707c2408ec18 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 7908a60306333c5d7c7c5e7ffef44bdf947ef0a4 127.0.0.1:7004
   slots: (0 slots) slave
   replicates bfcfcdc304b011023fa568e044ea23ea6bc03c3c
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

我們發現 7005 本來是從節點,由於他對應的主節點掛了,就自動變成主節點 master,所有會有最後一個說明 All 16384 slots covered. 所有哈希槽都可覆蓋了; 集羣可以正常使用;

假如我們把 7005 也幹掉,試試看

[root@localhost ~]# kill -9 9524
[root@localhost ~]#  ps -ef | grep redis
root       9501      1  0 17:38 ?        00:00:03 /usr/local/redis/bin/redis-server 127.0.0.1:7001 [cluster]
root       9516      1  0 17:45 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7003 [cluster]
root       9520      1  0 17:45 ?        00:00:03 /usr/local/redis/bin/redis-server 127.0.0.1:7004 [cluster]
root       9528      1  0 17:45 ?        00:00:02 /usr/local/redis/bin/redis-server 127.0.0.1:7006 [cluster]
root       9610   2186  0 18:16 pts/0    00:00:00 grep --color=auto redis

查看下集羣情況

[root@localhost ~]# redis-trib.rb check 127.0.0.1:7001
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: bfcfcdc304b011023fa568e044ea23ea6bc03c3c 127.0.0.1:7001
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: f25b35f208dc96605ee4660994d2ac52f39ac870 127.0.0.1:7006
   slots: (0 slots) slave
   replicates aa6bc3f1e1174c3a991c01882584707c2408ec18
M: aa6bc3f1e1174c3a991c01882584707c2408ec18 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 7908a60306333c5d7c7c5e7ffef44bdf947ef0a4 127.0.0.1:7004
   slots: (0 slots) slave
   replicates bfcfcdc304b011023fa568e044ea23ea6bc03c3c
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[ERR] Not all 16384 slots are corered by nodes.

這裏我們發現出事了,因爲主從節點都掛了 所以有一部分哈希槽沒得分配;

最後一句 [ERR] Not all 16384 slots are covered by nodes. 沒有完全覆蓋,所以不能正常使用集羣;

參考文章:http://blog.csdn.net/dbreawbpcj/article/details/76360099

發佈了72 篇原創文章 · 獲贊 62 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章