redis 集群
一、配置集群
一个 Redis 集群通常由多个节点(至少3个)组成, 在刚开始的时候, 每个节点都是相互独立的, 它们都处于一个只包含自己的集群当中, 要组建一个真正可工作的集群, 我们可以使用 CLUSTER MEET 命令将各个独立的节点连接起来。
使用命令:CLUSTER MEET 127.0.0.1 7002
最终达到这种状况
集群的数据分片
Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念.
Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:
- 节点 A 包含 0 到 5500号哈希槽.
- 节点 B 包含5501 到 11000 号哈希槽.
- 节点 C 包含11001 到 16384号哈希槽.
这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D, 我需要从节点 A, B, C中得部分槽到D上. 如果我想移除节点A,需要将A中的槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可. 由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态
二、配置主从模式
主从模式特点是:
(1)主节点Master可读、可写.
(2)从节点Slave只读。(read-only)
我们通过使用slaveof命令或者配置,可以配置主从模式
在7003上使用命令:SLAVEOF 127.0.0.1 7000
三、配置sentinel
sentinel模式的特点:
1.sentinel模式是建立在主从模式的基础上,当master挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master。
当master重新启动后,它将不再是master而是做为slave接收新的master的同步数据。
2.sentinel因为也是一个进程有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群,sentinel之间也会自动监控。
sentinel工作机制:
1. 在一般情况下, 每个sentinel会以每 10 秒一次的频率向它已知的所有master,发送 INFO 命令,获取主从关系、slave信息。
2. sentinel 向 Master/Slave 发送 SUBSCRIBE 命令,订阅 Master 的 Hello Channel (SUBSCRIBE __sentinel__:hello),等待接收消息,发送PUBLISH命令,扩散消息(当前Sentinel/Master 信息 )。sentinel 接收到了 Master/Slave 中 Hello Channel 中的消息,得到其他的Sentinel 信息,然后保存到对应Master 下的 Sentinels 列表中。至此,整个 sentinel 结构中的节点数据基本完善。
3.每个sentinel以每秒钟一次的频率向它所知的master,slave以及其他sentinel实例发送一个 PING 命令
4.如果一个实例距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被sentinel标记为主观下线。
5.如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态,当有足够数量的sentinel(大于等于配置文件指定的值)在指定的时间范围内确认master的确进入了主观下线状态, 则master会被标记为客观下线。
6.若没有足够数量的sentinel同意master已经下线,master的客观下线状态就会被移除; 若master重新向sentinel的 PING 命令返回有效回复,master的主观下线状态就会被移除。
配置哨兵
在所有节点修改配置文件
logfile "/var/log/sentinel.log" #日志文件
bind 192.168.253.128 #监听的ip地址,根据节点不同进行调整
sentinel monitor mymaster 192.168.253.128 6379 2
#配置监控的主节点
#这个配置项格式为sentinel monitor <master-group-name> <ip> <port> <quorum>
#意义为监视一个名为mymaster的主节点(这里的mymaster可以自定义,主要是为了标识这个集群)
#主节点ip地址是192.168.253.128,端口为6379
#法定票数为2票。表示至少需要2个哨兵认为节点down了,才算down了。
启动sentinel
redis-sentinel /etc/sentinel.conf
相关测试
查看主节点信息
[root@localhost ~]# redis-cli -h 192.168.253.128 -p 26379
192.168.253.128:26379> sentinel master mymaster
查看从节点信息
192.168.253.128:26379> sentinel slaves mymaster
查看其他sentinel信息
192.168.253.128:26379> sentinel sentinels mymaster
sentinel常用的几个命令
SENTINEL masters #查看主节点信息
SENTINEL slaves <MASTER_NAME> #查看对应集群的从节点信息
SENTINEL failover <MASTER_NAME> #进行故障转移
SENTINEL get-master-addr-by-name <MASTER_NAME> #查看当前的主节点地址