来自 Web前端 2020-05-07 05:42 的文章
当前位置: 网上澳门金莎娱乐 > Web前端 > 正文

千亿级高性能 KV 存储生态圈 运维派

时间: 2019-08-31阅读: 128标签: 规范

本文源自4月20日『高效开发运维』微信群的在线分享,分享者为360Web平台部DBA团队的张恒,本文infoQ的『高效开发运维』公众号首发,已授权转载

Redis功能强大,数据类型丰富,再快的系统,也经不住疯狂的滥用。通过禁用部分高风险功能,并挂上开发的枷锁,业务更能够以简洁、通用的思想去考虑问题,而不是绑定在某种实现上。

一、背景介绍

Redis根据不同的用途,会有不同的持久化策略和逐出策略,所以,在使用和申请 Redis 集群前,请明确是用来做缓存还是存储。Redis的集群有主从和 cluster 两种模式,各有优缺点。以下规范不区分集群模式,我们分别从使用场景和操作限制两方面说明。

随着360公司业务发展,业务使用kv存储的需求越来越大。为了应对kv存储需求爆发式的增长和多使用场景的需求,360web平台部致力于打造一个全方位,适用于多场景需求的kv解决方案。目前,我们线上大规模使用的kv存储有Redis,Redis cluster以及Pika。

使用规范冷热数据区分

为什么说是爆发式的需求增长呢?早在2015年9月份,公司Redis的日访问量还处于800亿,到了2016年第三季度日访问量已经突破2500亿,2017年第一季度日访问量已经接近4000亿。短短的一年半时间,日访问量增长了5倍。下面给大家分别简单介绍一下Redis,Redis Cluster以及Pika的特点和使用场景。

虽然 Redis支持持久化,但将所有数据存储在 Redis 中,成本非常昂贵。建议将热数据 (如 QPS超过 5k) 的数据加载到 Redis 中。低频数据可存储在 Mysql、 ElasticSearch中。

二、kv存储之Redis1、Redis介绍

业务数据分离

Redis做为大家熟知的开源内存数据库,在很多项目中被广泛的使用。它支持String、Hash、List、Set、Zset、Geo、Hyperloglogs等多数据结构。同时也支持主从复制、Lua脚本、事务、数据持久化、高可用和集群化等等

不要将不相关的数据业务都放到一个 Redis中。一方面避免业务相互影响,另一方面避免单实例膨胀,并能在故障时降低影响面,快速恢复。

2、Redis特性

消息大小限制

1)高性能:Redis虽然是单线程的,但是它同样拥有着超高的性能。我们线上的普通PC Server上,经过测试,每秒请求数OPS能够达到10w左右。

由于 Redis 是单线程服务,消息过大会阻塞并拖慢其他操作。保持消息内容在 1KB 以下是个好的习惯。严禁超过 50KB 的单条记录。消息过大还会引起网络带宽的高占用,持久化到磁盘时的 IO 问题。

2)多样化数据结构:Redis支持String、Hash、List、Set、Zset、Geo等多数据结构。

连接数限制

3)持久化:RDB持久化:快照式持久化方式,将内存中的全量数据dump到磁盘。它的优势是加载速度比AOF快,劣势是快照式的全量备份,没有增量数据,造成数据丢失。

连接的频繁创建和销毁,会浪费大量的系统资源,极限情况会造成宿主机当机。请确保使用了正确的 Redis 客户端连接池配置。

AOF持久化:AOF记录Redis执行的所有写操作命令。恢复数据的过程相当于回放这些写操作。使用AOF的持久化方式,优势是有灵活的刷盘策略,保证数据的安全性。劣势是AOF文件体积比RDB大,占用磁盘多,数据加载到内存的数据慢。

缓存 Key 设置失效时间

4)多重数据删除策略:

作为缓存使用的 Key,必须要设置失效时间。失效时间并不是越长越好,请根据业务性质进行设置。注意,失效时间的单位有的是秒,有的是毫秒,这个很多同学不注意容易搞错。

①惰性删除:当读/写一个已经过期的key时,会触发惰性删除策略,删除掉这个过期key。

缓存不能有中间态

②定期删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key。

缓存应该仅作缓存用,去掉后业务逻辑不应发生改变,万不可切入到业务里。

③主动删除:当前已用内存超过maxmemory限定时,触发主动清理策略,该策略由启动参数的配置决定,可配置参数及说明如下:

缓存的高可用会影响业务;

volatile-lru:从已设置过期时间的样本中根据LRU算法删除数据 (redis3.0之前的默认策略)volatile-ttl:从已设置过期时间的样本中挑选过期时间最小的数据删除volatile-random:从已设置过期时间的样本中随机选择数据删除allkeys-lru:从样本中根据LRU算法删除数据allkeys-random:从样本中任意选择删除数据noenviction:禁止从内存中删除数据 (从redis3.0 开始默认策略)

产生深耦合会发生无法预料的效果;

maxmemory-samples 删除数据的抽样样本数,redis3.0之前默认样本数为3,redis3.0开始默认样本数为5,该参数设置过小会导致主动删除策略不准确,过大会消耗多余的cpu。

会对维护行产生肤效果。

5)高可用:Redis自身带有哨兵的组件,可以监控Redis主从的运行状态和自动的故障切换,实现Redis的高可用。

网上澳门金莎娱乐,扩展方式首选客户端 hash

3、Redis使用场景

如果应用太小就别考虑了,如单 redis 集群并不能为你的数据服务,不要着急扩大你的 redis 集群(包括 M/S 和 Cluster),集群越大,在状态同步和持久化方面的性能越差。优先使用客户端 hash 进行集群拆分。如:根据用户 id 分 10 个集群,用户尾号为 0 的落在第一个集群。

一般场景:OPS 10W,数据量较小

操作限制严禁使用 Keys

进阶场景:单点写入可以支撑,但读取量巨大,可以采用读写分离,1主多从的方案;

Keys 命令效率极低,属于 O(N)操作,会阻塞其他正常命令,在 cluster 上,会是灾难性的操作。严禁使用,DBA 应该 rename 此命令,从根源禁用。

写入读取量都很大,单点写入无法支撑,可以采用Hash分片方式。

严禁使用 Flush

但是,无论数读写分离的方式还是Hash分片的方式,在的Redis的架构中没有引入中间件或者更加智能的驱动的情况下,都需要从代码上去保证,这一定程度上增加了开发人员的代码复杂度。同时随着业务的增长,扩展性也较差。那么如何更加理想的去解决这个问题,使用Redis Cluster会是一个更加简洁有效的方案。

flush 命令会清空所有数据,属于高危操作。严禁使用,DBA 应该 rename 此命令,从根源禁用,仅 DBA 可操作。

三、kv存储之Redis Cluster1、Redis Cluster介绍

严禁作为消息队列使用

Redis Cluster 是一个分布式、无中心节点的、高可用、可线性扩展的内存数据库,Redis Cluster的功能是普通单机 Redis 的功能的一个子集。Redis Cluster为了保证一致性而牺牲了一部分容错性: 系统会在保证对网络断线和节点失效具有有限抵抗力的前提下, 尽可能地保持数据的一致性。

如没有非常特殊的需求,严禁将 Redis 当作消息队列使用。Redis 当作消息队列使用,会有容量、网络、效率、功能方面的多种问题。如需要消息队列,可使用高吞吐的 Kafka 或者高可靠的 RocketMQ。

2、Redis Cluster重要概念:

严禁不设置范围的批量操作

①hash slots——哈希槽

redis 那么快,慢查询除了网络延迟,就属于这些批量操作函数。大多数线上问题都是由于这些函数引起。

Redis 集群没有使用一致性hash,而是引入了哈希槽(hash slot)的概念。Redis 集群一共有16384个hash slot,集群使用CRC16校验后对16384取模来计算键key属于哪个槽。

1、[zset] 严禁对 zset 的不设范围操作

②cluster node——集群节点

ZRANGE、 ZRANGEBYSCORE等多个操作 ZSET 的函数,严禁使用 ZRANGE myzset 0 -1 等这种不设置范围的操作。请指定范围,如 ZRANGE myzset 0 100。如不确定长度,可使用 ZCARD 判断长度

集群中的每个主节点负责处理16384个hash slot中的一部分。每个node的hash slot数量可以灵活手工调整。

2、[hash] 严禁对大数据量 Key 使用 HGETALL

③cluster map——集群信息表

HGETALL会取出相关 HASH 的所有数据,如果数据条数过大,同样会引起阻塞,请确保业务可控。如不确定长度,可使用 HLEN 先判断长度

集群中的每个节点都记录整个集群的Cluster map信息,集群信息包括每个节点的唯一id号,ip地址,port端口号,role 在集群中的角色,主节点负责的hash slot的范围,节点状态等。节点之间通过Gossip协议进行通信,传播集群信息,并发现新节点向其他节点发送ping包,检查目标节点是否正常运行。

3、[key] Redis Cluster 集群的 mget 操作

3、Redis Cluster架构 4、Redis Cluster数据路由

Redis Cluster 的 MGET 操作,会到各分片取数据聚合,相比传统的 M/S架构,性能会下降很多,请提前压测和评估

①client执行命令,计算key对应的hash slots

4、[其他] 严禁使用 sunion, sinter, sdiff等一些聚合操作

②根据本地缓存的cluster map信息,连接负责该hash slots的数据节点获取数据

禁用 select 函数

如果slot不在当前连接的节点,返回moved错误,重定向客户端到新的目的服务器上获取数据,并更新client本地缓存的cluster map

select函数用来切换 database,对于使用方来说,这是很容易发生问题的地方,cluster 模式也不支持多个 database,且没有任何收益,禁用。

如果slot在当前节点且key存在,则执行操作结果给客户端

禁用事务

如果slot迁出中,返回ask错误,重定向客户端到迁移的目的服务器上获取数据

redis 本身已经很快了,如无大的必要,建议捕获异常进行回滚,不要使用事务函数,很少有人这么干。

5、使用场景

禁用 lua 脚本扩展

大容量、高并发、可线性扩展

lua 脚本虽然能做很多看起来很 cool 的事情,但它就像是 SQL 的存储过程,会引入性能和一些难以维护的问题,禁用。

刚才仅仅是对Redis Cluster做了简单的介绍,关于集群的创建、数据的迁移、集群的扩容和缩容、hash slots重分布、集群的reblance等日常操作,使用Redis Cluster中遇到的问题以及在改进smart driver道路上解决的问题等等,如果有同学感兴趣的话,欢迎私下共同交流学习。

禁止长时间 monitor

四、kv存储之Pika1、Pika是什么

monitor函数可以快速看到当前 redis 正在执行的数据流,但是当心,高峰期长时间阻塞在 monitor 命令上,会严重影响 redis 的性能。此命令不禁止使用,但使用一定要特别特别注意。

Pika 是DBA需求,基础架构组开发的大容量、高性能、持久化、支持多数据结构的类Redis存储系统,目前已经开源,最新版本为Pika 2.2版本。它所使用的nemo引擎本质上是对Rocksdb的改造和封装,使其支持多数据结构的存储,并在nemo引擎之上封装redis接口,使其完全支持Redis协议。Pika兼容string、hash、list、zset、set等多数据结构,使用磁盘而非内存存储数据解决了Redis由于存储数据量巨大而导致内存不够用的容量瓶颈。

Key 规范

2、Pika PK Redis

本文由网上澳门金莎娱乐发布于Web前端,转载请注明出处:千亿级高性能 KV 存储生态圈 运维派

关键词: