一文掌握Redis的三种集群方案

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

一文掌握Redis的三种集群方案

【空山新雨】   2020-03-16 我要评论
在开发测试环境中,我们一般搭建Redis的单实例来应对开发测试需求,但是在生产环境,如果对可用性、可靠性要求较高,则需要引入Redis的集群方案。虽然现在各大云平台有提供缓存服务可以直接使用,但了解一下其背后的实现与原理总还是有些必要(比如面试), 本文就一起来学习一下Redis的几种集群方案。 Redis支持三种集群方案 * 主从复制模式 * Sentinel(哨兵)模式 * Cluster模式 ## 主从复制模式 ### 1. 基本原理 主从复制模式中包含一个主数据库实例(master)与一个或多个从数据库实例(slave),如下图 ![redis-master-slave](https://img2020.cnblogs.com/other/632381/202003/632381-20200316092434553-1122086987.png) 客户端可对主数据库进行读写操作,对从数据库进行读操作,主数据库写入的数据会实时自动同步给从数据库。 具体工作机制为: 1. slave启动后,向master发送SYNC命令,master接收到SYNC命令后通过bgsave保存快照(即上文所介绍的RDB持久化),并使用缓冲区记录保存快照这段时间内执行的写命令 2. master将保存的快照文件发送给slave,并继续记录执行的写命令 3. slave接收到快照文件后,加载快照文件,载入数据 4. master快照发送完后开始向slave发送缓冲区的写命令,slave接收命令并执行,完成复制初始化 5. 此后master每次执行一个写命令都会同步发送给slave,保持master与slave之间数据的一致性 ### 2. 部署示例 本示例基于Redis 5.0.3版。 redis.conf的主要配置 ```conf ###网络相关### # bind 127.0.0.1 # 绑定监听的网卡IP,注释掉或配置成0.0.0.0可使任意IP均可访问 protected-mode no # 关闭保护模式,使用密码访问 port 6379 # 设置监听端口,建议生产环境均使用自定义端口 timeout 30 # 客户端连接空闲多久后断开连接,单位秒,0表示禁用 ###通用配置### daemonize yes # 在后台运行 pidfile /var/run/redis_6379.pid # pid进程文件名 logfile /usr/local/redis/logs/redis.log # 日志文件的位置 ###RDB持久化配置### save 900 1 # 900s内至少一次写操作则执行bgsave进行RDB持久化 save 300 10 save 60 10000 # 如果禁用RDB持久化,可在这里添加 save "" rdbcompression yes #是否对RDB文件进行压缩,建议设置为no,以(磁盘)空间换(CPU)时间 dbfilename dump.rdb # RDB文件名称 dir /usr/local/redishttps://img.qb5200.com/download-x/datas # RDB文件保存路径,AOF文件也保存在这里 ###AOF配置### appendonly yes # 默认值是no,表示不使用AOF增量持久化的方式,使用RDB全量持久化的方式 appendfsync everysec # 可选值 always, everysec,no,建议设置为everysec ###设置密码### requirepass 123456 # 设置复杂一点的密码 ``` 部署主从复制模式只需稍微调整slave的配置,在redis.conf中添加 ```conf replicaof 127.0.0.1 6379 # master的ip,port masterauth 123456 # master的密码 replica-serve-stale-data no # 如果slave无法与master同步,设置成slave不可读,方便监控脚本发现问题 ``` 本示例在单台服务器上配置master端口6379,两个slave端口分别为7001,7002,启动master,再启动两个slave ```shell [root@dev-server-1 master-slave]# redis-server master.conf [root@dev-server-1 master-slave]# redis-server slave1.conf [root@dev-server-1 master-slave]# redis-server slave2.conf ``` 进入master数据库,写入一个数据,再进入一个slave数据库,立即便可访问刚才写入master数据库的数据。如下所示 ```shell [root@dev-server-1 master-slave]# redis-cli 127.0.0.1:6379> auth 123456 OK 127.0.0.1:6379> set site blog.jboost.cn OK 127.0.0.1:6379> get site "blog.jboost.cn" 127.0.0.1:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=7001,state=online,offset=13364738,lag=1 slave1:ip=127.0.0.1,port=7002,state=online,offset=13364738,lag=0 ... 127.0.0.1:6379> exit [root@dev-server-1 master-slave]# redis-cli -p 7001 127.0.0.1:7001> auth 123456 OK 127.0.0.1:7001> get site "blog.jboost.cn" ``` 执行`info replication`命令可以查看连接该数据库的其它库的信息,如上可看到有两个slave连接到master ### 3. 主从复制的优缺点 优点: 1. master能自动将数据同步到slave,可以进行读写分离,分担master的读压力 2. master、slave之间的同步是以非阻塞的方式进行的,同步期间,客户端仍然可以提交查询或更新请求 缺点: 1. 不具备自动容错与恢复功能,master或slave的宕机都可能导致客户端请求失败,需要等待机器重启或手动切换客户端IP才能恢复 2. master宕机,如果宕机前数据没有同步完,则切换IP后会存在数据不一致的问题 3. 难以支持在线扩容,Redis的容量受限于单机配置 ## Sentinel(哨兵)模式 ### 1. 基本原理 哨兵模式基于主从复制模式,只是引入了哨兵来监控与自动处理故障。如图 ![redis-sentinel](https://img2020.cnblogs.com/other/632381/202003/632381-20200316092434904-227928571.png) 哨兵顾名思义,就是来为Redis集群站哨的,一旦发现问题能做出相应的应对处理。其功能包括 1. 监控master、slave是否正常运行 2. 当master出现故障时,能自动将一个slave转换为master(大哥挂了,选一个小弟上位) 3. 多个哨兵可以监控同一个Redis,哨兵之间也会自动监控 哨兵模式的具体工作机制: 在配置文件中通过 `sentinel monitor

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们