错过血亏!深入学习Redis集群搭建方案及实现原理

作者:微信小助手

发布时间:2018-10-29T18:12:16

在前面的文章中已经介绍了 Redis 的几种高可用技术:持久化主从复制哨兵,但这些方案仍有不足,其中最主要的问题是存储能力受单机限制,以及无法实现写操作的负载均衡。


本文将详细介绍集群,主要内容包括:

  • 集群的作用

  • 集群的搭建方法及设计方案

  • 集群的基本原理

  • 客户端访问集群的方法

  • 实践须知(集群伸缩、故障转移、参数优化等)


集群的作用


集群,即 Redis Cluster,是 Redis 3.0 开始引入的分布式存储方案。集群由多个节点(Node)组成,Redis 的数据分布在这些节点中。


集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。


集群的作用,可以归纳为两点:


数据分区


数据分区(或称数据分片)是集群最核心的功能。集群将数据分散到多个节点:

  • 一方面突破了 Redis 单机内存大小的限制,存储容量大大增加。

  • 另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。


Redis 单机内存大小受限问题,在介绍持久化和主从复制时都有提及。


例如,如果单机内存太大,bgsave 和 bgrewriteaof 的 fork 操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。


高可用


集群支持主从复制和主节点的自动故障转移(与哨兵类似),当任一节点发生故障时,集群仍然可以对外提供服务。本文内容基于 Redis 3.0.6。


集群的搭建


我们将搭建一个简单的集群:共 6 个节点,3 主 3 从。方便起见,所有节点在同一台服务器上,以端口号进行区分,配置从简。


3个主节点端口号:7000/7001/7002;对应的从节点端口号:8000/8001/8002。


集群的搭建有两种方式:

  • 手动执行 Redis 命令,一步步完成搭建

  • 使用 Ruby 脚本搭建


两者搭建的原理是一样的,只是 Ruby 脚本将 Redis 命令进行了打包封装;在实际应用中推荐使用脚本方式,简单快捷不容易出错。下面分别介绍这两种方式。


执行 Redis 命令搭建集群


集群的搭建可以分为四步:

  • 启动节点:将节点以集群模式启动,此时节点是独立的,并没有建立联系。

  • 节点握手:让独立的节点连成一个网络。

  • 分配槽:将 16384 个槽分配给主节点。

  • 指定主从关系:为从节点指定主节点。


实际上,前三步完成后集群便可以对外提供服务;但指定从节点后,集群才能够提供真正高可用的服务。


启动节点


集群节点的启动仍然是使用 redis-server 命令,但需要使用集群模式启动。


下面是 7000 节点的配置文件(只列出了节点正常工作关键配置,其他配置,如开启 AOF,可以参照单机节点进行):

#redis-7000.conf
port 7000
cluster-enabled yes
cluster-config-file "node-7000.conf"
logfile "log-7000.log"
dbfilename "dump-7000.rdb"
daemonize yes


其中的 cluster-enabled 和 cluster-config-file 是与集群相关的配置。


cluster-enabledyes:Redis 实例可以分为单机模式(standalone)和集群模式(cluster);cluster-enabledyes 可以启动集群模式。