zoukankan      html  css  js  c++  java
  • Redis集群主从复制和哨兵

    Redi集群和哨兵模式

    主从复制模式

    什么是主从复制

    在Redis中,通过执行SLAVEOF命令或者通过配置文件设置slaveof选项,就可以让一台服务器去复制另一台服务器,其中被复制的服务器叫做主服务器(master),而对主服务器进行复制的服务器叫做从服务器(slave),从而实现当主服务器中的数据更新后,根据配置和策略自动同步到从服务器上。master以写为主,salve以读为主。

    image-20201008102748716

    简单的主从复制

    #开启三台edis服务器
    redis-cli -p 6379	#服务器A
    redis-cli -p 6380	#服务器B
    redis-cli -p 6381	#服务器C
    #设置B,C为A的从服务器
    SLAVEOF 127.0.0.1 6379	#服务器B
    SLAVEOF 127.0.0.1 6379	#服务器C
    #查看当前服务器的主从复制信息
    INFO replication
    

    主从服务器之间的数据将保持一致性,也就是数据库状态一致。

    主从复制的功能说明

    • 一个master可以有多个slave
    • 一个slave只能有一个master
    • 数据流向是单向的,从master到slave
    • Redis采用异步复制,从服务器会以每秒一次的频率向主服务器报告复制流的处理进度
    • 除了主服务器可以有从服务器之外,从服务器也可以有自己的从服务器,多个服务器之间可以构成一个网状结构,它们之间具有传递关系
    • 在进行复制的时候,复制功能不会阻塞主服务器
    • 如果主节点B成为另一个主节点A的从节点,那么主节点B之前保存的数据将会被清除,同步主节点A的数据,数据库状态将与主节点A保持一致

    主从复制配置

    使用SLAVEOF命令配置主从复制

    image-20201008161240437

    #配置从机
    SLAVEOF 127.0.0.1 6379
    #从服务器变成主服务器,之前的数据不会丢失,只是不再同步
    SLAVEOF no one
    

    修改配置文件实现主从复制

    #设置端口
    port 6380
    #设置后台进程运行Redis
    daemonize yes
    #设置进程ID文件
    pidfile /var/run/redis_6380.pid
    #设置日志文件名
    logfile "6380.log"
    #把持久化关掉
    save 900 1
    save 300 10
    save 60 10000
    #设置rdb文件名
    dbfilename dump6380.rdb
    

    复制功能的实现步骤

    1. 通过SLAVEOF命令设置主服务器的IP地址和端口号
    2. 主从服务器之间建立套接字连接
    3. 从服务器向主服务器发送PING命令
    4. 根据从服务器的配置决定是否进行身份验证
    5. 从服务器向主服务器发送端口信息
    6. 从服务器向主服务器发送PSYNC命令完成同步功能
    7. 主从服务器之间进行命令传播,进而维持数据库状态的一致性

    Redis读写分离

    Redis读写分离用于实现将读流量分摊到每个从节点,,它将master上的数据同步给slave,让salve分摊去执行相关的业务。比如,一个业务只需要读数据,那么我们直接去读从节点就可以了。通常的做法是让master执行写操作,让salve执行读操作,这样一方面减轻了master的压力、提高性能;另一方面拓展了Redis读的能力,适用于读多写少的场景。

    读写分离也会有几个缺点:

    • 复制数据延迟
    • 读到一些过期的数据
    • 在读写分离的过程中,节点发生故障

    高可用哨兵模式

    哨兵模式主要是用于监控任意多台服务器是否发生故障,以及监控这些主服务器的从服务器。当主服务器发生故障时,他会通过投票选举的方式从主服务器下属的从服务器中选举出一台新的主服务器,让这台新的主服务器代替之前的主服务器继续处理命令请求及完成相关工作,从而实现故障转移,达到了高可用、热部署的目的。

    作用:监控、通知、自动故障转移

    哨兵模式的配置

    #进入Redis目录
    cd redis
    #复制一份sentinel.conf文件
    cp sentinel.conf sentinel-26379.conf
    #去掉文件里面的空格和注释
    cat sentinel-26379.conf | grep -v "#" | grep -v "^$"
    #配置文件内容
    port 26379
    dir /tmp
    sentinel moniter mymaster 127.0.0.1 6379 2
    sentinel down-after-milliseconds mymaster 30000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 180000
    #编辑配置文件
    vim sentinel-26379.conf
    #编辑内容
    port 26379
    daemonize yes
    dir /home/redis/data
    logfile "26379.log"
    sentinel moniter mymaster 127.0.0.1 6379 2
    sentinel down-after-milliseconds mymaster 30000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 180000
    #第一种启动方法
    redis-sentinel sentinel-26379.conf
    #第二种方法
    redis-server sentinel-26379.conf --sentinel
    #查看Sentinel信息
    INFO sentinel
    

    哨兵模式下不能使用的命令

    • 与操作数据库和键值对相关命令不能使用
    • 与事务相关的命令不能使用
    • 与操作脚本相关的命令不能使用
    • 与持久化相关的命令不能使用

    哨兵模式的实现原理

    • 启动Sentinel并初始化
    • 获取主从服务器的信息
    • 向主从服务器发送信息
    • 接收来自主从服务器的频道消息
    • 监控主从服务器下线状态
    • 完成故障转移
  • 相关阅读:
    CodeForces 7B
    CodeForces 4D
    离散化
    线段树入门
    洛谷 P3951 小凯的疑惑(赛瓦维斯特定理)
    Codeforces 1295D Same GCDs (欧拉函数)
    Codeforces 1295C Obtain The String (二分)
    Codeforces 1295B Infinite Prefixes
    Codeforces 1295A Display The Number(思维)
    Codeforces 1294F Three Paths on a Tree(树的直径,思维)
  • 原文地址:https://www.cnblogs.com/striver20/p/13796335.html
Copyright © 2011-2022 走看看