Redis 生产架构选型对比,一文整治选择困难症

前言

在写开源项目的时候,想到了要支持多种redis部署方式,于是对于这块的生产环境的架构选型展开调研。

一、引擎版本

推荐使用更新的引擎版本以支持更多的特性,

Redis 6.0新特性说明

  • 模块系统新增多个API。
  • 支持SSL/TLS加密。
  • 支持新的Redis协议:RESP3。
  • 服务端支持多模式的客户端缓存。
  • 支持多线程IO。
  • 副本中支持无盘复制(diskless replication)。
  • Redis-benchmark新增了Redis集群模式。
  • 支持重写Systemd。
  • 支持Disque模块。

Redis 5.0新特性说明

  • 云数据库Redis 5.0版本大幅度优化内核,运行更加稳定,同时新增Stream、账号管理、审计日志等多种特性,满足您更多场景下的使用需求。
  • 新的数据类型:流数据(Stream)。详细说明请参见Redis Streams。
  • 新增账号管理功能。
  • 新增日志管理功能,支持审计日志、运行日志和慢日志,您可以通过日志管理查询读写操作、敏感操作(如KEYS、FLUSHALL)和管理类命令的使用记录以及慢日志。
  • 新增基于快照的缓存分析功能。
  • 新的定时器(Timers)、集群( Cluster)和字典(Dictionary)模块的API。
  • RDB中增加LFU和LRU信息。
  • 集群管理器从Ruby (redis-trib.rb)移植到了redis-cli中的C语言代码。
  • 新增有序集合(Sorted Set)命令ZPOPMIN、ZPOPMAX、BZPOPMIN和BZPOPMAX。
  • 升级Active Defragmentation至v2版本。
  • 增强HyperLogLog的实现。
  • 优化内存统计报告。
  • 为许多有子命令的命令增加了HELP子命令。
  • 提高了客户端频繁连接和断开连接时的性能表现。
  • 升级Jemalloc至5.1版本。
  • 新增命令CLIENT ID和CLIENT UNBLOCK。
  • 新增了为艺术而生的LOLWUT命令。
  • 弃用slave术语(需要API向后兼容的情况例外)。
  • 对网络层进行了多处优化。

  • 进行了一些Lua相关的改进。

  • 新增动态HZ(Dynamic HZ)以平衡空闲CPU使用率和响应性。

  • 对Redis核心代码进行了重构并在许多方面进行了改进。

二、架构

您需要根据业务需求选择:

  • 集群架构可轻松突破Redis自身单线程瓶颈,满足大容量、高性能的业务需求。
  • 主从架构,提供高性能的缓存服务和数据高可靠。
  • 读写分离架构提供高可用、高性能、高灵活的读写分离服务,解决热点数据集中及高并发读取的业务需求,最大化地节约用户运维成本。

1、主从架构-双副本

采用主从(master-replica)模式搭建。主节点提供日常服务访问,备节点提供HA高可用,当主节点发生故障,系统会自动在30秒内切换至备节点,保证业务平稳运行。

1)可靠性

  • 服务可靠采用双机主从(master-replica)架构,主从节点位于不同物理机。主节点对外提供访问,用户可通过Redis命令行和通用客户端进行数据的增删改查操作。当主节点出现故障,HA系统会自动进行主从切换,保证业务平稳运行。
  • 数据可靠默认开启数据持久化功能,数据全部落盘。支持数据备份功能,用户可以针对备份集回滚实例或者克隆实例,有效地解决数据误操作等问题。

2)使用场景

  • Redis作为持久化数据存储使用的业务标准版提供持久化机制及备份恢复机制,极大地保证数据可靠性。

  • 单个Redis性能压力可控的业务由于Redis原生采用单线程机制,性能在10万QPS以下的业务建议使用。如果需要更高的性能要求,请选用集群版本。

  • Redis命令相对简单,排序、计算类命令较少的业务由于Redis的单线程机制,CPU会成为主要瓶颈。如排序、计算类较多的业务建议选用集群版配置。

2、主从架构-单副本

可以在没有数据可靠性要求的纯缓存场景充分发挥性能优势。

1)使用场景

①纯缓存类业务场景

单副本版本只有一个数据库节点,节点出现故障时,系统会重新拉起一个Redis进程(没有数据),当节点故障业务自动切换完成后,应用程序需要将数据重新预热,以免对后端数据库产生访问压力冲击。单副本架构不能提供数据可靠性,如果发生节点故障,您需要重新对业务进行预热,因此,在对数据可靠性要求较高的敏感性业务中,建议选用双副本架构。

②单个Redis性能压力可控

由于Redis原生采用单线程机制,CPU为单核能力,性能在8万QPS的业务建议使用。如果需要更高的性能要求,请选用集群版配置。

③Redis命令相对简单,排序、计算类命令较少

由于Redis的单线程机制,CPU为主要瓶颈。如排序、计算类较多的业务建议选用集群版配置。

3、集群版-双副本

可轻松突破Redis自身单线程瓶颈,满足大容量、高性能的业务需求。双副本集群版实例采用集群架构,每个分片服务器采用主从(master-replica)双副本模式。集群版支持代理和直连两种连接模式,您可以根据本章节的说明,选择适合业务需求的连接模式。

1)代理模式

集群架构的本地盘实例默认采用代理(proxy)模式,支持通过一个统一的连接地址(域名)访问Redis集群,客户端的请求通过代理服务器转发到各数据分片,代理服务器、数据分片和配置服务器均不提供单独的连接地址,降低了应用开发难度和代码复杂度。代理模式的服务架构图和组件说明如下。

Redis 生产架构选型对比,一文整治选择困难症

Redis 生产架构选型对比,一文整治选择困难症

2)直连模式

因所有请求都要通过代理服务器转发,代理模式在降低业务开发难度的同时也会小幅度影响Redis服务的响应速度。如果业务对响应速度的要求非常高,您可以使用直连模式,绕过代理服务器直接连接后端数据分片,从而降低网络开销和服务响应时间。直连模式的服务架构和说明如下。

Redis 生产架构选型对比,一文整治选择困难症

前提条件:使用Jedis、PhpRedis等支持Redis Cluster的客户端。

  • 使用不支持Redis Cluster的客户端,可能因客户端无法重定向请求到正确的分片而获取不到需要的数据。

  • Jedis对于Redis Cluster的支持是基于JedisCluster这个类,详细说明请参见Jedis文档。

  • 您可以在Redis官网的客户端列表里查找更多支持Redis Cluster的客户端。

使用自定义连接池的示例代码 import redis.clients.jedis.*;</p> <p>import java.util.HashSet;</p> <p>import java.util.Set;</p> <p>public class main {</p> <p>private static final int DEFAULT_TIMEOUT = 2000;</p> <p>private static final int DEFAULT_REDIRECTIONS = 5;</p> <p>private static final JedisPoolConfig DEFAULT_CONFIG = new JedisPoolConfig();</p> <pre><code>public static void main(String args[]){ JedisPoolConfig config = new JedisPoolConfig(); // 最大空闲连接数, 根据业务需要设置,不能超过实例规格规定的最大的连接数 config.setMaxIdle(200); // 最大连接数, 根据业务需要设置,不能超过实例规格规定的最大的连接数 config.setMaxTotal(300); config.setTestOnBorrow(false); config.setTestOnReturn(false); // 开通直连访问时申请到的直连地址 String host = "r-bp1xxxxxxxxxxxx.redis.rds.aliyuncs.com"; int port = 6379; // 实例的密码 String password = "xxxxx"; Set jedisClusterNode = new HashSet(); jedisClusterNode.add(new HostAndPort(host, port)); JedisCluster jc = new JedisCluster(jedisClusterNode, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT, DEFAULT_REDIRECTIONS,password, "clientName", config); } }

4、集群版-单副本

Redis 生产架构选型对比,一文整治选择困难症

Redis 生产架构选型对比,一文整治选择困难症

5、读写分离版

针对读多写少的业务场景,提供高可用、高性能、灵活的读写分离服务,满足热点数据集中及高并发读取的业务需求,最大化地节约运维成本。读写分离版主要由主备节点、只读节点、Proxy(代理)节点和高可用系统组成。

Redis 生产架构选型对比,一文整治选择困难症

Redis 生产架构选型对比,一文整治选择困难症

1)特点

①高可用

  • 通过自研的高可用系统自动监控所有数据节点的健康状态,为整个实例的可用性保驾护航。主节点不可用时自动选择新的主节点并重新搭建复制拓扑。某个只读节点异常时,高可用系统能够自动探知并重新启动新节点完成数据同步,下线异常节点。

  • Proxy节点实时感知每个只读实例的服务状态。在某个只读实例异常期间,Proxy会自动降低该节点的服务权重,发现只读节点连续失败超过一定次数以后,会停止异常节点的服务权利,并具备继续监控后续重新启动节点服务的能力。

②高性能

读写分离版采取链式复制架构, 可以通过扩展只读实例个数使整体实例性能呈线性 增长,同时基于源码层面对Redis复制流程的定制优化,可以最大程度地提升线性复制的系统稳定性,充分利用每一个只读节点的物理资源。

2)使用场景

读取请求QPS(Queries Per Second)压力较大

标准版Redis无法支撑较大的QPS,如果业务类型是读多写少类型,需要采用多个只读节点的部署方式来突破Redis单线程的性能瓶颈。Redis集群版提供1个、3个、5个只读节点的配置,相比标准版可以将QPS提升近5倍。

对Redis协议兼容性要求较高的业务 读写分离版完全兼容Redis协议命令,可将自建Redis数据库迁移至读写分离版,同时支持从Redis标准版(双副本)一键平滑升级至读写分离版。

3)建议与使用须知

当一个只读节点发生故障时,请求会转发到其他节点;如果所有只读节点均不可用,请求会全部转发到主节点。只读节点异常可能导致主节点负载提高、响应时间变长,因此在读负载高的业务场景建议使用多个只读节点。

某些场景会触发只读节点的全量同步,例如在主节点触发高可用切换后。全量同步期间只读节点不提供服务并返回-LOADING Redis is loading the dataset in memory\r\n信息。

作者丨小热爱

Original: https://www.cnblogs.com/88223100/p/Comparison-of-Redis-production-architecture-selection.html
Author: 古道轻风
Title: Redis 生产架构选型对比,一文整治选择困难症

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585402/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • shell脚本

    1、什么是shell 什么是shell ? Shell(外壳) 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。 Shell 既是一种命令语言, 又是一种程序设计语…

    Linux 2023年5月27日
    098
  • Spring 4 集成 redis 实现缓存 一

    随着Web项目的复杂程度逐渐增加,可能会涉及诸如高并发、海量数据查询的的业务场景也逐渐增多;若频繁的操作数据库,会触发数据库的I/O瓶颈,因此需要加入缓存,尽量减少直接操作数据库的…

    Linux 2023年6月14日
    081
  • MySQL主从复制的原理和实现

    垂直扩展: 横向扩展: 复制:使每一个节点都有相同的数据集 MySQL复制的实现:使用二进制日志来实现 提高性能(负载均衡)、 实现读写分离 实现数据备份的功能(实时备份) 高可用…

    Linux 2023年6月7日
    098
  • MySQL多实例安装部署

    MySQL多实例安装部署 1、MySQL多实例概念 多实例就是在一台服务器上同时开启多个不同的数据库服务端口(例如3306、3307),同时运行多个MYSQL服务进程,这些服务进程…

    Linux 2023年6月7日
    0110
  • Flask的环境配置

    from flask import Flask​ 通过专门的配置文件,读取配置项,适用于配置项较多 settings.py class Config(object):    DEB…

    Linux 2023年6月8日
    093
  • jmeter学习记录–05–Beanshell2

    学习beanshell时有不少的例子、遇到不少问题。在此记录下。 测试实例列表 A1:使用Beanshell请求作为测试请求 一个打包的Jar包,直接对其内的方法进行测试。 第一步…

    Linux 2023年5月28日
    099
  • 如何优化前端性能?

    导读:随着前端的范畴逐渐扩大,深度逐渐下沉,富前端必然带来的一个问题就是性能。特别是在大型复杂项目中,重前端业务可能因为一个小小的数据依赖,导致整个页面卡顿甚至崩溃。本文基于Qui…

    Linux 2023年6月8日
    0109
  • 【数学建模相关】matplotlib画多个子图(散点图为例 左右对照画图)

    @ 例题 例图 代码展示 例题 乙醇偶合制备 C4 烯烃 C4 烯烃广泛应用于化工产品及医药的生产,乙醇是生产制备 C4 烯烃的原料。 在制备过程中,催化剂组合(即:Co 负载量、…

    Linux 2023年6月8日
    094
  • springboot整合redis-sentinel支持Cache注解

    一、前提 已经存在一个redis-sentinel集群,两个哨兵分别如下: /home/redis-sentinel-cluster/sentinel-1.conf port 26…

    Linux 2023年5月28日
    075
  • 大数据——配置并启动集群/开启历史服务器和日志聚集

    上篇文章通过克隆将集群搭建出来,这篇文章对Hadoop进行配置,修改配置文件,启动并测试集群。开去历史服务器以及日志聚集。 部署规划 hadoop102 hadoop103 had…

    Linux 2023年6月8日
    093
  • LeetCode 84.柱状图中最大的矩形 | 单调栈的使用 | 解题思路及算法 Java

    给定(n)个非负整数,用来表示柱状图中每个柱子的高度。每个柱子相邻且宽度为1。求这个柱状图中能容纳的最大矩形的面积。 对于一个柱状图中的最大矩形,我们可以观察出如下性质: 根据上面…

    Linux 2023年6月13日
    0106
  • redis缓存数据库简单使用

    1、在Linux上安装与配置 -最新:7.0 -最稳定版本:6.x-讲课:5.x-企业里:3.x,4.x,5.x 6.x(极少数公司在用)-windows:3.x,5.x 1 速度…

    Linux 2023年6月14日
    085
  • Linux

    ​ 大型企业高并发的 Java 应用程序都是部署在大型服务器之上的,而服务器的操作系统一般是使用高性能的 Linux(或Unix)的操作系统,不是 Windows 操作系统,所以编…

    Linux 2023年5月27日
    0149
  • 【Python】【Flask】【字符串索引】计算人民币与美元的相互计算

    简介 Python Code 导包 设置首页 计算的接口 问题0:设置请求方式 问题1:关于接收数据可能存在的问题 问题2:返回结果 启动 完整代码 HTML Code 问题分析 …

    Linux 2023年6月14日
    095
  • ubuntu 20.04.1 安装 PHP+Nginx

    ubuntu 20.04.1 安装 PHP+Nginx 全流程 ubuntu 20.04.1 安装 PHP+Nginx 更新源 sudo apt-get update 安装环境包 …

    Linux 2023年6月7日
    0128
  • Netty源码解读(一)-前置准备

    前置条件 源码版本netty4.1 了解Java NIO、Reactor模型和Netty的基本使用。 解释一下: Java NIO:了解BIO和NIO的区别以及Java NIO基础…

    Linux 2023年6月7日
    084
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球