Redis(六)集群
Redis集群
1.1 存在的问题
容量不够Redis如何扩容
并发写操作,Redis如何分摊
当主机或者从机宕机,薪火相传、反客为主等主从模式都会导致ip发生变化,应用程序中的配置需要对应修改主机地址以及端口号等信息。
主机代理方式

主机代理方式指的是不需要客户端去寻找需要的服务,而是只暴露一个代理服务器,由代理服务器转发服务请求,并且代理服务器也可以向其他服务的主机一样,添加一个从机防止主机宕机。
类似nginx以及前端的跨域代理,这样做的缺点是总共需要八台服务器,后期维护也很不方便
无中心化集群方式

无中心化的集群方式,则是任意的服务都可以作为集群的入口,并且各个服务之间能够相互连通调用,同样的功能无中心化集群配置只需要六台服务器即可实现了。
1.2 简介
Redis集群实现了对Redis的水平扩容,即总共启动N个Redis节点,将整个数据库分布存储在这N个节点中,每个节点存储的数据占总的数据的1/N。
Redis集群通过分区(partition)来提供一定程度的可用性(aviability),即使集群中有一部分节点失效无法进行通讯,redis集群也能够继续处理请求命令。
1.3 Redis集群的搭建
删除原有的RDB文件以及其他的配置文件
[root@hadoop100 myredis]# rm -rf redis6381.conf redis6382.conf
配置集群节点
6380
include /myredis/redis.conf
pidfile "/var/run/redis_6380.pid"
port 6380
dbfilename "dump6380.rdb"
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
制作6个实例:6381 6382 6383 6384 6385
81为80的从机,83为82的,85为84的
[root@hadoop100 myredis]# cp redis6380.conf redis6381.conf
[root@hadoop100 myredis]# cp redis6380.conf redis6382.conf
[root@hadoop100 myredis]# cp redis6380.conf redis6383.conf
[root@hadoop100 myredis]# cp redis6380.conf redis6384.conf
[root@hadoop100 myredis]# cp redis6380.conf redis6385.conf
[root@hadoop100 myredis]# ls
redis6380.conf redis6381.conf redis6382.conf redis6383.conf redis6384.conf redis6385.conf redis.conf sentinel.conf
然后修改里面的端口号、RDB文件名称以及集群节点名,这里就不赘述了
启动redis
[root@hadoop100 myredis]# ls /var/lib/redis/
dump6380.rdb dump6381.rdb dump6382.rdb dump.rdb nodes-6379.conf nodes-6381.conf nodes-6382.conf nodes-6383.conf nodes-6384.conf nodes-6385.conf
[root@hadoop100 myredis]# ps -ef | grep redis
root 2476 1 0 11月08 ? 00:01:37 redis-server 127.0.0.1:6378
polkitd 16606 16545 0 13:04 ? 00:00:42 redis-server *:6379
root 121480 1 0 23:03 ? 00:00:00 redis-server 127.0.0.1:6380 [cluster]
root 121628 1 0 23:03 ? 00:00:00 redis-server 127.0.0.1:6381 [cluster]
root 121743 1 0 23:03 ? 00:00:00 redis-server 127.0.0.1:6382 [cluster]
root 121814 1 0 23:03 ? 00:00:00 redis-server 127.0.0.1:6383 [cluster]
root 121885 1 0 23:03 ? 00:00:00 redis-server 127.0:6384 [cluster]
root 121957 1 0 23:03 ? 00:00:00 redis-server 127.0.0.1:6385 [cluster]
root 126306 21149 0 23:06 pts/4 00:00:00 grep --color=auto redis
然后可以在生成rdb文件的目录下发现生成的集群节点配置文件
[root@hadoop100 myredis]# ls /var/lib/redis/
dump6380.rdb dump6381.rdb dump6382.rdb dump.rdb nodes-6379.conf nodes-6381.conf nodes-6382.conf nodes-6383.conf nodes-6384.conf nodes-6385.conf
将六个节点合成集群
切换到安装目录下的src
执行合成集群命令
redis-cli --cluster create --cluster-replacas 1 X X X X X X
这里不能使用127.0.0.1,需要使用真实的IP地址
主从的分配原则尽量保证两个服务器运行在不同的IP地址
--cluster-replacas 1表示使用一台主机一个从机的模式

使用集群方式连接 redis-cli -c -p
使用任何一个端口号都可以连接到集群
cluster nodes查看集群信息

1.4 Redis集群slots插槽
在上面合成集群的命令执行后,会有一行All 16384 slots covered,slots即是redis插槽,集群使用CRCkey(16)%16384来计算键key属于哪一个插槽,集群的每一个节点只负责一部分插槽,如上面的几个主机分别负责0-5460,5461-10922,10923-16383插槽
在集群中录入值
在redis每次录入、查询键值,redis都会计算出该key对应的插槽,如果不是当前客户端对应的插槽则会报错并告知应前往对应的插槽的redis实例地址和端口。
redis-cli客户端提供了 -c参数 实现了自动重定向。
redis-cli -c -p 6379
不在同一个插槽的键值,不能够使用mget、mset等操作
在集群中以组的形式录入多个值 mset k1{g1} v1 k2{g2} v2
如上面所说,插入多个值的时候由于多个值对应的插槽不同,因此不能进行同时插入,redis提供了一种分组的形式来录入多个值,即将多个值声明为一个组,在计算插槽的时候按照组的名称计算,这样就实现了插入多个值
mset name{user} lucy age{user} 20
cluster keyslot 查询值对应的插槽
cluster countkeysinslot 查询key值对应插槽中的值的个数
注意只能查看当前客户端的插槽
cluster getkeysinslot 4847 10 返回10个指定key插槽中的值
1.5 集群的故障修复
和哨兵模式相同,主机宕机后,经过设置的延时时间15000,从机就变为了主机,这时候主机再连接会变为原来从机的从机。
主从服务器全部宕机的情况
如果某一段插槽的主从全部挂掉了,而cluster-require-full-coverage为yes,那么整个集群都会挂掉。如果cluster-require-full-coverage为no,则仅仅是该主机对应的插槽不能使用。
1.6 集群的Jedis开发

即使连接的不是主机,redis也会自动进行主从切换,实现读写分离
无中心化,能够实现无论是哪个主机上写的数据,其他从机上都能读到

集群类也可以通过一个HostAndPort的集合创建,这样做也可以防止连接的ip宕机导致无法连接集群。
1.7 Redis集合的不足
多键操作不支持,多键的Redis事务是不被支持的,lua脚本(主要用于redis的悲观锁效果)也不支持。
Redis(六)集群的更多相关文章
- Redis Cluster集群搭建与配置
Redis Cluster是一种服务器sharding分片技术,关于Redis的集群方案应该怎么做,请参考我的另一篇博客http://www.cnblogs.com/xckk/p/6134655.ht ...
- Redis Cluster集群搭建与应用
1.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper,但从redis 3.0之后版本支持redis-cluster集群,redis-cluster采用无中心结 ...
- Redis Cluster集群主从方案
本文介绍一种通过Jedis和Cluster实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.8.0(推荐),Redis3.0及以上版本(强制). 附:Redis Cluster集群主 ...
- Redis Cluster集群架构实现(四)--技术流ken
Redis集群简介 通过前面三篇博客的介绍<Redis基础认识及常用命令使用(一)--技术流ken>,<Redis基础知识补充及持久化.备份介绍(二)--技术流ken>,< ...
- 【精】搭建redis cluster集群,JedisCluster带密码访问【解决当中各种坑】!
转: [精]搭建redis cluster集群,JedisCluster带密码访问[解决当中各种坑]! 2017年05月09日 00:13:18 冉椿林博客 阅读数:18208 版权声明:本文为博主 ...
- Redis之集群环境搭建
前面文章介绍了Redis的主从复制,虽然该模式能够在一定程度上提高系统的稳定性,但是在数据访问量比较大的情况下,单个master应付起来还是比较吃力的,这时我们可以考虑将redis集群部署,本文就来重 ...
- redis介绍 (8) window 下redis的集群(cluster命令)
前言: 前段时间我在centos上搭建过一次redis集群,那是借助ruby搭建,这次我介绍一种纯redis集群命令的方式去搭建[最后我会简单介绍ruby搭建]. redis集群搭建(三主三备): 准 ...
- Redis cluster集群:原理及搭建
Redis cluster集群:原理及搭建 2018年03月19日 16:00:55 阅读数:6120 1.为什么使用redis? redis是一种典型的no-sql 即非关系数据库 像python的 ...
- Redis Cluster集群搭建<原>
一.环境配置 一台window 7上安装虚拟机,虚拟机中安装的是centos系统. 二.目标 Redis集群搭建的方式有多种,根据集群逻辑的位置,大致可以分为三大类:基于客户端分片的Redis ...
- redis集群与分片(2)-Redis Cluster集群的搭建与实践
Redis Cluster集群 一.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Re ...
随机推荐
- vue实现学生管理系统
开发步骤 创建一个空文件夹,取名students-system 方式一:右键新建 方式二:命令行新建(提倡) ##windows系统 md students-system##mac/linux mkd ...
- SpringBoot - Lombok使用详解5(@log、@Buinder、@SneakyThrows、@Synchronized)
七.Lombok注解详解(5) 12,@log (1)该注解用在类上,可以省去从日志工厂生成日志对象这一步,直接进行日志记录,具体注解根据日志工具的不同而不同.不同的日志注解总结如下(上面是注解,下面 ...
- oracle 白名单作用及配置教程
出于提高数据安全性等目地,我们可能想要对oracle的访问进行限制,允许一些IP连接数据库或拒绝一些IP访问数据库. 当然使用iptables也能达到限制的目地,但是从监听端口变更限制仍可生效.只针对 ...
- Electron问题记录01:关于electron的notification在win10下不显示问题
0.问题描述 在学习electron官网的notification例程时, 使用官网的代码运行时无法按照预期弹出窗口,在查询官网时发现以下解决方法. 官网解决方法:在 Windows 10 上,您的应 ...
- CMake指定的任务可执行文件"cmd.exe" 未能运行。System.IO.IOException:未能创建临时文件。临时文件夹已满或其路径不正确。对路径"......exec.cmd "的访问被拒绝
我觉得是我使用VS2022的原因,网上也没有找到相同的问题.
- linux系统下载redis时make报错:没有名为什么》》》》》
明明自己下载了gcc-c++环境,但是make还是一直报错,没有名为什么的>>>>> 其实这个问题主要的原因的是gcc的版本过低了,你可以gcc -v查看一下你的版本,是 ...
- MSVC设置版本
MSVC设置版本 在开发QT时,由于QT 5.12与MSVC 2017兼容,因此需要用MSVC 2017来编译使用QT 5.12的程序. 1 安装MSVC 2017 由于笔者电脑上安装的Visual ...
- 转帖:弹性布局(display:flex;)属性详解
它之所以被称为 Flexbox ,是因为它能够扩展和收缩 flex 容器内的元素,以最大限度地填充可用空间.与以前布局方式(如 table 布局和浮动元素内嵌块元素)相比,Flexbox 是一个更强大 ...
- python+appium拉起APP
1.首先需要完成环境配置: JDK:https://www.cnblogs.com/wenlongma/p/17103062.html: SDK:https://www.cnblogs.com/w ...
- Go_day01
Go基础语法 注释 注释是为了增强代码的可读性,不会参与程序的一切功能, go语言注释分为单行注释与多行注释 单行注释 //双斜杠 每行都要添加 // 多行注释 /* */ 一次标记多行注释输入 pa ...