分片阈值,redis集群如何解决key不均匀?
对分布式存储系统的架构和运维管理,如何保证每个 Node 的数据存储容量和请求量尽量均衡,是非常重要的。本文介绍 Redis 大集群运维过程中,常见导致数据和请求量“倾斜”的场景,及规避措施。Redis 数据容量或请求量严重”倾斜”的影响
以下从运维的角度解释,Redis数十节点的集群,出现数据容量和请求量倾斜情况下,存在的一些痛点:
少数或单个节点请求量”过热”,导致 Redis 分布式系统失去可扩展性能力和集群的意义,类似 MongoDB_id 字段作为片键;导致运维容量规划,扩容处理难度大;增大自动化配置管理难度;单集群节点尽量统一参数配置;监控告警复杂(容量,QPS,连接数的阈值等)。那我们再看生产环境中,常见导致 Redis 集群严重“倾斜”的场景
Redis 集群常见“倾斜”的场景这类问题一般 DBA 规划不当,业务键空间(keyspace)设计不合理等问题导致
DBA 在规划集群时或扩容后,导致数据槽(哈希桶)位分配不均匀,引起内存容量、键个数和请求 QPS 倾斜;业务的键空间设计不合理,所谓“热点key”,导致某少量 KEY 的 QPS 操作很大;这类节点 QPS 过载;程序大量使用 Keys hash tags, 可能导致某些数据槽位的键个数较多;程序存在大的集群 key(hash,set,list等),导致大 key 所在节点的容量和 QPS 过高;工和师执行Monitor这类命令,导致当前节点client输出缓冲区增大,used_memory_rss 被撑大,导致节点内存容量增大。接下来,当集群出现内存容量、键数量或 QPS 请求量严重倾斜时,我们应该排查定位问题。
Redis 集群“倾斜”问题排查检查集群每个分片的数据槽分配是否均匀
下面以 Redis Cluster 集群为例确认集群中,每个节点负责的数据槽位(slots)和 key 个数。下面 demo的部分实例存在不轻度“倾斜”,但不严重,可考虑进行reblance。
排查节点热点 Key,确定 top commands
使用 redis-faina,当然有实时分析平台就更好。从以下示例中,可见两个前缀 key 的 QPS 占比基本各为 50%, 明显热点 key;也能看到auth命令的异常(top commands)。
程序是否大量使用 Keys hash tags
可能导致数据存储内存量,QPS都不均匀的问题,可使用scan扫描keyspace是否有使用hash tags的,或使用monitor,vc-redis-sniffer。
程序是否使用较大的集合键
比如 1kw 个字段的 hash key, 内存占用在几个 GB,这类集合 key 每次操作几个字段,很难从 proxy 或 sdk 发现 key 的大小。 可通过 redis-cli –bigkeys
确认是否因 monitor 命令引起的输出缓冲区占用内存过大的问题
这类情况基本 Redis 实例内存会快速增长,很快会出现回落。通过监测 client 输出缓冲区使用情况:
查看输出缓冲区列表长度不为 0 的 client。 可见 monitor 占用输出缓冲区 370MB如何有效避免 Redis 集群“倾斜”问题集群部署和扩容处理,保证数据槽位分配平均;keyspace设计时,如何避免热点key, 打散热key;业务在键空间设计时,中尽量避免使用大的集合类型的Key,把key设计拆分;程序角度尽量避免使用keys hash tag;避免工程师直接使用keys,monitor等命令,导致输出缓冲区堆积;合量配置 normal 的 client output buffer,建议设置 10MB(警示:和业务确认调整再修改,避免业务出错)在实际生产业务场景中,大规模集群很难做到集群的完全均衡,只是尽量保证不出现严重倾斜问题。
以上就是我的观点,对于这个问题大家是怎么看待的呢?欢迎在下方评论区交流 ~ 我是科技领域创作者,十年互联网从业经验,欢迎关注我了解更多科技知识!WebSocket是什么原理?
首先我们看一下websocket的出现背景,我们知道http系列协议是建立在tcp上的,理论上,他是可以可以双向通信的。但是http1.1之前,服务器没有实现推送的功能。每次都是客户端请求,服务器响应。下面看一下http协议关于请求处理的发展。
http1.0的时候,一个http请求的生命周期是客户端发起请求,服务器响应,断开连接。但是我们知道tcp协议的缺点就是,三次握手需要时间,再加上慢开始等特性,每一个http请求都这样的话,效率就很低。http1.1的时候,默认开启了长连接(客户端请求中设置了keep-alive头),服务器处理一个请求后,不会立刻关闭连接,而是会等待一定的时间。如果没有请求才关闭连接。这样浏览器不仅可以在一个tcp连接中,不断地发送请求(服务器也会限制一个连接上可以处理的请求阈值),甚至可以一次发很多个请求。这就是http1.1的管道化(pipeline)技术。但是他也有个问题,因为对于基于http协议的客户端来说,虽然他可以发很多请求出去,但是当一个请求对于的回包回来时,他却无法分辨是属于哪个请求的。所以回包只能按请求顺序返回,这就引来了另一个问题-线头阻塞(Head-of-Link Blocking)。并且http1.1虽然支持长连接,但是他不支持服务端推送(push)的能力。如果服务器有数据要给客户端,也只能等着客户端来取(pull)。来到了http2.0,不仅实现了服务器推送,还使用了帧(iframe),流(stream)等技术解决了线头阻塞的问题,http2.0在一个tcp连接中,可以同时发送多个http请求,每个请求是一个流,一个流可以分成很多帧,有了标记号,服务器可以随便发送回包,客户端收到后,根据标记,重新组装就可以。以上是http协议的关于请求的一些发展,而websocket就服务端推送提供了另外一种解决方案。他本质上是在tcp协议上封装的另一种应用层协议(websocket协议)。因为他是基于tcp的,所以服务端推送自然不是什么难题。但是在实现上,他并不是直接连接一个tcp连接,然后在上面传输基于websocket协议的数据包。他涉及到一个协议升级(交换)的过程。我们看看这个过程。1 客户端发送协议升级的请求。在http请求加上下面的http头2 服务器如果支持websocket协议的话,会返回101状态码表示同意协议升级,并且支持各种配置(如果服务器不支持某些功能或版本,或告诉客户端,客户端可以再次发送协议升级的请求)。服务会返回形如下面的http头(可以参考websocket协议)。3 这样就完成了协议的升级,后续的数据通信,就是基于tcp连接之上,使用websocket协议封装的数据包。下面我们通过wireshark来了解这个过程。首先我们启动一个服务器(ip:192.168.8.226)。我们可以直接在浏览器控制台进行测试这时候,我们看看wireshark的包。首先看前面三条记录,这是tcp三次握手的数据包。这个我们都了解了,就不展示。接着看第四条记录。展开后如下。我们看到建立tcp连接后,浏览器发了一个http请求,并带上了几个websocket的数据包。接着看下面的一条。服务返回了同意升级协议或者说交换协议。从服务器代码中我们看到,在建立连接的时候我们给浏览器推送了一个get it的字符串。继续看上面的记录。这就是服务器给浏览器推送的基于websocket协议的数据包。具体每个字段什么意思,参考websocket协议就可以。继续往下看一条记录是针对服务器推送的数据包的一个tcp的ack。最后我们可以顺便看看最后三条写着keep-alive的记录。这就是之前文章里讲到的tcp层的keep-alive。因为我们一直没有数据传输,所以tcp层会间歇性地发送探测包。我们可以看看探测包的结构。有一个字节的探测数据。如果这时候我们发送一个数据包给服务器,又是怎样的呢。白色背景的三条数据,分别是浏览器发送给服务器的数据,服务器推送回来的数据。tcp的ack。我们发现,服务器给浏览器推送的时候,浏览器会发送ack,但是浏览器给服务器发送的时候,服务器貌似没有返回ack。下面我们看看为什么。首先我们看浏览器发出的包。再看看服务器给浏览器推送的数据包。我们发现服务器(tcp)推送消息的时候把ack也带上了。而不是发送两个tcp包。这就是tcp的机制。tcp不会对每个包都发ack,他会累积确认(发ack),以减少网络的包,但是他也需要保证尽快地回复ack,否则就会导致客户端触发超时重传。tcp什么时候发送确认呢?比如需要发送数据的时候,或者超过一定时间没有收到数据包,或者累积的确认数量达到阈值等。既然研究了tcp,我们不妨多研究点,我们看一下,如果这时候关闭服务器会怎样。服务器会发送一个重置包给浏览器,告诉他需要断开连接。继续,如果是浏览器自己调用close去关闭连接会怎样。我们看到websocket首先会发送一个FIN包给服务器,然后服务器也会返回一个FIN包,然后才开始真正的四次挥手过程。并且四次挥手的第一个fin包是服务器发的。我们再来看看安全版本的websocket。我们启动一个https服务器。然后在浏览器控制台执行。然后来看看wireshark。首先建立tcp连接,然后建立tls连接。后续的数据通信就可以基于加密来进行了。不再重复。后续分析tls协议的时候再分析。经过一系列的分析,我们对websocket协议应该有了更多的了解,最后再说一个关于websocket的点。我们发现如果在websocket连接上,一直不通信的话,websocket连接所维持的时间是依赖tcp实现的。因为我们发现tcp层会一直发送探测包。达到阈值之后,连接就会被断开。所以我们想维持websocket连接的话,需要自己去发送心跳包,比如ping,pong。总结:本文分析了websocket的基本原理,但不涉及协议的内容,如需了解协议的内容,可以参考rfc文档。应用层协议http同传输层协议TCP在数量上的对应关系是什么?
“我是哟哟吼说科技,专注于数据网络的回答,欢迎大家与我交流数据网络的问题”
HTTP(HyperText Transfer Protocol,超文本传输协议)是访问网站时最常用的协议,也是互联网上应用最广泛的一种网络协议。HTTP协议是基于TCP协议来实现的,在客户端发送一个HTTP请求后,会默认使用80端口来建立TCP连接,服务器端则最80端口监听客户端发送的HTTP请求,进而对其进行回应。
如题,HTTP协议与TCP协议在数量上的对应关系是什么呢?
哟哟认为,一个完整的HTTP请求可能对应多个TCP连接,没有具体定义数量的对应关系。数量的关系会受连接时间、网络稳定性等因素来影响。
下面哟哟来简单介绍一下一个HTTP请求必要的TCP连接有哪些?
1、建立连接首先会使用TCP三次握手的机制来建立连接,因此肯定会有3个握手数据报文;
2、request在建立连接后会发送request请求,这里不止会有1个request,因此至少有1个以上的TCP连接;
3、response一个request会对应多个response,分别为1次确认发送和不止1此的负载数据,因此这里最少有3个TCP连接;
4、断开连接在数据交互完成后,会使用TCP四次挥手的机制来断开连接,因此肯定会有4个挥手数据报文;
若考虑到网络稳定性差的因素,那么会有多次重传的数据报文,因此对应的TCP连接数量会无法计算,总之,一个HTTP请求无法明确的定义TCP连接数量的对应关系。
欢迎大家多多关注我,在下方评论区说出自己的见解。
rts门槛设置多少合适?
RTS阈值:为数据包指定rts(request to send,发送请求)阈值。分片阈值:这一数值用于确定在将数据分割为几个包之前的包最大尺寸,如果包的错误率较高,则可以稍微提高分片阂值;如果分片阈值设置得太低,则可能会降低网络性能。推荐稍微降低默认值,而在大多数情况下,应保留其默认数值2346DTIM阈值:无线发送数据包的频率要达到最好的效果必须用仪器测试才能确定数值,而且环境会变,环境变了,数值也要变。追求最好效果没有必要,没有现实意义,只要按照出厂默认和运营商默认数值,就可以达到理想效果,正常使用。
区块哈希值如何生成?
1. 创建数据分片。存储系统将数据分成更小的段,这个过程称为分片。分片涉及到将数据分解为可管理的块,这些块可以分布在多个节点上。分片的确切方法取决于数据类型和进行分片的应用程序。关系数据库的分片不同于NoSQL数据库的分片或文件共享上的文件分片。
2. 每个分片都进行加密。然后,存储系统对本地系统上的每个数据分片进行加密。内容所有者完全控制这个过程。我们的目标是确保除了内容所有者之外,没有人能够查看或访问分片中的数据,无论数据位于何处,以及该数据是处于静止状态还是处于运动状态。
3. 为每个分片生成一个哈希值。区块链存储系统根据分片的数据或加密密钥生成一个唯一的哈希值——一个加密的固定长度输出字符串。哈希值被添加到分类账和分片元数据中,以将事务链接到存储的分片。生成哈希值的确切方法因系统而异。
4. 复制每个分片。存储系统复制每个分那篇,这样就有足够的冗余副本来确保可用性和性能,并防止发生性能下降和数据丢失的情况。内容所有者选择为每个分片创建多少个副本,以及这些分片位于何处。作为这个过程的一部分,内容所有者应该为要维护的最小副本数量设置一个阈值,以确保不会丢失数据。
5. 分发复制的分片。P2P网络将复制的分片分布到分散地理上的存储节点,可以是区域的,也可以是全局的。多个组织或个人拥有存储节点,他们租用额外的存储空间,以换取某种补偿——加密货币。没有一个实体会拥有所有存储资源或控制存储基础设施。只有内容所有者才能完全访问其所有数据,无论这些节点位于何处。
6. 把交易记录到分类账上。存储系统记录区块链分类账中的所有事务,并跨所有节点同步该信息。分类账存储与交易相关的详细信息,如分片位置、分片哈希值和租赁成本。因为分类账是基于区块链技术的,所以它是透明的、可验证的、可追踪的、防篡改的。
虽然步骤6是最后列出的,但是区块链集成是一个正在进行的过程,具体的方法取决于存储系统。例如,当存储过程第一次开始时,它可能首先在区块链分类账中记录事务。然后,当事务变得可用时,它将使用信息(如唯一哈希值或特定于节点的详细信息)更新事务。然后,在参与节点验证事务之后,系统在分类账中将该事务标记为final,并锁定它以防止更改。
这里描述的六个步骤是作为一种概念化的区块链存储过程方法。确切的方法将取决于特定存储系统在给定用例中的实现方式,以及如何管理该数据存储。
还没有评论,来说两句吧...