相信Redis如何使用大家都已经学会了,但是Redis是如何部署的呢?可能有人会问,这不是运维工程师应该关心的问题么?在计算机中,有很多边界模糊的工作,多了解一些,可以学习到非常多的知识。在生产环境中,我们主要还是采用分布式的部署方案,以尽量地避免单点问题,前面我们已经讲过很多次了,单台机器故障,在生产环境中是发生概率较高的事情,如果因为某台机器故障而影响了整个系统,那只能说明这个系统非常的不健壮。
概况
今天我们来简单介绍下,Redis的官方多机部署方案,Redis Cluster。一组Redis Cluster是由多个Redis实例组成,官方推荐我们使用6实例,其中3个为主节点,3个为从结点。一旦有主节点发生故障的时候,Redis Cluster可以选举出对应的从结点成为新的主节点,继续对外服务,从而保证服务的高可用性。那么对于客户端来说,知道知道对应的key是要路由到哪一个节点呢?原来,Redis Cluster 把所有的数据划分为16384个不同的槽位,可以根据机器的性能把不同的槽位分配给不同的Redis实例,对于Redis实例来说,他们只会存储部门的Redis数据,当然,槽的数据是可以迁移的,不同的实例之间,可以通过一定的协议,进行数据迁移。
数据获取
客户端是如何访问Redis Cluster里面的数据呢?首先客户端需要保存一份Redis Cluster槽相关的信息,也就是路由表,然后对即将访问的key进行哈希计算,计算出对应的槽位,然后向对应的Redis实例发起查询请求。如果访问的Redis实例中,的确保存着对应槽的数据信息,就会进行返回,否则向客户端返回一个Moved指令,让客户端到正确的地址进行获取。
数据迁移
在分布式系统中,衡量一个系统好坏的一项重要指标,系统的扩展性。什么是系统的扩展性呢?就是今天你又10万个用户,需要4台机器进行服务,如果明天的用户数量增加到20万了,是不是只要简单的增加4台机器就行,同时又不需要进行复杂的数据迁移。Redis Cluster便是如此,当你新增一些实例的时候,只需要将一部分槽位迁移到新的实例即可。在迁移的过程中,客户端会先去旧的实例上去查询数据,因为迁移正在发生,如果对应的数据还在本机上,那么直接返回,否则返回让客户端重定向到新的实例。客户端先向新的机器发起ask指令,新实例返回成功后,再一次查询最终的结果。
总结
Redis Cluster已经是一款比较成熟的Redis集群部署方案了, 在Redis Cluster推出后,类似Codis, 推特的Twemproxy也没有更新了。欢迎大家关注我,共同学习,共同进步。大家的支持是我继续唠嗑的动力。