Redis集群学习

参考文章:

https://www.cnblogs.com/boshen-hzb/p/7699783.html

sentinel monitor mymaster 127.0.0.1 7001 2

一:安装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异常。

 

133008_D41F_3711426.png

启动一次后,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:7001@17001 myself,slave 9a89cd3a46346c1a2314b0b5a9fe8a00ab99d9a7 0 1527641808000 1 connected

9a89cd3a46346c1a2314b0b5a9fe8a00ab99d9a7 127.0.0.1:7006@17006 master - 0 1527641807000 7 connected 0-5460

34977fcc52b5bd8c92bb6423c4c386f6e47f97e2 127.0.0.1:7005@17005 slave a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 0 1527641807547 5 connected

c3414bd40496b9f2910f72a41b17463d6ac9d708 127.0.0.1:7002@17002 master - 0 1527641808000 2 connected 5461-10922

a3dd91b0119fc9ccd9c75a27af241d6d3bd017d1 127.0.0.1:7003@17003 master - 0 1527641808556 3 connected 10923-16383

788447fb1b3445967ea94af22428dab4436105a6 127.0.0.1:7004@17004 slave c3414bd40496b9f2910f72a41b17463d6ac9d708 0 1527641809563 4 connected

查看集集群状态:

cluster nodes

返回结果

132954_RDiq_3711426.png

 

给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节点。

 

转载于:https://my.oschina.net/u/3711426/blog/1821131

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值