文档章节

Redis 3.0 集群简明上手教程

neuront
 neuront
发布于 2015/04/17 16:45
字数 1646
阅读 219
收藏 5

Redis 3.0 集群概述

Redis 3.0 集群的数据分片方式为按 key 散列. 具体地, 集群中的每个节点持有一些 hash 槽位, 一个集群总共有 16384 个槽位, 可以以任意方式分布在各个节点上.

当应用程序需要访问一条数据时, 要使用 CRC16 函数计算出该数据 key 的一个散列值, 用此散列值对总槽位数 16384 取模, 得出槽位编号, 然后, 将此请求发送到持有该槽位的 Redis 节点上去. 对于有多个 key 的请求, 如果这多个 key 不在同一个槽位, 该指令不可以在集群中执行. 这一点限制极其苛刻, 因为两个随机指定的 key 名想要在同一个槽位上的概率几乎就是 1/16384 了. 虽然可以通过一种特殊手段强制一些 key 占据相同的槽位, 但这样又损害了集群设计的初衷, 即让 key 分散到不同的节点上去.

以上所述的每个节点为一个独立的 redis-server 进程, 进程启动时需要在配置文件中标明启用集群功能 (否则该进程的行为如同一个 2.8 的单点 Redis). 同一个集群中的不同节点可以分布在不同的机器上, 当然, 它们互相之间可以建立 TCP 连接进行必要的通信.

Redis 集群示意图

集群要求客户端自行判断请求该发往哪一个槽位, 且该槽位处在哪一个节点上. 因此在应用程序切换到使用 Redis 3.0 集群之前, 需要检查 Redis 库是否已经支持这些, 从而能正常使用集群.

在此输入图片描述

或者, 使用我厂生产的 Redis-Cerberus 作为集群代理, 从而像操作单点 Redis 一样操作集群.

槽位是 Redis 3.0 集群中数据迁移的最小单位, 这也是 Redis 本身支持的集群与 Twemproxy 之间的区别, 后者并不能很好地支持运行时数据迁移.

使用 Redis 3.0 集群

取源代码并编译

git clone https://github.com/antirez/redis.git && cd redis
git checkout 3.0
make

编译完成后, src 目录下会有 redis-server 可执行文件. 继续使用

make install

可以将改可执行文件安装到 /usr/local/bin 下.

以集群模式启动一个 redis-server

将以下内容保存到配置文件 redis-7000.conf

port 7000
cluster-enabled yes
cluster-config-file nodes-autogen-7000.conf
cluster-node-timeout 5000

然后以

redis-server redis-7000.conf

启动进程.

但此时只启动了一个空的节点, 并不具备集群功能, 也无法实现任何数据访问 (例如, 使用 redis-cli 连接到 7000 端口, 执行 GET 指令会返回 CLUSTERDOWN 错误).

在此配置文件里, port 参数指出其监听的端口, 这在以往的 redis 中也会有. 而 cluster-config-file nodes-autogen 参数也要求不同节点该值不能相同, 此参数指出的文件由节点自动生成, 用于记录节点所在集群的情况. 在节点进程意外崩溃重启之后, 节点会尝试读取该文件, 以便回到原来所处的集群中.

所以, 如果还需要在诸如 7001 端口上启动新节点, 需要更改以上两个参数.

在空节点上创建集群

要使新的空节点进入集群状态, 需要执行一个有 16384 个参数的 cluster addslots 命令, 将所有 16384 个槽位赋予该节点, 显然这不是人力可及的事情. 可以借助脚本来完成这个工作, 譬如使用以下的 python 脚本

import socket

REDIS_ADDR = ('127.0.0.1', 7000)

SYM_STAR = '*'
SYM_DOLLAR = '$'
SYM_CRLF = '\r\n'

def pack_command(*args):
    output = [SYM_STAR, str(len(args)), SYM_CRLF]
    for arg in args:
        output.extend((SYM_DOLLAR, str(len(arg)), SYM_CRLF, arg, SYM_CRLF))
    return ''.join(output)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(REDIS_ADDR)
s.sendall(pack_command('cluster', 'addslots', *[str(i) for i in xrange(16384)]))

然后稍等三五秒, 监听 7000 端口的 redis-server 进程就进入正常集群服务状态. 使用 redis-cli 连上去可以正常地发送数据指令.

关于这一部分内容, 可以参考我之前的一篇文章.

基本的集群组建和数据迁移功能已经由我厂生产的 Redis-Trib.py 项目封装完毕, 并上传到 pypi, 可以通过

pip install redis-trib
easy_install redis-trib

之一来安装. 安装后, 在命令行可以用以下指令来控制集群

# start: 从一个空节点上建立一个集群
# 参数: 1 个, 该节点的地址, 端口, 以冒号连接
# 要求: 指定节点并没有被分配槽位, 且没有已经在集群中
# 例
redis-trib.py start 127.0.0.1:7000

# start_multi: 指定多个空节点, 建立集群, 并将 16384 个槽位近似平分给这些节点
# 参数: 任意多个, 每个参数各表示一个节点的地址, 端口
# 要求: 每个指定节点都没有被分配槽位, 且没有已经在集群中
# 例
redis-trib.py start_multi 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002

# join: 指定一个空节点和一个集群, 使该节点加入此集群, 另外, 自动为该节点均摊一部分槽位
# join_no_load: 指定一个空节点和一个集群, 使该节点加入此集群, 但不分配任何槽位
# 参数: 2 个, 指定集群中任何一个节点的地址, 端口; 空节点的地址, 端口
# 例
redis-trib.py join 127.0.0.1:7000 127.0.0.1:7003
redis-trib.py join_no_load 127.0.0.1:7000 127.0.0.1:7004

# migrate_slots: 迁移槽位
# 参数: 至少 3 个, 原槽位所有者的地址, 端口; 迁移目标节点的地址端口; 一组槽位或槽位段
# 其中, 槽位或槽位段参数中的每一个参数可以有两种格式
#     单独一个非负整数, 表示一个槽位, 如 "0", "42"
#     一小一大两个非负整数, 以横线连接, 如 "2-3", 表示这个闭区间内的全部槽位
# 要求: 指定的两个节点必须在同一个集群中; 原槽位所有者对应的节点必须持有全部指定的槽位
# 例
redis-trib.py migrate_slots 127.0.0.1:7000 127.0.0.1:7001 0 2 4-7
# 这样从 127.0.0.1:7000 对应的节点迁移 0, 2, 4, 5, 6, 7 共 6 个槽位到 127.0.0.1:7001

更多指令请参阅项目首页的 README.

至此, 集群创建和数据迁移相关的操作已经简述完毕. 与集群使用相关的一些内容将在后续文章中继续说明.

© 著作权归作者所有

共有 人打赏支持
neuront

neuront

粉丝 13
博文 6
码字总数 6398
作品 0
武汉
私信 提问
windows上redis集群搭建附github下载地址

下载安装 下载Redis for windows最新版本;解压到d:/redis目录下 下载地址:https://github.com/ServiceStack/redis-windows 本案例使用的版本是3.0.501 下载 RubyInstaller 下载地址:http:...

u010570551
2017/07/24
0
0
简明实用:Redis 高级特性与案例介绍

本文将为大家介绍Redis的一些高级特性以及结合一个具体的实际案例来对Redis进行设计分析。 Redis基础类型回顾 String Redis中最基本,也是最简单的数据类型。注意,VALUE既可以是简单的Strin...

高效运维
07/18
0
0
求知识,redis3.0集群创建好后,如何在spring-data-redis支持?

RT,以前只有一台REDIS的时候,是用org.springframework.data.redis.core.RedisTemplate的,现在变成3.0集群了,如和使用spring-data-redis? redis 3.0集群配置,我是参考这个配置http://my...

猫神
2015/11/24
644
0
这可能是最全的 Redis 集群方案介绍了

这可能是最全的 Redis 集群方案介绍了 原创 2016-06-01 曾健生 运维帮 由于Redis出众的性能,其在众多的移动互联网企业中得到广泛的应用。Redis在3.0版本前只支持单实例模式,虽然现在的服务...

fdhay
2016/06/02
129
0
codis集群部署实战

一、概要 1、折腾codis集群已经快两个月了,感谢一直以来codis的作者刘奇和黄东旭的耐心支持,在这里给你们点个赞,现在我司已经有一个业务跑在了codis集群上,目前只是切了整个业务的10%的量...

navyaijm2012
2015/04/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

微服务分布式事务实现

https://www.processon.com/view/link/5b2144d7e4b001a14d3d2d30

WALK_MAN
今天
2
0
《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
今天
3
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
今天
3
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
今天
3
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部