Redis 主从复制、哨兵模式、群集模式

发布时间 2023-09-26 19:59:00作者: Candy独角兽

Redis 主从复制、哨兵模式、群集模式

1. Redis 的 2种 持久化方式

  • RDB 持久化

    • 定时把 redis 内存中的数据进行快照并压缩保存到硬盘
    • RDB 持久化保存的文件占用空间小,网络传输快,恢复速度也比 AOF 快
    • 缺点:实时性较差不如 AOF,兼容性较差,持久化期间在 fork 子进程时会阻塞 redis 父进程
  • AOF 持久化

    • 以追加的方式将redis写操作的命令记录到文件中
    • 实时性比 RDB 好,支持秒级持久化,兼容性更好
    • 缺点:持久化保存的文件占用磁盘空间更大,恢复速度更慢,性能影响更大,AOF 文件重写期间在 fork 子进程时会阻塞 redis 父进程

问题:

两者区别?

可以通过 "工作方式" 、实时性、磁盘占用、恢复速度、兼容性、IO 性能影响等方面进行阐述。

2. Redis 优化

1)设置 config set activedefrag yes 开启内存碎片自动清理,或者定时执行 memory purge 清理内存碎片
2)设置 maxmemory 指定redis可占用的最大内存大小
   设置 maxmemory-policy 指定内存数据淘汰策略,实现保存内存使用率不超过最大内存
   设置 maxmemory-samples 指定内存数据淘汰策略的样本数量,值越大越精确(默认为5)
   设置 maxclients 指定最大客户端连接数
   设置 tcp-backlog 指定最大连接排队数
   设置 timeout 指定连接超时时间
3)尽可能使用 hash 数据类型存储数据。因为 hash 类型的一个 key 可包含多个字段,该类型的数据占用空间较小
4)建议设置 key 的过期时间,精简 键名和键值,控制键占用空间的大小
5)设置 AOF持久化 和 主从复制 来备份数据,采用 哨兵 或 集群 模式实现集群的高可用
6)建议通过命令 config set requirepass 或 修改配置文件 requirepass 参数来设置redis密码

3. Redis 主从复制的原理

  1. 首次同步:当从节点要进行主从复制时,它会发送一个SYNC命令给主节点。主节点收到SYNC命令后,会执行BGSAVE命令来生成RDB快照文件,并在生成期间使用缓冲区记录所有写操作。

  2. 快照传输:当主节点完成BGSAVE命令并且快照文件准备好后,将快照文件传输给从节点。主节点将快照文件发送给从节点,并且在发送过程中,主节点会继续将新的写操作缓冲到内存中。

  3. 追赶复制:当从节点收到快照文件后,会加载快照文件并应用到自己的数据集中。一旦快照文件被加载,从节点会向主节点发送一个PSYNC命令,以便获取缓冲区中未发送的写操作。

  4. 增量复制:主节点收到PSYNC命令后,会将缓冲区中未发送的写操作发送给从节点,从节点会执行这些写操作,保证与主节点的数据一致性。此时,从节点已经追赶上了主节点的状态。

  5. 同步:从节点会继续监听主节点的命令,并及时执行主节点的写操作,以保持与主节点的数据同步。主节点会定期将自己的操作发送给从节点,以便从节点保持最新的数据状态.

    注意:当slave首次同步或者宕机后恢复时,会全盘加载,以追赶上大部队,即全量复制

3.1 配置文件

Master 192.168.175.101
Slave1 192.168.175.102
Slave2 192.168.175.103

-----修改 Redis 配置文件(Master节点操作)-----
vim /usr/local/redis/conf/redis.conf
bind 0.0.0.0									#87行,修改监听地址为0.0.0.0
appendonly yes									#1380行,开启AOF


systemctl restart redis-server.service


-----修改 Redis 配置文件(Slave节点操作)-----
vim /usr/local/redis/conf/redis.conf
bind 0.0.0.0									#87行,修改监听地址为0.0.0.0
appendonly yes									#1380行,开启AOF
replicaof 192.168.175.101 6379					#528行,指定要同步的Master节点IP和端口
#masterauth abc123								#535行,可选,指定Master节点的密码,仅在Master节点设置了requirepass


systemctl restart redis-server.service


redis-cli -h 192.168.175.101 -p 6379 -a abc123
redis-cli -h 192.168.175.102 -p 6379 -a abc123
redis-cli -h 192.168.175.103 -p 6379 -a abc123
info replication

3.2 Redis 主从复制

Master
cd /usr/local/redis/conf
ls
cd ..
ls
cd log/
ls
vim redis_6379.log
redis-cli -h 192.168.175.101 -p 6379 -a abc123
keys *
set name ssu
#新建姓名 ssu
set group G1
#新建组 G1
keys *
#全部信息

Slave1
redis-cli -h 192.168.175.102 -p 6379 -a abc123
keys *
#Master内容已同步到Slave1
get name
"ssu"
get group
"G1"
#主从复制成功

Slave2
redis-cli -h 192.168.175.103 -p 6379 -a abc123
keys *
#Master内容已同步到Slave2
get name
"ssu"
get group
"G1"
#主从复制成功

4. Redis 哨兵模式

哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式

4.1 哨兵机制

  • 主从切换技术的方法是:当服务器宕机后,需要手动一台从机切换为主机,这需要人工干预,不仅费时费力而且还会造成一段时间内服务不可用。为了解决主从复制的缺点,就有了哨兵机制。
  • 哨兵的核心功能:在主从复制的基础上,哨兵引入了主节点的自动故障转移,不能实现从节点的自动故障转移

4.2 哨兵模式的作用

  • 监控:哨兵会不断地检查主节点和从节点是否运作正常。
  • 自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其它从节点改为复制新的主节点。
  • 通知(提醒):哨兵可以将故障转移的结果发送给客户端。

4.3 哨兵结构

  • 由两部分组成,哨兵节点和数据节点:
    • 哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。默认端口号26379
    • 数据节点:主节点和从节点都是数据节点。端口号6379

4.4 哨兵模式配置

Master节点:192.168.175.101
Slave1节点:192.168.175.102
Slave2节点:192.168.175.103
cd /opt
cd redis-7.0.13/
ls
cp sentinel.conf /usr/local/redis/conf/
cd !$
ls
ll
chown redis:redis sentinel.conf
ll

vim sentinel.conf
protected-mode no									#6行,关闭保护模式
port 26379											#10行,Redis哨兵默认的监听端口
daemonize yes										#15行,指定sentinel为后台启动
pidfile /usr/local/redis/log/redis-sentinel.pid		#20行,指定 PID 文件
logfile "/usr/local/redis/log/sentinel.log"			#25行,指定日志存放路径
dir /usr/local/redis/data							#54行,指定数据库存放路径
sentinel monitor mymaster 192.168.175.101 6379 2		#73行,修改 指定该哨兵节点监控192.168.175.101:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
#sentinel auth-pass mymaster abc123					#76行,可选,指定Master节点的密码,仅在Master节点设置了requirepass
sentinel down-after-milliseconds mymaster 3000		#114行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000			#214行,同一个sentinel对同一个master两次failover之间的间隔时间(180秒)



提取IP地址
1.ifconfig ens33 | grep netmask | awk '{print $2}'
2.ip addr | grep ens33 | grep inet | awk '{print $2}' | awk -F/ '{print $1}'
3.ifconfig ens33 | awk 'NR==2 {print $2}'



vim failover.sh
#!/bin/bash

MASTER_IP=$6
#新MASTER地址赋给MASTER_IP变量

INTERFACE="ens33"
#网卡名称

LOCAL_IP=$(ifconfig $INTERFACE | awk 'NR==2 {print $2}')
#当前主机IP地址

VIP="192.168.175.200"
#VIP地址

NETMASK="24"
#掩码

KEY="1"
#网卡接口

if [ "$MASTER_IP" = "$LOCAL_IP" ]
then
      #比较新MASTER地址和当前主机地址
      /sbin/ifconfig ${INTERFACE}:${KEY} ${VIP}/${NETMASK}
                     #网卡名称:网卡接口  IP地址/子网掩码 
      exit 0
else
#地址不一样
     /sbin/ifconfig ${INTERFACE}:${KEY} down
     #删除VIP地址
fi
exit 1
#返回1  哨兵一直执行脚本

chmod +x failover.sh
ll
./failover.sh 1 1 1 1 1 192.168.175.101 1