Redis生产级高可用集群配置部署方案
mhr18 2024-11-07 11:01 16 浏览 0 评论
1. 基于主从+哨兵的集群模式
1、说明:由一主双从 + Sentinel哨兵集群(三个节点)实现的高可用。为保证可用性,需要三台机器。
2、适用场景:数据量不大、写入量少、扩展性要求不高
3、部署结构
4、拓扑图
5、Redis主从安装部署说明:
假定IP:
MASTER: 192.168.0.1
SLAVE1: 192.168.0.2
SLAVE2: 192.168.0.3
Redis的安装不做赘述,侧重讲解如何配置,这里主要列出差异性的配置:
1) 主节点(master)配置:
port 6379
bind 192.168.0.1
daemonize yes
pidfile /home/hadoop/redis/6379/redis.pid
logfile /home/hadoop/redis/6379/log/redis.log
dir /home/hadoop/redis/6379/data
2)从节点1(slave-1)配置
port 6380
bind 192.168.0.2
daemonize yes
pidfile /home/hadoop/redis/6380/redis.pid
logfile /home/hadoop/redis/6380/log/redis.log
dir /home/hadoop/redis/6380/data
slaveof 192.168.0.1 6379
3)从节点2(slave-2)配置
port 6381
bind 192.168.0.3
daemonize yes
pidfile /home/hadoop/redis/6381/redis.pid
logfile /home/hadoop/redis/6381/log/redis.log
dir /home/hadoop/redis/6381/data
slaveof 192.168.0.1 6379
主从依次启动三台服务节点: MASTER ->SLAVE1->SLAVE2
启动完成后, 通过命令检查服务是否正常启动:
ps -ef | grep redis-server
最后检查主从关系是否正常,进入redis控制台:
redis-cli -h 127.0.0.1 -p 6379
出现以下信息,代表一主双从的配置关系建立正常:
#RepLication
roLe:master
connected _sLaves: 2
slave0:ip=192.168.0.2, port=6380, state=onLine, offset=658, Lag= 0
slave1:ip=192.168.0.3, port=6381, state=online, offset=658, Lag= 0
master_replid:5c5e937e31c8cfa5142416011bca47902d2a1f34
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:658
second _repl_offset:-1
repL_backlog_active: 1
rept_backlog_size:1048576
repL_backLog_ first _byte_offset: 1
repl_backLog_histten:658
6、Sentinel集群配置
Sentinel集群不参与数据的处理, 主要作用是保障Redis主从节点的高可用, 在主节点出现故障时,能够自动实现切换。
1)Sentinel节点配置
依次在三台机器上做好配置, 注意端口不能填写错误, 示例:
sentinel-26379.conf
#设置 sentinel 工作端口
port 26379
#后台运行
daemonize yes
#日志文件名称
logfile "/home/hadoop/redis/26379/log/redis.log"
#设置当前 sentinel 监控的 redis ip 和 端口
sentinel monitor mymaster 192.168.0.1 6379 2
#设置判断 redis 节点宕机时间 (30秒)
sentinel down-after-milliseconds mymaster 30000
#设置自动故障转移超时(20秒)
sentinel failover-timeout mymaster 20000
#设置同时故障转移个数
sentinel parallel-syncs mymaster 1
2)启动Sentinel集群
有两种命令:
redis-sentinel /path/sentinel.conf
redis-server /path/sentinel.conf --sentinel
3)查看Sentinel集群状态
[root@redis]#redis-cli -h 192.168.0.1 -p 26379
192.168.0.1:26379>info sentinel
#Sentinel
sentinel_masters: 1
sentinel_tilt: 0
sentinel_running_scripts: 0
sentinel_scripts_queue_Length: 0
sentinel_simuLate_failure_fLags: 0
master0:name=mymaster, status=ok, address=192.168.0.1:6379, sLaves=2, sentinels=3
能够正常识别主节点,2个从节点和3个sentinel节点。
整体就完成了主从+哨兵的集群模式部署。可以自行验证,KILL Redis的主节点进程,对高可用进行测试。
2. Redis原生Cluster集群模式(推荐)
1、说明由多个主从节点群组成的分布式服务集群, 具有复制、高可用和分片特性。需要三台以上机器。
2、适用场景数据量大、写入量多、支持扩容。
3、部署结构
搭建三个master节点、每个master主节点再配置两个slave节点、总共9个Redis节点。
4、拓扑结构
5、安装部署说明
① 先在一台机器安装三个redis节点
创建目录:
1.在每台机器Redis目录下, 创建redis-cluster文件夹
mkdir redis-cluster
2.在redis-cluster文件夹下按照不同端口号创建三个文件夹
mkdir 6379 6380 6381
② 修改三个redis节点的配置文件
将以下内容按照实际端口号与服务器IP替换:
10
port 端口号
bind 服务器IP
daemonize yes
cluster-enabled yes
pidfile /home/hadoop/redis-cluster/端口号/redis.pid
logfile /home/hadoop/redis-cluster/端口号/log/redis.log
dir /home/hadoop/redis-cluster/端口号/data
③ 启动redis,验证是否成功
[root@locaLhost redis] #ps -ef | grep redis
root 41340 12月02 00:06:26 ./bin/redis-server*: 6379[cluster]
root 413541 12月02 00:06:26 ./bin/redis-server*:6380[cluster]
root 1183090 10:54 00:00:08 ./bin/redis-server*:6381[cluster]
④ 其余两台机器按照redis节点
参照以上步骤执行。
⑤ 集群创建
1)先创建主节点:
假定三台机器IP为: 192.168.0.1、192.168.0.2、192.168.0.3,主节点端口为6379
redis-cli --cluster create 192.168.0.1:6379 192.168.0.2:6379 192.168.0.3:6379 --cluster-replicas 0
如果设定了密码, 需要加入-a参数。
2)再创建从节点:
先添加第一台从节点:192.168.0.2:6380
redis-cli --cluster add-node 192.168.0.2:6380 192.168.0.1:6379 --cluster-slave --cluster-master-id ***************
这里的master-id 为对应主节点的身份标识, 进入redis集群控制台,通过cluster nodes命令查看:
[root@had oop 2_bin] #:/redis-c1i-h 192.168.0.1 -p 6379
192.168.0.1:7000>c1uster nodes
d35a50c334f9b3b734191294838c3f86a80e9d73 192.168.0.1:6379@17000 myse1f,master -016406747240003 connected 5461-10922
5601505fdfFcbodbobf26e7df66dc3264c5834d6 192.168.0.2:6379@17000 master -016406747250005 connected 10923-16383
7835e24616839fc65ffa26583166bbb79c827c7a 192.168.0.3:6379@17000 master -016406747232771 connected 0-5460
192.168.0.1:6379主机点对应的ID标识为:d35a50c334f9b3b734191294838c3f86a80e9d73
再添加第二台从节点:192.168.0.3:6380
redis-cli --cluster add-node 192.168.0.3:6380 192.168.0.1:6379 --cluster-slave --cluster-master-id d35a50c334f9b3b734191294838c3f86a80e9d73
3) 按照以上步骤,给另外两个主节点增加从节点
按照拓扑图,
给第二台主节点192.168.0.2:6379添加从节点:192.168.0.1:6381、192.168.0.3:6381;
给第三台主节点192.168.0.3:6379添加从节点:192.168.0.1:6380、192.168.0.2:6381。
4) 检查
接入redis集群,通过cluster nodes命令与info replication检查集群配置是否正常。
3. Redis Cluster集群实现水平扩展
1、说明模拟将两台新机器加入机器, IP为192.168.0.100(主),192.168.0.101(从)
2、拓扑结构
3、安装Redis
参照上述2.4的集群安装配置, 安装配置Redis服务
4、添加新的集群主节点
redis-cli -a 123456 --cluster add-node 192.168.0.100:6379 192.168.0.1:6379
输出结果:
[root@localhost redis] # redis-cli -a 123456 --cluster add-node 192.168.0.100:6379 192.168.0.1:6379
Warning:Using a password with '-a' or'-u'option on the command Line interface may not be safe.
>>>Adding node 192.168.0.100:6379 to cLuster 192.168.0.1:6379
>>>Perfoming Cluster Check(using node 192.168.0.1:6379)
M:4eledel370d1901c8c58b64a8234d5ea0lbf595d 192.168.0.1:6379
slots:[0-5460] (546l slots) master
2 additional replica(s)
S:7994c015e32875b77lec345038fdb92bcel9bde0 192.168.0.2:6380
slots :( 0 slots) slave
replicates 4eledel370d1901c8c58b64a8234d5ea0lbf595d
S:2c4ca39ffe6lbea03a4fa79f6dfeb2f17fb006b4 192.168.0.1:6381
slots:(O slots) slave
replicates b70c14316e403a4a of fabl3fdf39bdd9997399df
S:6lfd413lf8213fd4f46a5eddfc927d62c57146le 192.168.0.3:638l
slots:(O slots) sLave
replicates b70c14316e403a4a of fabl3fdf39bdd9997399df
S:604f4ldfce224777c8067f8778ac2e92bcdb6el4 192.168.0.1:6380
slots :( 0 slots) slave
replicates 75a0lef1056a0982a7edd330776518db37a6dl0b
M:b70c14316e403a4a of fabl3fdf39bdd9997399df 192.168.0.2:6379
slots:[5461-10922] ( 5462 slots) master
2 additional replica(s)
S:Ocd033e5b717b98cd76593048196dcl4849c4ff7 192.168.0.3:6380
slots :( 0 slots) slave
replicates 4eledel370d1901c8c58b64a8234d5ea0lbf595d
M:75aOlef1056a0982a7edd330776518db37a6dl0b 192.168.0.2:6381
slots:[10923-16383] ( 5461 slots) master
2 additional replica(s)
S:0199c65eeefl 4 34a9af4448c2dofod02b20fd314 192.168.0.3:6379
slots:(O slots) slave
replicates 75a0lef1056a0982a7edd330776518db37a6dl0b
[OK] ALL nodes agree about slots configuration.
>>>Check for open slots...
>>>Check slots coverage.
[OK] ALL 16384 slots covered
>>>Send CLUSTER MEET to node 192.168.0.100:6379 to make it join the cLuster.
[OK] Newnode added correctLy.
5、重新分配数据
分配数据槽位给新加入的主节点
redis-cli -a 123456 --cluster reshard 192.168.0.100:6379
输出结果:
[root@localhost redis] #redis-cli-a 123456 --cluster reshard 192.168.0.100:6379
Warning:Using a password with '-a' or'-u'option on the command Line interface may not be safe.
>>Performing CLuster Check(using node 192.168.0.100:6379)
M:2126fdf84a7b23c83e7cdfc5cb3bdl366d4f7601 192.168.0.100:6379
slots:(est ots) master
S:Ocd033e5b717b98cd76593048196dcl4849c4ff7 192.168.0.3:6380
slots :( 0 slots) sLave
replicates4eledel370d1901c8c58b64a8234d5ea0lbf595d
S:7994c015e32875b77lec345038fdb92bcel9bde0 192.168.0.2:6380
slots :( 0 slots) slave
replicates 4eledel370d1901c8c58b64a8234d5ea0lbf595d
M:4eledel370d1901c 8c58b64a8234d5ea0lbf595d 192.168.0.1:6379
slots:[0-5460] (546l slots) master
2 additional replica(s)
S:2c4ca39ffe6lbea 03a4fa79f6dfeb2fl7fb006b4 192.168.0.1:638l
slots :( 0 slots) sLave
replicates b70c14316e403a4a0ffabl3fdf39bdd9997399df
S:0199c65eeefl434a9af4448c2d0fod02b20fd314 192.168.0.3:6379
slots :( 0 slots) sLave
replicates 75aOlef1056a0982a7edd330776518db37a6dl0b
M:75a0lef1056a0982a7edd330776518db37a6dl0b 192.168.0.2:6381
slots:[10923-16383] ( 5461 slots) master
2 additional replica(s)
S:604f4ldfce224777c8067f8778ac2e92bcdb6el4 192.168.0.1:6380
slots :( 0 slots) slave
replicates 75aOlef1056a0982a7edd330776518db37a6dl0b
M:b70cl4316e403a4a of fabl3fdf39bdd9997399df 192.168.0.2:6379
slots:[5461-10922] ( 5462 slots) master
2 additional replica(s)
S:61fd4131f8213fd4f46a5eddfc927d62c57146le 192.168.0.3:6381
slots:(O slots) sLave
replicates b70c14316e403a4a of fabl3fdf39bdd9997399df
[OK] ALl nodes agree about slots configuration.
>>>Check for open slots...
>>Check slots coverage...
[OK] ALL 16384 slots covered
这里的数据槽位设定为600,可以根据需要设定。这里需要记录新加入的节点192.168.0.100所对应的ID: 2126fdf84a7b23c83e7cdfc5cb3bd1366d4f7601, 下面需要输入:
How many slots do you want to move(from l to 16384) ? 600
What is the receiving nodeID? 2126fdf84a7b23c83e7cdfc5cb3bd1366d4f7601
PLease enter all the source node IDs.
Type'all'to use all the nodes as source nodes for the hash slots.
Type'done'once you entered all the source nodes IDs.
Source node#l:all
输入all是代表从集群中的所有节点抽取600个数据槽位进行重新分配。
Moving slot 11068from75a0let1056a0982a7edd330776518db37a6dl0b
Moving sLot 11069from75a0lef1056a0982a7edd330776518db37a6dl0b
Moving slot 11070from75a0lef1056a0982a7edd330776518db37a6dlob
Moving slot 11071from75a0lef1056a0982a7edd330776518db37a6dlob
Moving slot 11072from75a0lef1056a0982a7edd330776518db37a6dl0b
Moving slot 11073from75a0lef1056a0982a7edd330776518db37a6dlob
Moving slot 11074from75a0lef1056a0982a7edd330776518db37a6dlob
Moving slot 11075from75a0lef1056a0982a7edd330776518db37a6dl0b
Moving slot 11076from75a0lefl056a0982a7edd330776518db37a6dlob
Moving slot 11077from75a0lef1056a0982a7edd330776518db37a6dl0b
Moving slot 11078from75a0lef1056a0982a7edd330776518db37a6dlob
Moving slot 11079from75a0lef1056a0982a7edd330776518db37a6dlob
Moving slot l1080from75a0lef1056a0982a7edd330776518db37a6dlob
Moving slot 1108lfrom75a0lef1056a0982a7edd330776518db37a6dlob
Moving slot l1082from75a0lef1056a0982a7edd330776518db37a6dlob
Moving slot 11083from75a0lef1056a0982a7edd330776518db37a6dlob
Moving slot l1084from75a0lefl056a0982a7edd330776518db37a6dlob
Moving slot 11085from75a0lef1056a0982a7edd330776518db37a6dlob
Moving slot 11086from75a0lef1056a0982a7edd330776518db37a6dlob
Moving slot 11087from75a0lef1056a0982a7edd330776518db37a6dlob
Moving slot 11088from75a0lef1056a0982a7edd330776518db37a6dlob
Do you want to proceed with the proposed reshard plan(yes/no) ?yes
输入yes,确认开始执行分片计划, 执行完毕后会自动退出, 代表新的主节点正常加入。
6、添加从节点
192.168.0.100主节点加入成功后,加入对应的从节点192.168.0.101。
可以参照上面的集群从节点加入步骤, 执行命令:
redis-cli --cluster add-node 192.168.0.101:6380 192.168.0.1:6379 --cluster-slave --cluster-master-id 2126fdf84a7b23c83e7cdfc5cb3bd1366d4f7601
cluster-master-id为新加入的192.168.0.100节点所对应的ID。最后通过cluster nodes命令检查集群信息。
4. Redis Cluster集群动态剔除节点
1、说明如果要调整Redis整个集群部署结构,可以通过动态增加和剔除节点的方式实现。
2、迁移节点的槽数据
./redis-cli --cluster reshard 192.168.0.100:6379
提示我们要移动多少哈希槽 ?
输入全部数量
选择接受的槽节点ID?
找一个新加入的主节点接受哈希槽
选择数据源槽?
输入需要剔除的节点ID
3、确保节点无数据, 执行剔除动作
redis-cli --cluster del-node 192.168.0.1:6379 <node-id>
注意:node-id为要剔除的节点ID标识。192.168.0.1:6379为集群中任意主节点。
4、如果要重平衡, 可以执行以下指令
./redis-cli --cluster rebalance --cluster-threshold 1 192.168.0.1:6379
5. FAQ
1、脑裂问题
网络分区出错现象:比如其中一个master节点的网络出现问题,slave节点无法取得联系,但是客户端可以连接,那么slave在无法联系master一段时间, 就会触发重新选举主节点,从而导致脑裂现象。如果产生多个主节点对外提供写服务,一旦网络分区恢复, 会将其中一个主节点变为从节点,就会有大量数据丢失。 规避方法: 在redis.conf里面添加min‐replicas‐to‐write 1。写数据成功最少同步的slave数量。这个配置在一定程度上会影响集群的可用性,比如slave要是少于1个,这个集群就算leader正常也不能 提供服务了,需要根据具体场景权衡选择。
2、集群服务可用性配置问题
当redis.conf的配置cluster-require-full-coverage为no时,表示当负责一个插槽的主库下线且没有相应的从 库进行故障恢复时,集群仍然可用,如果为yes则集群不可用
3、You requested maxclients of 10000 requiring at least 10032 max file descriptors.
问题:你设置的最大连接数是10000 那么服务器的最大连接数最少需要10032 原因:服务器的最大连接数 < redis.conf中设置的最大连接数。对应属性是maxclients,没设置默认为10000。
解决:
1、修改服务器最大连接数: vi etc/profile,调整: ulimit -n 20000
2、修改redis.conf配置文件中maxclients的属性。改小些: maxclients 9000
相关推荐
- B站收藏视频失效?mybili 收藏夹备份神器完整部署指南
-
本内容来源于@什么值得买APP,观点仅代表作者本人|作者:羊刀仙很多B站用户都有过类似经历:自己精心收藏的视频突然“消失”,点开一看不是“已被删除”,就是“因UP主设置不可见”。而B站并不会主动通知...
- 中间件推荐初始化配置
-
Redis推荐初始化配置bind0.0.0.0protected-modeyesport6379tcp-backlog511timeout300tcp-keepalive300...
- Redis中缓存穿透问题与解决方法
-
缓存穿透问题概述在Redis作为缓存使用时,缓存穿透是常见问题。正常查询流程是先从Redis缓存获取数据,若有则直接使用;若没有则去数据库查询,查到后存入缓存。但当请求的数据在缓存和数据库中都...
- 后端开发必看!Redis 哨兵机制如何保障系统高可用?
-
你是否曾在项目中遇到过Redis主服务器突然宕机,导致整个业务系统出现数据读取异常、响应延迟甚至服务中断的情况?面对这样的突发状况,作为互联网大厂的后端开发人员,如何快速恢复服务、保障系统的高可用...
- Redis合集-大Key处理建议
-
以下是Redis大Key问题的全流程解决方案,涵盖检测、处理、优化及预防策略,结合代码示例和最佳实践:一、大Key的定义与风险1.大Key判定标准数据类型大Key阈值风险场景S...
- 深入解析跳跃表:Redis里的"老六"数据结构,专治各种不服
-
大家好,我是你们的码农段子手,今天要给大家讲一个Redis世界里最会"跳科目三"的数据结构——跳跃表(SkipList)。这货表面上是个青铜,实际上是个王者,连红黑树见了都要喊声大哥。...
- Redis 中 AOF 持久化技术原理全解析,看完你就懂了!
-
你在使用Redis的过程中,有没有担心过数据丢失的问题?尤其是在服务器突然宕机、意外断电等情况发生时,那些还没来得及持久化的数据,是不是让你夜不能寐?别担心,Redis的AOF持久化技术就是...
- Redis合集-必备的几款运维工具
-
Redis在应用Redis时,经常会面临的运维工作,包括Redis的运行状态监控,数据迁移,主从集群、切片集群的部署和运维。接下来,从这三个方面,介绍一些工具。先来学习下监控Redis实时...
- 别再纠结线程池大小 + 线程数量了,没有固定公式的!
-
我们在百度上能很轻易地搜索到以下线程池设置大小的理论:在一台服务器上我们按照以下设置CPU密集型的程序-核心数+1I/O密集型的程序-核心数*2你不会真的按照这个理论来设置线程池的...
- 网络编程—IO多路复用详解
-
假如你想了解IO多路复用,那本文或许可以帮助你本文的最大目的就是想要把select、epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别。基础知识IO多路复用涉及...
- 5分钟学会C/C++多线程编程进程和线程
-
前言对线程有基本的理解简单的C++面向过程编程能力创造单个简单的线程。创造单个带参数的线程。如何等待线程结束。创造多个线程,并使用互斥量来防止资源抢占。会使用之后,直接跳到“汇总”,复制模板来用就行...
- 尽情阅读,技术进阶,详解mmap的原理
-
1.一句话概括mmapmmap的作用,在应用这一层,是让你把文件的某一段,当作内存一样来访问。将文件映射到物理内存,将进程虚拟空间映射到那块内存。这样,进程不仅能像访问内存一样读写文件,多个进程...
- C++11多线程知识点总结
-
一、多线程的基本概念1、进程与线程的区别和联系进程:进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程;线程:是运行中的实际的任务执行者。可以说,进程中包含了多...
- 微服务高可用的2个关键技巧,你一定用得上
-
概述上一篇文章讲了一个朋友公司使用SpringCloud架构遇到问题的一个真实案例,虽然不是什么大的技术问题,但如果对一些东西理解的不深刻,还真会犯一些错误。这篇文章我们来聊聊在微服务架构中,到底如...
- Java线程间如何共享与传递数据
-
1、背景在日常SpringBoot应用或者Java应用开发中,使用多线程编程有很多好处,比如可以同时处理多个任务,提高程序的并发性;可以充分利用计算机的多核处理器,使得程序能够更好地利用计算机的资源,...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)