redis集群搭建

Posted kevinstark

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis集群搭建相关的知识,希望对你有一定的参考价值。

一:安装redis
1.参照网上的例子。确保机器上面有gcc、ruby环境。验证的命令是:gcc -v、ruby-v。如果没有这两个环境,就需要安装。brew install gcc;brew install ruby
2.下载redis源码。下载地址:http://www.redis.cn/
3.编译安装redis
make
make install PREFIX=/usr/local/redis
cp redis.conf /usr/local/redis/bin/redis.conf
 
4.运行redis
在/usr/local/redis/bin/目录下面,运行  ./redis-server redis.conf 命令
5.验证redis是否启动成功,还是在usr/local/redis/bin/目录下面
MacBook-Pro:bin a$ ./redis-cli -p 6379
127.0.0.1:6379> get
(error) ERR wrong number of arguments for ‘get‘ command
127.0.0.1:6379> set a abc
OK
127.0.0.1:6379> get a
"abc"
127.0.0.1:6379>
 
二:安装集群(集群模式)
1.创建文件夹:usr/local/redis-cluster/
2.将redis文件复制到该目录下面,并且重新命名redis1.复制redis1文件夹五分,从reidis1到redis6
3.要做集群就应当修改这些里面的配置文件。主要的修改内容如下:端口修改从7001-7006
daemonize yes
port 7001
#日志文件
logfile "./redis-7001.log"
protected-mode no
pidfile /var/run/redis_7001.pid
cluster-enabled yes
#注意,这里一定要改,不然默认是通过nodes-6379配置启动,当你启动第二台的时候,就会爆文件被占用的错误
cluster-config-file nodes-7001.conf
2.修改文件权限,否则可能会爆没有权限访问对应的日志文件
chmod 777 xxx
最好将配置redis集群的文件夹的所有者改为当前系统登录人,否则可能会出现一些莫名其妙的错误
chown -R a /usr/local/redis-cluster/
3。配置完后,逐个启动cluster。
MacBook-Pro:redis-cluster a$ ./redis1/redis-server ./redis1/nodes-7001.conf
MacBook-Pro:redis-cluster a$ ./redis3/redis-server ./redis3/nodes-7003.conf
MacBook-Pro:redis-cluster a$ ./redis4/redis-server ./redis4/nodes-7004.conf
MacBook-Pro:redis-cluster a$ ./redis5/redis-server ./redis5/nodes-7005.conf
MacBook-Pro:redis-cluster a$ ./redis6/redis-server ./redis6/nodes-7006.conf 
查看已经启动的线程信息
MacBook-Pro:redis-cluster a$ ps aux|grep redis
a                 3084   0.0  0.0  4276968    884 s003  S+    4:43下午   0:00.00 grep redis
a                 3080   0.0  0.0  4293756   2200   ??  Ss    4:43下午   0:00.01 ./redis6/redis-server 127.0.0.1:7006 [cluster]
a                 3078   0.0  0.0  4301948   2204   ??  Ss    4:43下午   0:00.03 ./redis5/redis-server 127.0.0.1:7005 [cluster]
a                 3075   0.0  0.0  4293756   2208   ??  Ss    4:42下午   0:00.04 ./redis4/redis-server 127.0.0.1:7004 [cluster]
a                 3072   0.0  0.0  4301948   2216   ??  Ss    4:42下午   0:00.05 ./redis3/redis-server 127.0.0.1:7003 [cluster]
a                 3068   0.0  0.0  4293756   2188   ??  Ss    4:41下午   0:00.09 ./redis1/redis-server 127.0.0.1:7001 [cluster]
a                 3062   0.0  0.0  4310140   2256   ??  Ss    4:41下午   0:00.12 ./redis2/redis-server 127.0.0.1:7002 [cluster] 
启动成功后输出。可以看到,01,02,03是master。其他的作为从
#该命令告诉系统我的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
MacBook-Pro:redis-cluster a$ ./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:7005 to 127.0.0.1:7001
Adding replica 127.0.0.1:7006 to 127.0.0.1:7002
Adding replica 127.0.0.1:7004 to 127.0.0.1:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 9ced24811d441e90c1eb45a52a8cb53912ecfced 127.0.0.1:7001
   slots:0-5460 (5461 slots) master
M: c3414bd40496b9f2910f72a41b17463d6ac9d708 127.0.0.1:7002
   slots:5461-10922 (5462 slots) master
M: a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
S: 788447fb1b3445967ea94af22428dab4436105a6 127.0.0.1:7004
   replicates c3414bd40496b9f2910f72a41b17463d6ac9d708
S: 34977fcc52b5bd8c92bb6423c4c386f6e47f97e2 127.0.0.1:7005
   replicates a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1
S: 9a89cd3a46346c1a2314b0b5a9fe8a00ab99d9a7 127.0.0.1:7006
   replicates 9ced24811d441e90c1eb45a52a8cb53912ecfced
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 127.0.0.1:7001)
M: 9ced24811d441e90c1eb45a52a8cb53912ecfced 127.0.0.1:7001
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 788447fb1b3445967ea94af22428dab4436105a6 127.0.0.1:7004
   slots: (0 slots) slave
   replicates c3414bd40496b9f2910f72a41b17463d6ac9d708
S: 34977fcc52b5bd8c92bb6423c4c386f6e47f97e2 127.0.0.1:7005
   slots: (0 slots) slave
   replicates a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1
S: 9a89cd3a46346c1a2314b0b5a9fe8a00ab99d9a7 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 9ced24811d441e90c1eb45a52a8cb53912ecfced
M: c3414bd40496b9f2910f72a41b17463d6ac9d708 127.0.0.1:7002
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
4.测试
一定得使用参数  ./redis6/redis-cli -c  -p 7006
-c -p
-c
连接集群结点时使用,此选项可防止moved和ask异常。
 
技术分享图片
启动一次后,redis的集群就建立好了。从上面的实验可以看出。从库在获取数据的时候,会有一种给人飘忽不定的感觉,在网上查询相关原理是是这样解释的:redis提供的slot(插槽)有16383个,然后在获取的时候是通过CRC(key) % 16383取模的,飘到哪个节点就算是哪个节点。
用集群的方式去部署redis集群,在停掉一个master节点后,在slave上面使用get命令的时候可能会偏移到已经停掉的节点上面,这时会报错  
(error) CLUSTERDOWN The cluster is down
猜想可能使用集群方式部署redis集群,一个master节点挂掉之后,整个集群也就挂掉了。
猜想。可能在7001上面set的值并没有同步到其他节点。7001重启之后整个集群就重新恢复工作了,但是,7001没有关闭之前,7006是7001的从节点,当7001关闭后,7006升级为主节点,重新开启7001后,7001变为7006的从节点。
查看节点信息命令:
./redis1/redis-cli -p 7001 cluster nodes
返回结果:
9ced24811d441e90c1eb45a52a8cb53912ecfced 127.0.0.1:[email protected] myself,slave 9a89cd3a46346c1a2314b0b5a9fe8a00ab99d9a7 0 1527641808000 1 connected
9a89cd3a46346c1a2314b0b5a9fe8a00ab99d9a7 127.0.0.1:[email protected] master - 0 1527641807000 7 connected 0-5460
34977fcc52b5bd8c92bb6423c4c386f6e47f97e2 127.0.0.1:[email protected] slave a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 0 1527641807547 5 connected
c3414bd40496b9f2910f72a41b17463d6ac9d708 127.0.0.1:[email protected] master - 0 1527641808000 2 connected 5461-10922
a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 127.0.0.1:[email protected] master - 0 1527641808556 3 connected 10923-16383
788447fb1b3445967ea94af22428dab4436105a6 127.0.0.1:[email protected] slave c3414bd40496b9f2910f72a41b17463d6ac9d708 0 1527641809563 4 connected
 
查看集集群状态:
cluster nodes
返回结果
技术分享图片
 
给slave节点赋值master节点命令:
#最后这个参数是通过cluster node命令得到的master的hash值
./redis4/redis-cli -p 7006 cluster replicate a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1
让所有节点相互感知:cluster meet 命令
MacBook-Pro:redis-cluster a$ ./redis3//redis-cli -p 7003 cluster meet 127.0.0.1 7001
OK
MacBook-Pro:redis-cluster a$ ./redis3//redis-cli -p 7003 cluster meet 127.0.0.1 7002
OK
MacBook-Pro:redis-cluster a$ ./redis3//redis-cli -p 7003 cluster meet 127.0.0.1 7004
OK
MacBook-Pro:redis-cluster a$ ./redis3//redis-cli -p 7003 cluster meet 127.0.0.1 7005
OK
MacBook-Pro:redis-cluster a$ ./redis3//redis-cli -p 7003 cluster meet 127.0.0.1 7006
查看集群状态
查看对应节点的集群状态:cluster info
如果查看到对应的节点的集群状态是fail,那么使用cluster meet命令与其他节点相互感知。然后在重新启动。
127.0.0.1:7003> cluster info
cluster_state:fail  //表明集群已经挂了。
cluster_slots_assigned:16381
cluster_slots_ok:16381
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6 //集群节点数
cluster_size:3
cluster_current_epoch:8
cluster_my_epoch:3
cluster_stats_messages_ping_sent:1962
cluster_stats_messages_pong_sent:1954
cluster_stats_messages_sent:3916
cluster_stats_messages_ping_received:1953
cluster_stats_messages_pong_received:1962
cluster_stats_messages_meet_received:1
cluster_stats_messages_received:3916
当通过cluster info命令查看到状态是fail并且其他参数都是正常的时候,说明此时redis集群已经挂了。所以你在命令行输入获取或者添加的命名就会报异常,此时需要将所有节点重启。
redis集群挂掉的原因:
    1.集群的任意master挂掉,并且该master没有相应的slave
    2.超过半数以上的master挂掉
 
二:哨兵模式建立redis集群(sentinel)
工作模式:
    设置一个节点为master,多个监控器(sentinels)。当sentinel主观判断master下线时,系统会自动从slave节点中选举一个作为新的master节点。
使用哨兵模式搭建的redis集群,slave节点不允许写数据,只能够读取数据,要想写数据智能切换到master节点
同上,需要建立几个节点信息。修改对应的配置文件。
复制建立redis1,redis2,redis3.。。。。
修改配置文件。需要将 cluster-enable yes改为no
daemonize yes
Port 7001
#Bind 127.0.0.1
logfile "./redis-7001.log"
protected-mode no
cluster-config-file nodes-7001.conf
改完后,分别启动对应的节点。并进入到该节点中手动指定对应的主节点.
#如果之前的cluster-enable yes没改的话。运行这个命令就会报错
salveof 127.0.0.0 7001
sentinel
从redis的压缩包复制sentinel.conf过来。修改对应的配置信息
port 7005
#设置127.0.0.1 的7001是master,并且当2个sentinel监控他挂掉再从slave中选举节点来做为master
sentinel monitor mymaster 127.0.0.1 7001 2
protected-mode no
 
启动sentinel实例
./redis-sentinel/sentinel1/redis-sentinel ./redis-sentinel/sentinel1/sentinel.conf &
进入sentinel查看相关的监控信息
 
MacBook-Pro:local a$ ./redis/bin/redis-cli -p 27001
127.0.0.1:27001> sentinel masters
相关命令
① INFO 
sentinel的基本状态信息 
②SENTINEL masters 
列出所有被监视的主服务器,以及这些主服务器的当前状态 
③ SENTINEL slaves 
列出给定主服务器的所有从服务器,以及这些从服务器的当前状态 
④SENTINEL get-master-addr-by-name 
返回给定名字的主服务器的 IP 地址和端口号 
⑤SENTINEL reset 
重置所有名字和给定模式 pattern 相匹配的主服务器。重置操作清除主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的所有从服务器和 Sentinel 。 
⑥SENTINEL failover 
当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移,但是它会给其他sentinel发送一个最新的配置,其他sentinel会根据这个配置进行更新
 
现在默认的主是7001节点。当手动杀掉7001节点后,27001,27002这两个哨兵主观判断7001节点已经挂掉就选举出7003来当选新的master节点。
技术分享图片

以上是关于redis集群搭建的主要内容,如果未能解决你的问题,请参考以下文章

Redis Cluster集群的搭建

Redis实战-Redis集群环境搭建(自动搭建)

Redis实战-Redis集群环境搭建(自动搭建)

一般Redis集群搭建采用几台服务器?

redis集群搭建怎么分配内存的

Redis Cluster基于Docker的集群搭建