Redis主从&哨兵模式

  • 简介

    • 主从 -- 用法
      • 像MySQL一样,redis是支持主从同步的,而且也支持一主多从以及多级从结构。 主从结构,一是为了纯粹的冗余备份,二是为了提升读性能,比如很消耗性能的SORT就可以由从服务器来承担。 redis的主从同步是异步进行的,这意味着主从同步不会影响主逻辑,也不会降低redis的处理性能。 主从架构中,可以考虑关闭主服务器的数据持久化功能,只让从服务器进行持久化,这样可以提高主服务器的处理性能。 在主从架构中,从服务器通常被设置为只读模式,这样可以避免从服务器的数据被误修改。但是从服务器仍然可以接受CONFIG等指令,所以还是不应该将从服务器直接暴露到不安全的网络环境中。如果必须如此,那可以考虑给重要指令进行重命名,来避免命令被外人误执行。
    • 主从 -- 同步原理
      • 从服务器会向主服务器发出SYNC指令,当主服务器接到此命令后,就会调用BGSAVE指令来创建一个子进程专门进行数据持久化工作,也就是将主服务器的数据写入RDB文件中。在数据持久化期间,主服务器将执行的写指令都缓存在内存中。 在BGSAVE指令执行完成后,主服务器会将持久化好的RDB文件发送给从服务器,从服务器接到此文件后会将其存储到磁盘上,然后再将其读取到内存中。这个动作完成后,主服务器会将这段时间缓存的写指令再以redis协议的格式发送给从服务器。 另外,要说的一点是,即使有多个从服务器同时发来SYNC指令,主服务器也只会执行一次BGSAVE,然后把持久化好的RDB文件发给多个下游。在redis2.8版本之前,如果从服务器与主服务器因某些原因断开连接的话,都会进行一次主从之间的全量的数据同步;而在2.8版本之后,redis支持了效率更高的增量同步策略,这大大降低了连接断开的恢复成本。 主服务器会在内存中维护一个缓冲区,缓冲区中存储着将要发给从服务器的内容。从服务器在与主服务器出现网络瞬断之后,从服务器会尝试再次与主服务器连接,一旦连接成功,从服务器就会把"希望同步的主服务器ID"和"希望请求的数据的偏移位置(replication offset)"发送出去。主服务器接收到这样的同步请求后,首先会验证主服务器ID是否和自己的ID匹配,其次会检查"请求的偏移位置"是否存在于自己的缓冲区中,如果两者都满足的话,主服务器就会向从服务器发送增量内容。 增量同步功能,需要服务器端支持全新的PSYNC指令。这个指令,只有在redis-2.8之后才具有。
  • 环境

    • 三台服务器通信畅通。
    • 并部署redis
    • 关闭防火墙和selinux
      启用多重执行

1.Redis安装
  • 安装redis
bash 复制代码
 wget http://download.redis.io/releases/redis-4.0.9.tar.gz -O /redis-4.0.9.tar.gz
  • 从redis.io下载最新版redis-X.Y.Z.tar.gz后解压,然后进入redis-X.Y.Z文件夹后直接make即可
    • redis-4.0.9.tar.gz
bash 复制代码
cd  /
 进入资源目录
tar xzf redis-4.0.9.tar.gz
 解压缩安装包
cd /redis-4.0.9/
 进入安装包所在目录
make
 编译安装
  • 开机启动
bash 复制代码
 mkdir  /etc/redis
 cp   /redis-4.0.9/redis.conf  /etc/redis/6379.conf
 cp /redis-4.0.9/utils/redis_init_script   /etc/init.d/redis
  • 新增第6,7,13,15,29行
bash 复制代码
 vim /etc/init.d/redis

6 # chkconfig: 2345 10 90
7 # description: Start and Stop redis
12 #EXEC=/usr/local/bin/redis-server
13 EXEC=/redis-4.0.9/src/redis-server
14 #CLIEXEC=/usr/local/bin/redis-cli
15 CLIEXEC=/redis-4.0.9/src/redis-cli

23         if [ -f $PIDFILE ]
24         then
25                 echo "$PIDFILE exists, process is already running or crashed"
26         else
27                 echo "Starting Redis server..."
28                 #$EXEC $CONF 
29                 $EXEC $CONF &
30 
31         fi
bash 复制代码
 chmod +x /etc/init.d/redis
 chkconfig --add redis
  • 增加开机启动设置
bash 复制代码
 chkconfig --list
 redis          	0:关	1:关	2:开	3:开	4:开	5:开	6:关
 chkconfig  redis  on
  • 设置redis开机启动
bash 复制代码
 systemctl daemon-reload
  • 重新加载自启动信息
bash 复制代码
 systemctl start redis
  • 启动redis

master1 192.168.145.11

bash 复制代码
vim /etc/redis/6379.conf 
  bind 127.0.0.1
  bind 0.0.0.0
  • 监听本机所有地址
bash 复制代码
   protected-mode yes
   protected-mode no
  • 关闭保护模式
bash 复制代码
systemctl  restart  redis
  • 重启

  • slave1 192.168.145.12

bash 复制代码
 vim /etc/redis/6379.conf 
   slaveof 192.168.145.11  6379
bash 复制代码
   bind 0.0.0.0
   protected-mode no


 systemctl  restart  redis
  • slave2 192.168.145.13
bash 复制代码
 vim /etc/redis/6379.conf 
   slaveof 192.168.145.11  6379
   bind 0.0.0.0
   protected-mode no


 systemctl  restart  redis
  • 测试

    • 数据一致性

      • master1记录键值对

      复制代码
        [root@master1 ~]# /redis-4.0.9/src/redis-cli
        127.0.0.1:6379> set abc hahahahah
        OK
        127.0.0.1:6379> get abc
        "hahahahah"
    • slave1查询数据,验证数据一致性

    复制代码
      [root@slave1 redis-4.0.9]#  /redis-4.0.9/src/redis-cli
      127.0.0.1:6379> get abc
      "hahahaah"
      127.0.0.1:6379>
  • 服务状态

bash 复制代码
/redis-4.0.9/src/redis-cli 

登录redis客户端

info replication

查看复制状态

master
复制代码
  [root@master ~]# /redis-4.0.9/src/redis-cli
  127.0.0.1:6379> info replication
  # Replication
  role:master
  connected_slaves:2
  slave0:ip=192.168.145.12,port=6379,state=online,offset=280,lag=1
  slave1:ip=192.168.145.13,port=6379,state=online,offset=280,lag=1
  master_replid:54a4066c4ca51148adb6e273e37265aa1401a941
  master_replid2:0000000000000000000000000000000000000000
  master_repl_offset:280
  second_repl_offset:-1
  repl_backlog_active:1
  repl_backlog_size:1048576
  repl_backlog_first_byte_offset:1
  repl_backlog_histlen:280
  


  

- slave


  [root@slave~]# /redis-4.0.9/src/redis-cli
  127.0.0.1:6379> info replication
  # Replication
  role:slave
  master_host:192.168.145.11
  master_port:6379
  master_link_status:up
  master_last_io_seconds_ago:1
  master_sync_in_progress:0
  slave_repl_offset:182
  slave_priority:100
  slave_read_only:1
  connected_slaves:0
  master_replid:54a4066c4ca51148adb6e273e37265aa1401a941
  master_replid2:0000000000000000000000000000000000000000
  master_repl_offset:182
  second_repl_offset:-1
  repl_backlog_active:1
  repl_backlog_size:1048576
  repl_backlog_first_byte_offset:15
  repl_backlog_histlen:168
  127.0.0.1:6379>
  127.0.0.1:6379> get abc
  "hahahahah"

redis-sentinel

  • 简介

    • sentinel介绍

      • 作用

        • Redis Sentinel Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案。实际上这意味着你可以使用Sentinel模式创建一个可以不用人为干预而应对各种故障的Redis部署。

        • 作用:

          1):Master状态检测

          2):如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave

          3):Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换

      • 工作方式

        • 1):每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令
        • 2):如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
        • 3):如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
        • 4):当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线
    • 主观下线和客观下线

      • 主观下线:Subjectively Down,简称 SDOWN,指的是当前 Sentinel 实例对某个redis服务器做出的下线判断。
      • 客观下线:Objectively Down, 简称 ODOWN,指的是多个 Sentinel 实例在对Master Server做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,然后开启failover.
  • 环境

    • 在上一个实验的基础上。
    • 注意:每台机器的防火墙
  • 步骤

    • 1.每台机器上修改redis主配置文件设置:bind 0.0.0.0(略)

    • 2.每台机器上修改sentinel配置文件:添加如下配置

bash 复制代码
 vim /redis-4.0.9/sentinel.conf
​     sentinel monitor mymaster 192.168.145.11 6379 2
  • 当集群中有2个sentinel认为master死了时,才能真正认为该master已经不可用了。
bash 复制代码
  sentinel down-after-milliseconds mymaster 3000
  • 单位毫秒
  • 如果在down-after-millisecondes毫秒内,没有收到有效的回复,则会判定该节点为主观下线。
bash 复制代码
   sentinel failover-timeout mymaster 10000
  • 若sentinel在该配置值内未能完成failover(故障转移)操作(即故障时master/slave自动切换),则认为本次failover失败。
bash 复制代码
protected-mode no
  • 3.每台机器启动服务:
bash 复制代码
 cd  /redis-4.0.9
 ./src/redis-sentinel sentinel.conf
  • 4.关闭主服务器,观察从服务器改变状态

    • master1
bash 复制代码
 systemctl stop redis
  • 观察三台服务器返回信息。会显示新主人信息。

    复制代码
    36596:X 13 Aug 08:11:01.260 # -odown master mymaster 192.168.145.11 6379
    36596:X 13 Aug 08:11:01.260 # +failover-end master mymaster 192.168.145.11 6379
    36596:X 13 Aug 08:11:01.260 # +switch-master mymaster 192.168.145.11 6379 192.168.145.13 6379
    36596:X 13 Aug 08:11:01.260 * +slave slave 192.168.145.12:6379 192.168.145.12 6379 @ mymaster 192.168.145.13 6379
    36596:X 13 Aug 08:11:01.260 * +slave slave 192.168.145.11:6379 192.168.145.11 6379 @ mymaster 192.168.145.13 6379
    36596:X 13 Aug 08:11:04.275 # +sdown slave 192.168.145.11:6379 192.168.145.11 6379 @ mymaster 192.168.145.13 6379
  • 新主服务器上观察状态转换

bash 复制代码
/redis-4.0.9/src/redis-cli 
info replication
  • 观察状态由主转从

  • redis相关工具(了解)

bash 复制代码
 find /redis-4.0.9/src -type f -executable
 ./redis-benchmark //用于进行redis性能测试的工具
 ./redis-check-dump //用于修复出问题的dump.rdb文件
 ./redis-cli //redis的客户端
 ./redis-server //redis的服务端
 ./redis-check-aof //用于修复出问题的AOF文件
 ./redis-sentinel //用于集群管理
相关推荐
�FENG7 分钟前
Redis 安装配置和性能优化
redis·持久化
大熊猫侯佩28 分钟前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(三)
数据库·swiftui·swift
大熊猫侯佩28 分钟前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(二)
数据库·swiftui·swift
大熊猫侯佩33 分钟前
用异步序列优雅的监听 SwiftData 2.0 中历史追踪记录(History Trace)的变化
数据库·swiftui·swift
大熊猫侯佩35 分钟前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(一)
数据库·swiftui·swift
Ares-Wang40 分钟前
负载均衡LB》》HAproxy
运维·数据库·负载均衡
AI.NET 极客圈1 小时前
.NET 原生驾驭 AI 新基建实战系列(四):Qdrant ── 实时高效的向量搜索利器
数据库·人工智能·.net
weixin_470880261 小时前
MySQL体系架构解析(二):MySQL目录与启动配置全解析
数据库·mysql·面试·mysql体系架构·mysql bin目录
互联网搬砖老肖1 小时前
Web 架构之缓存策略实战:从本地缓存到分布式缓存
前端·缓存·架构
英英_2 小时前
MySQL 日志数据同步的详细教程
数据库·mysql