1、服务器集群
服务器 redis节点
node-i(192.168.0.168) 7001,7002
node-ii(192.168.0.169) 7003,7004
node-iii(192.168.0.170) 7005,7006
    三个节点都关闭防火墙:

    systemctl stop iptables
    systemctl stop firewalld
    

    查看防火墙状态:

    systemctl status iptables
    systemctl status firewalld

2、安装gcc

 

    redis进行源码安装,先要安装gcc,再make redis。执行以下命令安装redis:

    yum -y install gcc gcc-c++ libstdc++-devel

    

3、安装ruby

 

执行以下命令安装ruby2.5,如果ruby版本过低,无法启动redis集群。

    yum install -y centos-release-scl-rh
    yum install -y rh-ruby25
    scl enable rh-ruby25 bash

    检验并查看ruby版本:

    ruby -v

    最后执行如下命令:

    gem install redis

    

 

4、配置redis节点
(1)、node-i(192.168.0.168)

    (a).安装redis

 

    从redis官网https://redis.io/下载redis最新版本redis-4.0.11。或者 wget http://download.redis.io/releases/redis-4.0.11.tar.gz

    解压redis:

    tar -zxvf redis-4.0.11.tar.gz

    

 

    创建redis目录:

    mkdir -p /usr/local/redis-i
    mkdir -p /usr/local/redis-cluster/7001 /usr/local/redis-cluster/7002

    解压redis:

    tar -zxvf redis-4.0.11.tar.gz

    进入redis-4.0.11目录,执行make命令,将redis安装在/usr/local/redis-i目录下:

    make install PREFIX=/usr/local/redis-i

    复制redis.conf到redis集群节点目录下:

    cp redis.conf /usr/local/redis-cluster/7001
    cp redis.conf /usr/local/redis-cluster/7002

    进入/usr/local/redis-i目录,将生成的 bin目录复制到redis集群节点目录下:

    cp -r bin /usr/local/redis-cluster/7001
    cp -r bin /usr/local/redis-cluster/7002

    分别修改节点7001、7002的配置文件redis.conf,修改如下:

    7001:

bind 192.168.0.168
protected-mode no
port 7001
daemonize yes
cluster-enabled yes
cluster-node-timeout 15000
    7002:

bind 192.168.0.168
protected-mode no
port 7002
daemonize yes
cluster-enabled yes
cluster-node-timeout 15000
    (b).启动redis节点

    分别启动7001和7002节点:

    分别在/usr/local/redis-cluster/7001和/usr/local/redis-cluster/7002目录,执行如下命令: 

    ./bin/redis-server ./redis.conf

    通过ps命令查看启动的redis节点:

    ps -ef|grep redis

(2)、node-ii(192.168.0.169)

    (a).安装redis

    创建redis目录:

    mkdir -p /usr/local/redis-ii
    mkdir -p /usr/local/redis-cluster/7003 /usr/local/redis-cluster/7004

    解压redis:

    tar -zxvf redis-4.0.11.tar.gz

    进入redis-4.0.11目录,执行make命令,将redis安装在/usr/local/redis-ii目录下:

    make install PREFIX=/usr/local/redis-ii

    复制redis.conf到redis集群节点目录下:

    cp redis.conf /usr/local/redis-cluster/7003
    cp redis.conf /usr/local/redis-cluster/7004

    进入/usr/local/redis-ii目录,将生成的 bin目录复制到redis集群节点目录下:

    cp -r bin /usr/local/redis-cluster/7003
    cp -r bin /usr/local/redis-cluster/7004

    分别修改节点7003、7004的配置文件redis.conf,修改如下:

    7003:

bind 192.168.0.169
protected-mode no
port 7003
daemonize yes
cluster-enabled yes
cluster-node-timeout 15000
    7004:

bind 192.168.0.169
protected-mode no
port 7004
daemonize yes
cluster-enabled yes
cluster-node-timeout 15000
    (b).启动redis节点

    分别启动7003和7004节点:

    分别在/usr/local/redis-cluster/7003和/usr/local/redis-cluster/7004目录,执行如下命令: 

    ./bin/redis-server ./redis.conf

    通过ps命令查看启动的redis节点:

    ps -ef|grep redis

(3)、node-iii(192.168.0.170)

    (a).安装redis

    创建redis目录:

    mkdir -p /usr/local/redis-iii
    mkdir -p /usr/local/redis-cluster/7005 /usr/local/redis-cluster/7006

    解压redis:

    tar -zxvf redis-4.0.11.tar.gz

    进入redis-4.0.11目录,执行make命令,将redis安装在/usr/local/redis-iii目录下:

    make install PREFIX=/usr/local/redis-iii

    复制redis.conf到redis集群节点目录下:

    cp redis.conf /usr/local/redis-cluster/7005
    cp redis.conf /usr/local/redis-cluster/7006

    进入/usr/local/redis-iii目录,将生成的 bin目录复制到redis集群节点目录下:

    cp -r bin /usr/local/redis-cluster/7005
    cp -r bin /usr/local/redis-cluster/7006

    分别修改节点7005、7006的配置文件redis.conf,修改如下:

    7005:

bind 192.168.0.170
protected-mode no
port 7005
daemonize yes
cluster-enabled yes
cluster-node-timeout 15000
    7006:

bind 192.168.0.170
protected-mode no
port 7006
daemonize yes
cluster-enabled yes
cluster-node-timeout 15000
    (b).启动redis节点

    分别启动7005和7006节点:

    分别在/usr/local/redis-cluster/7005和/usr/local/redis-cluster/7006目录,执行如下命令: 

    ./bin/redis-server ./redis.conf

    通过ps命令查看启动的redis节点:

    ps -ef|grep redis

5、启动redis集群
    以上步骤完成,6个redis节点都已经启动完成。现在启动redis集群,在任一服务器上都可以启动集群,进入最开始解压出来的redis-4.0.11目录的src子目录,执行如下命令启动redis集群:

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

 

 

[root@localhost src]# ./redis-trib.rb create --replicas 1 192.168.0.168:7001 192.168.0.168:7002 192.168.0.169:7003 192.168.0.169:7004 192.168.0.170:7005 192.168.0.170:7006
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.0.168:7001
192.168.0.169:7003
192.168.0.170:7005
Adding replica 192.168.0.169:7004 to 192.168.0.168:7001
Adding replica 192.168.0.170:7006 to 192.168.0.169:7003
Adding replica 192.168.0.168:7002 to 192.168.0.170:7005
M: 30e71932ee92893bcf28f7e4d3b5a7a84ad205c3 192.168.0.168:7001
slots:0-5460 (5461 slots) master
S: 5c0f265eb2e46e1189181b7d5d709a4f7f595cfe 192.168.0.168:7002
replicates 8e34e11d03fa3dd22afde2a96ccbb66aeb805132
M: 226ab6b2176950dec24945cef4d4ccab1169a79c 192.168.0.169:7003
slots:5461-10922 (5462 slots) master
S: ccce10f5da67155479a8c515df65323aa6adb06a 192.168.0.169:7004
replicates 30e71932ee92893bcf28f7e4d3b5a7a84ad205c3
M: 8e34e11d03fa3dd22afde2a96ccbb66aeb805132 192.168.0.170:7005
slots:10923-16383 (5461 slots) master
S: b3b520a1957142cd6c7fa1e1e8aa4cf588ea1282 192.168.0.170:7006
replicates 226ab6b2176950dec24945cef4d4ccab1169a79c
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.0.168:7001)
M: 30e71932ee92893bcf28f7e4d3b5a7a84ad205c3 192.168.0.168:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: ccce10f5da67155479a8c515df65323aa6adb06a 192.168.0.169:7004
slots: (0 slots) slave
replicates 30e71932ee92893bcf28f7e4d3b5a7a84ad205c3
M: 8e34e11d03fa3dd22afde2a96ccbb66aeb805132 192.168.0.170:7005
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: 5c0f265eb2e46e1189181b7d5d709a4f7f595cfe 192.168.0.168:7002
slots: (0 slots) slave
replicates 8e34e11d03fa3dd22afde2a96ccbb66aeb805132
M: 226ab6b2176950dec24945cef4d4ccab1169a79c 192.168.0.169:7003
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: b3b520a1957142cd6c7fa1e1e8aa4cf588ea1282 192.168.0.170:7006
slots: (0 slots) slave
replicates 226ab6b2176950dec24945cef4d4ccab1169a79c
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

 

 

6、验证集群
    从任一主机进入任一redis节点,如从192.168.0.168主机中进入7001节点:

    进入7001目录:

    cd /usr/local/redis-cluster/7001

    登录7001节点:

    ./bin/redis-cli -c -h 192.168.0.168 -p 7001

    写入一个数据:

    set redis cluster

    之后进入其他节点,查看redis中的数据,如登录7005节点:

    ./bin/redis-cli -c -h 192.168.0.170 -p 7005

    查看redis数据:

    get redis

 

 

redis cluster命令

集群(cluster)  
cluster info       打印集群的信息
cluster nodes   列出集群当前已知的所有节点(node),以及这些节点的相关信息   
节点(node)  
cluster meet <ip> <port>       将ip和port所指定的节点添加到集群当中,让它成为集群的一份子  
cluster forget <node_id>        从集群中移除node_id指定的节点
cluster replicate <node_id>   将当前节点设置为node_id指定的节点的从节点
cluster saveconfig                   将节点的配置文件保存到硬盘里面
cluster slaves <node_id>       列出该slave节点的master节点
cluster set-config-epoch        强制设置configEpoch 
槽(slot)  
cluster addslots <slot> [slot ...]                         将一个或多个槽(slot)指派(assign)给当前节点
cluster delslots <slot> [slot ...]                          移除一个或多个槽对当前节点的指派 
cluster flushslots                                                移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点 
cluster setslot <slot> node <node_id>            将槽slot指派给node_id指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽,然后再进行指派 
cluster setslot <slot> migrating <node_id>   将本节点的槽slot迁移到node_id指定的节点中  
cluster setslot <slot> importing <node_id>   从node_id 指定的节点中导入槽slot到本节点 
cluster setslot <slot> stable                             取消对槽slot的导入(import)或者迁移(migrate) 
键(key)  
cluster keyslot <key>                                       计算键key应该被放置在哪个槽上  
cluster countkeysinslot <slot>                         返回槽slot目前包含的键值对数量 
cluster getkeysinslot <slot> <count>              返回count个slot槽中的键
其它
cluster myid       返回节点的ID
cluster slots       返回节点负责的slot
cluster reset      重置集群,慎用

redis cluster配置
cluster-enabled yes
如果配置yes则开启集群功能,此redis实例作为集群的一个节点,否则,它是一个普通的单一的redis实例。

cluster-config-file nodes-6379.conf
虽然此配置的名字叫"集群配置文件",但是此配置文件不能人工编辑,它是集群节点自动维护的文件,主要用于记录集群中有哪些节点、他们的状态以及一些持久化参数等,方便在重启时恢复这些状态。通常是在收到请求之后这个文件就会被更新。
 
cluster-node-timeout 15000
这是集群中的节点能够失联的最大时间,超过这个时间,该节点就会被认为故障。如果主节点超过这个时间还是不可达,则用它的从节点将启动故障迁移,升级成主节点。注意,任何一个节点在这个时间之内如果还是没有连上大部分的主节点,则此节点将停止接收任何请求。一般设置为15秒即可。

cluster-slave-validity-factor 10
如果设置成0,则无论从节点与主节点失联多久,从节点都会尝试升级成主节点。如果设置成正数,则cluster-node-timeout乘以cluster-slave-validity-factor得到的时间,是从节点与主节点失联后,此从节点数据有效的最长时间,超过这个时间,从节点不会启动故障迁移。假设cluster-node-timeout=5,cluster-slave-validity-factor=10,则如果从节点跟主节点失联超过50秒,此从节点不能成为主节点。注意,如果此参数配置为非0,将可能出现由于某主节点失联却没有从节点能顶上的情况,从而导致集群不能正常工作,在这种情况下,只有等到原来的主节点重新回归到集群,集群才恢复运作。

cluster-migration-barrier 1
主节点需要的最小从节点数,只有达到这个数,主节点失败时,它从节点才会进行迁移。更详细介绍可以看本教程后面关于副本迁移到部分。

cluster-require-full-coverage yes
在部分key所在的节点不可用时,如果此参数设置为"yes"(默认值), 则整个集群停止接受操作;如果此参数设置为”no”,则集群依然为可达节点上的key提供读操作。

redis cluster状态
127.0.0.1:8001> cluster info
cluster_state:ok             

如果当前redis发现有failed的slots,默认为把自己cluster_state从ok个性为fail, 写入命令会失败。如果设置cluster-require-full-coverage为no,则无此限制。
cluster_slots_assigned:16384   #已分配的槽
cluster_slots_ok:16384              #槽的状态是ok的数目
cluster_slots_pfail:0                    #可能失效的槽的数目
cluster_slots_fail:0                      #已经失效的槽的数目
cluster_known_nodes:6             #集群中节点个数
cluster_size:3                              #集群中设置的分片个数
cluster_current_epoch:15          #集群中的currentEpoch总是一致的,currentEpoch越高,代表节点的配置或者操作越新,集群中最大的那个node epoch
cluster_my_epoch:12                 #当前节点的config epoch,每个主节点都不同,一直递增, 其表示某节点最后一次变成主节点或获取新slot所有权的逻辑时间.
cluster_stats_messages_sent:270782059
cluster_stats_messages_received:270732696

127.0.0.1:8001> cluster nodes
25e8c9379c3db621da6ff8152684dc95dbe2e163 192.168.64.102:8002 master - 0 1490696025496 15 connected 5461-10922
d777a98ff16901dffca53e509b78b65dd1394ce2 192.168.64.156:8001 slave 0b1f3dd6e53ba76b8664294af2b7f492dbf914ec 0 1490696027498 12 connected
8e082ea9fe9d4c4fcca4fbe75ba3b77512b695ef 192.168.64.108:8000 master - 0 1490696025997 14 connected 0-5460
0b1f3dd6e53ba76b8664294af2b7f492dbf914ec 192.168.64.170:8001 myself,master - 0 0 12 connected 10923-16383
eb8adb8c0c5715525997bdb3c2d5345e688d943f 192.168.64.101:8002 slave 25e8c9379c3db621da6ff8152684dc95dbe2e163 0 1490696027498 15 connected
4000155a787ddab1e7f12584dabeab48a617fc46 192.168.67.54:8000 slave 8e082ea9fe9d4c4fcca4fbe75ba3b77512b695ef 0 1490696026497 14 connected
#说明
节点ID:例如25e8c9379c3db621da6ff8152684dc95dbe2e163
ip:port:节点的ip地址和端口号,例如192.168.64.102:8002
flags:节点的角色(master,slave,myself)以及状态(pfail,fail)
如果节点是一个从节点的话,那么跟在flags之后的将是主节点的节点ID,例如192.168.64.156:8001主节点的ID就是0b1f3dd6e53ba76b8664294af2b7f492dbf914ec
集群最近一次向节点发送ping命令之后,过了多长时间还没接到回复
节点最近一次返回pong回复的时间
节点的配置纪元(config epoch)
本节点的网络连接情况
节点目前包含的槽,例如192.168.64.102:8002目前包含的槽为5461-10922