第三方测评:GaussDB(for Redis)稳定性与扩容表现
摘要:本文将通过采用Redis Labs推出的多线程压测工具memtier_benchmark对比测试下GaussDB(for Redis) 和原生Redis的特性差异
本文分享自华为云社区《墨天轮评测:GaussDB(for Redis)稳定性与扩容表现》,本文转载自墨天轮。
GaussDB(for Redis) 是华为云推出的企业级Redis,采用计算存储分离架构,兼容Redis生态的云原生NoSQL数据库,基于共享存储池的多副本强一致机制,支持持久化存储,保证数据的安全可靠。具有高兼容、高性价比、高可靠、弹性伸缩、高可用、无损扩容等特点。
GaussDB(for Redis)满足高读写性能场景及容量需弹性扩展的业务需求,广泛使用于电商、游戏以及视频直播等行业。即可作为前端缓存支撑大并发的访问,也可作为底层数据库负责核心数据可靠存储。
接下来我们使用采用Redis Labs推出的多线程压测工具memtier_benchmark对比测试下GaussDB(for Redis) 和原生Redis的特性差异。
1、创建GaussDB(for Redis)实例
在华为云通过控制台购买GaussDB(for Redis)实例,测试实例的配置为8G容量,如下所示。
如截图所示,GaussDB(for Redis)提供了统一的负载均衡地址和端口,方便应用程序访问高可用的Redis服务。持久化数据存储空间直观展示了数据量及容量上限。另外,依托于GaussDB(for Redis)存算分离的架构,实例的容量和性能可以按需分别扩展:
- 如需更多容量,只需点击“磁盘扩容”;
- 如需更高的吞吐性能,则通过“规格变更”或“添加节点”完成。
2、安装memtier_benchmark
使用与GaussDB(for Redis)测试实例相同子网的ECS云服务器,部署memtier_benchmark测试环境
# yum install autoconf automake make gcc-c++
# yum install pcre-devel zlib-devel libmemcached-devel openssl-devel
# git clone https://github.com/RedisLabs/memtier_benchmark.git
# cd memtier_benchmark
# autoreconf -ivf
# ./configure
# make && make install 如libevent版本较低,需要在安装memtier_benchmark前 按以下步骤安装libevent
# wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
# tar xfz libevent-2.0.21-stable.tar.gz
# pushd libevent-2.0.21-stable
# ./configure
# make
# sudo make install
# popd
# export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${PKG_CONFIG_PATH} 确认安装成功
# memtier_benchmark --help
3、数据批量装载
向GaussDB(for Redis) 中装载数据
使用memtier_benchmark向GaussDB(for Redis) 中装载数据命令如下,单个value长度1000字节,12个线程,每个线程16个客户端,每个客户端发出请求数100000个,全部是写入操作。
memtier_benchmark -s 192.XXX.XXX.XXX -a XXXXXXX -p 8635 -c 16 -t 12 -n 100000 --random-data --randomize --distinct-client-seed -d 1000 --key-maximum=65000000 --key-minimum=1 --key-prefix= --ratio=1:0 --out-file=./result_small_6G_set.log
可以看到执行了1920万次操作,平均每秒4.4w的ops,总耗时438秒。
使用redis-cli登录实例,查看dbsize(注意:由于采用MVCC机制,查询结果为key数量的预估值,非实时的准确值。)
向原生Redis中装载数据
为了对比方便,我们在另一台4核8G的ECS上部署一个单节点的开源Redis,版本与GaussDB(for Redis)一致使用5.0
还是使用memtier_benchmark相同的配置向原始redis中插入数据
memtier_benchmark -s 192.XXX.XXX.XXX -a XXXXXXX -p 6379 -c 16 -t 12 -n 100000 --random-data --randomize --distinct-client-seed -d 1000 --key-maximum=65000000 --key-minimum=1 --key-prefix= --ratio=1:0 --out-file=./result_small_6G_set_2.log
执行一段时间后出现大量报错
从Redis日志中查看,是在做RDB快照的时候出现了问题。从系统日志中分析当时发生了OOM故障。
这其实和原生Redis的RDB快照处理方式有关,Redis是fork了一个进程使用copy-on-write的方式持久化内存数据,这必然会导致更多内存的申请和使用。并且除了RDB快照,原生redis在执行aof重写,新加从库的操作时也会申请使用更多的内存。为了避免OOM的情况出现,操作系统往往要预留出一倍的空闲内存,限制了内存资源的使用率造成极大的浪费。
反观GaussDB(for Redis) 由于摒弃了fork机制,使得架构更健壮。
从上面的测试也可以看到,导入同样数量的数据时,GaussDB(for Redis) 的可用性和响应的性能没有受到任何的影响。
4、实例紧急扩容
为了测试能进行下去,我们将GaussDB(for Redis) 和原生Redis分别扩容到16G。
GaussDB(for Redis)扩容到16G
对GaussDB(for Redis) 来说由于采用了存算分离的架构,分布式存储池海量在线,按额度分配给用户使用。扩容过程没有数据拷贝,也不会影响业务使用。接下来我们测试使用memtier_benchmark在持续的RW操作场景下GaussDB(for Redis)的扩容过程,看看是否会影响业务的读写;
memtier_benchmark -s 192.XXX.XXX.XXX -a XXXXXXXX -p 8635 -c 16 -t 12 -n 10000 --random-data --randomize --distinct-client-seed -d 1000 --key-maximum=65000000 --key-minimum=1 --key-prefix= --ratio=1:0 --out-file=./result_small_6G_set_get.log
在执行命令的同时进行扩容操作,查看测试结果和监控发现,扩容期间未见报错,GaussDB(for Redis) 响应时延没有明显变化。
原生Redis扩容到16G
原生Redis实例受服务器内存限制,要扩容到16G只能先升级ECS配置。需要重启服务器,存在短时间业务不可使用的问题。升级后再次使用memtier_benchmark插入数据依旧报错,检查发现还是出现了OOM
没办法,只能再次升级云服务器ECS配置到32G,升级期间Redis服务再次不可用。这次升级后终于使用memtier_benchmark成功的插入了数据。
5、数据淘汰问题
下面我们来看高压力下导致数据写满的场景,直观对比双方的表现。
插入数据到GaussDB(for Redis)
memtier_benchmark参数设置如下,全部为写入操作,set的单个value长度50k字节,12个线程,每个线程16个客户端,每个客户端发出请求数10000次请求。折算下来 总的插入的key约为192万,数据量约96G,远大于实例的规格了。
memtier_benchmark -s 192.XXX.XXX.XXX -a XXXXXXX -p 8635 -c 16 -t 12 -n 10000 --random-data --randomize --distinct-client-seed -d 50000 --key-maximum=65000000 --key-minimum=1 --key-prefix= --ratio=1:0 --out-file=./result_small_6G_set.log
运行了一段时间后,从监控上看到GaussDB(for Redis)磁盘空间100%,并且实例进入只读模式拒绝新数据的写入。检查发现共导入数据194954条。
对于GaussDB(for Redis)来说,当容量接近写满的时候,用户会收到告警通知,此时只需在控制台点击“磁盘扩容”,即可秒级完成扩容,对业务没有影响。
插入数据到原生Redis
原生Redis通过配置限制了内存大小为8G,同样执行以下命令导入数据
memtier_benchmark -s 192.XXX.XXX.XXX -a XXXXXXX -p 8635 -c 16 -t 12 -n 10000 --random-data --randomize --distinct-client-seed -d 50000 --key-maximum=65000000 --key-minimum=1 --key-prefix= --ratio=1:0 --out-file=./result_small_6G_set.log
运行一段时间后报错。
登录redis查看内存已写满
也可以通过配置maxmemory-policy设置数据淘汰策略保障数据写入,如图我们将淘汰策略设置成allkeys-lru,即淘汰最近最少使用的key 满足插入数据的内存需求;
修改配置后 插入正常
综上,GaussDB(for Redis)更加看重数据安全,将“保障用户数据不丢”作为最高优先级。当数据写满后自动进入只读模式,确保实例中数据的安全。通过控制台可以做到快速的扩容,最大可能降低对业务的影响。 原生Redis提供了数据淘汰参数,用户可自主选择策略当数据写满后淘汰符合条件的数据,设计思想更偏向于缓存的用途“数据可随意丢弃”。如使用在重要的业务场景,不希望数据丢失,建议选择GaussDB(for Redis)。
6、测试总结
本次我们使用memtier_benchmark分别对GaussDB(for Redis) 和原生Redis进行set操作的测试,8G规格的GaussDB(for Redis) 很顺利的完成了数据加载的操作,原生Redis出现OOM异常导致数据加载失败。原生Redis通过fork进程copy-on-write的方式拷贝数据,在RDB快照、aof重写以及新增从库等操作时容易出现OOM异常。反观GaussDB(for Redis) 由于摒弃了fork机制,使得架构更健壮,服务的可用性更强。
在后续的扩容操作中GaussDB(for Redis)能够快速完成且对业务RW操作无影响,而原生Redis扩容需停服,期间业务无法正常使用。GaussDB(for Redis)快速扩容的特性非常适合生产环境中需要紧急扩容的场景,如游戏开服、电商抢购的火爆程度远超预期时。从测试的情况看,扩容几乎达到了秒级完成,且扩容过程中对业务的读写完全没有影响。
另外更重要的原生Redis无论采用RDB还是aof方式进行数据持久化,都有数据丢失的风险,而GaussDB(for Redis)支持全量数据落盘,GaussDB基础组件服务提供底层数据三副本冗余保存,能够保证数据零丢失。
如果使用场景既要满足KV查询的高性能,又希望数据得到重视能够不丢,建议从原生Redis迁移到GaussDB(for Redis) 。
第三方测评:GaussDB(for Redis)稳定性与扩容表现的更多相关文章
- 华为云企业级Redis评测第一期:稳定性与扩容表现
摘要:采用Redis Labs推出的多线程压测工具memtier_benchmark对比测试下GaussDB(for Redis) 和原生Redis的特性差异. 本文分享自华为云社区<华为云企业 ...
- 深度评测丨 GaussDB(for Redis) 大 Key 操作的影响
本文分享自华为云社区<墨天轮评测:GaussDB(for Redis)大Key操作的影响>,作者: 高斯 Redis 官方博客. 在前一篇文章<墨天轮评测:GaussDB(for R ...
- 揭秘GaussDB(for Redis):全面对比Codis
摘要:Codis集群在国内Redis生态圈很流行,社区已停止维护.本文从架构和特性两方面对比,带你感受华为云GaussDB(for Redis)的全新价值. 本文分享自华为云社区<华为云Gaus ...
- 华为云PB级数据库GaussDB(for Redis)揭秘第八期:用高斯 Redis 进行计数
摘要:高斯Redis,计数的最佳选择! 一.背景 当我们打开手机刷微博时,就要开始和各种各样的计数器打交道了.我们注册一个帐号后,微博就会给我们记录一组数据:关注数.粉丝数.动态数-:我们刷帖时,关注 ...
- 即时通讯系统为什么选择GaussDB(for Redis)?
摘要:如果你需要一款稳定可靠的高性能企业级KV数据库,不妨试试GaussDB(for Redis). 每当网络上爆出热点新闻,混迹于各个社交媒体的小伙伴们全都开启了讨论模式.一条消息的产生是如何在群聊 ...
- 华为云PB级数据库GaussDB(for Redis)揭秘第七期:高斯Redis与强一致
摘要:在KV数据库领域,"强一致性"不仅是一个技术名词,它更是业务与运维的重要需求. 清明刚过,五一假期就要来了.大好春光,不如去婺源看油菜花吧!小云迅速打开APP刷出余票2张,赶 ...
- 【laravel5.* + 钉钉实现WEB第三方登录】 使用redis 作为持久化存储
1.去钉钉开发者平台>自助者工具,创建扫码登录授权应用,填写名称.描述.授权页面logo地址(这个图片最后会出现在用户扫码设备中,建议使用压缩图片减少用户加载时间).回调域名(一般都是写一个子域 ...
- Redis的字典扩容与ConcurrentHashMap的扩容策略比较
本文介绍Redis的字典(是种Map)扩容与ConcurrentHashMap的扩容策略,并比较它们的优缺点. (不讨论它们的实现细节) 首先Redis的字典采用的是一种‘’单线程渐进式rehash‘ ...
- Redis大集群扩容性能优化实践
一.背景 在现网环境,一些使用Redis集群的业务随着业务量的上涨,往往需要进行节点扩容操作. 之前有了解到运维同学对一些节点数比较大的Redis集群进行扩容操作后,业务侧反映集群性能下降,具体表现在 ...
- redis集群扩容(添加新节点)
一.创建节点(接上文) 1.在H1服务器/root/soft目录下创建7002目录 2.将7001目录的配置文件redis.conf拷贝到7002,并修改配置文件的端口 3.进入 redis-5.0. ...
随机推荐
- 关于Xftp7和Xshell7是最新版本但是报错这件事
以win11为例,仅供参考.只能说捣鼓这么久还是建议各位转用MobaXterm. 先说一下,我的解决方法只能说是跳过问题,不是解决问题. <要继续使用此程序 您必须应用最新的更新或使用新版本&g ...
- P1522 [USACO2.4] 牛的旅行 Cow Tours
Problem 题目简述 给你两个独立的联通块,求:在两个联通块上各找一个点连起来,使得新的联通块的直径的最小值. 思路 本题主要做法:\(Floyd\). 首先,Floyd求出任意两个点之间的最短路 ...
- 一个基于.NET7的开源DNS服务 DnsServer 的部署使用经验分享
前言 接上篇 docker-bind 的使用搭建了一个 dns 服务,本篇将介绍另外一款 DnsServer 的部署和使用,更专注,更轻量. 特点 基于 .NET 7 实现 ,支持 Windows.L ...
- 浅析KV存储之长尾时延解决办法
本文分享自华为云社区<浅析KV存储之长尾时延问题,华为云 GeminiDB Redis 探寻行业更优解决方案!>,作者:华为云数据库GaussDB NoSQL团队. 目前,KV存储的广泛使 ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-27-处理单选和多选按钮-番外篇
1.简介 前边几篇文章是宏哥自己在本地弄了一个单选和多选的demo,然后又找了网上相关联的例子给小伙伴或童鞋们演示了一下如何使用playwright来处理单选按钮和多选按钮进行自动化测试,想必大家都已 ...
- FPGA与Simulink联合仿真环境搭建(硬件在环)
硬件在环(HIL) \(\quad\)官方的一些定义:硬件在环 (HIL) 测试是一种实时仿真,让您无需使用系统硬件即可开始测试嵌入式代码.如果正在开发的代码未按照规范运行,您可以通过此项测试来发现可 ...
- 写代码不用"if"行不行,曾经的反 if 运动
如果在IT行业的时间够长的话,可能还记得大约10几年前,设计模式风靡一时的时候,有过一段反 "if" 的运动. 所谓的反"if"运动,其实是夸大了"i ...
- springCore完整学习教程2,入门级别
上集说到:2. 3,咱们从2.3集开始 2. Externalized Configuration 2.3. External Application Properties Spring Boot会自 ...
- [ABC265G] 012 Inversion
Problem Statement You are given a sequence $A=(A_1,\ldots,A_N)$ of length $N$. Each element is $0$, ...
- C# 获取系统DPI缩放比例以及分辨率大小
一般方法 System.Windows.Forms.Screen类 // 获取当前主屏幕分辨率 int screenWidth = Screen.PrimaryScreen.Bounds.Width; ...