Redis3 cluster 集群配置测试

Redis3 已经正式支持集群了,之前需要使用第三方的代理来实现多个redis的集群

Redis 集群可以在多个 Redis 节点之间进行数据共享

将数据自动切分到多个节点,即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求

原理

Redis3 cluster使用了 hash slot(哈希槽)的概念,一个redis节点上分配多个slot,一个slot中存放多个key

一个cluster包含16384个slot,集群中的每个节点负责处理一部分哈希槽,也很容易向集群中添加或者删除redis节点

举个例子, 一个集群可以有三个哈希槽, 其中:

节点 A 负责处理 0 - 5500

节点 B 负责处理 5501 - 11000

节点 C 负责处理 11001 - 16383

如果想添加节点 D,只需要重新分配一下哈希槽,从 A B C 中拿出一部分哈希槽,移到 D 中

如果想移除节点 A,只需要将 A 中的所有哈希槽移动到 B 和 C , 然后再移除空白的节点 A 就可以了

哈希槽的移动过程是安全的,不会造成节点阻塞,无论是添加新节点,还是移除已存在节点, 又或者改变某个节点包含的哈希槽数量, 都不会造成集群下线

创建并测试 Redis3 cluster

安装 redis3

下载地址 http://www.redis.io/download,选择3.0稳定版本下载

$ tar xzf redis-3.x.x.tar.gz
$ cd redis-3.x.x
$ make
$ cd src
$ make install

cp /redis安装目录/src/redis-server /usr/local/bin
cp /redis安装目录/src/redis-cli /usr/local/bin
cp /redis安装目录/src/redis-trib.rb /usr/local/bin

安装依赖

redis3 的集群命令是用ruby写的,所以需要安装ruby的相关环境

yum -y install ruby ruby-rdoc

yum install rubygems

下载 redis-3.0.0.gem,地址 https://rubygems.org/gems/redis/versions/3.2.1

gem install -l redis-3.2.1.gem

配置cluster

这里我们创建6个redis节点,3个作为master,3个作为slave

6个节点的端口号分别为:7000 7001 7002 7003 7004 7005

创建每个节点的目录

$ mkdir /data/cluster -p

$ cd /data/cluster

$ mkdir 7000 7001 7002 7003 7004 7005

cp /redis安装目录/redis.conf /data/cluster/7000

编辑 /data/cluster/7000/redis.conf

修改下面几项的值:

port 7000

daemonize yes

appendonly yes

打开下面几项的注释:

cluster-enabled

cluster-config-file

cluster-node-timeout

保存后,把这个redis.conf分别拷贝到 7001 - 7005 目录下,再修改每一个,把port的值改为各自的

配置文件修改完成后,分别启动每个redis

$ cd /data/cluster/7000

$ redis-server redis.conf

同理启动其他的 7001 - 7005

检查是否启动成功

ps -ef | grep redis

如果显示出 7000 - 7005 的redis进程,就说明这6个redis启动成功

root     16403     1  0 01:38 ?        00:00:00 redis-server *:7000 [cluster]
......

创建集群

redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

执行后,会进行连接与分配等操作,然后提示:

Can I set the above configuration? (type 'yes' to accept):

输入 yes ,回车,然后自动执行创建操作,成功后提示:

[OK] All 16384 slots covered.

这时,集群已经创建并启动成功了

测试

用客户端命令连接其中一个节点,测试简单的操作

redis-cli -p 7000
127.0.0.1:7000> set clustertest 'hi'
127.0.0.1:7000> get clustertest

退出后,连接另一个节点

redis-cli -p 7001
127.0.0.1:7001> get clustertest
(error) MOVED 1519 127.0.0.1:7000

提示这个key在ID为1519的哈希槽中,这个哈希槽在127.0.0.1:7000这个节点上

对于集群的客户端连接,要使用 -c 参数,不然就会出现上面的错误

退出重新连接

redis-cli -c -p 7001
127.0.0.1:7001> get clustertest
-> Redirected to slot [1519] located at 127.0.0.1:7000
"hi"

这时就可以正常取到正确值了

原文发布于微信公众号 - 性能与架构(yogoup)

原文发表时间:2015-06-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏增长技术

Android Studio查看Android源码

打开Android Studio,点击File>Open,选择刚刚生成的android.ipr就好了

42320
来自专栏云计算教程系列

如何在Debian 8上安装Django Web框架

Django是一个功能齐全的Python Web框架,用于开发动态网站和应用程序。使用Django,您可以快速创建Python Web应用程序,并依靠该框架来完...

17620
来自专栏张浩的专栏

Sqoop在导入的时候生成的MR代码教你怎么指定路径去存放

最近常用Sqoop导入一些数据到HDFS中。但是执行完成后,总是会在我执行sqoop命令的文件夹下生成一些MR代码。总是需要去手动清理。感觉比较困扰,然后就看S...

28410
来自专栏SDNLAB

ONOS编程系列(三)应用模板

此文章承接ONOS编程系列(二)命令行命令与服务开发,本文将为你介绍ONOS编程系列(三)应用模板。 每次新建项目都要重新手动构建应用项目的骨架,而且应用都放在...

36150
来自专栏测试驿栈

Jmeter(三十五)_分布式

在JMETER_HOME / bin / jmeter.properties中,找到名为“ remote_hosts ” 的属性,并添加正在运行的JMeter服...

13440
来自专栏IT综合技术分享

在ubuntu16.10上开启docker 17.03.0-ce的http远程访问

$ sudo dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock &

84920
来自专栏阿炬.NET

在线生成二维码的API接口

3.4K110
来自专栏老安的博客

zabbix 监控percona

16530
来自专栏Aloys的开发之路

Android真机安装sqlite3的方法

Android版本: 4.4.2 PS C:\Users\jiang> adb shell shell@hwH60:/ $ su - root # 此时输入s...

39890
来自专栏Angular&服务

ionic2 编译打包的坑,

Could not find an installed version of Gradle either in Android Studio, or on y...

11830

扫码关注云+社区

领取腾讯云代金券