redis5.0.7集群搭建
目录
一、简介
二、redis集群介绍
三、Redis 集群的数据分片
四、Redis 集群的主从复制模型
五、搭建并使用Redis集群
六、添加主节点
七、添加从节点
八、删除集群节点
九、集群相关操作命令
十、总结
一、简介
前面介绍了redis主从复制和redis哨兵模式,它们能在一定程度上提高系统的稳定性,但是当数据量比较大的时候,单个主节点压力可能会过于太大,这个时候可以考虑将redis集群部署,本文将详细介绍redis集群搭建的详细过程。
二、redis集群介绍
Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。
Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.
Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令.
Redis 集群的优势:
- 自动分割数据到不同的节点上。
- 整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
三、Redis 集群的数据分片
Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念.
Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:
- 节点 A 包含 0 到 5500号哈希槽.
- 节点 B 包含5501 到 11000 号哈希槽.
- 节点 C 包含11001 到 16384号哈希槽.
这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D, 我需要从节点 A, B, C中得部分槽到D上. 如果我想移除节点A,需要将A中的槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可. 由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.
四、Redis 集群的主从复制模型
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品.
在我们例子中具有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用.
然而如果在集群创建的时候(或者过一段时间)我们为每个节点添加一个从节点A1,B1,C1,那么整个集群便有三个master节点和三个slave节点组成,这样在节点B失败后,集群便会选举B1为新的主节点继续服务,整个集群便不会因为槽找不到而不可用了
不过当B和B1 都失败后,集群是不可用的.
五、搭建并使用Redis集群
注意,这里使用的是redis5.0.7,好像redis5.0之后不需要使用ruby环境搭建集群了,直接使用redis-cli也可以搭建。
【a】准备环境
根据官网可知redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点,所以我们以3主3从模型搭建redis集群。
这里以虚拟机启动多个redis服务模拟伪分布式redis集群,端口号分别为:
192.168.8.130:6379
192.168.8.130:6380
192.168.8.130:6381
192.168.8.130:6382
192.168.8.130:6383
192.168.8.130:6384
模型图大体如下:
【b】配置多个redis.conf配置文件,用于启动多个redis服务
首先,我们复制六份redis.conf,名字分别为:redis6379.conf、redis6380.conf、redis6381.conf、redis6382.conf、redis6383.conf、redis6384.conf
cp redis.conf redis6379.conf
cp redis.conf redis6380.conf
cp redis.conf redis6381.conf
cp redis.conf redis6382.conf
cp redis.conf redis6383.conf
cp redis.conf redis6384.conf
【c】修改配置文件
依次修改下面几项地方:这里以修改redis6380.conf为例子,其他几个配置文件依次类推。
- (1). 端口号
port 6380
- (2). 关闭保护模式
protected-mode no
- (3). 修改IP绑定为0.0.0.0
bind 0.0.0.0
- (4). rdb文件名称
dbfilename "dump6380.rdb"
- (5). aof文件名称
appendfilename "appendonly6380.aof"
- (6). pid进程管道文件名称
pidfile "/var/run/redis_6380.pid"
- (7). 日志文件名称
logfile "redis6380.log"
- (8). 打开集群开关
cluster-enabled yes
- (9).集群节点配置文件
cluster-config-file nodes-6380.conf
- (10).集群节点超时时间
cluster-node-timeout 15000
【d】依次启动6个redis服务
redis-server ../etc/redis6379.conf
redis-server ../etc/redis6380.conf
redis-server ../etc/redis6381.conf
redis-server ../etc/redis6382.conf
redis-server ../etc/redis6383.conf
redis-server ../etc/redis6384.conf
查看redis服务是否启动成功:
ps -ef | grep redis
【e】创建集群
redis-cli --cluster create 192.168.8.130:6379 192.168.8.130:6380 192.168.8.130:6381 192.168.8.130:6382 192.168.8.130:6383 192.168.8.130:6384 --cluster-replicas 1
使用上面的命令创建集群,参数说明:
--cluster-replicas 1:希望为集群中的每个主节点创建一个从节点
192.168.8.130:6379 192.168.8.130:6380 192.168.8.130:6381 192.168.8.130:6382 192.168.8.130:6383 192.168.8.130:6384:集群实例的地址列表
启动实例时可能会报下面的错误:
这是因为集群中的redis可能存在数据或者存在rdb、aof持久化文件的原因,解决方法就是清除数据以及删除跟配置文件同一级目录存在的.rdb、.aof、nodes.conf文件。
【f】然后继续执行创建集群的语句:
redis打印出一份预想中的配置给你看, 如果没问题, 就可以输入 yes, redis-cli就会将这份配置应用到集群当中,让各个节点开始互相通讯。
不过很不幸的是,这个时候又给我报了另外一个错误如下:
[ERR] Not all 16384 slots are covered by nodes.
说明16384个槽没有全部覆盖到所有节点上面,slots分布不正确,解决方法如下:
- (1). 第一步:修复集群
redis-cli --cluster fix 192.168.8.130:6379
- (2). 第二步:修复完成后再用check命令检查下是否正确
只要输入任意集群中节点即可,会自动检查所有相关节点
redis-cli --cluster check 192.168.8.130:6379
- (3). 第三步:重新分配slot
redis-cli --cluster reshard 192.168.8.130:6379
通过上面的命令重新分配之后,slot就正常了。
【g】测试集群
首先登录集群中任意一台redis客户端,然后测试一下。
redis-cli -p 6379 -c
ping
set k1 v1
set k2 v2
set k3 v3
set k4 v4
如上图,添加一个key被分配到6381节点上,注意连接的端口变为了6381。
接着,我们打印集群的信息:
CLUSTER INFO
当然也可以使用命令 cluster nodes 列出集群当前已知的所有节点( node),以及这些节点的相关信息。好了,上面已经成功搭建了一个redis集群,下面我们看看如何添加主节点、从节点以及删除节点。
六、添加主节点
【a】准备配置文件redis6385.conf
cd /usr/local/redis-5.0.7/etc/
cp redis6384.conf redis6385.conf
【b】修改配置文件,这跟之前修改的地方都一样,这里不再详细说明,下面是需要进行修改的地方:
port 6385
protected-mode no
pidfile "/var/run/redis_6385.pid"
logfile "6385.log"
dbfilename "dump6385.rdb"
appendfilename "appendonly6385.aof"
cluster-config-file nodes-6385.conf
cluster-node-timeout 15000
cluster-enabled yes
bind 0.0.0.0
【c】启动redis 6385服务:
redis-server ../etc/redis6385.conf
ps -ef | grep redis
【d】添加主节点到集群中
redis-cli --cluster add-node 192.168.8.130:6385 192.168.8.130:6379
参数说明:
192.168.8.130:6385:新节点的地址
192.168.8.130:6379:集群中任意一个已经存在的节点的IP和端口
使用上面的命令就可以将192.168.8.130:6385服务添加到之前的集群中。
【e】登录redis客户端查看集群节点信息
redis-cli -p 6379 -c
CLUSTER NODES
可见,新节点6385没有包含任何数据, 因为它没有包含任何哈希槽。所以我们需要将集群中的某些哈希桶移动到新节点里面, 新节点就会成为真正的主节点。
【f】重新分配slot
./redis-cli --cluster reshard 192.168.8.130:6379
继续查看集群节点信息:
CLUSTER NODES
可见,6385服务成功分配了slot哈希槽。
七、添加从节点
【a】准备配置文件
cp redis6385.conf redis6386.conf
vim redis6386.conf
【b】修改配置文件
port 6386
pidfile "/var/run/redis_6386.pid"
logfile "6386.log"
dbfilename "dump6386.rdb"
appendfilename "appendonly6386.aof"
cluster-config-file nodes-6386.conf
cluster-enabled yes
cluster-node-timeout 15000
【c】启动redis6386服务:
redis-server ../etc/redis6386.conf
ps -ef | grep redis
【d】添加从节点到集群中
redis-cli --cluster add-node 192.168.8.130:6386 192.168.8.130:6379 --cluster-slave
注意后面有 --cluster-slave参数
参数说明:
192.168.8.130:6386:新节点的地址
192.168.8.130:6379:集群中任意一个已经存在的节点的IP和端口
可见,成功将6386从节点加入到集群中。当然如果想指定添加的从节点在某个主节点下的话,可以使用下面的命令:
redis-cli --cluster add-node 192.168.8.130:6386 192.168.8.130:6379 --cluster-slave --cluster-master-id 主节点ID
注意配置:--cluster-master-id 主节点ID
八、删除集群节点
redis-cli --cluster del-node 192.168.8.130:6379 40d83a1b6284f4cd5e9c30cddf1de936ccc18a2
参数说明:
192.168.8.130:6379:集群中任意一个已经存在的节点的IP和端口
40d83a1b6284f4cd5e9c30cddf1de936ccc18a2:想移除的节点ID
九、集群相关操作命令
redis-cli --cluster help
Cluster Manager Commands:create host1:port1 ... hostN:portN--cluster-replicas <arg>check host:port--cluster-search-multiple-ownersinfo host:portfix host:port--cluster-search-multiple-ownersreshard host:port--cluster-from <arg>--cluster-to <arg>--cluster-slots <arg>--cluster-yes--cluster-timeout <arg>--cluster-pipeline <arg>--cluster-replacerebalance host:port--cluster-weight <node1=w1...nodeN=wN>--cluster-use-empty-masters--cluster-timeout <arg>--cluster-simulate--cluster-pipeline <arg>--cluster-threshold <arg>--cluster-replaceadd-node new_host:new_port existing_host:existing_port--cluster-slave--cluster-master-id <arg>del-node host:port node_idcall host:port command arg arg .. argset-timeout host:port millisecondsimport host:port--cluster-from <arg>--cluster-copy--cluster-replacehelp
十、总结
下面总结三个需要注意的问题:
- 【a】集群是如何判断是否有某个节点挂掉
首先要说的是,每一个节点都存有这个集群所有主节点以及从节点的信息。它们之间通过互相的ping-pong判断是否节点可以连接上。如果有一半以上的节点去ping一个节点的时候没有回应,集群就认为这个节点宕机了,然后去连接它的备用节点。
- 【b】集群进入fail状态的必要条件
A、某个主节点和所有从节点全部挂掉,我们集群就进入faill状态。
B、如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.
C、如果集群任意master挂掉,且当前master没有slave.集群进入fail状态
- 【c】 集群中的主从复制
集群中的每个节点都有1个至N个复制品,其中一个为主节点,其余的为从节点,如果主节点下线了,集群就会把这个主节点的一个从节点设置为新的主节点继续工作,这样集群就不会因为一个主节点的下线而无法正常工作。
注意:
- 1、如果某一个主节点和他所有的从节点都下线的话,redis集群就会停止工作了。redis集群不保证数据的强一致性,在特定的情况下,redis集群会丢失已经被执行过的写命令。
- 2、使用异步复制(asynchronous replication)是redis 集群可能会丢失写命令的其中一个原因,有时候由于网络原因,如果网络断开时间太长,redis集群就会启用新的主节点,之前发给主节点的数据就会丢失
至此,我们成功搭建了一个redis集群,以上都是笔者实际搭建时的一些总结,如果不当之处,还望及时指正~,希望能对小伙伴们的学习有所帮助。
参考资料:
redis中文官网:http://www.redis.cn/topics/cluster-tutorial.html
redis5.0.7集群搭建相关推荐
- Redis5.0.x集群搭建
前言: 本文将介绍Redis5.0三主三从集群搭建以及集群配置. 一.资源配置(3主3从集群) 1.以下为生产环境下,集群搭建所需资源配置: 资源 配置 cpu 4核*6 内存 16G*6 硬盘 20 ...
- csrediscore访问redis集群_搭建文档 | centos7.6环境下redis5.0.8集群搭建
" 本文作者:墨篱弦 " 一.做基础配置 a) 首先创建3个空文件 mkdir -p /server/redis_cluster/7001/datamkdir -p /server ...
- Redis5.0.8集群搭建与说明
文章目录 1. 环境说明 2. 修改集群配置 3. 创建集群 4. 集群槽位 5. 主节点故障问题 1. 环境说明 RedisCluster要求至少3个主节点,因此我们需要启动6个Redis实例(3主 ...
- redis-5.0.4集群部署
redis-5.0.4 集群搭建 redis-cluster介绍 1:redis是一个开源的key value存储系统,受到了广大互联网公司的青睐. 2:redis集群采用P2P模式,是完全去 ...
- Redis-5.0.5集群配置
Redis-5.0.5集群配置 版本:redis-5.0.5 参考:http://redis.io/topics/cluster-tutorial. 集群部署交互式命令行工具:https://gith ...
- 手动搭建高可用的Redis5.0分片集群,从理论到实践,超详细
前言 前一篇 高可用的Redis主从复制集群,从理论到实践 发布后,反响非常热烈.所以今天继续深入讲解redis集群的搭建和相关理论. 好吧,其实是因为上篇搭建的主从复制集群,还有一个实际问题不能解决 ...
- Redis 3.0.2集群搭建以及相关问题汇总
Redis3 正式支持了 cluster,是为了解决构建redis集群时的诸多不便 (1)像操作单个redis一样操作key,不用操心key在哪个节点上 (2)在线动态添加.删除redis节点,不用停 ...
- elasticsearch7.0.1集群搭建(最后有ES6.7的配置)
** ES集群搭建 **: 说明:首先要讨论搭建几个集群,集群搭建很简单,只需要配置做好就ok; 一 : 在搭建集群之前,我们首先要了解一个es中的相关内容 cluster : 代表一个集群,集群中有 ...
- Nacos2.0.3集群搭建
集群搭建 前置条件 JDK 1.8 MySQL 5.7.29 Nacos 2.0.3 搭建过程 将Nacos安装包上传至三个服务器,本次搭建使用三个端口来模拟三个不同的主机 解压: tar -zvxf ...
- spark3.0 分布式集群搭建
Spark 集群环境搭建-exsi 1.虚拟机环境配置 进入管理界面 创建虚拟机 后续选择存储空间位置 3处选择存储目录中的 centos7,安装过程略 如法炮制建立三个虚拟机 ssh连接 此处使用的 ...
最新文章
- JEECMS的新浪图集在IE9、10不能显示大图片BUG的解决方法
- Netflix海外市场交到好运 用户数量猛增
- thinkphp-volist2
- web服务器 字体.svg/.woff/.woff2 404错误 解决方案
- c#多线程同步之EventWaitHandle使用
- 【机器学习】 - 关于合适用均方误差(MSE)何时用交叉熵(cross-entropy)
- JAVA入门级教学之(static静态代码块)
- java加锁多线程改为单线程_GUI为什么不设计为多线程(用户事件和底层事件的流程是相反的,每层都加锁效率太低,共用一把锁那就是单线程)...
- C语言中的fopen函数
- pix2pix笔记(B站,更加清晰)
- SSH访问远程主机超时问题解决
- 测试中国地理常识(中文版)
- 【牛客网SQL篇】SQL必知必会
- 短视频+直播系统源码 短视频直播系统源码
- 21天学通C语言-学习笔记(5)
- 人工智能中的专家系统
- petalinux笔记
- EXCEL97版本(.xls)和EXCEL2007之后的版本(.xlsx)对比
- u盘引导linux加载raid卡驱动,解决方案:如何使用centos U盘加载Raid卡驱动程序_计算机基础知识_IT /计算机_资源...
- 计算机表格出现value,excel表格出现#value解决方法
热门文章
- 容器技术Docker K8s 6 阿里云容器服务体系介绍
- 《领域驱动设计精粹》DDD Domain-Driven Design Distilled -- Vaughn Vernon 读后感
- java 如何将word 转换为ftl_3种方法轻松将PDF转换为Word文档,办公必备
- java 装饰者模式 替代方案_如何利用装饰者模式在不改变原有对象的基础上扩展功能...
- linux下python3 安装tkinter库
- python 中的[::-1]和[:-1]
- Mapreduce从HBASE抽取数据,生成搜索下拉服务数据,hadoop jar 调用异常问题解决
- 【 Codeforces Round #395 (Div. 2) E】Timofey and remoduling【数学思维题 —— 等差/等比数列】
- OllyDBG 入门系列(一)-认识OllyDBG
- DLLPasswordFilterImplant:DLL密码过滤器