先看一张图,大致触摸下Redis Cluster
Redis Cluster要求至少需要3个master才能组成一个集群,同时每个master至少需要有一个slave节点。各个节点之间保持TCP通信。当master发生了宕机, Redis Cluster自动会将对应的slave节点提拔为master,来重新对外提供服务。
Redis Cluster 功能 : 负载均衡,故障切换,主从复制 。
负载均衡
先说下槽,集群中每个redis实例都负责接管一部分槽,总槽数为:16384(2^14),如果有3台master,那么每台负责5461个槽(16384/3)。
redis节点 | 负责的槽位 |
---|---|
节点1 | 0-5461 |
节点2 | 5461-10922 |
节点3 | 10922-16383 |
当redis客户端设置值时,会拿key进行CRC16算法,然后 跟16384取模,得到的就是落在哪个槽位,根据上面表格就得出在哪台节点上。槽公式如下:
slot = CRC16(key) & 16383
Redis集群中,每个节点都会有其余节点ip,负责的槽 等 信息。
JedisCluster如何寻址集群的?
JedisCluster配置只用指定集群中某一个节点的IP,端口信息就可以了。JedisCluster初始化时,会找配置的节点获取整个集群的信息(cluster nodes命令)。
解析集群信息,得到集群中所有master信息,然后遍历每台master,通过ip,端口构建jedis实例,然后put到一个全局nodes变量里面(Map类型) , key为ip,端口,值为Jedis实例,nodes值如下:
nodes={172.19.93.120:6380=redis.clients.jedis.JedisPool@74ad1f1f,.....}
在上面遍历master过程中,还做一件事,遍历此台master负责的槽索引,然后又put到一个全局map slots里面。值为上面的Jedis实例, slots值如下:
slots={0=redis.clients.jedis.JedisPool@74ad1f1f,
1=redis.clients.jedis.JedisPool@74ad1f1f,
2=redis.clients.jedis.JedisPool@74ad1f1f,
....
5461 = redis.clients.jedis.JedisPool@65aa1f2f, ####另外的master机器
....
16383=r