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"
这时就可以正常取到正确值了
- 第二章:Shiro入门——深入浅出学Shiro细粒度权限开发框架
- 在Apache Spark上跑Logistic Regression算法
- 第四章:Shiro的身份认证(Authentication)——深入浅出学Shiro细粒度权限开发框架
- 第五章:Shiro的授权(Authorization)——深入浅出学Shiro细粒度权限开发框架
- 第六章:Shiro的Realms——深入浅出学Shiro细粒度权限开发框架
- 第八章:Shiro和Spring的集成——深入浅出学Shiro细粒度权限开发框架
- 第九章:Shiro的Web——深入浅出学Shiro细粒度权限开发框架
- 第十章:Shiro的Cache——深入浅出学Shiro细粒度权限开发框架
- Appboy基于MongoDB的数据密集型实践
- 微信企业号登录授权Java实现获取员工userid根据userid换openid
- 微信支付-微信红包Java版本
- Universe入门
- 分享一款值得分享的写作工具
- 微信二次开发Java自定义菜单事件实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 从0开始打造UI框架:动态化框架Scrollview物理学算法解析
- 基于Keras的格式化输出Loss实现方式
- PHP信号处理机制的操作代码讲解
- php防止表单重复提交实例讲解
- Python实现封装打包自己写的代码,被python import
- 创建一个 Serverless 应用,真的没有这么难!
- PHP使用mongoclient简单操作mongodb数据库示例
- 基于TensorFlow的CNN实现Mnist手写数字识别
- django rest framework 自定义返回方式
- PHP+Ajax实现的检测用户名功能简单示例
- Yii框架学习笔记之session与cookie简单操作示例
- Ajax+Jpgraph实现的动态折线图功能示例
- Python闭包及装饰器运行原理解析
- Django中Q查询及Q()对象 F查询及F()对象用法
- keras.layer.input()用法说明