目录
一.主从复制
主从复制的工作原理如下:
主从复制的作用:
搭建Redis 主从复制
每台服务器配置:
编辑进行编译安装:
定义systemd服务管理脚本:
开启服务,报错看下内容:
修改 Redis 配置文件(Master节点操作):
修改 Redis 配置文件(Slave节点操作):
192.168.233.30(从)与192.168.233.20(从)配置一样.
验证主从效果:
二.Redis 哨兵模式
哨兵模式的作用:
哨兵结构由两部分组成:
主节点的选举:
哨兵模式工作过程:
哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式。
搭建Redis 哨兵模式(端口号26379):
修改 Redis 哨兵模式的配置文件(所有节点操作):
修改文件:
启动哨兵模式:先启主,再启从
查看哨兵信息:
故障模拟:
将配置文件远程复制到从节点上:
Redis集群模式:
Redis集群的工作原理:
Redis集群的数据分片:
Redis集群的主从复制模型:
在哨兵的基础上继续配置集群模式:
在根目录下创建集群目录及端口号目录:编辑
修改6001的配置文件:
启动集群:
一.主从复制
Redis主从复制是一种用于数据备份、灾难恢复和读写分离的技术,它通过将一个Redis服务器(主节点)的数据复制到其他服务器(从节点)来实现。
主从复制的工作原理如下:
1.首次同步:当从节点要进行主从复制时,它会发送一个SYNC命令给主节点。主节点收到SYNC命令后,会执行BGSAVE命令来生成RDB快照文件,并在生成期间使用缓冲区记录所有写操作。
2.快照传输:当主节点完成BGSAVE命令并且快照文件准备好后,将快照文件传输给从节点。主节点将快照文件发送给从节点,并且在发送过程中,主节点会继续将新的写操作缓冲到内存中。
3.追赶复制:当从节点收到快照文件后,会加载快照文件并应用到自己的数据集中。一旦快照文件被加载,从节点会向主节点发送一个PSYNC命令,以便获取缓冲区中未发送的写操作
4.增量复制:主节点收到PSYNC命令后,会将缓冲区中未发送的写操作发送给从节点,从节点会执行这些写操作,保证与主节点的数据一致性。此时,从节点已经追赶上了主节点的状态
5.同步:从节点会继续监听主节点的命令,并及时执行主节点的写操作,以保持与主节点的数据同步。主节点会定期将自己的操作发送给从节点,以便从节点保持最新的数据状态.
注意:当slave首次同步或者宕机后恢复时,会全盘加载,以追赶上大部队,即全量复制
主从复制的作用:
数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务,分担服务器负载
高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
搭建Redis 主从复制
准备三台服务器,192.168.233.10(主);192.168.233.20(从);192.168.233.30(从)
每台服务器配置:
修改添加内核参数:
查看刷新一下:
安装环境:
压缩解压redis软件包:
进行编译安装:
创建redis工作目录:
复制配置文件:
创建用户:
给redis目录授权:
添加 环境变量:
定义systemd服务管理脚本:
[Unit]
Description=Redis Server
After=network.target
[Service]
User=redis
Group=redis
Type=forking
TimeoutSec=0
PIDFile=/usr/local/redis/log/redis_6379.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
开启服务,报错看下内容:
文件授权要都是redis:
修改 Redis 配置文件(Master节点操作):
192.168.233.20(从)192.168.233.30(从):
pid和log日志文件位置:
修改 Redis 配置文件(Slave节点操作):
192.168.233.30(从)与192.168.233.20(从)配置一样.
重启服务:
验证主从效果:
在Master节点上看日志:
看到了从服务器的ip对接成功
在Master节点上验证从节点:
主服务添加键:
从服务查看:
主从复制成功。
二.Redis 哨兵模式
哨兵模式的作用:
监控:哨兵会不断地检查主节点和从节点是否运作正常。
自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其它从节点改为复制新的主节点。
通知(提醒):哨兵可以将故障转移的结果发送给客户端。
哨兵结构由两部分组成:
哨兵节点:哨兵系统由一个或多个哨兵节点组成,不存储数据
数据节点:主节点和从节点都是数据节点
主节点的选举:
1.过滤掉不健康的(已下线的),没有回复哨兵 ping 响应的从节点
2.选择配置文件中从节点优先级配置最高的。(replica-priority,默认值为100)
3.选择复制偏移量最大,也就是复制最完整的从节点
哨兵模式工作过程:
1,哨兵系统需要>=3台的哨兵节点组成,一主多从做主从复制
2,哨兵节点定时探测主节点,从节点和其他哨兵节点的运行状态
3,当哨兵节点探测到主节点异常,则认为主节点主观下线
4, 当超过指定数量的哨兵节点认为主节点主观下线,则认定主节点客观下线
5,哨兵节点会通过raft算法选举出leader,再由leader负责故障转移和通知
6,将一个从节点提升为新的主节点,让其它从节点指向新的主节点做主从复制
7,写VIP也会漂移到新的主节点上
8,原主节点恢复后也会自动变成从节点指向新的主节点做主从复制
哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式。
搭建Redis 哨兵模式(端口号26379):
在主从复制的基础上继续进行哨兵模式的搭建。
修改 Redis 哨兵模式的配置文件(所有节点操作):
主:
从:
授权文件:
主:
从:
修改文件:
启动哨兵模式:先启主,再启从
主:
从:
查看哨兵信息:
故障模拟:
先给主添加vip:
添加脚本,进行监控:
#!/bin/bash
NEW_MASTERIP=$6
OLD_MASTERIP="$(ifconfig ens33| awk'NR==2{print $2}')"
VIP="192.168.233.100"
if [ "$NEW_MASTERIP"="$OLD_MASTERIP" ]; then
ifconfig ens33:1 ${VIP}/24
exit 0
else
ifconfig ens33:1 down
exit 0
fi
exit 1
给脚本授权:
执行脚本:
修改主服务器文件:
将配置文件远程复制到从节点上:
给从服务器文件授权:
给所有服务器进行操作:
查看主服务的log文件:
关闭主服务器:
查看日志文件:
看下192.168.233.30从服务器:有vip
看下从节点192.168.233.20的信息状态:
当我们旧主192.168.233.10恢复正常后,查看信息:
Redis集群模式:
集群模式的端口号为:16379
Redis集群的工作原理:
1、集群有多组节点,每组节点负责一部分哈希槽。
2、读写数据时,先根据crc16的算法得出一个结果,然后把结果对 16384 取余。通过这个值去找到对应的哈希槽的节点,进行数据读写。
3、集群每组节点内做主从复制,当主节点宕机的时候,就会启用从节点。主节点负责读写请求和集群信息的维护;从节点负责主节点数据和状态信息的复制。
Redis集群的数据分片:
Redis集群引入了哈希槽的概念
Redis集群有16384个哈希槽(编号0-16383)
集群的每组节点负责一部分哈希槽
以3个节点组成的集群为例:
节点A包含0到5460号哈希槽
节点B包含5461到10922号哈希槽
节点C包含10923到16383号哈希槽
Redis集群的主从复制模型:
集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会因缺少5461-10922这个范围的槽而不可以用。
为每个节点添加一个从节点A1、B1、C1整个集群便有三个Master节点和三个slave节点组成,在节点B失败后,集群选举B1位为的主节点继续服务。当B和B1都失败后,集群将不可用。
在哨兵的基础上继续配置集群模式:
redis的集群一般需要6个节点,3主3从。方便起见,这里所有节点在同一台服务器上模拟:
以端口号进行区分:3个主节点端口号6001/6002/6003,对应的从节点端口号6004/6005/6006。
在根目录下创建集群目录及端口号目录:
将初始配置文件,客户端命令及redis服务命令复制到这几个目录下:
我们可以使用for循环来一次性复制过去:
for i in {6001..6006}
> do
> cp redis.conf src/redis-server src/redis-cli
redis-cli redis-cli.c redis-cli.d redis-cli.o
> cp redis.conf src/redis-server src/redis-cli /usr/local/redis/redis-cluster/redis$i
> done
我们看下集群目录下文件:
修改6001的配置文件:
通过for循环将配置文件复制到其他端口上:
通过for循环在将文件中的0661改为各自端口号一样的配置:
看下配置文件:
通过for循环开启每个端口服务:
启动集群:
在6001添加键:会跳转到6002下
在进入6001查看键:不存在
跳转到6002的从节点下6005看:
查看键内容,会跳转到主节点上: