返回介绍

6 架构篇

发布于 2024-10-03 10:16:42 字数 4682 浏览 0 评论 0 收藏 0

逻辑架构

Reids 逻辑架构包含 Redis Server 与 Redis-WS,如图 1 所示。

图 1 Redis 逻辑架构
1574510074791

  • 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 单实例模式
1574510108802

说明:

  • 一个主实例(master)可以对应有多个从实例(slave),从实例本身还可连接从实例。
  • 发给主实例的命令请求,主实例会实时同步给从实例进行处理。
  • 主实例宕机,从实例不会自动升主。
  • 从实例默认只读,在配置了“slave-read-only”为 no 时,从实例也可写。但从实例重启后,会从主实例同步数据,之前写入从实例的数据丢失。
  • 多层级从实例的结构,相对所有从实例都直接连接在主实例下的结构,由于减少了主实例需要直接同步的从实例个数,一定程度上能提升主实例的业务处理性能。

可伸缩性:Redis 集群

Redis 集群实现有三种方式:客户端分片、代理分片、RedisCluster

方式客户端分片代理分片RedisCluster
简介通过业务代码自己实现路由。分区逻辑包含在客户端代码中。连接到中间件,同中间件来分发请求。代理程序接收到来自业务程序的数据请求,根据路由规则,将这些请求分发给正确的 Redis 实例并返回给业务程序。使用类似 Twemproxy、Codis 等中间件实现。查询路由,官方集群解决方案。任一客户端查询集群中的随机节点将被路由到包含键的正确节点上。
优点可以自己控制分片算法、性能比代理的好运维方便、程序不用关心如何链接 Redis 实例无中心节点,和客户端直连,性能较好
缺点维护成本高、扩容/缩容等运维操作都需要自己研发会带来性能消耗(大概 20%)、无法平滑扩容/缩容,需要执行脚本迁移数据,不方便(Codis 在 Twemproxy 基础上优化并实现了预分片来达到 Auto Rebalance)。方案太重、无法平滑扩容/缩容,需要执行相应的脚本,不方便、太新,没有相应成熟的解决案例

查询路由:Redis 集群当前的实现方式,典型实现有 Twitter 开源的 Twemproxy。常见方法有范围分区、列表分区等等。

  • 范围分区:根据传入键落入特定范围,并将该键划分给此范围所对应的实例。

  • 列表分区:为分区指定一个列表值。如果传入键在某分区列表中,则命中此分区。如全国电话号码分布(将前若干位数字作为分区号)。

  • 哈希分区:对键进行哈希,结果取模操作(%)。

  • 复合分区:范围/列表/哈希组合分区的方式,使用一致性哈希(哈希槽 16384,理论上集群节点数最多 16384 个)。

集群模式

集群模式逻辑部署方式如下图所示:

集群模式
1574510144445

说明:

  • 多个 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 步。

  1. 配置文件修改: 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
  1. 服务注册:命令行输入
redis-server --service-install redis.windows-service-6380.conf --service-name redis6380 --loglevel verbose
  1. 服务启动:命令行输入
redis-server --service-start --service-name redis6380
  1. 客户端启动:命令行输入
redis-cli.exe -p 6379
redis-cli.exe -p 6380

备注:linux 配置一主多从会更简单点,去除服务注册,直接用 redis-server [conf] 启动。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文