在之前学习了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的更多相关文章

  1. redis系列:集群

    1 简介 Redis 集群是Redis 的一个分布式实现,它是一个网状结构,每个节点都通过 TCP 连接跟其他每个节点连接.现在来看看Redis集群实现了哪些目标? 在1000个节点的时候仍能表现得很 ...

  2. redis单点、redis主从、redis哨兵sentinel,redis集群cluster配置搭建与使用

    目录 redis单点.redis主从.redis哨兵 sentinel,redis集群cluster配置搭建与使用 1 .redis 安装及配置 1.1 redis 单点 1.1.2 在命令窗口操作r ...

  3. Redis进阶实践之十 Redis主从复制的集群模式

    一.引言        Redis的基本数据类型,高级特性,与Lua脚本的整合等相关知识点都学完了,说是学完了,只是完成了当前的学习计划,在以后的时间还需继续深入研究和学习.从今天开始来讲一下有关Re ...

  4. Docker快速构建Redis集群(cluster)

    Docker快速构建Redis集群(cluster) 以所有redis实例运行在同一台宿主机上为例子 搭建步骤 redis集群目录清单 . ├── Dockerfile ├── make_master ...

  5. 面试连环炮系列(二):你们的项目Redis做了集群部署吗

    你们的项目Redis做了集群部署吗? 我们有大量数据需要缓存,而单实例的容量毕竟是有限的,于是做了Redis集群部署. 采取的方案是什么,Codis还是Redis Cluster,为什么要选择这个方案 ...

  6. redis集群cluster简单设置

    环境: 这里参考官方使用一台服务器:Centos 7  redis-5.0.4    192.168.10.10 redis集群cluster最少要3个主节点,所以本次需要创建6个实例:3个主节点,3 ...

  7. Redis 3.0 集群搭建

    Redis 3.0 集群搭建 开启两个虚拟机 分别在两个虚拟机上开启3个Redis实例 3主3从两个虚拟机里的实例互为主备 下面分别在两个虚拟机上安装,网络设置参照codis集群的前两个主机 分别关闭 ...

  8. Redis 3.0集群 Window搭建方案

    Redis 3.0集群 Window搭建方案 1.集群安装前准备 安装Ruby环境,安装:rubyinstaller-2.3.0-x64.exe http://dl.bintray.com/onecl ...

  9. Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

    Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享 ============================= 蕃薯耀 2017年11月27日 http: ...

随机推荐

  1. Oracle 远程访问配置 在 Windows Forms 和 WPF 应用中使用 FontAwesome 图标 C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素” C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper Decimal类型截取保留N位小数向上取, Decimal类型截取保留N位小数并且不进行四舍五入操作

    Oracle 远程访问配置   服务端配置 如果不想自己写,可以通过 Net Manager 来配置. 以下配置文件中的 localhost 改为 ip 地址,否则,远程不能访问. 1.网络监听配置 ...

  2. java并发编程之Semaphore

    信号量(Semaphore).有时被称为信号灯.是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们可以正确.合理的使用公共资源. 一个计数信号量.从概念上讲,信号量维护了一个许可集.如 ...

  3. 【bzoj4542】[Hnoi2016]大数

    #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> # ...

  4. gcc优化选项解析

    1 -fno-defer-pop 函数返回的时候,就立即将栈里面放置的该函数的参数pop出来.这样可以避免函数参数占用过多的栈空间. 2 -fforward-propagate ? 3 -ffp-co ...

  5. 为什么要在css文件里定义 ul{margin:0;padding:0;}这个选择器?

    为什么要在css文件里定义 ul{margin:0;padding:0;}这个选择器? ul标签在FF中默认是有padding值的,而在IE中仅仅有margin默认有值.请看下面不同浏览中对paddi ...

  6. XMU 1040 Schedule 【拓扑排序】

    1040: Schedule Time Limit: 500 MS  Memory Limit: 64 MBSubmit: 12  Solved: 2[Submit][Status][Web Boar ...

  7. POJ 1060:Modular multiplication of polynomials

    Modular multiplication of polynomials Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4 ...

  8. BZOJ_1150_[CTSC2007]数据备份Backup_堆+贪心

    BZOJ_1150_[CTSC2007]数据备份Backup_堆+贪心 Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏 ...

  9. apache相关补充

    apache相关补充 sendfile机制 1)不用sendfile的传统网络传输过程: read(file, tmp_buf, len) write(socket, tmp_buf, len) 2) ...

  10. UVaLive 6680 Join the Conversation (DP)

    题意:给出n条发言,让你求最大的交流长度并输出标记顺序. 析:这个题要知道的是,前面的人是不能at后面的人,只能由后面的人at前面的,那就简单了,我们只要更新每一层的最大值就好,并不会影响到其他层. ...