摘要:一文带你全方位测评 GaussDB(for Redis) 和开源 Redis。

本文分享自华为云社区《程序员硬核测评:全方位测评 GaussDB(for Redis) 和开源 Redis》,作者:高斯Redis官方博客。

正值企业数字化转型全面提速之际,业务需求急速增加,伴随而来的是数据量和并发访问量呈指数级增长,传统关系型数据库在处理海量大数据时显得力不从心。由于局部性原理的限制,在使用传统数据库来处理大数据流,在初始建表时表中大量的数据项被置空,这对于传统数据库来说是灾难性的。在关系型数据库中,建表时须定义表结构,字段动态增减对于性能的影响巨大,同时带有大量空值稀疏矩阵的存储会导致存储成本的急剧增加,这给了NoSQL 型数据库以极大发展空间,而Redis作为 NoSQL 的翘楚,备受业界追捧。

开源版本的Redis 5.0 提供了包括 String、List、Set、ZSet、Hash、Bit Array、HyperLogLog、Geo、Streams 九种数据类型,以及建立在这些数据类型上的相关操作,给开发人员更多的选择空间来表达数据和数据间的相互关系。但开源版Redis从本质上讲并不是一款数据库,主要有以下几方面的弱点:

  1. 使用场景有限,只能达到弱一致性的水平,一般只能在缓存层使用;
  2. 使用成本高,由于开源版Redis使用内存作为存储主体,内存居高不下的价格使搭建Redis集群的成本极高;
  3. 运行不稳定,经常使用开源版Redis的读者肯定了解,在进行如大key替换时、扩容、缩容等操作时,经常遇到阻塞、抖动等问题。

于是本文我们选择了在业界有着良好口碑GaussDB(for Redis)进行了对比评测,以向各位读者推荐一款真正质优价廉的Redis。下面我们具体展开聊聊:

1. 稳定可靠

在使用缓存方案时,用户最害怕见到的场景就是Redis由于各种原因性能下降,使业务流量的压力直接向核心数据库转移,最终造成整个系统的雪崩。可以说运行稳定性是用户在对于缓存数据库选型时需要考虑的首要问题,因此我们选择了切换、重启与备份三个在日常工作中经常会遇到的场景进行开源版本Redis与GaussDB(for Redis)进行整体使用感受层面的对比评测。

1.1. 灾备切换场景

首先通过在控制台强行将主节点关机,模拟开源Redis主节点故障与GaussDB(for Redis)单个节点故障,其中特别说明:由于GaussDB(for Redis)采用多个节点同时工作的负载均衡方案,因此没有开源Redis中的主节点概念,因此灾备切换时任选某一节点宕机,即可模拟灾备切换的场景。具体如下:

可以看到GaussDB(for Redis)在切换过程中服务会瞬间迁移至备节点,而且切换过程中性能下降也不明显,整体只需要1s就可以恢复正常。而对比开源版Redis在切换时则会出现服务完全中断的情况,平均需要5s才能恢复。可以说GaussDB(for Redis)的表现让我完全不会担心在主节点发生异常时,使整个交易链路全部崩溃的情况,但是开源版Redis,在遇到切换时就会比较提心吊胆了。

1.2. 节点故障恢复场景

节点异常重启是Redis使用中所经常遇到的问题,我们知道开源版Redis服务重启时需要加载元数据也就是RDB,Key值越多RDB也就越大,重启速度就越慢,16G规格的开源版Redis服务重启速度约需要10秒左右,而作为对比GaussDB(for Redis)重启时没有重新加载元数据的步骤,因此重启速度很快,几乎可以在1秒内完成重启操作,而且重启速度不受数据量影响。

1.3. 备份场景

对于开源版Redis来说系统备份会触发fork操作,fork操作是标准的POSIX操作系统接口,调用时会产生内存分配、拷贝等等一系列动作,这会使时延大幅度增长,造成开源版Redis在备份等日常运维操作时出现明显的抖动现象,甚至极端情况下还会使内存使用率大幅飙升,触发操作系统OOM保护使Redis进程异常中止,因此开源版的Redis只能在业务低谷期进行备份操作,对于全天候24小时都存在交易高峰的系统就不适用。不过GaussDB(for Redis)从系统底层解决了备份时的fork问题,备份时根本不需要fork操作,数据随时可备,高峰期也不干扰。

从总体的使用感受来看,GaussDB(for Redis)在稳定性方面几乎碾压开源版本Redis的,堪称是用户系统中的定海神针,下面我们再就具体扩容、性能、价格等方面的情况进行详细评测。

2. 秒级扩容

从事开源Redis运维工作的读者,一般都会有掉进过扩容的坑,由于开源 Redis使用内存作为数据的存储,各节点间使用 Raft 协议进行数据同步,这使开源 Redis在扩容时操作较复杂,尤其在对服务器进行内存扩容时,一般都需要对于所在ECS实例进行重启,这一系列的操作必然伴随着主节点的切换与重启,使服务暂时中断。

2.1. 扩容过程中的服务性能对比

开源Redis是弱一致的缓存数据库,数据即使没有落盘持久化也可能向调用方法返回写入成功,因此一旦发生切换,那么难免出现脏读现象,因此扩容可以说是开源版Redis日常运维过程中最令使用者头疼的问题。

针对扩容场景我们同样对于GaussDB(for Redis)与开源 Redis也进行了相应评测:

2.2. 扩容操作便利性对比

从操作层面上讲GaussDB(for Redis)在扩容时比开源 Redis 简单得多,只需要在华为云的操作台上进行简单操作即可。

在笔者近百次不断扩容操作当中,GaussDB(for Redis)从未出现过服务中断及数据丢失的情况,扩容操作秒级完成,外部零感知,对比开源版本,操作复杂需要不断地重启、切换不说,在扩容过程中平均会有25秒左右的服务中断。

不仅扩容时不再需要提心吊胆,GaussDB(for Redis)的配套监控系统比开源 Redis 完善,不仅可对请求时延等关键性能指标可视化监控,还可实现故障节点自动摘除、平滑移动、自动告警、自动恢复,给使用者提供了绝佳的运维体验。

3. 强悍性能

与内存相比,磁盘无论在稳定性还是可维护性上都有非常强大的优势,从本质上讲GaussDB(for Redis)实际上都得益于其磁盘作为数据的存储设备,内存的优势是速度快,笔者在评测之前认为GaussDB(for Redis)可能会比开源版本有差距,但实际的测试结果却证明在相同的规格下GaussDB(for Redis)与开源版本的差距微乎其微。

3.1. 一般场景性能对比

在我们测试的16G规格下,GaussDB(for Redis)甚至还略高于开源Redis,具体如下:

3.2. 大key替换场景性能对比

GaussDB(for Redis)也完全解决了开源 Redis在进行 key 值替换时的卡顿问题。在模拟大key替换的场景下,具体如下:

在对大Key进行替换、读写操作时,GaussDB(for Redis)性能几乎没有受到任何影响,这与开源版本动辄下降20%的情况相比,实在令人惊喜。

3.3. GaussDB (for Redis)的性能密码

剖析这背后的原因,在于GaussDB(for Redis)通过存储层 Shared Everything 解决了开源 Redis 在批量 key 替换时产生的卡顿问题,GaussDB(for Redis)的存算分离架构不但屏蔽了各个不同独立数据库之间的底层细节,让存储的归存储,计算的归计算,将各种能力封装到模块中,用户任意挑选适合组件,根据自身的业务需求、以极小的成本来定制化数据库服务。在这个过程中还保证了完整的用户体验一致性。

GaussDB(for Redis)利用 hash 策略对数据进行均衡,不存在 Full GC 造成的 STW 问题,这些技术方案的运用让GaussDB(for Redis)完美解决了开源版本经常出现的卡顿问题,真正做到了“丝丝顺滑,完全不卡”。GaussDB(for Redis)通过冷热分离技术动态发现热点数据,并将热点数据有序调入内存,在客户看来,几乎感受不到GaussDB(for Redis)与开源Redis时的性能差距。

GaussDB(for Redis)有开源Redis不具备的优势,就是不受内存容量限制,支持PB级的缓存集群,规模越大GaussDB(for Redis)的性能还越好,从华为云的官方资料上看,GaussDB(for Redis)性能可以轻松达到百万级的QPS。

得益于GaussDB(for Redis)负载均衡的架构方案,只要集群中有一个节点还是可用的,整个集群就能正常对外服务,正常情况下每个节点都可支持写入,这种架构在正常情况下可以保证对外的高性能,在异常时又支持N-1级别的容错特性,在性能及容灾方面的对比GaussDB(for Redis)又是领先于开源版Redis。

4. 极致性价比

为了对比这两者的性价比,我们采购了某厂商的 2C/16G、4C/64G两种规格的ECS云服务器各3台,搭建开源Redis版本的集群,并与华为云上用同规格的 GaussDB(for Redis)进行价格对比,由于具体性能指标的对比前文已经列出,这里不再加赘述。

我们可以看到单位数据量的GaussDB(for Redis)在性价比层面可以比开源Redis平均提高近1倍。

从评测结果来看,GaussDB(for Redis)是一款超越开源版本的优秀产品,在各方面的指标几乎全面超越了开源版本,总结上述评测结果如下:

由于GaussDB(for Redis)基于华为高性能分布式共享存储池,完美避开开源Redis 的主从堆积、主从不一致、fork 抖动、内存利用率只有 50%、大 key 阻塞、gossip 集群管理等诸多问题,购买的容量全部可用,并且单位数据的使用成本只有开源版本的一半。开发者们,现在不试试GaussDB(for Redis)更待何时?

点击关注,第一时间了解华为云新鲜技术~

上手测试GaussDB(for Redis) 和开源 Redis,只为推荐质优价廉的Redis的更多相关文章

  1. ELK(+Redis)-开源实时日志分析平台

    ################################################################################################### ...

  2. 开源|如何开发一个高性能的redis cluster proxy?

    文|曹佳俊 网易智慧企业资深服务端开发工程师 背    景 redis cluster简介 Redis cluster是redis官方提供集群方案,设计上采用非中心化的架构,节点之间通过gossip协 ...

  3. .NET redis 客户端开源组件 FreeRedis (继 CSRedisCore 之后重写)

    什么是 FreeRedis FreeRedis 是一款 .NET redis 客户端开源组件,以 MIT 协议开源托管于 github,目前支持 .NET 5..NETCore 2.1+..NETFr ...

  4. 基于Redis的开源分布式服务Codis

    Redis在豌豆荚的使用历程--单实例==>多实例,业务代码中做sharding==>单个Twemproxy==>多个Twemproxy==>Codis,豌豆荚自己开发的分布式 ...

  5. Redis .NET开源组件Beetle.Redis

    Redis .NET开源组件Beetle.Redis Beetle.Redis是一款开源的Redis Client for .net组件,它提供非常简便的操作方式可以让开发人员轻松地访问Redis,同 ...

  6. Springboot +redis+⾕歌开源Kaptcha实现图片验证码功能

    Springboot +redis+⾕歌开源Kaptcha实现图片验证码功能 背景 注册-登录-修改密码⼀般需要发送验证码,但是容易被 攻击恶意调⽤ 什么是短信-邮箱轰炸机 手机短信轰炸机是批.循环给 ...

  7. Redis 3.0正式版发布,正式支持Redis集群

    Redis是一个开源.基于C语言.基于内存亦可持久化的高性能NoSQL数据库,同时,它还提供了多种语言的API.近日,Redis 3.0在经过6个RC版本后,其正式版终于发布了.Redis 3.0的最 ...

  8. redis——学习之路五(简单的C#使用redis)

    redis官方推荐使用的客户端程序 打星星表示推荐使用的客户端程序,一个笑脸表示最近6个月内有过正式活动的.http://redis.io/clients/#c 从这里我们可以判断官方推荐我们使用Se ...

  9. centos 安装redis(一台机器可以安装多个redis)

    我在运行时redis版本是2.8 操作前设置以管理员身份: 打开终端输入 su - 安装redis需要确保系统已经安装了(gcc gcc-c++)# yum -y install gcc gcc-c+ ...

  10. Redis总结(二)C#中如何使用redis

    上一篇讲述了安装redis<Redis总结(一)Redis安装>,同时也大致介绍了redis的优势和应用场景.本篇着重讲解.NET中如何使用redis和C#. Redis官网提供了很多开源 ...

随机推荐

  1. Django + celery + redis 执行异步任务及查看结果

      官方文档 https://docs.celeryproject.org/en/latest/django/first-steps-with-django.html#using-celery-wit ...

  2. CSS属性 Position的几种定位方式

    作者:WangMin 格言:努力做好自己喜欢的每一件事 在讲几种定位方式之前,我们先来了解一下什么是普通流(normal flow)? 除非专门指定,否则所有框都在普通流中定位.普通流中元素框的位置由 ...

  3. 2021CSP 游记

    总结 试机日: 我天,这学校什么垃圾电脑-- 比赛日: 1. 普及考试 总体上来说题目算简单 (只是我脑残),t1简单 \(O(1)\),学了数论就行,而 t2 看懂后按题意打一遍,再优化一下: 数组 ...

  4. Java SPI机制总结系列之万字详细图解SPI源码分析

    原创/朱季谦 我在<Java SPI机制总结系列之开发入门实例>一文当中,分享了Java SPI的玩法,但是这只是基于表面的应用.若要明白其中的原理实现,还需深入到底层源码,分析一番. 这 ...

  5. (Good topic)哈希表:拼写单词 (3.17 leetcode每日打卡)

    给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars. 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌 ...

  6. 🔥🔥Java开发者的Python快速进修指南:控制之if-else和循环技巧

    简单介绍 在我们今天的学习中,让我们简要了解一下Python的控制流程.考虑到我们作为有着丰富Java开发经验的程序员,我们将跳过一些基础概念,如变量和数据类型.如果遇到不熟悉的内容,可以随时查阅文档 ...

  7. 小米二面:Redis 如何保证数据不丢失?

    前段时间表妹收到了小米秋招补录的面试邀请,一面还算顺利,很快就通过了,但在看二面面试录屏的时候,我发现了一个问题,回答的不是很好,也就是我们今天要聊的这个问题:Redis 如何保证数据不丢失? 很多人 ...

  8. 如何使用JavaScript 将数据网格绑定到 GraphQL 服务

    前言 作为一名前端开发人员,GraphQL对于我们来说是令人难以置信的好用.它可以用来简化数据访问,这让我们的工作变得更加容易. 什么是 GraphQL?它是一个抽象层,位于任意数量的数据源之上,并为 ...

  9. 【结对作业】 第一周 | 学习体会day05

    实现了单条地铁线路的直达 进行了页面的优化,实现了侧边栏功能 并且对第二天(今天)的任务进行了规划.

  10. AtCoder_abc327

    T1 ab 循环从s[0] 到s[n-2] 判断有无ab相邻 T2 A^A 两层循环枚举就可以了 由于aa会增长的很快,所以当a=16时aa就已经大于\(10^{18}\)了,一定不会T 就这么点数打 ...