文档章节

Redis 3.0 集群简明上手教程

neuront
 neuront
发布于 2015/04/17 16:45
字数 1646
阅读 214
收藏 5
点赞 0
评论 0

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
[简明python教程]学习笔记之总结篇

花了好几天的时间,终于把PDF版的《简明python教程》看完了。 对着教程的代码,一边敲代码一边调试,慢慢感觉,python的代码给人的感觉很舒服,也很容易上手,可能大学学过一丁点面向对象的编...

初级泥水工
2014/05/07
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
635
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
RedisCluter集群(一):Redis高可用集群Redis Cluster搭建

原文地址:https://my.oschina.net/lyyjason/blog/1842002 前言: Redis3.0版本之前,可以通过Redis Sentinel(哨兵)来实现高可用 ( HA ),从3.0版本之后,官方推出了Redis Cluster,它的主...

lyyjason
07/07
0
0
redis2.8版本之前怎么实现集群

What's new in Redis 3.0 compared to Redis 2.8? Redis Cluster: a distributed implementation of a subset of Redis.我们从官网看到,redis3.0正式支持集群,请教各位大神,那2.8之前的版......

GreatQing
2015/08/24
123
1
[个人翻译]Redis 集群教程(上)

[个人翻译]Redis 集群教程(中) [个人翻译]Redis 集群教程(下)     官方原文地址:https://redis.io/topics/cluster-tutorial     水平有限,如果您在阅读过程中发现有翻译的不合理...

lpxxn
2016/12/08
0
0
免费的编程中文书籍索引【收藏速度】

语言无关类 优质博客 PyTab在线手册中心 ImportNew 廖雪峰的官方网站 程序员博客墙 操作系统 开源世界旅行手册 鸟哥的Linux私房菜 Linux 系统高级编程 The Linux Command Line (中英文版) L...

yonghu86
2015/04/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python3学习日志二 Python中的集合set和字典dict

1.集合set 定义一个集合set 我们可以看到定义集合set有两种不同的形式,如果要定义一个空的集合set不能用{}而是要用set();另外,集合是无序的,而且set中的元素是不可重复的,如果你定义了一...

Mr_bullshit
11分钟前
0
0
adb 操作指令详解

ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。 注:有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。...

孟飞阳
18分钟前
0
0
nodejs安装以及环境配置(很好的node安装和配置文章,少走很多弯路)

一、安装环境 1、本机系统:Windows 10 Pro(64位) 2、Node.js:v6.9.2LTS(64位) 二、安装Node.js步骤 1、下载对应你系统的Node.js版本:https://nodejs.org/en/download/ 2、选安装目录进...

sprouting
34分钟前
0
0
Redisson

了解了Redisson,发现使用挺简单的,接下来准备深入学习一下。 Redisson介绍 Redisson是架设于Redis基础之上的一个Java驻内存数据网格(In-Memory Data Grid) Redisson在基于NIO的Netty框架上...

to_ln
34分钟前
0
0
python有哪些好玩的应用实现,用python爬虫做一个二维码生成器

python爬虫不止可以批量下载数据,还可以有很多有趣的应用,之前也发过很多,比如天气预报实时查询、cmd版的实时翻译、快速浏览论坛热门帖等等,这些都可以算是爬虫的另一个应用方向! 今天给...

python玩家
35分钟前
0
0
jq 判断复选框是否被选中,复选框后台接收

1. 效果 2. 代码 html部分: JS部分: var rememberLogin = $("#rememberLoginId").is(':checked')//获取复选框是否被选中 var rememberLoginval = $("#rememberLoginId").attr('value')//拿......

Lucky_Me
42分钟前
0
0
python爬虫日志(3)-爬去异步加载网页

在浏览器检查元素页面中,选取Network中的XHR选项即可观察每次加载页面,网页发出的请求,观察url的规律即可利用封装的函数对每一页进行爬取。

茫羽行
42分钟前
0
0
《趣谈网络协议》01之为什么要学习网络协议?

一、协议 1.协议的定义 简单说协议就是一个规则,保证沟通交流双方可以互相听懂、理解或者可以双方合作可以顺利进行的一个约定和规则。 2.生活中例子 (1)有一种叫“程序猿”的物种,敲着一种...

aibinxiao
44分钟前
1
0
Python数据分析numpy基础-维度的认识

什么是多维数组? 核心对象是同型的多维数组(简单理解就是一个表格,通常内容都是些数字),具有相同的数据类型。 概念: 1. axes(轴):数组的维度统称为轴。 2. rank:轴的数量称为rank。...

十年磨一剑3344
48分钟前
0
0
Java 正则表达式相关资料

1.java正则表达式过滤html标签

IT追寻者
51分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部