Redis系列(十)--集群cluster
在之前学习了Master-Slave、Sentinel模式,但是在某些情况下还是无法满足系统对QPS等要求,这时候就需要Cluster,Redis3.0支持了cluster
一、为什么使用Cluster
1、并发量
官方说明Redis支持10W条命令/秒,这已经很牛逼了,但是有些业务场景需要100W条命令/秒,当然这可能是一线互联网公司的场景
2、数据量
Master-Slave模式下内存、网络流量(网卡)无法满足要求
二、数据分区
我们使用cluster,有一个很重要的原因就是数据量过大,这种时候就要考虑数据分区了
1、顺序分布:数据倾斜
2、hash分布:通过hash函数进行分区,hash分布有很多实现方式,常见的有一下两种
1).节点取余:通过hash和取余,比较简单,当进行节点扩容/伸缩的时候,数据迁移率80%,最好是进行翻倍扩容,数据迁移率50%
2).一致性hash
将数据看做一个token环,范围0~2^32,对key进行hash计算,例如落到n1-n2之间,就会顺时针找离自己最近的节点,最终落到n2节点
2.1).扩容:
新增节点n5,只会影响hash落到n1-n5之间的数据,之前这些数据最终落到n2节点,但是现在找到n5节点,是无法找到的,还是存在数据迁移,
如果现在有1000个节点,新增节点时,影响的范围很小1/1000,所以一致性hash适合节点比较多的情况
2.2).翻倍扩容:
保证最小数据迁移和负载均衡(新增n5节点,如果数据分布不均衡,主要在n1--n2之间,还是有很大问题)
顺序分步和hash分布对比:
3、虚拟槽分区:Redis采用的分区方式
1、预设虚拟槽:每个槽映射一个数据子集,一般比节点数大
2、hash函数:例如CRC16
3、Server管理节点、槽和数据之间的关系:例如Redis Cluster
虚拟槽分配:一共有16383个槽
流程:
首先将key进行hash,然后和16383取余,发送给Redis Cluster任意一个node,每个node都会记录自己负责的slot,如果命中,保存在自己的
slot里面,如果没有命中,会返回应该是哪个node,直接去找就行了,因为node之间通过meet操作,自动进行感知,然后相互之间交换数据信息
三、Redis Cluster安装架构
两种安装方式:
1、原生命令安装
2、官方工具安装
为了理解结构,可以尝试原生命令安装
1、原生命令安装
启动六个node,默认三主三从,6379/6380/6381/6382/6383/6384
1、设置:
cluster-enabled:yes 就是使用集群模式启动
cluster-node-timeout 15000 节点超时时间15s
cluster-config-file nodes-${port}.conf 开启每个节点的配置
cluster-require-full-coverage no 要求所有节点都可用才对外提供Redis服务
启动:
redis-server redis-6379.conf
redis-server redis-6380.conf
redis-server redis-6381.conf
redis-server redis-6382.conf
redis-server redis-6383.conf
redis-server redis-6384.conf
2、meet操作:
流程:
1、A对B进行meet操作,B返回pong
2、B对C进行meet操作,C返回pong
3、节点通过内部协议,自动进行节点的感知(),C也能了解到B,他们也是通的,都可以交换消息
命令:cluster meet ip port
例如:
redis-cli -h 127.0.0.1 -p 6379 meet 127.0.0.1 6380
redis-cli -h 127.0.0.1 -p 6379 meet 127.0.0.1 6381
redis-cli -h 127.0.0.1 -p 6379 meet 127.0.0.1 6382
redis-cli -h 127.0.0.1 -p 6379 meet 127.0.0.1 6383
redis-cli -h 127.0.0.1 -p 6379 meet 127.0.0.1 6384
3、指派槽
命令:cluster addslots slot[slot...]
例如:
redis-cli -h 127.0.0.1 -p 6379 cluster addslots {0...5461}
redis-cli -h 127.0.0.1 -p 6380 cluster addslots {5461...10922}
redis-cli -h 127.0.0.1 -p 6381 cluster addslots {10922...16383}
4、设置主从
命令:cluster replicate node-id
例如:
redis-cli -h 127.0.0.1 -p 6382 cluster replicate ${node-id-6379}
redis-cli -h 127.0.0.1 -p 6383 cluster replicate ${node-id-6380}
redis-cli -h 127.0.0.1 -p 6384 cluster replicate ${node-id-6381}
到此,集群已经建立完毕
5、特性
1).主从复制
2).高可用
3).分片:多个主节点进行读写
未完待续。。。
Redis系列(十)--集群cluster的更多相关文章
- redis系列:集群
1 简介 Redis 集群是Redis 的一个分布式实现,它是一个网状结构,每个节点都通过 TCP 连接跟其他每个节点连接.现在来看看Redis集群实现了哪些目标? 在1000个节点的时候仍能表现得很 ...
- redis单点、redis主从、redis哨兵sentinel,redis集群cluster配置搭建与使用
目录 redis单点.redis主从.redis哨兵 sentinel,redis集群cluster配置搭建与使用 1 .redis 安装及配置 1.1 redis 单点 1.1.2 在命令窗口操作r ...
- Redis进阶实践之十 Redis主从复制的集群模式
一.引言 Redis的基本数据类型,高级特性,与Lua脚本的整合等相关知识点都学完了,说是学完了,只是完成了当前的学习计划,在以后的时间还需继续深入研究和学习.从今天开始来讲一下有关Re ...
- Docker快速构建Redis集群(cluster)
Docker快速构建Redis集群(cluster) 以所有redis实例运行在同一台宿主机上为例子 搭建步骤 redis集群目录清单 . ├── Dockerfile ├── make_master ...
- 面试连环炮系列(二):你们的项目Redis做了集群部署吗
你们的项目Redis做了集群部署吗? 我们有大量数据需要缓存,而单实例的容量毕竟是有限的,于是做了Redis集群部署. 采取的方案是什么,Codis还是Redis Cluster,为什么要选择这个方案 ...
- redis集群cluster简单设置
环境: 这里参考官方使用一台服务器:Centos 7 redis-5.0.4 192.168.10.10 redis集群cluster最少要3个主节点,所以本次需要创建6个实例:3个主节点,3 ...
- Redis 3.0 集群搭建
Redis 3.0 集群搭建 开启两个虚拟机 分别在两个虚拟机上开启3个Redis实例 3主3从两个虚拟机里的实例互为主备 下面分别在两个虚拟机上安装,网络设置参照codis集群的前两个主机 分别关闭 ...
- Redis 3.0集群 Window搭建方案
Redis 3.0集群 Window搭建方案 1.集群安装前准备 安装Ruby环境,安装:rubyinstaller-2.3.0-x64.exe http://dl.bintray.com/onecl ...
- Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享
Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享 ============================= 蕃薯耀 2017年11月27日 http: ...
随机推荐
- ACdream区域赛指导赛之手速赛系列(5) 题解
A - Problem A Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submi ...
- [办公应用]如何保护我的EXCEL表格结构,不被填表人员随意改动
同事很苦恼的说,下发要求部门人员填写的EXCEL表格,已经加了密码,结果最后还是被他们自行复制后,更改了列结构,“一塌糊涂”的填写交了上来.这样给他的后续处理带来了很多麻烦. 我相信不少朋友很多时候都 ...
- linux switch_root
1 命令格式 switch_root newroot init 跳转到另外一个文件系统,并且把newroot作为新的mount tree,并且执行init程序. 2 特殊要求 newroot必须是一个 ...
- js生成页面水印
路: 获取想要插入水印的文档节点的顶点坐标值x,y. 获取文档节点的高度heigt和宽度width. 用div包裹文字来生成水印. 定义好div的长宽高间距等各种属性. 定义虚拟节点createDoc ...
- 预载入和javascript对象
请参见 http://www.west263.com/info/html/wangyezhizuo/Javascript/20080225/34168.html
- Linux/Android——input子系统核心 (三)【转】
本文转载自:http://blog.csdn.net/jscese/article/details/42123673 之前的博客有涉及到linux的input子系统,这里学习记录一下input模块. ...
- openstack horizon 学习(2) navigation、dashboard、panels
本章的主要内容是如何用horizon的navigation结构添加一个应用的面板. Horizon中提供了两种为应用添加panel的方法,一种是通过Pluggable Settings的方式,另一种是 ...
- 并不对劲的st表
对于带修改的区间求和能做到O(n log n)预处理,O(log n)查询:而不带修改的可以做到O(n)预处理,O(1)查询.那么不带修改的区间最值能做到O(1)查询吗? 区间最值有这样一个性质:对于 ...
- Code First: 五大映射模式
映射一 Mapping the Table-Per-Hierarchy (TPH) Inheritance 模型文件 using System.Data.Entity; using System.Da ...
- Same Tree 序列化二叉树
https://oj.leetcode.com/problems/same-tree/ Given two binary trees, write a function to check if the ...