6 架构篇
逻辑架构
Reids 逻辑架构包含 Redis Server 与 Redis-WS,如图 1 所示。
图 1 Redis 逻辑架构
- Redis Server:Redis 组件的核心模块,负责 Redis 协议的数据读写、数据持久化、主从复制、集群功能。
- Redis-WS:Redis WebService 管理模块,主要负责 Redis 集群的创建、扩容、减容、查询、删除等操作,集群管理信息存入 DB 数据库。
备注:每个节点会打开两个 TCP socket。第一个用于标准的 RESP 协议,默认端口是 6369;另一个用于集群间二进制协议,在第一个端口加上 10000。
部署架构~运行模式
表格 Redis 运行模式比较
单实例模式 | 集群模式 | |
---|---|---|
部署方式 | 一主多从,一从多从 | 多主。多个 Redis 实例组合为一个 Redis 集群,共 16384 个槽位均分到各主实例上。 |
可用性 | 主实例宕机,服务终止。从实例默认只读。 | Redis Sentinel,监控主从节点的实例。主实例故障,由集群中剩余的主实例选举出一个从实例升主,需要半数以上主实例 OK 才能选举。 |
可伸缩性 | Redis 集群可以进行扩容、减容(新实例加入集群或 Redis 实例退出集群),并进行槽位迁移。 | |
性能 |
备注:单机版的 Redis 是有数据库概念的,并且每个数据库的数据是隔离的不能共享。集群没有数据库概念。
Redis 实例可以部署在一个或多个节点上,且一个节点上也可以部署一个或多个 Redis 实例(FusionInsight HD 平台中,每个节点上 Redis 实例的个数由软件根据节点硬件资源情况计算得出)。
最新版本的 Redis 支持集群功能,可以将多个 Redis 实例组合为一个 Redis 集群,从而对外提供一个分布式 key-value 数据库。集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。
单实例模式
单实例模式逻辑部署方式如图 2 所示:
图 2 单实例模式
说明:
- 一个主实例(master)可以对应有多个从实例(slave),从实例本身还可连接从实例。
- 发给主实例的命令请求,主实例会实时同步给从实例进行处理。
- 主实例宕机,从实例不会自动升主。
- 从实例默认只读,在配置了“slave-read-only”为 no 时,从实例也可写。但从实例重启后,会从主实例同步数据,之前写入从实例的数据丢失。
- 多层级从实例的结构,相对所有从实例都直接连接在主实例下的结构,由于减少了主实例需要直接同步的从实例个数,一定程度上能提升主实例的业务处理性能。
可伸缩性:Redis 集群
Redis 集群实现有三种方式:客户端分片、代理分片、RedisCluster
方式 | 客户端分片 | 代理分片 | RedisCluster |
---|---|---|---|
简介 | 通过业务代码自己实现路由。分区逻辑包含在客户端代码中。 | 连接到中间件,同中间件来分发请求。代理程序接收到来自业务程序的数据请求,根据路由规则,将这些请求分发给正确的 Redis 实例并返回给业务程序。使用类似 Twemproxy、Codis 等中间件实现。 | 查询路由,官方集群解决方案。任一客户端查询集群中的随机节点将被路由到包含键的正确节点上。 |
优点 | 可以自己控制分片算法、性能比代理的好 | 运维方便、程序不用关心如何链接 Redis 实例 | 无中心节点,和客户端直连,性能较好 |
缺点 | 维护成本高、扩容/缩容等运维操作都需要自己研发 | 会带来性能消耗(大概 20%)、无法平滑扩容/缩容,需要执行脚本迁移数据,不方便(Codis 在 Twemproxy 基础上优化并实现了预分片来达到 Auto Rebalance)。 | 方案太重、无法平滑扩容/缩容,需要执行相应的脚本,不方便、太新,没有相应成熟的解决案例 |
查询路由:Redis 集群当前的实现方式,典型实现有 Twitter 开源的 Twemproxy。常见方法有范围分区、列表分区等等。
范围分区:根据传入键落入特定范围,并将该键划分给此范围所对应的实例。
列表分区:为分区指定一个列表值。如果传入键在某分区列表中,则命中此分区。如全国电话号码分布(将前若干位数字作为分区号)。
哈希分区:对键进行哈希,结果取模操作(%)。
复合分区:范围/列表/哈希组合分区的方式,使用一致性哈希(哈希槽 16384,理论上集群节点数最多 16384 个)。
集群模式
集群模式逻辑部署方式如下图所示:
图 集群模式
说明:
多个 Redis 实例组合为一个 Redis 集群,共 16384 个槽位均分到各主实例上。
集群中的每个实例都记录有槽位与实例的映射关系,客户端也记录了槽位与实例的映射。客户端根据 key 算 hash 并模 16384 得到槽位 (HASH_SLOT=CRC16(key) module 16384),根据槽位-实例映射,将消息直接发送到对应实例处理。
默认情况,从实例不能读不能写,在线执行 readonly 命令可使从实例可读。
主实例故障,由集群中剩余的主实例选举出一个从实例升主,需要半数以上主实例 OK 才能选举。
cluster-require-full-coverage 配置项指示集群是否要求完整,若配置为 yes,则其中一组主从都故障时,集群状态为 FAIL,整个集群不能处理命令;若配置为 no,则半数以上主实例 OK,集群状态还是 OK。
Redis 集群可以进行扩容、减容(新实例加入集群或 Redis 实例退出集群),并进行槽位迁移。
目前 FusionInsight HD 中的 Redis 集群只支持一主一从模式。
windows 下创建多实例(一主多从)
一个 redis 实例对应一个节点,每个节点对应一个配置文件,可配置一个监听端口。每个节点对应下面的 2-3 步。
- 配置文件修改:
redis.windows-service.conf
,命名为redis.windows-service-{port}.conf
,如redis.windows-service-6380.conf
# master port 为 6379
port 6380
slaveof 127.0.0.1 6379
- 服务注册:命令行输入
redis-server --service-install redis.windows-service-6380.conf --service-name redis6380 --loglevel verbose
- 服务启动:命令行输入
redis-server --service-start --service-name redis6380
- 客户端启动:命令行输入
redis-cli.exe -p 6379
redis-cli.exe -p 6380
备注:linux 配置一主多从会更简单点,去除服务注册,直接用 redis-server [conf]
启动。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论