`
xpenxpen
  • 浏览: 726142 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

redis官方文档中文版_Partitioning : 怎么样将你的数据分布在多个redis instance上?

阅读更多
本文转载自http://skynetdoc.com/?p=119
本人顺便修正了一些文字上的复制粘贴小错误,以及更新了一些文字以和英文版保持一致。



Partitioning 能够将你的数据发布在多个redis node(node和instance一个意思)上,因此每一个node仅仅保存了你keys的一个subset。这个文档的第一部分将会给你介绍Partitioning 的概念,第二部分将会描述Redis Partitioning可供选择的方案。

为什么Partitioning 是有用的?

redis Partitioning 主要有2个目标:1.通过使用多台计算机的内存总和使得我们可以得到一个更大的数据库。如果不使用partitioning 将局限于单台计算机的内存限制。2.它能够测试多核机器和多计算机的计算能力,以及多台机器的网络带宽和网络适配器问题。

Partitioning 的基本要素

有一些不同的Partitioning 算法。假设我们有redis node R0, R1, R2, R3,并且有许多keys代表users比如user:1, user:2…等等。我们可以使用不同的方式来选择node保存key。换句话说,可以采用不同的方式来实现key-redis_node之间的映射。一个简单的实现叫range partitioning,在objects范围内映射到特殊的redis_node。例如,可以将users ID [0, 10000]映射到R0,users ID[10001, 20000]映射到R1…等等。这种实现实际上有被使用,但是这里有个缺点是这里将这个table的范围映射到了redis_node上。因此,这个table需要你手工去管理,需要包含我们有的各种类型。一般来讲对于redis这不是一个好的主意。

另外一种可供选择的策略是 hash partitioning。这种策略可以用于任何key,并且不需要一个由object_name:id组成的key,更加简单。1.使用一个hash函数将一个key_name转换成一个number。例如,我使用crc32哈希函数,对于key_name foobar: -> crc32(foobar)将输入类似于93024922的值。2.我对这个计算出来的number进行取模运算得到[0, 3]的值,这样我就可以将这个number映射到4个redis_node之一了。93024922 %4 = 2,因此 key_name foobar就应该被存储在R2 redis_node里面。NOTE: %仅仅是除法运算的余数,在很多编程语言中通常它被实现为%操作符。

还有其他一些partitioning的实现方法,但是看了这2种你应该有想法了。其中一个哈希partitioning 叫做consistent hashing(一致性哈希算法),并且它被一些redis 的clients和proxies所实现。

partitioning不同的实现

Partitioning由一个软件栈的不同部分所负责

· Client side partitioning 这种方法意味着客户端在在读写key的时候,直接选择一个正确的redis_node。许多redis client都实现了这种方法。

· Proxy assisted partitioning 这种方法client发送请求到proxy而不是直接发送到redis_node,proxy能够解析redis协议。proxy能够根据预先配置好的 partitioning schema将请求发送到正确的redis_node,并且将redis_node的返回发送给client。Redis和Memcached proxyTwemproxy实现了proxy assisted partitioning。

· Query routing 这种方法你将你的请求发送到一个随机的node,这个node会将你的请求发送到正确的node。redis Cluster(redis集群服务)实现了一个混合query routing,实现依赖于client将请求从一个redis_node发送到另外一个,但是返回的时候是得到重定向的正确的node。

partitioning的弊端

readis的一些特性在partitioning表现不是特别好
1.包含多个key的操作通常是不被支持的。例如:如果2个set它们保存的keys被映射到了不同的redis_node,你就不能再它们之间形成交叉。(事实上也有方法解决这个问题,只是不直接。)
2.包含多个keys的事务不被支持
3.由于分区的粒度是关键,所以不可能切分一个巨大的key,比如一个大型的排好序的set。
4.当partitioning被使用的时候,数据处理将更加复杂。比如,有些时候你需要处理多个RDB/AOF文件来恢复你的数据, 你需要从多个node或者多台机器上收集这些文件。
5.添加或者删除节点将变得复杂。例如,redis集群支持在运行时透明地添加和删除redis节点,但是其他像client side partitioning 和 proxies 都不支持这个特性。然而,一项叫做Presharding技术 被考虑中。

数据存储或者作为Cache?

对于Partitioning而言使用redis作为数据存储或者Cache是相同的概念,然而这里也有一个巨大的不同。当我们使用redis作为一个存储时你必须确保同一个key每次都映射到相同的redis_node, 但是如果你使用redis作为一个Cache,如果node不可用这不是什么大的问题,系统将使用一个不同的node,并且修改key-node之间的映射关系,这样将提高系统的可用性。这样系统就可以响应我们的请求。Consistent hashing经常用于解决node不可用的问题。同样地,如果你添加了一个新的节点,新keys将被存储在new node。主要的概念如下:

·如果redis被当做cache来用,使用一致性哈希算法来scaling up and down是容易的。

·但是如果把redis作为存储数据的服务器,就需要在key和节点之间实现一个map,节点的数量也必须固定。否则的话我们需要一个系统来维护key_nods之间的平衡,当我们添加或者删除nodes的时候。目前只有redis集群服务能做这个,但是目前集群服务还是beta版,还不足以在产品中使用它。

Presharding技术

对于redis partitioning 上的一些问题,我们知道除非我们使用redis作为一个cahe这样add和remove nodes都是比较容易管理的,并且更加的简单的方法是使用归哪个的key-node映射。然而我们数据存储通常变化是很大的,今天我需要10个redis_nodes,明天我就可能需要50个。

因为redis node是非常轻量的(一个空闲的node仅仅使用1M内存),所以一个简单的方案是可以在一开始就启动大量的node。你甚至可以在一台服务器上启动多个redis实例来达到partition的效果。
你可以一开始就选择一个大的数字作为redis的实例数量,比如,32或者64个nodes能解决大多数人的需求,并且对于空间的增长提供足够的需求。

这样当需要存储的数据增加,你需要更多的redis服务器,通过这种方式你可以简单的将这些nodes从一台服务器迁移到另一台。一旦你添加了新的服务器,你需要将redis node的一半数据迁移到新的服务器…等等。

使用redis的replication(复制)功能,你可以使停机时间最小化甚至为零。

·在新的服务器上启动空的node
·配置这些新的nodes作为你原来node的从服务器(slaves)
·stop所有的clients
·更新那些被移动节点的配置,使用新的IP地址.
·发送命令 SLAVEOF NO ONE 到新的服务器上
·重启clients 使用新的配置
·关闭老服务器上那些很久没有使用的nodes

Redis partitioning 的实现
到目前为止我们涵盖了Redis partitioning 的理论知识,但是实际中呢?你应该使用什么系统?
redis 集群
Redis集群是推荐的方法,可以实现自动sharding和高可用性。现在处于beta阶段还没有发布,建议你可以开始尝试一下。你可以在Cluster tutorial得到更多的信息。(有中文版)

一旦redis的集群功能可用了,而且支持集群的客户端(相应语言的)也有了,实际上redis集群将成为Redis partitioning的事实标准。

redis集群是一个query routing 和 client side partitioning的混合实现。

Twemproxy
Twemproxy是Twitter开发的一个proxy,用于Redis 协议和Memcached ASCII 。它是c的单线程程序但是非常快。它支持自动的partitioning ,并且如果一个node不可用了可以剔除掉。(这会改变key-node的映射,因此你应该使用它,当把 redis作为一个Cach时)

客户端支持consistent hashing
相对于Twemproxy,一种可供选择的方法是使用实现 client side partitioning的客户端(通过一致性哈希或者别的算法)。
比如著名的有Redis-rb(ruby) 和 Predis(php)

请检查完整的客户端列表,看一下你需要的语言的客户端是否实现了一致性哈希算法。
分享到:
评论

相关推荐

    Redis-begin.zip_Redis java_adodb REDIS_java redis_redis_site:www

    在很多时候,人们只是将Redis视为Key/Value数据库服务器,然而事实并非如此,在目前的版本中,Redis除了Key/Value之外还支持List、Hash、Set和Ordered Set等数据结构,因此它的用途也更为宽泛。对于此种误解,Redis...

    Redis官方文档.zip_redis

    Redis Cluster是Redis的分布式解决方案,通过分片(sharding)技术将数据分散在多个节点上,实现水平扩展。每个节点负责一部分数据,当数据量过大时,可以添加新的节点来扩展容量。 6. **lua脚本** Redis支持使用...

    Redis实战_Redis实战中文完整版_Redis快速入门_Redis数据类型及操作_Redis常用

    在《Redis实战》中文完整版中,新手可以系统地学习Redis的基础知识和实战技巧。以下是根据标题和描述提炼出的一些关键知识点: 1. **Redis快速入门**:这部分通常会介绍如何安装Redis,包括在各种操作系统(如Linux...

    基于acl库封装c\c++ 的redis-client客户端源码

    基于acl库封装的redis client vs2010工程; 运行时解压到: redis-acl\lib_acl_cpp\samples\redis路径下,把lib_acl_vc2010d.lib、lib_acl_cpp_vc2010d.lib放到 \redis-acl\lib_acl_cpp\samples\redis\redisclient...

    cpp_redis:C ++ 11轻量级Redis客户端:异步,线程安全,无依赖项,流水线,多平台-不再维护-请检查https:github.comcpp-rediscpp_redis

    cpp_redis cpp_redis是C ++ 11异步多平台轻量级Redis客户端,支持同步操作,流水线,标记和高可用性。需求cpp_redis没有依赖项。 它唯一的要求是C++11 。 它没有网络模块,因此您可以自由配置自己的模块,也可以使用...

    flink-connector-redis-2.10-1.1.5-API文档-中文版.zip

    包含翻译后的API文档:flink-connector-redis_2.10-1.1.5-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.flink:flink-connector-redis_2.10:1.1.5; 标签:apache、flink、connector、redis、中文文档...

    Redis 中文文档

    它通过将数据分散存储在多个节点上来实现水平扩展。 #### 十一、Redis集群规范 集群规范定义了如何组织节点以及如何在节点之间分配数据的规则。例如,Redis集群使用哈希槽(hash slots)的概念来确保数据分布均匀...

    Redis 中文文档-01061629.pdf

    Redis 的复制功能使得客户端可以将数据从一个 Redis 服务器复制到另一个 Redis 服务器。Redis 的复制功能可以确保数据的一致性和可用性。 持久化(Persistence) Redis 的持久化功能使得 Redis 可以将数据保存到...

    php5.6下的redis扩展(redis/php_redis.dll/php_igbinary.dll)windows环境

    在PHP开发中,Redis是一个非常流行的键值存储系统,常被用作缓存和数据持久化解决方案。在Windows环境下配置PHP以使用Redis扩展,可以显著提升Web应用的性能。本资源合集专注于PHP 5.6版本在Windows NTX操作系统上的...

    Redis缓存数据库_redis_数据库系统_

    Redis,全称Remote Dictionary ...综上,Redis在Windows环境下提供了便捷的数据缓存解决方案,其高效、灵活的特点使其在许多场景下成为首选。了解并熟练掌握Redis的使用,对于优化系统性能和开发高效应用至关重要。

    cpp_redis:C ++ 11轻量级Redis客户端:异步,线程安全,无依赖项,流水线,多平台

    cpp_redis cpp_redis是C ++ 11异步多平台轻量级Redis客户端,支持同步操作,流水线,标记和高可用性。需求cpp_redis没有依赖项。 它唯一的要求是C++11 。 它没有网络模块,因此您可以自由配置自己的模块,也可以使用...

    php-redis 中文文档

    ### PHP-redis中文文档知识点详解 #### 一、概述 `phpredis` 是 PHP 的一个扩展,用于高效地与 Redis 数据库交互。该扩展利用 Redis 的高性能特性来提高 PHP 应用程序的速度和效率。通过使用 `phpredis`,开发者...

    redis_for_windows_32_64bit

    redis for windows_32bit or 64bit, 包含配置文件.下载后直接解压可用. 文件说明: redis-server.exe:服务程序 redis-check-dump.exe:本地数据库检查 redis-check-aof.exe:更新日志检查 redis-benchmark.exe:...

    REDIS_redis的工具包_redisinlabview_labviewredis_labview调用redis_redis

    它可能包含了一个或多个库,这些库封装了Redis协议,以便于LabVIEW中的数据传输。通过这个工具包,用户可以直接在LabVIEW程序中执行诸如设置键值、获取键值、执行事务、操作列表和集合等操作。`Palette`文件夹中的...

    redis官方文档中文版

    这份“redis官方文档中文版”提供了全面的Redis使用指南和技术详解,对于理解和掌握Redis的各项功能和最佳实践至关重要。 文档通常会从以下几个方面进行详细介绍: 1. **Redis简介**:Redis是一个开源(BSD许可)...

    distr-redis-master.zip_C++操作Redis_redis c++_redis c++_redis分布式_

    复制可以将数据自动同步到多个节点,提高可用性;Sentinel则用于监控、故障检测和自动故障切换。在C++应用中,需要根据具体需求设计和实现分布式策略,比如使用Sentinel获取主从节点信息,动态调整连接。 7. **...

    redis-unstable.zip_Redis C_c redis_redis_redis c++_visual c

    Redis是一款开源的、高性能的键值对存储系统,主要用于数据缓存、消息中间件、数据库等功能。这个压缩包“redis-unstable.zip”包含了Redis的C语言源代码,这对于理解其内部工作原理和进行二次开发非常有帮助。Redis...

    最新版redis官方中文说明文档(2016)

    这份“最新版redis官方中文说明文档(2016)”是学习和理解Redis的重要资源,尤其对于初学者和开发者来说,它提供了详尽的指导和解释。 文档中,首先会介绍Redis的基本概念,包括其工作原理、数据类型以及与传统...

    flink-connector-redis_2.10-1.1.5-API文档-中英对照版.zip

    包含翻译后的API文档:flink-connector-redis_2.10-1.1.5-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.apache.flink:flink-connector-redis_2.10:1.1.5; 标签:apache、flink、connector、redis...

    Redis集群管理工具Redis::Sentinel.zip

    Redis-sentinel是Redis的作者antirez完成的,因为Redis实例在各个大公司的应用,每个公司都需要一个Redis集群的管理工具,被迫都自己写管理工具来管理Redis集群,antirez考虑到社区的急迫需要(详情),花了几个星期写...

Global site tag (gtag.js) - Google Analytics