Redis 集群之 Redis-Cluster
Redis集群官方推荐方案 Redis-Cluster
集群 redis cluster
通过分片实࣫容量扩展
通过主从复制实࣫节点的高可用
节点之间互相通信
每个节点都维护整个集群的节点信息
redis-cluster把所有的物理节点映射到[0-16383]slotЇ,cluster 负责维护node<->slot<->key
Redis-Cluster的优势
1、官方推荐,毋庸置疑。
2、去中心化,集群最大可增加1000个节点,性能随节点增加而线性扩展。
3、管理方便,后续可自行增加或摘除节点,移动分槽等等。
4、简单,易上手
redis-cluster名词介绍
1、master 主节点
2、slave 从节点
3、slot 槽,一共有16384数据分槽,分布在集群的所有主节点中
集群内部划分为16384个数据分槽,分布在三个主redis中
一致性hash
普通hash的缺点
– 当hash节点数量发生变化时,大部分的数据的hash值都会发生变化,这将导致数据的缓存命中率下降很多
– 随着业务的发展,换从容量会受限,进行扩容又是必然的需求
一致性hash
– Key空间比较大,为0~~(2^32)-1个,形成一个࣪
– 把机器也通过hash算法映射到此环上
– 把数据的key也映射到此环上,以相同的hash算法
– 按照顺时针的方向,把数据存储在最近的节点上
– 优点:
• 当新加入某个机器时,只会影响落入此节点左边和前一个节点之间的数据
• 当删除某个机器时,也只会影响这个节点左边和前一个节点之间的数据
– 缺点:
• 数据分布不够均匀,新加入的节点的数据较少,也不能能把旧节点的数据进行迁移
如何解决数据分布不均匀—平衡性
– 思路:足够多的机器节点-----构建虚拟节点,然后做虚拟节点与物理节点的映射
– 虚拟节点ࡁ物理节点多,分布较均匀
常用命令
cluster nodes 查看集群所有节点
cluster info 查看集群状态信息
cluster slots 查看集群槽位的分配信息
CLUSTER KEYSLOT key 返回某个key对应的槽位的槽位
CLUSTER DELSLOTS slot [slot ...] 删除当前节点的槽位
1 准备节点
ip:port
127.0.0.1 6379 127.0.0.1 6382
127.0.0.1 6383 127.0.0.1 6384
127.0.0.1 6385 127.0.0.1 6386
修改配置文件 /etc/redis/6379.conf
pidfile "/var/run/redis_6379.pid"
port 6379 //端口
logfile "/etc/redis/6379.log"
dbfilename "dump-6382.rdb"
cluster-enabled yes //开启集群模式
cluster-config-file nodes-6379.conf //集群内部的配置文件
cluster-node-timeout 15000 //节点超时时间,单位毫秒
// 其他配置和单机模式相同
#/usr/local/redis/src/redis-server /etc/redis/6379.conf
/usr/local/redis/src/redis-server /etc/redis/6382.conf
/usr/local/redis/src/redis-server /etc/redis/6383.conf
/usr/local/redis/src/redis-server /etc/redis/6384.conf
/usr/local/redis/src/redis-server /etc/redis/6385.conf
/usr/local/redis/src/redis-server /etc/redis/6386.conf
/usr/local/redis/src/redis-server /etc/redis/6387.conf
[root@hongquan1 redis]# /usr/local/redis/src/redis-server /etc/redis/6379.conf
*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 945
>>> 'slaveof 127.0.0.1 6380'
slaveof directive not allowed in cluster mode
[root@hongquan1 redis]# ps -ef|grep redis
root 30167 1 0 08:10 ? 00:00:00 /usr/local/redis/src/redis-server *:6387 [cluster]
root 30762 1 0 08:14 ? 00:00:00 /usr/local/redis/src/redis-server *:6382 [cluster]
root 30781 1 0 08:14 ? 00:00:00 /usr/local/redis/src/redis-server *:6383 [cluster]
root 30783 1 0 08:14 ? 00:00:00 /usr/local/redis/src/redis-server *:6384 [cluster]
root 30785 1 0 08:14 ? 00:00:00 /usr/local/redis/src/redis-server *:6385 [cluster]
root 30793 1 0 08:14 ? 00:00:00 /usr/local/redis/src/redis-server *:6386 [cluster]
root 30840 3385 0 08:14 pts/1 00:00:00 grep redis
/usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6387
cluster-config-file nodes-6387.conf
集群配置文件的作用:当集群内节点发生信息变化时,如添加节点、节点下线、故障转移等。节点会自动保存集群的状态到配置文件中。该配置文件由Redis自行维护,不要手动修改,防止节点重启时产生集群信息错乱。
[root@hongquan1 redis]# tail -n 20 nodes-6387.conf
aa95cc1e617a173aba2a1839a9fcf03f1fa06a94 :0 myself,master - 0 0 0 connected
vars currentEpoch 0 lastVoteEpoch 0
127.0.0.1:6387> cluster nodes
aa95cc1e617a173aba2a1839a9fcf03f1fa06a94 :6387 myself,master - 0 0 0 connected
2 节点握手
节点握手是指一批运行在集群模式的节点通过Gossip协议彼此通信,达到感知对方的过程。节点握手是集群彼此通信的第一步,由客户端发起命令:cluster meet <ip> <port>
127.0.0.1:6387> cluster meet 127.0.0.1 6382
OK
让所有的节点都互相感知
127.0.0.1:6387> cluster nodes
e70238d739f433b74d4e86c4f651ea97085e2306 127.0.0.1:6382 master - 0 1525825154654 0 connected
aa95cc1e617a173aba2a1839a9fcf03f1fa06a94 127.0.0.1:6387 myself,master - 0 0 1 connected
127.0.0.1:6387> cluster meet 127.0.0.1 6383
OK
127.0.0.1:6387> cluster meet 127.0.0.1 6384
OK
127.0.0.1:6387> cluster meet 127.0.0.1 6385
OK
127.0.0.1:6387> cluster meet 127.0.0.1 6386
OK
127.0.0.1:6387> cluster nodes
1b62871cebb802ebed82b7ce43d2a58a08168c35 127.0.0.1:6383 master - 0 1525825206274 2 connected
714ff9c0cf3c5c45c80bf093a17b290ed02415e9 127.0.0.1:6384 master - 0 1525825207289 3 connected
aa95cc1e617a173aba2a1839a9fcf03f1fa06a94 127.0.0.1:6387 myself,master - 0 0 1 connected
e70238d739f433b74d4e86c4f651ea97085e2306 127.0.0.1:6382 master - 0 1525825207596 0 connected
52a74656529a7af4bd10060038bc866b60e9bb92 127.0.0.1:6385 master - 0 1525825210432 4 connected
e00a19c26d02de645fa1bf493319a91952d49504 127.0.0.1:6386 master - 0 1525825209363 5 connected
前已经使这六个节点组成集群,但是现在还无法工作,因为集群节点还没有分配槽(slot)
3 分配槽
启动后的集群状态为fail,只有把所有槽位都分配给集群节点后状态才变为可用
可以看一下6379端口的槽个数
127.0.0.1:6387> cluster info
cluster_state:fail //状态为fail
cluster_slots_assigned:0 // 被分配槽的个数为0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_sent:233
cluster_stats_messages_received:233
接下来为节点分配槽空间。通过cluster addslots命令。
16383个槽位必须全部分配玩,不同节点不能重复,一个槽位只能位于一个节点上
/usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6387 cluster addslots {0..5461}
/usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6382 cluster addslots {5462..10922}
/usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6383 cluster addslots {10923..16383}
[root@hongquan1 redis]# /usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6387 cluster addslots {0..5461}
OK
[root@hongquan1 redis]# /usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6382 cluster addslots {5462..10922}
OK
[root@hongquan1 redis]# /usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6383 cluster addslots {10923..16383}
OK
[root@hongquan1 redis]# /usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6387
127.0.0.1:6387> cluster info
cluster_state:ok //分配后,状态为ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_sent:453
cluster_stats_messages_received:453
可以通过CLUSTER NODES来查看分配情况:
127.0.0.1:6387> cluster nodes
1b62871cebb802ebed82b7ce43d2a58a08168c35 127.0.0.1:6383 master - 0 1525825377690 2 connected 10923-16383
714ff9c0cf3c5c45c80bf093a17b290ed02415e9 127.0.0.1:6384 master - 0 1525825378752 3 connected
aa95cc1e617a173aba2a1839a9fcf03f1fa06a94 127.0.0.1:6387 myself,master - 0 0 1 connected 0-5461
e70238d739f433b74d4e86c4f651ea97085e2306 127.0.0.1:6382 master - 0 1525825377895 0 connected 5462-10922
52a74656529a7af4bd10060038bc866b60e9bb92 127.0.0.1:6385 master - 0 1525825375628 4 connected
e00a19c26d02de645fa1bf493319a91952d49504 127.0.0.1:6386 master - 0 1525825376647 5 connected
目前还有三个节点没有使用,作为一个完整的集群,每个负责处理槽的节点应该具有从节点,保证当主节点出现故障时,可以自动进行故障转移。
集群模式下,首次启动的节点和被分配槽的节点都是主节点,从节点负责复制主节点槽的信息和相关数据。
使用cluster replicate <nodeid>在从节点上执行
127.0.0.1 6387 127.0.0.1 6384
127.0.0.1 6382 127.0.0.1 6385
127.0.0.1 6383 127.0.0.1 6386
/usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6384 cluster replicate aa95cc1e617a173aba2a1839a9fcf03f1fa06a94
/usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6385 cluster replicate e70238d739f433b74d4e86c4f651ea97085e2306
/usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6386 cluster replicate 1b62871cebb802ebed82b7ce43d2a58a08168c35
127.0.0.1:6387> cluster nodes
1b62871cebb802ebed82b7ce43d2a58a08168c35 127.0.0.1:6383 master - 0 1525825628380 2 connected 10923-16383
714ff9c0cf3c5c45c80bf093a17b290ed02415e9 127.0.0.1:6384 slave aa95cc1e617a173aba2a1839a9fcf03f1fa06a94 0 1525825625343 3 connected
aa95cc1e617a173aba2a1839a9fcf03f1fa06a94 127.0.0.1:6387 myself,master - 0 0 1 connected 0-5461
e70238d739f433b74d4e86c4f651ea97085e2306 127.0.0.1:6382 master - 0 1525825628790 0 connected 5462-10922
52a74656529a7af4bd10060038bc866b60e9bb92 127.0.0.1:6385 slave e70238d739f433b74d4e86c4f651ea97085e2306 0 1525825627360 4 connected
e00a19c26d02de645fa1bf493319a91952d49504 127.0.0.1:6386 slave 1b62871cebb802ebed82b7ce43d2a58a08168c35 0 1525825626349 5 connected
这样就完成了一个3主3从的Redis集群搭建
127.0.0.1:6387> cluster slots
1) 1) (integer) 10923
2) (integer) 16383
3) 1) "127.0.0.1"
2) (integer) 6383
4) 1) "127.0.0.1"
2) (integer) 6386
2) 1) (integer) 0
2) (integer) 5461
3) 1) "127.0.0.1"
2) (integer) 6387
4) 1) "127.0.0.1"
2) (integer) 6384
3) 1) (integer) 5462
2) (integer) 10922
3) 1) "127.0.0.1"
2) (integer) 6382
4) 1) "127.0.0.1"
2) (integer) 6385
Redis 集群之 Redis-Cluster的更多相关文章
- redis集群之REDIS CLUSTER
redis集群之REDIS CLUSTER 时间 2016-04-11 17:05:00 NoSQL_博客园 原文 http://www.cnblogs.com/zhanchenjin/p/537 ...
- Redis集群教程(Redis cluster tutorial)
本博文翻译自Redis官网:http://redis.io/topics/cluster-tutorial 本文档以温和的方式介绍Redis集群,不使用复杂的方式来理解分布式系统的概念. ...
- Redis 集群:CLUSTERDOWN The cluster is down
1.错误 (error)CLUSTERDOWN The cluster is down 2.问题表现 Java项目使用redis集群时报错, HTTP Status 500 - Could not g ...
- Redis集群模式(Cluster)部署
1. 安装依赖包 注意:本节需要使用root用户操作 1.1 安装ruby yum install ruby -y yum install ruby-devel.x86_64 -y 1.2 安装rub ...
- Redis集群~StackExchange.redis连接Twemproxy代理服务器
回到目录 本文是Redis集群系列的一篇文章,主要介绍使用StackExchange.Redis进行Twemproxy(文中简称TW)代理服务的连接过程,事务上,对于TW来说,我们需要理解一下它的物理 ...
- 在虚拟机上安装redis集群,redis使用版本为4.0.5,本机通过命令客户端可以连接访问,外部主机一直访问不了
在虚拟机上安装了redis 4 ,启动后本机客户端可以连接访问,但是外部主机一直访问不了,在使用java代码连接redis集群时报:no reachable node in cluster,原因:在r ...
- redis高可用、redis集群、redis缓存优化
今日内容概要 redis高可用 redis集群 redis缓存优化 内容详细 1.redis高可用 # 主从复制存在的问题: 1 主从复制,主节点发生故障,需要做故障转移,可以手动转移:让其中一个sl ...
- Redis集群~StackExchange.redis连接Sentinel服务器并订阅相关事件(原创)
回到目录 对于redis-sentinel我在之前的文章中已经说过,它是一个仲裁者,当主master挂了后,它将在所有slave服务器中进行选举,选举的原则当然可以看它的官方文章,这与我们使用者没有什 ...
- Redis集群_3.redis主从自动切换Sentinel(转)
Redis SentinelSentinel(哨兵)是用于监控redis集群中Master状态的工具,其已经被集成在redis2.4+的版本中 一.Sentinel作用:1):Master状态检测 2 ...
- Linux(ubuntu)安装redis集群,redis集群搭建
今天学习一下redis集群的搭建.redis在现在是很常用的数据库,在nosql数据库中也是非常好用的,接下来我们搭建一下redis的集群. 一.准备 首先我们要安装c语言的编译环境,我们要安装red ...
随机推荐
- jsp中的basePath和path(绝对路径 相对路径)
在JSP中的如果使用 "相对路径" 则有 可能会出现问题. 因为 网页中的 "相对路径" , 他是相对于 "URL请求的地址" 去寻找资源. ...
- Tomcat虚拟目录的配置
Tomcat可以作为应用服务器部署Java应用,同时可以创建虚拟目录存放图片,相当于一个图片服务器使用1. 创建目录 /usr/images/2. 编辑TOMCAT_HOME/conf/server. ...
- js用星号隐藏电话中间四位号码
$(document).ready(function(){ var mobile="{$user.mobile}"; var reg=/^(\d{3})\d{4}(\d{4})$/ ...
- 关于UML方法学图中类之间的关系:依赖,泛化,关联
类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什 ...
- JMeter-Window10系统下设置环境变量
首先我们右击此电脑(我的电脑),点击属性 接下来我们就可以进入到控制面板主页,点击[高级系统设置] 在系统属性里面,点击[环境变量]按钮 在环境变量里面,点击[新建]按钮 接下来我们输 ...
- 应用程序.f/q(f了个墙)
1.20180414: 前两天,发现 CnFast不能用了,也没管它 以为过两天会好. 今天发现还是不能用,上网随便baidu下,看到个帖子:有人用加速精灵吗 现在登陆不了了 哪位大佬知道怎么回事啊[ ...
- 大视野 1012: [JSOI2008]最大数maxnumber(线段树/ 树状数组/ 单调队列/ 单调栈/ rmq)
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 9851 Solved: 4318[Submi ...
- android之Uri的常用几个例子
显示网页: 1. Uri uri = Uri.parse("http://www.google.com"); 2. Intent it = new Intent(Inten ...
- tableau join 与格式问题
一开始我没有找到它的join 方法.其实应该是编辑相应的join关系.选择数据源,选择字段.数据源是可以选择的. 剩下的计算问题,要再弄下.不好说,这个其实烦了我很久了. 高级选项,扩展最大行数.即可 ...
- 15 Python 迭代器和生成器
什么是迭代 (iterable) 字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. 可以直接作用于for循环的对象统称为可迭代对象(Iterable). 可以被next()函数 ...