作者:微信小助手
发布时间: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 可以启动集群模式。