Redis(五)集群
(a)是什么?
1)当容量不够时,redis如何进行扩容?
当并发写操作时,redis如何分摊?
当使用主从模式,薪火相传模式,主机宕机,导致ip地址发生变化。应用程序中配置需要修改对应的主机地址,端口等信息。
2) 在redis-3之前通过代理主机解决这些问题,redis-3后提供了 无中心化集群 配置解决方案(任何一台服务器都可以作为集群的入口,服务器之间可以互相连接。当以一台服务器为入口,但是请求不在这台服务器上,就交给集群中的下一台服务器进行匹配。同代理主机相比,需要主机更少)。
3)redis集群实现了对redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
4)redis集群可通过分区来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。
(b)集群的实现
尚硅谷redis集群的实现
1)注意:
一个集群最少要有三个主节点;
选项(cluster-replicas 1)表示我们希望为集群中的每个主节点创建一个从节点;
分配原则尽量保证每个主服务器运行在不同的IP地址,每个从库和主库不在一个IP地址上。
2)Slots(插槽):
一个redis集群包含16384个插槽(hash slot),数据库中每个键都属于这16384个插槽中的一个。
集群使用公式CRC16(key)%16384来计算键key属于哪个槽,其中CRC16(key)语句用于计算键key的CRC16校验和。
集群中每个节点负责处理一部分插槽(如一个集群中有三个主节点-相对应3个从节点;节点A处理0-5460,节点B处理5461-10922,节点C处理10923-16383)。插槽属于哪个主服务器,则切换到这个服务器进行操作,后续再重复。
目的:为了把值平均分摊到集群中的不同主服务器。
3)在集群中录入值:
在redis-cli每次录入、查询键值,redis都会计算出该key应该送往的插槽,如果不是该客户端对应服务器的插槽,redis会报错,并告知应前往的redis实例地址和端口。
不在一个slot下的键值,是不能使用mget,mset等多键操作。
可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。
4)查询集群中的值
使用CLUSTER GETKEYSINSLOT 返回 count 个 slot 槽中的键。
第一个cluster操作为查询cust的插槽值。
第二个命令为查询4847插槽中有几个key键。
第三个命令为查询插槽中具体的key键。10表示返回key键的数量,这里只有三个,则返回三个。
(c)集群中的Jedis开发
尚硅谷集群的Jedis开发
1)配合redis-6官方文档操作效果更好。
2)注:
即使连接的不是主机,集群会自动切换主机存储,主机写,从机读。
无中心化主从集群。无论从哪台主机写数据,其它主机都能读到数据。
(d)redis集群的优缺点
1)优点:
实现扩容
分摊压力
无中心化配置相对简单
2)缺点:
多键操作不被支持
多键的Redis事务不被支持,lua脚本不被支持
许多公司使用其它集群方案,如迁移到redis集群,复杂度较高。