使用Redis搭建持久化K-V存储

简介: 最近在项目中需要在多机之间共享一些集合,Hash等有类型的数据结构,如果基于Mysql来存储的话需要预先定义一系列表结构并维护表结构和数据结构的一致性,后续还需要根据时间对数据库做旧数据清理工作,所以开始调研一些能满足下列需求的存储引擎。 具有高可用,持久化的特性。 数据可以设置失效时间,方便自动数据清理。 支持常用数据结构,如集合,有序集合,Hash map,列表等。 支持事务操作,
最近在项目中需要在多机之间共享一些集合,Hash等有类型的数据结构,如果基于Mysql来存储的话需要预先定义一系列表结构并维护表结构和数据结构的一致性,后续还需要根据时间对数据库做旧数据清理工作,所以开始调研一些能满足下列需求的存储引擎。
  1. 具有高可用,持久化的特性。
  2. 数据可以设置失效时间,方便自动数据清理。
  3. 支持常用数据结构,如集合,有序集合,Hash map,列表等。
  4. 支持事务操作,方便原子化的对多个key进行操作。
  5. 有Python,Golang语言的客户端。
通过对公司内部的Tair,开源的Redis,Memcache,LevelDB, MongoDB等产品进行比较,感觉Redis最符合需求,现将我对 Redis-3.2的理解和使用方法总结一下。

Redis的典型使用方式:


非持久化的独立部署方式:

这种使用方式主要的使用场景是使用Redis做为Cache集群,存储可以丢失的cache数据,首要考虑目标是速度,不考虑持久化。典型的使用方式如下:


所有数据都在内存中,不落盘, 集群中实例之间相互无感知,每个实例都是对等的,在客户端做基于一致性hash的数据分配。用户只需要告诉客户端所有可用的集群实例列表,由客户端对key做一致性hash来决定key会落到那个redis实例上,从而决定会对哪个实例进行读写。
除了在客户端做hash还有一种方式是使用 Proxy代理,由代理来负责对key做hash决定客户端的请求会落到哪个实例,客户端只需要连接到proxy就行了。 Twemproxy 就是一个开源的实现了Redis和Memecached协议的Proxy。


持久化方案:

Redis有两种持久化方案: RDB和AOF, 说白了前者就是dump全量数据做snapshot,后者是记录增量操作日志。
两者的优缺点也很明显: RDB适合做数据备份和数据快速恢复,但是做snapshot是一个很费时的过程,不可能做到频率很高,一般是每几分钟进行一次,所以不能保证最近几分钟之内的数据不会丢。
AOF做增量操作日志的代价不是很高,一般是每秒一次,所以能保证最多只丢一秒的数据。
不过需要指出的是这两种方式并不冲突,可以同时开启,我们在部署的时候也是这么做的。
社区也在考虑结合RDB和AOF,达到类似PostgreSQL的数据安全性(有点小期待呢)。


主从复制(Replication):

Redis采用1:N主备结构来实现replication。但是 需要注意的是为了提高效率,Master和Slave之间是异步进行数据同步的,这也就意味着主备之间可能存在数据不一致的情况,但是有配置可以指定主备之间的最大数据延时,需要用户自己根据业务场景进行配置。


使用Sentinel哨兵实现HA:

Sentinel是Redis提供的一个哨兵组件,主要实现了两个功能:
1. Master和slave监控,一旦Master不可用,则Sentinel集群会进行投票,进行failover,选举新的master。
2. Master和Slave的配置提供,客户端只需要从sentinel即可读取当前的主从配置即可,不需要主动连接Master和Slave。


Redis Cluster集群部署方式:

Redis Cluster使用多个Redis实例进行容量扩展。这种方式同独立部署方式的区别是 集群的实例之间不是相互独立的,是相互感知的,每个实例都知道其他实例的存在,并会进行通信同步全局的sharding和集群配置。

此模式下如何对数据进行切分(sharding):
1. 客户端不会进行一致性hash,而是会对key做CRC16运算,然后将产生的值%16384, 从而产生一个0~16383的值。
2. 集群会将所有key切分成16384个hash slot, 并根据集群中redis实例的个数将hash slot均分到所有的实例中。
3. 将1中产生的值直接对应到相同值的hash slot,而集群中包含此hash slot的机器既是包含此key的机器
4. 当3中客户端计算出的机器因进行过人工resharding而不在包含3中的slot时,此机器会根据自己感知的集群sharding配置返回redirect告知真正包含所需hash slot的机器。

不过有几个需要注意的地方:
1. 当需要对集群进行扩容时,将新机器加到集群中之后其实新机器并没有包含任何hash slot,需要手动重新进行sharding分配hash slot并进行数据迁移。
2. 连接Redis Cluster的客户端和标准客户端是不一样的,不能混用。
3. Transaction支持受限:当transaction中涉及的key不属于同一个redis实例时无法完成transaction。
4. 多key操作受限:如取两个集合的交集操作,若两个集合的key属于不同的机器,则无法完成。


最终选定的部署方式:

由于Redis Cluster部署方式下transaction和多key操作受限,而单台机器的容量能满足我们的业务需求,所以没有选择Redis Cluster部署方式,最终选择的部署方式如下:



1. 采用一台Master加两台slave做replication。
2. 采用三台机器搭建sentinel集群,保证高可用性。
3. 将sentinel部署在使用的redis服务的三台Tesla API后端机,使得sentinel能反映API到Master/slave的真实可用性。
在这种部署方式下再加上针对redis server和redis sentinel的配置和运维控制脚本即可完成服务的搭建。

目录
相关文章
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
583 1
|
9月前
|
NoSQL 安全 关系型数据库
Redis:持久化的两种方式
Redis持久化机制主要包括RDB和AOF两种方式。RDB通过生成数据快照进行持久化,支持手动或自动触发,具有加载速度快、文件紧凑等特点,但无法实时保存数据。AOF则记录每个操作命令,保障数据更安全,支持多种写入策略,并可通过重写机制优化文件大小。两者各有优劣,常结合使用以兼顾性能与数据安全。
|
9月前
|
存储 缓存 NoSQL
Redis持久化深度解析:数据安全与性能的平衡艺术
Redis持久化解决内存数据易失问题,提供RDB快照与AOF日志两种机制。RDB恢复快、性能高,但可能丢数据;AOF安全性高,最多丢1秒数据,支持多种写回策略,适合不同场景。Redis 4.0+支持混合持久化,兼顾速度与安全。根据业务需求选择合适方案,实现数据可靠与性能平衡。(238字)
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
237 2
数据的存储--Redis缓存存储(二)
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
378 6
|
存储 监控 NoSQL
流量洪峰应对术:Redis持久化策略与内存压测避坑指南
本文深入解析Redis持久化策略与内存优化技巧,涵盖RDB快照机制、AOF重写原理及混合持久化实践。通过实测数据揭示bgsave内存翻倍风险、Hash结构内存节省方案,并提供高并发场景下的主从复制冲突解决策略。结合压测工具链构建与故障恢复演练,总结出生产环境最佳实践清单。
530 9
|
存储 NoSQL 安全
Redis的两种持久化方式---RDB、AOF
通过本文的介绍,我们详细讲解了Redis的两种主要持久化方式:RDB和AOF。每种方式都有其独特的优缺点和适用场景。在实际应用中,可以根据具体需求选择合适的持久化方式,或者同时启用RDB和AOF,以达到最佳效果。希望本文能帮助您更好地理解和应用Redis的持久化机制,构建高效、可靠的数据存储解决方案。
1375 79
|
存储 NoSQL Redis
Redis 持久化揭秘:选择 RDB、AOF 还是混合持久化?
Redis 是一个内存数据库,意味着它主要将数据存储在内存中,从而能够提供极高的性能。然而,作为内存数据库,Redis 默认情况下的数据不会永久保存。为了确保数据在重启或故障后能够恢复,Redis 提供了几种 **持久化机制**。这些机制允许 Redis 将内存中的数据保存到硬盘上,从而实现数据持久化。
1577 22
Redis 持久化揭秘:选择 RDB、AOF 还是混合持久化?
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用的算法是哈希槽分区算法。Redis集群中有16384个哈希槽(槽的范围是 0 -16383,哈希槽),将不同的哈希槽分布在不同的Redis节点上面进行管理,也就是说每个Redis节点只负责一部分的哈希槽。在对数据进行操作的时候,集群会对使用CRC16算法对key进行计算并对16384取模(slot = CRC16(key)%16383),得到的结果就是 Key-Value 所放入的槽,通过这个值,去找到对应的槽所对应的Redis节点,然后直接到这个对应的节点上进行存取操作
|
NoSQL Redis
Redis的数据持久化策略有哪些 ?
Redis 提供了两种方式,实现数据的持久化到硬盘。 1. RDB 持久化(全量),是指在指定的时间间隔内将内存中的数据集快照写入磁盘。 2. AOF持久化(增量),以日志的形式记录服务器所处理的每一个写、删除操作 RDB和AOF一起使用, 在Redis4.0版本支持混合持久化方式 ( 设置 aof-use-rdb-preamble yes )