Redis5的集群搭建 2019-09-18 作者:Hap Tool 说道Redis,自然少不了集群。真实生产环境,一般使用都是集群,以应对巨大的缓存数据量。Java分布式技术体系中,使用集群的框架非常之多,但是往往在集群中的节点之间是互相同步数据的,也就是无论应用调用到哪个节点,产生的效果都是一样的。尤其是在我了解服务注册类框架的时候,节点之间的一致性更是硬性要求。 Redis集群给我印象较深的就是节点之间的数据是完全不需要同步的。首先来讲,集群没有Leader,之间的关系互相平等。那Redis集群是怎么存储数据的呢? 我们都知道Redis的数据格式都是key-value,类似于Java中的HashMap。不错,和HashMap的结构类似,Redis集群同样是用key生成出的Hash值来决定保存key-value这对键值的位置。 Redis集群的结构中共有哈希槽16384个,例如集群有三个节点,那这三个节点分配到的哈希槽分别为: node1: 0-5500, node2:5501-11000, node3:11001-16383。 也就是说当保存一对键值的时候,会根据key生成出来的值分配到这三个当中的一个。那么不免会有疑问当键值被保存到node2的情况下,但是我的应用只连接到node1,这个时候怎么处理呢? 应用使用key来获取value的时候,同样使用key来得到键值保存的位置,发现在node2节点后,会跳转到node2,,这样就可以get到相应的值了。 开始动手实践,资源所限只能搭建一个伪集群,首先需要准备6个Redis单节点,为什么要6个呢?因为3个是master,3个是slave。一个master对应一个slave,这两个之间的数据是互相同步,这是Redis为集群的可用性做的设置,如果master挂了,至少slave可以用。当然,如果master和他的所有slave都挂了,那么整个集群也就不可用了。 Redis5的单节点下载和安装可以在这里看到:Redis5单节点下载和安装 单节点的目录和文件结构如下所示: 后续的操作如下: /usr/local下新建文件夹redis-cluster /usr/local/下的redis文件夹复制到redis-cluster文件夹下,改名为redis01 复制redis01,一共复制6份作为集群的子节点,名字按照顺序为redis02,redis03......redis06 修改各节点的redis.conf配置 创建集群并启动 文件夹列表如下: 由于都是在本机启动,所以他们的端口号是不能重复的。进入每个节点,修改redis.conf文件,修改点有两点: 第一个是端口号:Redis01端口号为7001,Redis02端口号为7002,以此类推。 第二个是Cluster的相关配置,将原来注释掉的cluster-enabled和cluster-config-file均放开。 将6个节点的配置文件都修改完成后,我们需要将6个节点都启动起来。鉴于一个个的启动实在麻烦,于是写了一个shell脚本来完成。 6个节点目前都已经按照cluster方式启动,怎么将他们组织为一个集群,需要用到工具redis-tools。本测试机为Ubuntu,使用 sudo apt install redis-tools 即可安装。在任何目录下都可以使用redis-cli命令来连接到Redis服务器 使用redis-tools来创建集群的指令如下: redis-cli --cluster create 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 --cluster-replicas 1 创建过程如图所示: 在图中就可以看到集群自动创建了3个master和3个slave。简单做个测试: 在使用redis-cli连接到集群的时候,除了-p来定义连接的端口外,-c是必须的,否则会出现异常。 (error) MOVED 5798 127.0.0.1:7002 改异常表示连接到node1,但是key得到的位置在node2,这个时候无法从node1跳转到node2去保存键值对。