4.1 Redis主从复制

本文探讨了Redis在高并发场景下面临的挑战,包括单点故障和数据吞吐量限制,并介绍了如何通过构建Redis集群解决这些问题。文章详细阐述了主从复制、数据同步、故障转移及哨兵(sentinel)机制的原理与配置,确保Redis服务的稳定性和可靠性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一个从无到有,从简到繁的过程。
首先为了保证热点数据的高频访问,我们引入了缓存数据库redis。那么,我们使用一个redis实例。暂时性的解决了或少眉毛的问题。但是单个实例有以下几个弊端:
1、故障容忍问题。在产品中如果这个实例发生故障不能为业务提供支持,这对于已经上线的产品来讲是一个巨大的boom。等同于瘫痪,因为我们在redis中做的不仅仅是数据缓存,还会在redis中分布式场景下的session共享也可以称之为数据共享;分布式场景下的锁,分布式场景下的事务等等;
2、数据吞吐量问题。redis性能方面毋庸置疑的,但是我们有几句俗话—好虎架不住群狼,双拳难敌四手。我们还有几句俗话—三个臭皮匠顶个诸葛亮。这里其实是讲的量变引起质变的过程。访问量超过redis的临界值时,那么该怎么办呢?

万能的程序员对以上这些问题提供了解决方案----Redis集群。
上图:
在这里插入图片描述

那么集群模式下会遇到这样几个问题:
1、当master挂掉以后两个slave怎么顶替master继续提供服务呢?
2、数据一致性问题,既然slave要被降大任,那么它就必须要持有master的所有数据,否则那他就不堪重任了。

清楚上述两个问题以后我们先迈出第一步----让他们形成主从关系。
方法也是相当的简单。
在redis.conf这个文件当中有这样一个项配置:
#slaveof
在这一行的下面我们写上自己的配置:
slaveof 121.47.0.1 6379 (这是一个slave的配置)(当然这个我信口开河的一个ip 别当真 我是不会告诉你我自己的ip信息的)
对于master 我们不需要做什么,直接重启slave就可以。在slave节点进入redis客户端 输入info replication 命令就可以看到主从信息了。里面的内容也是相当简单,知道点英语的人都可以看懂。所以我想讲一个我自己遇到的问题?
我在输入info replication 命令以后遇到了这样一个问题。显示 master_link_status:down ;这个down让我很难受表示slave没有跟master联系上。
请检查两个地方:
1、在master节点redis.conf 里的 protected-mode 这个的值是不是 no 如果不是则改过来
2、使用 telnet ip port 来访问master主节点 如果连接不上 则到主节点的redis.conf 里修改bind 把它注释掉 并重启
3、如果你做了以上几个事情仍然是down 则可以考虑关闭master节点的防火墙

做了以上几件事情以后,再到slave里去info replication master_link_status:up 这个up才是我想要的


接下来我们要做的是数据的同步,使得slave和master的数据是一致的。
我先说过程在解释同步的原理是怎样的。
过程:过程也是相当的简单的,只要在master中set数据,那么在slave当中get数据是可以拿到相应的数据的。
原理 :原理才是重中之重。
redsi的复制方式有三种:
1、全量复制
2、增量复制
3、无磁盘复制

全量复制的使用场景,在初始化的时候。即新增了一个slave节点,这个节点会把master的数据都复制过来。那么全量复制的过程是这样的,slave启动以后会向master发送SYNC命令,告诉master我是来做数据同步的;master在收到命令以后会使用bgsave命令来生成一个快照(这个快照是本地磁盘,会影响性能),把快照发送给salve;salve拿到快照以后就会做数据恢复load。
上图
在这里插入图片描述

那么这里有一个问题,主节点生成快照以后的命令什么时候同步呢?
master生成快照之后产生的命令会存在缓存之中,这些命令会发送给slave。这个过程类似于增量复制。这里是以命令的方式。
全量复制完成以后就开始做增量复制。

在这里我们应该注意到一个问题。
这个问题可能会发生在这样一个场景下:快照通过网络进行传输。那么如果由于网络的原因,或者其他的原因导致我们的salve没有能够把数据同步过来怎么办呢?更要命的是master是不知道他自己有几个slave的。
这里依然有解决方案:
min-slaves-to-write 3
这个表示只有当指定数量的slave节点连做了数据同步以后 master才是可写的;在此之前master会阻塞,不接收外部的请求,意思就是说:既然master不知道自己有几个salve那么我人工告诉他有几个slave,这总可以了吧。
那么还有一个配置:min-slave-max-lag 10
这个配置的意思是,允许slave最长失联多长时间,因为master-slave之间是维持这一个心跳包的。这样符合做事留余地,来日好相聚的逻辑了----一个容错空间

下面开始讲增量复制 这是redis2.8之后才有的哦
增量复制–顾名思义,当master数据发生改变,slave也会跟着同步数据。
那么这里就有一个问题master-slave他们两个是怎样知道,数据是从哪里开始复制的呢?
master会在内存当中创建一个backlog。backlog类似于日志,可以简单的这样理解一下。
在master客户端输入 info replication ,在众多的参数当中有这样两个信息:
slave_repl_offset:1049(这个数据仅仅是样品)
repl_backlog_active:1(这个数据依然是样品)
slave_repl_offset表示当前数据同步的位置,他是保存在backlog里的。
当slave和master重新恢复连接以后,slave会从自己的backlog当中获取offset数据到master中的这个位置开始恢复(也叫同步)数据

下面讲无磁盘复制
在增量复制的时候,会生成快照文件。众所周知的是生成快照文件是会影响性能的。那么有没有精益求精的方式呢?
有呀。在redis2.8之后提供了无磁盘复制。
使用起来也是相当的简单。
在master的redis.conf里有repl-diskless-sync no 这个配置 的意思是让redis不生成磁盘快照。那么问题来了–不生成磁盘快照的话怎么来实现数据同步呢?
在内存里创建rdb数据(其实也是快照文件),直接发送,而不是使用本地磁盘(全量复制是本地磁盘)。

下面开始讲redis选主
经过以上内容我们解决了redis集群主从之间数据的同步问题。这只是迈出了万里长征的第一步,那么我们依然有问题需要解决。这个问题就是:当master节点挂掉以后,集群怎样继续为应用提供服务

这个问题也是相当的简单,为了保证系列文章的完整性,我还是决定分享。
redis自身并没有互相感知这个功能。万能的程序员提供了解决方案。
sentinel–哨兵
这个是redis官方提供的高可用解决方案。欢呼吧,既然是官方提供的,说明有很好的用户体验,也就是说不需要我们另外做什么了。
我们公司比较大条。单独搞了一个主机运行一个redis实例,这个实例的主要目的就是开启redis的sentinel功能。其实我感觉不用这么做的。我可以在redis实例A上来监控redis实例B,redis实例B上监控C ,C上监控A。意思就是说sentinel不能自己监控自己。为了高可用。那么sentinel也要做集群,万一单个sentinel挂掉了,那岂不是相当于没有?!

在这里插入图片描述

我们不需要配置哨兵之间的关系,他们通过共同监控的master而互相感知。就是类似于QQ好友,欧阳斧子 和 诸葛铁锤 通过他们的共同好友 尉迟榔头 而成为铁哥们儿。 sentinel之间通过与master节点的pub/sub 而互相感知,
那么sentinel是怎么知道slave的呢?
当然也是通过订阅master而知道的,其过程我不明白我只知道是这样一个过程,事实上我也没必要去研究这个东西。
那么sentinel是怎么选举他们的队长的呢?
原理我略懂一下,其内部经过一个复杂的算法进行选举,这个算法叫raft算法。给一个连接吧更有利于理解raft算法-----thesecretlivesofdata.com/raft
那么sentinel是怎么选出redis集群的master的呢?
sentinel通过raft算法在内部选举出队长,再由这个队长直接进行主节点的任命
接下来我来说怎么使用?
soooooooo easy!!!
通过配置的方式进行启动。
就是加压目录里有一个sentinel.conf ,这是一个示例文件,里面是对使用sentinel的配置的样板。我们可以直接用这个文件来启动,也可以使用它的复制品来启动。无所谓都一样。
在这个文件里会找到这样一段串串:
sentinel monitor mymaster 127.0.0.1 6379 2
这就是sentinel的配置,它的意思就是监控 127.0.0.1 机器上 运行在6379端口的程序;这个2的意思是:如果当前master挂掉了需要多少个sentinel判定master挂了才断定他真的挂了 -----这是一个相当民主的过程 还是做个比喻吧:
说尉迟榔头躺在病床上呼出了榔生的最后一口气。这个细节被欧阳斧子看到了,但是它不敢确定,就问诸葛铁锤:老兄,你觉得榔头是真的凉了吗?如果诸葛铁锤说:是,我也觉得凉了。那么他们两个才认为榔头是真的凉了。 -----------这是保证主观和客观的公正性
在bin目录下 输入 ./redis-sentinel sentinel.conf 回车
这样就启动了

那么这里还有一个细节,
如果一个master挂了,队长会等他一段时间(事实上是几秒钟,可以自己配置)----呃。。。类似于 欧阳斧子 和 诸葛铁锤 会给 尉迟榔头 摆灵三天,三天内他活过来了就皆大欢喜,如果没有那就埋了。
当master在指定的时间内没有和队长回复通讯,这个队长就会触发failover机制从salve中间挑选一个作为新的master。
以下是我们常用的两个配置:
sentinel dwon-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
第一行就是摆灵的那三天(5000) 时间是毫秒
第二行就是 ,当选举过程开始以后,如果队长不作为(可能是偷懒,也可能是其他原因总之他没有做任何事情),那么当前节点就认为这次的failover是失败的,则重新推举一个队长。事实上,队长是受队员监督的。

那么如果master经过修复重新回到集群当中呢?
这时master就相当于尉迟榔头重新投胎做人了,他以slave的角色加入到集群当中,进行数据的全量复制,增量复制等等等等。从而进入下一个朝代(redis中的epoch概念)。
结束了--------------------------------------------------------------------

<think>好的,用户让我写一个关于两台Linux服务器部署Redis主从高可用的详细配置文档。首先,我得确认用户的需求是什么。他们可能需要在两台服务器上配置Redis主从复制,并且确保高可用性。这可能涉及到主从切换、故障恢复等方面的配置。 首先,我需要考虑Redis主从的基本配置。主服务器负责写操作,从服务器复制主服务器的数据。但仅仅是主从可能还不够高可用,因为如果主服务器宕机,需要手动切换从服务器为主节点,或者使用哨兵模式(Sentinel)来自动处理故障转移。用户可能指的是使用哨兵来实现高可用,所以需要确认这一点。不过用户可能对Redis的高可用方案不太熟悉,可能需要我明确说明两种方案的差异,或者直接提供哨兵配置。 接下来,我需要确定服务器的基本信息。用户提到的是两台服务器,但通常Redis哨兵模式建议至少三个哨兵实例,以防止脑裂问题。不过可能用户只有两台服务器,每台服务器上运行一个Redis实例和一个哨兵实例。这种情况下,需要明确说明如何在两台服务器上部署Redis和哨兵,以及如何配置哨兵来监控主节点。 然后,我需要考虑网络配置,比如防火墙是否开放相应的端口,Redis默认是6379,哨兵是26379。用户可能需要确保这些端口在服务器之间是可达的。此外,安全配置如设置密码认证也是重要的,避免未授权访问。 文档的结构需要清晰,分步骤说明。可能包括环境准备、安装Redis、配置主从、配置哨兵、验证配置等部分。每个步骤需要详细的命令和配置文件示例,确保用户能够按图索骥进行操作。 另外,需要注意Redis版本,不同版本的配置可能略有不同,所以需要指定版本号,比如Redis 6.x。同时,系统服务配置部分,可能需要提供systemd的unit文件,方便用户管理Redis和哨兵服务。 用户可能还会关心如何测试高可用性,比如手动停止主节点,观察哨兵是否自动切换,以及客户端如何重新连接到新的主节点。这部分需要包含测试步骤,确保配置的正确性。 最后,可能还需要一些注意事项,比如数据持久化配置、内存管理、监控等,但用户主要需求是高可用部署,所以这些可以作为补充内容简要提及。 总结下来,我需要按照以下步骤来构建文档: 1. 环境准备,包括服务器信息、软件版本、防火墙设置。 2. 安装Redis,两台服务器都安装相同版本的Redis。 3. 配置主从复制,设置主节点和从节点的配置文件。 4. 配置哨兵,在两台服务器上分别配置哨兵,监控主节点。 5. 启动服务并验证主从复制和哨兵监控。 6. 测试故障转移,确保高可用性。 7. 提供客户端连接示例和注意事项。 需要确保每个步骤的命令和配置准确无误,特别是bind地址、密码、守护进程模式等关键配置项。同时,解释每个配置的作用,帮助用户理解为何需要这样设置,比如关闭保护模式、允许后台运行等。 可能遇到的问题包括主从无法同步,哨兵无法检测到故障,这时候需要检查日志文件,查看是否有连接拒绝或认证失败的错误。因此,在文档中加入常见问题排查步骤也是有帮助的。 最后,确保使用中文,术语准确,格式美观,代码块和配置示例清晰易读,符合用户的要求。</think># Redis主从高可用部署文档(哨兵模式) ## 一、环境准备 ### 1.1 服务器信息 | 角色 | IP地址 | 主机名 | Redis端口 | 哨兵端口 | |-------------|-------------|---------|-----------|----------| | Master+Sentinel | 192.168.1.10 | master | 6379 | 26379 | | Slave+Sentinel | 192.168.1.11 | slave | 6379 | 26379 | ### 1.2 软件版本 - Redis:6.2.12 - 操作系统:CentOS 7.9 ### 1.3 前置条件 ```bash # 两台服务器均执行 systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config ``` ## 二、Redis安装配置 ### 2.1 安装Redis(两台服务器) ```bash yum install -y gcc make wget https://download.redis.io/releases/redis-6.2.12.tar.gz tar xzf redis-6.2.12.tar.gz cd redis-6.2.12 make && make install ``` ### 2.2 主节点配置(192.168.1.10) ```bash mkdir -p /etc/redis /var/log/redis /var/lib/redis cat > /etc/redis/6379.conf <<EOF bind 0.0.0.0 port 6379 daemonize yes pidfile /var/run/redis_6379.pid logfile "/var/log/redis/redis.log" dir /var/lib/redis requirepass RedisMasterPass123 masterauth RedisMasterPass123 appendonly yes protected-mode no EOF ``` ### 2.3 从节点配置(192.168.1.11) ```bash mkdir -p /etc/redis /var/log/redis /var/lib/redis cat > /etc/redis/6379.conf <<EOF bind 0.0.0.0 port 6379 daemonize yes pidfile /var/run/redis_6379.pid logfile "/var/log/redis/redis.log" dir /var/lib/redis requirepass RedisSlavePass123 masterauth RedisMasterPass123 replicaof 192.168.1.10 6379 appendonly yes protected-mode no EOF ``` ## 三、哨兵配置 ### 3.1 主节点哨兵配置 ```bash cat > /etc/redis/sentinel.conf <<EOF port 26379 daemonize yes logfile "/var/log/redis/sentinel.log" dir /var/lib/redis sentinel monitor mymaster 192.168.1.10 6379 1 sentinel auth-pass mymaster RedisMasterPass123 sentinel down-after-milliseconds mymaster 5000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 10000 protected-mode no EOF ``` ### 3.2 从节点哨兵配置 ```bash cat > /etc/redis/sentinel.conf <<EOF port 26379 daemonize yes logfile "/var/log/redis/sentinel.log" dir /var/lib/redis sentinel monitor mymaster 192.168.1.10 6379 1 sentinel auth-pass mymaster RedisMasterPass123 sentinel down-after-milliseconds mymaster 5000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 10000 protected-mode no EOF ``` ## 四、服务启动 ### 4.1 启动Redis服务 ```bash # 两台服务器分别执行 redis-server /etc/redis/6379.conf ``` ### 4.2 启动哨兵服务 ```bash # 两台服务器分别执行 redis-sentinel /etc/redis/sentinel.conf ``` ## 五、验证部署 ### 5.1 主从复制验证 ```bash # 在主节点执行 redis-cli -a RedisMasterPass123 info replication # 应显示 connected_slaves:1 # 在从节点执行 redis-cli -a RedisSlavePass123 info replication # 应显示 role:slave 和 master_host:192.168.1.10 ``` ### 5.2 哨兵状态检查 ```bash redis-cli -p 26379 info sentinel # 应显示 sentinel_masters:1 和 num_other_sentinels:1 ``` ## 六、故障转移测试 1. 停止主节点Redis服务 ```bash redis-cli -a RedisMasterPass123 shutdown ``` 2. 等待约10秒后检查从节点状态 ```bash redis-cli -a RedisSlavePass123 info replication # 应显示 role:master ``` 3. 检查哨兵日志 ```bash tail -f /var/log/redis/sentinel.log # 应显示 +switch-master 切换记录 ``` ## 七、客户端连接示例 ```python from redis.sentinel import Sentinel sentinel = Sentinel([('192.168.1.10', 26379), ('192.168.1.11', 26379)], socket_timeout=0.5) master = sentinel.master_for('mymaster', password='RedisMasterPass123', db=0) slave = sentinel.slave_for('mymaster', password='RedisMasterPass123', db=0) ``` ## 八、注意事项 1. 生产环境建议部署3个及以上哨兵节点 2. 建议配置持久化策略:`appendfsync everysec` 3. 监控重要指标:内存使用率、连接数、OPS 4. 定期检查哨兵和Redis日志 5. 重要操作前做好数据备份 > 所有配置文件的路径和密码请根据实际情况修改,防火墙配置需根据实际网络环境调整。生产环境建议使用非默认端口并启用TLS加密。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值