• [技术干货] Redis集群
    Redis集群是Redis的分布式解决方案,旨在通过多个节点共同工作来提高Redis的稳定性和效率。以下是对Redis集群的详细介绍:一、定义与目的Redis集群通过添加服务器的数量提供相同的服务,从而让服务器达到一个稳定、高效的状态。它主要解决单个Redis实例存在的不稳定性、读写能力有限以及存储容量受限等问题。二、特性可扩展性:Redis集群最多可扩展到1000个节点上,这极大地提高了Redis数据库的可扩展性。可用性:Redis集群继续运行有两个条件,即大多数主节点必须可达,无法达到的主节点必须有一个备份从节点。这一特性有助于提高Redis数据库的可用性。写入安全性:Redis集群尝试以写入安全的方式运行,它将尽量保留与集群中多数主节点连接的任何客户端的写入。数据分片:Redis集群通过在数据库中分片数据来工作。分片是一种数据库分区方案,将数据库中不同的行(在Redis中是键值对)分布到多个节点上,以便每个节点包含一部分数据。这意味着如果一个节点宕机,只有一部分数据将不可用,这将允许许多数据库请求正常进行。主/从架构:Redis集群使用主从复制,以便集群中的每个主节点都有一个备份从节点。如果其中一个主节点失败,相应的从节点可以被指定为新的主节点,对整个集群的影响很小。三、工作原理Redis集群通过哈希槽(Hash Slot)机制实现数据分片存储。每个节点负责一部分哈希槽,当客户端请求数据时,Redis会根据数据的键计算哈希值,并确定该数据所属的哈希槽,然后将请求转发到负责该哈希槽的节点。四、搭建与配置搭建Redis集群需要准备多台服务器或虚拟机,并在每台服务器上安装Redis。然后,为每个节点创建一个独立的配置目录和配置文件,设置集群相关的参数,如cluster-enabled、cluster-config-file、cluster-node-timeout等。最后,使用redis-cli工具创建集群,并将节点之间的关系绑定起来。五、高可用性保障Redis集群的高可用性主要由以下几个方面保障:自动故障转移:当主节点发生故障时,集群会自动提升对应的从节点为新的主节点,保证服务持续可用。数据分片:通过哈希槽机制,数据分散存储在多个节点上,避免单点瓶颈。去中心化架构:Redis集群中没有单点故障,每个节点相互通讯,共同维护集群状态。六、应用场景Redis集群适用于需要高并发、高可用性和大数据存储的分布式系统。例如,热点数据的缓存、限时任务、计数器、分布式锁、排行榜、社交网站的基本功能(如点赞、踩、关注/被关注、共同好友等)以及队列操作等场景都可以使用Redis集群来实现。综上所述,Redis集群是一种高效、可扩展且高可用的分布式数据库解决方案。它通过数据分片、主/从架构和自动故障转移等机制,提供了稳定、可靠的数据存储和服务。
  • [技术干货] Redis 分布式锁详解
    当然,Redis 分布式锁是一种常用的解决分布式系统中资源同步访问的方法。以下是一篇关于 Redis 分布式锁的详细指南,包括原理、实现以及注意事项。Redis 分布式锁详解一、引言在分布式系统中,多个进程或线程可能会同时访问和修改共享资源,这会导致数据不一致的问题。为了解决这一问题,分布式锁应运而生。Redis 分布式锁因其高性能和易用性,成为了一种广泛使用的解决方案。二、Redis 分布式锁的原理Redis 分布式锁的实现通常依赖于 Redis 的单线程模型和原子操作。常见的实现方式包括使用 SETNX 命令、SET 命令的 NX 和 EX 选项,以及基于 Lua 脚本的原子操作。2.1 SETNX 命令SETNX 是 Redis 中的一个命令,全称是 “SET if Not eXists”。它用于设置一个键值对,当且仅当该键不存在时才会成功设置,并返回 1;如果键已经存在,则设置失败,返回 0。利用这一特性,我们可以实现一个简单的分布式锁。2.2 SET 命令的 NX 和 EX 选项Redis 2.6.12 版本及以后,SET 命令增加了 NX 和 EX 选项。NX 表示仅在键不存在时设置键,EX 表示设置键的过期时间。通过这两个选项,我们可以一次性完成锁的获取和过期时间的设置,从而简化了分布式锁的实现。2.3 Lua 脚本为了确保分布式锁的原子性,可以使用 Lua 脚本来实现复杂的操作。Lua 脚本在 Redis 中是以原子方式执行的,这保证了脚本中的多个命令在执行过程中不会被其他命令打断。三、Redis 分布式锁的实现以下是一个基于 Redis SET 命令的 NX 和 EX 选项实现的分布式锁示例:3.1 锁获取import redis import uuid import time # 连接到 Redis 服务器 client = redis.StrictRedis(host='localhost', port=6379, db=0) def acquire_lock(lock_name, acquire_timeout=10, lock_timeout=10): identifier = str(uuid.uuid4()) end = time.time() + acquire_timeout while time.time() < end: if client.set(lock_name, identifier, nx=True, px=lock_timeout * 1000): return identifier time.sleep(0.001) return False 在这个示例中,acquire_lock 函数尝试获取一个名为 lock_name 的锁。它生成一个唯一的标识符 identifier,并使用 SET 命令的 NX 和 PX 选项尝试设置锁。如果设置成功,则返回标识符;否则,循环等待直到超时。3.2 锁释放def release_lock(lock_name, identifier): pipe = client.pipeline(True) while True: try: pipe.watch(lock_name) if pipe.get(lock_name) == identifier: pipe.multi() pipe.delete(lock_name) pipe.execute() return True pipe.unwatch() break except redis.exceptions.WatchError: continue return False 在 release_lock 函数中,我们使用 Redis 的事务机制来确保锁的正确释放。通过 WATCH 命令监视锁键,如果锁键的值与我们的标识符匹配,则使用 MULTI 和 EXEC 命令删除锁键。如果在事务执行过程中锁键被其他进程修改,则会引发 WatchError 异常,此时我们重新尝试释放锁。四、注意事项锁过期时间:设置合理的锁过期时间非常重要。如果过期时间太短,可能会导致锁被意外释放;如果过期时间太长,则可能导致资源被长时间占用。续期机制:对于需要长时间持有的锁,可以考虑实现续期机制,即在锁即将过期时重新设置过期时间。这需要在业务逻辑中增加相应的处理。可重入性:上述示例中的锁实现是不可重入的。如果需要可重入锁,可以在锁值中记录获取锁的次数,并在释放锁时根据次数递减。锁释放失败:由于网络或其他原因,锁可能无法被正确释放。为了避免这种情况,可以使用额外的机制(如日志记录、监控等)来检测和清理未释放的锁。Redis 实例的高可用性:如果 Redis 实例发生故障,可能会导致分布式锁失效。因此,在生产环境中,通常需要使用 Redis 集群或主从复制来提高 Redis 的可用性。五、总结Redis 分布式锁是一种高效且易用的解决方案,适用于大多数分布式系统中的资源同步访问场景。通过合理设置锁过期时间、实现续期机制以及注意锁的释放和可重入性等问题,可以确保分布式锁的正确性和可靠性。希望这篇指南对你理解和实现 Redis 分布式锁有所帮助。如果你有任何问题或需要进一步的帮助,请随时提问。
  • [问题求助] docker中使用华为redis客户端sasl创建客户端耗时非常长
    用到了华为redis客户端,版本是jedisclient-3.6.3-h0.cbu.mrs.330.r9.jar创建客户端实例JedisCluster,本地和服务器上链接正常,使用docker创建镜像后,只有少数情况下正常,多数情况下都需要16秒才能创建,跟踪代码定位发现在JdisAuth.java中createSaslClient里调用Sasl.createSaslClient需要16秒,jdk换成和服务器正常使用的jdk一样也不行,怀疑可能是网络问题,各位有没有遇到相似问题的,麻烦提供一下指点,非常感谢
  • [问题求助] redis全量+增量迁移(已经在增量中),发现目标实例键数>源实例键数,这是什么情况呢
    redis全量+增量迁移(已经在增量中),发现目标实例键数>源实例键数,这是什么情况呢
  • [热门活动] 【华为云618】研发工具、Redis、漏洞扫描等新客3.96元起,下单抽FreeBuds耳机!
    #实惠更实用,跑赢新开局 #华为云618 15+款云原生2.0产品助力应用现代化! Redis、Kafka、RockeMQ、研发工具等新客试用3.96元起 老客户也有专属优惠!下单抽FreeBuds耳机! 更多产品优惠戳:http://t.cn/A6a7JhLQ #华为云 #618促销季
  • [热门活动] 【华为云开年采购季】研发工具、Redis、漏洞扫描等新客1.98元起,下单抽FreeBuds耳机!
     #华为云开年采购季#15+云原生产品全场低至3折,新客1.98元起! -Redis低至6折,Kafka、RabbitMQ、RocketMQ等低至5.5折,3年5折! -数字资产链新客119元起,华为链新客19.8元起! -软件开发生产线CodeArts,新客试用1.98元起! -漏洞扫描、二进制成分分析、APP合规检测6.6折起! -Serverless应用引擎CAE,新客试用109元起! -ROMAConnect集成平台,打通新老应用,试用19.8元起! 下单抽FreeBuds无线耳机!更多产品优惠戳:http://t.cn/A6a7JhLQ 活动有效期至2023年3月31日,上云正当时!>点击这里,马上进入活动专场<
  • [培训资料] 【应用使能】DCS培训资料一览
     分布式缓存服务(Distributed Cache Service,简称DCS)是华为云提供的一款内存数据库服务,兼容了Redis和Memcached两种内存数据库引擎,为您提供即开即用、安全可靠、弹性扩容、便捷管理的在线分布式缓存能力,满足用户高并发及数据快速访问的业务诉求。即开即用DCS提供单机、主备、Proxy集群、Cluster集群、读写分离类型的缓存实例,拥有从128M到1024G的丰富内存规格。您可以通过控制台直接创建,无需单独准备服务器资源。其中Redis 4.0、Redis 5.0和Redis 6.0版本采用容器化部署,秒级完成创建。安全可靠借助华为云统一身份认证、虚拟私有云、云监控与云审计等安全管理服务,全方位保护实例数据的存储与访问。灵活的容灾策略,主备/集群实例从单AZ(可用区)内部署,到支持跨AZ部署。弹性伸缩DCS提供对实例内存规格的在线扩容与缩容服务,帮助您实现基于实际业务量的成本控制,达到按需使用的目标。便捷管理可视化Web管理界面,在线完成实例重启、参数修改、数据备份恢复等操作。DCS还提供基于RESTful的管理API,方便您进一步实现实例自动化管理。在线迁移提供可视化Web界面迁移功能,支持备份文件导入和在线迁移两种方式,您可以通过控制台直接创建迁移任务,提高迁移效率。 以下是我们整理的DCS相关资料:分布式缓存服务DCS产品官方文档最新动态_分布式缓存服务 DCS_华为云 (huaweicloud.com)分布式缓存服务DCS功能总览功能总览_分布式缓存服务 DCS_华为云 (huaweicloud.com)分布式缓存服务DCS快速入门快速入门_分布式缓存服务 DCS_华为云 (huaweicloud.com)分布式缓存服务DCS用户指南管理和使用分布式缓存服务_分布式缓存服务 DCS_用户指南_使用前必读_华为云 (huaweicloud.com)分布式缓存服务DCS API参考概述_分布式缓存服务 DCS_API参考_使用前必读_华为云 (huaweicloud.com)华为云分布式缓存服务Redis(DCS),从入门到实践应用,循序渐进一站式学习Redis全景实践课_在线课程_华为云开发者学堂_云计算培训-华为云 (huaweicloud.com)
  • [热门活动] 【华为云12·12】全场中间件、软件开发、漏洞扫描等服务新客1.98元起,老客户低至7折,下单抽FreeBuds耳机!
    #华为云12·12#全场DevOps与中间件服务3折起,新用户1.98元起,老用户续订7折起!-Redis、Kafka、RabbitMQ、RocketMQ等低至5.5折,3年5折!-数字资产链7折起,区块链新客试用19.8元起!-软件开发生产线CodeArts,新客试用1.98元起!-漏洞扫描、二进制成分分析、APP合规检测6.6折起!下单抽FreeBuds无线耳机!戳连接:http://t.cn/A6a7JhLQ活动有效期至2022年12月31日,上云正当时!>点击这里,马上进入活动专场<
  • [热门活动] 【华为云828】数字资产管理服务、Redis、Kafka、软件开发平台等服务,企业专享3折起!
    828选华为云,实惠更实用!研发与中间件专场全场3折起! Redis、Kafka、数字资产链、软件开发平台,首购低至1.98元! 下单抽FreeBuds耳机,满额送P50手机,助力企业转型云原生2.0! 活动有效期至2022年9月16日,上云正当时!>点击这里,马上进入活动专场<
  • [热门活动] 【惠上云·更简单】618全场DevOps与中间件服务低至3折,新用户1.98元起,下单抽FreeBuds耳机
    亲爱的开发者们,618年中钜惠来袭!参与试用,100%有礼!最高可得价值899元FreeBuds耳机,满额再送MateBook笔记本!>点击这里,马上进入活动专场<
  • [技术干货] 基于redis-benchmark测试华为云DCS性能指导文档
    【背景】新业务上云,需要获取环境中的redis 5.0 proxy 64G集群在GET以及SET命令操作下的性能指标。 【测试目标】测试redis 5.0 proxy 64G集群服务在1000并发访问下,集群的QPS能否达到100000【环境准备】硬件环境准备服务器数量可用区用途通用计算增强型 | c6.xlarge.2   | 4核 | 8GB3华北 北京四 可用区1测试机安装测试软件Redis 5.0 proxy 64G集群1华北 北京四 可用区1被测机提供被测环境测试软件安装(基于Centos 7.5安装)注:需在每台测试机器安装redis-benchmark客户端测试工具,DCS 4.0 cluster以及DCS cluster 5.0集群需使用memtier_benchmark测试工具,使用redis-benchmark时只能测试到一个节点。其余DCS实例的均可使用redis-benchmark测试工具。1.   安装步骤$ wget http://download.redis.io/releases/redis-5.0.8.tar.gz $ tar xzf redis-5.0.8.tar.gz  $ cd redis-5.0.8/src $ make 2.    命令格式[root@testceph ~]# redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests>] [-r <keyspacelen>] [-t <tests>]参数解释:-h   <hostname>服务器的主机名(默认值为127.0.0.1)-p   <port>服务器的端口号(默认值为6379)-s   <socket>服务器的套接字(会覆盖主机名和端口号)-a   <password>登录Redis时进行身份验证的密码。-c   <clients>并发的连接数量(默认值为50)-n   <requests>发出的请求总数(默认值为100000)-d   <size>SET/GET命令所操作的值的数据大小,以字节为单位(默认值为2)–dbnum <db>选择用于性能测试的数据库的编号(默认值为0)-r   <keyspacelen>随机键个数-t  <tests>测试的命令【环境拓扑】  【测试场景】场景场景描述测试命令检查点场景1使用1个客户端,总并发数为1000,总请求数为10000000,使用1000000个随机键,操作的数据大小为32字节,操作的命令为SET和GET./redis-benchmark -h 集群地址 -p 6379 -a 密码 -c 1000 -n 10000000  -r 1000000 -d 32 -t SET,GET分别查看SET以及GET下的QPS大小场景2使用2个客户端,总并发数为1000,每个客户端并发数为500,总请求数为10000000,使用1000000个随机键,操作的数据大小为32字节,操作的命令为SET和GET./redis-benchmark –h 集群地址-p 6379 -a密码-c 500 -n 10000000  -r 1000000 -d 32 -t SET,GET分别查看SET以及GET下的QPS大小场景3使用3个客户端,总并发数为1000,每个客户端并发数为334,总请求数为10000000,使用1000000个随机键,操作的数据大小为32字节,操作的命令为SET和GET./redis-benchmark –h 集群地址-p 6379 -a密码-c 334 -n 10000000  -r 1000000 -d 32 -t SET,GET分别查看SET以及GET下的QPS大小场景4使用4个客户端,总并发数为1000,每个客户端并发数为250,总请求数为10000000,使用1000000个随机键,操作的数据大小为32字节,操作的命令为SET和GET./redis-benchmark –h 集群地址-p 6379 -a密码-c 250 -n 10000000  -r 1000000 -d 32 -t SET,GET分别查看SET以及GET下的QPS大小场景5使用6个客户端,总并发数为1000,每个客户端并发数为167,总请求数为10000000,使用1000000个随机键,操作的数据大小为32字节,操作的命令为SET和GET./redis-benchmark –h 集群地址-p 6379 -a密码-c 167 -n 10000000  -r 1000000 -d 32 -t SET,GET分别查看SET以及GET下的QPS大小场景6使用9个客户端,总并发数为1000,每个客户端并发数为111,总请求数为10000000,使用1000000个随机键,操作的数据大小为32字节,操作的命令为SET和GET./redis-benchmark –h 集群地址-p 6379 -a密码-c 111 -n 10000000  -r 1000000 -d 32 -t SET,GET分别查看SET以及GET下的QPS大小【测试结果】按照以上场景,使用3台压测机,分别在不同的客户端数量下进行并发访问,控制总并发数为1000,具体实验数据如下:由上述测试数据可得出,华为云redis 5.0 proxy 64G集群在1000并发下,可以支撑SET的QPS:27W,GET的QPS:28W,完全满足实验目标的QPS:10W。 
  • [技术干货] 分布式缓存数据库Redis大KEY问题定位及优化建议
    【背景】访问Redis 5.0 cluster集群出现OOM报错,报错信息为(error) OOM command not  allowed when used memory > ‘maxmemory’,部分ECS应用程序无法向数据库写入,影响服务的正常使用。执行set t2 s2时,数据库报错OOM,如下图:【拓扑】环境信息:Redis 5.0 cluster集群   4G内存  DCS网段:192.168.1.0/24分片1:master 192.168.1.12  slave 192.168.1.37分片2:master 192.168.1.10  slave 192.168.1.69分片3:master 192.168.1.26  slave 192.168.1.134 【分析思路】【详细步骤】一、查看监控查看Redis实例监控,显示Redis集群内存占用46.97%,无明显异常,结果如下图所示:查看节点的内存监控。其中分片2中master节点192.168.1.10内存使用率达到100%,其余两个分片分内存使用率均在20%左右,结果如下图所示:二、确认异常分片信息通过上述监控信息可得知,该redis集群中的分片2中内存使用率达100%。有且仅有该分片内存异常。三、大KEY分析在线分析①    工具分析:使用华为云管理控制台缓存分析-大Key分析工具。执行完成后,查看信息即可。结果如下图所示:(string类型保存top20,list/set/zset/hash类型保存top80)具体使用方法参考以下链接:https://support.huaweicloud.com/usermanual-dcs/dcs-ug-190808001.html②    命令分析:使用redis-cli -h IP -p port –bigkeys命令,该工具会列出各个类型数据中大Key中的最大的那个key的信息。结果如下图所示:如上图所示,可以得出该环境中string类型的大key为“nc_filed/_pk”,大小为13283byte,list、set、hash、zset类型的数据未发现大key。离线方式离线分析需要使用专门的rdb_bigkeys分析工具,对rdb文件进行分析。工具地址: https://github.com/weiyanwei412/rdb_bigkeys。具体步骤如下:编译方法:# yum install git go -y# mkdir /home/gocode/# cd /home/gocode/# git clone https://github.com/weiyanwei412/rdb_bigkeys.git# cd rdb_bigkeys# go build执行完成生成可执行文件rdb_bigkeys。使用方法: ./rdb_bigkeys -bytes 1024 -file bigkeys.csv -sorted -threads 4 /home/redis/dump.rdb参数说明:-bytes 1024:筛选大于1024字节的key-file bigkeys.csv:将结果保存到bigkeys.csv文件-sorted:从大到小进行排序-threads:使用的线程个数/home/redis/dump.rdb:实际的rdb文件路径生成文件样式如下所示:每列分别为数据库编号,key类型,key名,key大小,元素数量,最大值元素名,元素大小,key过期时间。文档链接:https://www.cnblogs.com/yqzc/p/12425533.html四、解决方案导致本次OOM问题的根因为大KEY导致数据大小分布不均匀,某一个分片内存达到maxmemory,在进行数据写入的过程中,如果调度到该分片,则会产生OOM问题。将该分片的rdb文件导出一份,以便于后期针对大key做对应的优化。临时方案:为尽快回复业务,删除上有步骤中查询到的大KEY,执行操作如下:(非字符串的bigkey,不要使用 del 删除,使用 hscan、sscan、zscan 方式渐进式删除)长期方案:通过对大KEY进行拆分,将一个大的KEY拆分为多个小的KEY, 变成value1,value2… valueN,打散分不到不同的分片中,避免因为数据倾斜导致的数据分布不均。其他的类型的数据也可以按照相同的方式进行拆分重组,从而避免大KEY带来的影响。五、 结果验证查看分片监控,192.168.1.10内存使用率下降到24%,结果如下图所示:执行set t2 s2,返回正常,登录集群,执行get命令,正常返回数据信息。结果如下所示,至此业务恢复正常。 【优化及建议】1) 配置节点级别的内存利用率监控指标的告警。如果某个节点存在大key,这个节点比其他节点内存使用率高很多,会触发告警,便于用户发现潜在的大key。2) 配置节点级别的入网最大带宽、出网最大带宽、CPU利用率监控指标的告警。如果某个节点存在热key,这个节点的带宽占用、CPU利用率都比其他节点高,该节点会容易触发告警,便于用户发现潜在热key。3) string类型控制在10KB以内,hash、list、set、zset元素尽量不超过5000。4) 定期通过大key、热key分析工具检查集群中是否存在大key问题,尽早识别风险。