第一步:安装Redisnode
前面已经安装过了 不解释,redis
Reids安装包里有个集群工具,要复制到/usr/local/bin里去算法
cp redis-3.2.9/src/redis-trib.rb /usr/local/bin安全
第二步:修改配置,建立节点ruby
咱们如今要搞六个节点,三主三从,app
端口规定分别是7001,7002,7003,7004,7005,7006工具
咱们先在root目录下新建一个redis_cluster目录,而后该目录下再建立6个目录,测试
分别是7001,7002,7003,7004,7005,7006,用来存在redis配置文件;ui
这里咱们要使用redis集群,要先修改redis的配置文件redis.confspa
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 7月 27 17:18 7001
drwxr-xr-x. 2 root root 6 7月 27 17:18 7002
drwxr-xr-x. 2 root root 6 7月 27 17:18 7003
drwxr-xr-x. 2 root root 6 7月 27 17:18 7004
drwxr-xr-x. 2 root root 6 7月 27 17:18 7005
drwxr-xr-x. 2 root root 6 7月 27 17:18 7006
[root@localhost redis_cluster]#
先复制一份配置文件到7001目录下
[root@localhost redis_cluster]# cd
[root@localhost ~]# cp redis-3.2.9/redis.conf redis_cluster/7001/
咱们修改下这个配置文件
vi redis_cluster/7001/redis.conf
修改一下几个
port 7001 //六个节点配置文件分别是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 而后对应的再修改下配置便可;
[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 ~]# vi redis_cluster/7002/redis.conf
[root@localhost ~]# vi redis_cluster/7003/redis.conf
[root@localhost ~]# vi redis_cluster/7004/redis.conf
[root@localhost ~]# vi redis_cluster/7005/redis.conf
[root@localhost ~]# vi redis_cluster/7006/redis.conf
编辑后面5个配置文件,把 port ,pidfile,cluster-config-file 分别修改下便可;
第三步:启动六个节点的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
启动六个节点
[root@localhost ~]# ps -ef | grep redis
查找下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链接
yum -y install ruby ruby-devel rubygems rpm-build
gem install redis
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
建立集群
[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):
从运行结果看 主节点就是7001 7002 7003 从节点分别是7004 7005 7006
7001分配到的哈希槽是 0-5460
7002分配到的哈希槽是 5461-10922
7003分配到的哈希槽是 10923-16383
最后问咱们是否接受上面的设置,输入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.
显示配置哈希槽,以及集群建立成功,能够用了;
第五步:集群数据测试
咱们先链接任意一个节点,而后添加一个key:
redis-cli是redis默认的客户端工具,启动时加上`-c`参数,`-p`指定端口,就能够链接到集群。
链接任意一个节点端口:
[root@localhost ~]# /usr/local/redis/bin/redis-cli -c -p 7002
127.0.0.1:7002>
咱们链接7002
127.0.0.1:7002> set xxx 'fdafda'
-> Redirected to slot [4038] located at 127.0.0.1:7001
OK
前面说过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
这里咱们发现 出事了,由于主从节点都挂了 因此有一部分哈希槽没得分配,最后一句
[ERR] Not all 16384 slots are covered by nodes. 没有安全覆盖;
因此不能正常使用集群;