Redis.1.3 集群功能限制
Redis 集群相对单机在功能上存在一些限制,需要开发人员提前了解,在使用时做好规避。限制如下:
1)key 批量操作支持有限。如 mset、mget,目前只支持具有相同 slot 值的 key执行批量操作。对于映射为不同 slot 值的 key 由于执行 mget、mget 等操作可能存在于多个节点上因此不被支持。
2)key 事务操作支持有限。同理只支持多 key 在同一节点上的事务操作,当多个 key 分布在不同的节点上时无法使用事务功能。
3)key 作为数据分区的最小粒度,因此不能将一个大的键值对象如 hash、list等映射到不同的节点。
4)不支持多数据库空间。单机下的 Redis 可以支持 16 个数据库,集群模式下只能使用一个数据库空间,即 db0。
5)复制结构只支持一层,从节点只能复制主节点,不支持嵌套树状复制结构。
10.2 搭建集群
介绍完 Redis 集群分区规则之后,下面我们开始搭建 Redis 集群。搭建集群工作
需要以下三个步骤:
1) 准备节点。
2) 节点握手。
3) 分配槽。
Redis.2.1 准备节点
Redis 集群一般由多个节点组成,节点数量至少为 6 个才能保证组成完整高可用的集群。每个节点需要开启配置 cluster-enabled yes,让 Redis 运行在集群模式下。建议为集群内所有节点统一目录,一般划分三个目录:conf、data、log,分别存放配置、数据和日志相关文件。把 6 个节点配置统一放在 conf 目录下,集群相关配置如下:
#节点端口
port 6379
# 开启集群模式
cluster-enabled yes
# 节点超时时间, 单位毫秒
cluster-node-timeout 15000
# 集群内部配置文件
cluster-config-file "nodes-6379.conf"
其他配置和单机模式一致即可,配置文件命名规则 redis-{port}.conf,准备好配
置后启动所有节点,命令如下:
redis-server conf/redis-6379.conf
redis-server conf/redis-6380.conf
redis-server conf/redis-6381.conf
redis-server conf/redis-6382.conf
redis-server conf/redis-6383.conf
redis-server conf/redis-6384.conf
检查节点日志是否正确,日志内容如下:
cat log/redis-6379.log
* No cluster configuration found, I'm cfb28ef1deee4e0fa78da86abe5d24566744411e
# Server started, Redis version 3.0.7
* The server is now ready to accept connections on port 6379
6379 节点启动成功,第一次启动时如果没有集群配置文件,它会自动创建一
份,文件名称采用 cluster-config-file 参数项控制,建议采用 node-{port}.conf格式定义,通过使用端口号区分不同节点,防止同一机器下多个节点彼此覆盖,造成集群信息异常。如果启动时存在集群配置文件,节点会使用配置文件内容初始化集群信息。启动过程如图所示
集群模式的 Redis 除了原有的配置文件之外又加了一份集群配置文件。当集群内节点信息发生变化,如添加节点、节点下线、故障转移等。节点会自动保存集群状态到配置文件中。需要注意的是,Redis 自动维护集群配置文件,不要手动修改,防止节点重启时产生集群信息错乱。
如节点 6379 首次启动后生成集群配置如下:
#cat data/nodes-6379.conf
cfb28ef1deee4e0fa78da86abe5d24566744411e 127.0.0.1:6379 myself,master - 0 0 0
connected
vars currentEpoch 0 lastVoteEpoch 0
文件内容记录了集群初始状态,这里最重要的是节点 ID,它是一个 40 位 16 进制字符串,用于唯一标识集群内一个节点,之后很多集群操作都要借助于节点ID 来完成。需要注意是,节点 ID 不同于运行 ID。节点 ID 在集群初始化时只创建一次,节点重启时会加载集群配置文件进行重用,而 Redis 的运行 ID 每次重启都会变化。在节点 6380 执行 cluster nodes 命令获取集群节点状态:
127.0.0.1:6380>cluster nodes
8e41673d59c9568aa9d29fb174ce733345b3e8f1 127.0.0.1:6380 myself,master - 0 0 0
connected
每个节点目前只能识别出自己的节点信息。我们启动 6 个节点,但每个节点彼此并不知道对方的存在,下面通过节点握手让 6 个节点彼此建立联系从而组成一个集群。