文章目录
一、redis 集群三种模式简介
模式一:主从复制,是redis高可用的基础,实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。
缺陷:故障恢复无法自动化、写操作无法负载均衡、存储能力受到单机的限制。
模式二:哨兵模式,基于主从复制模式,实现了自动化的故障恢复
缺陷:写操作无法负载均衡、存储能力受到单机的限制。
模式三:cluster集群模式,通过Redis集群解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。
二、redis 集群三种模式原理
2.1 主从复制
第一步:slave服务器向master服务器发送sync_command命令,请求同步数据
第二步:master接收到sync_command后使用fork函数派生一个子进程(此过程会阻塞子进程),用于生成RDB文件,并且把客户端执行的写命令保存在缓冲区中,再保存到aof文件中
第三步:master RDB持久化完成之后,将生成的RDB和AOF文件发送给slave
第四步:slave恢复RDB和AOF文件中的数据
第五步:master持续性的将客户端写入的命令以一定的规则同步给slave
2.2 哨兵模式
哨兵模式主要功能:
① 集群监控:负责监控Redis 主 和 备 进程是否正常工作
② 消息通知:如果某个Redis实例有故障,那么哨兵负责发送消息作为告警通知给管理员
③ 故障转移:如果 主节点 挂掉了,会自动转移到 备节点 上
④ 配置中心:如果故障转移发生了,通知客户端新的master地址
实现步骤:
步骤一:在所有哨兵节点上配置master节点
步骤二:哨兵节点会和配置的主节点建立起两条连接①命令连接、②订阅连接
步骤三:哨兵会通过命令连接周期性(间隔10秒)发送一次info命令,通过info命令,主节点会返回自己的run_id和自己的从节点信息;哨兵通过获取的从节点信息,也会对从节点建立起两条连接:命令连接 和 订阅连接,执行相同的操作。
步骤四:主从节点通过命令连接向哨兵服务器的hello频道发送一条消息,内容包括自己的ip端口、run_id、配置等,用于后续投票使用
步骤五:哨兵集群通过订阅连接对哨兵服务器的hello频道进行监听,所有向该频道发送的消息都能被所有哨兵服务器接受到
步骤六:哨兵集群中每一台哨兵都解析监听到的消息,进行分析提取,就可以知道还有那些别的哨兵服务节点也在监听这些主从节点了,更新结构体将这些哨兵节点记录下来
步骤七:哨兵集群中每一台哨兵都向观察到的其他的哨兵节点建立命令连接(用于投票),没有订阅连接
哨兵模式下的故障迁移
- 主观下线:哨兵(Sentinel)节点会每秒一次的频率向建立了命令连接的主节点发送PING命令,如果在down-after-milliseconds毫秒内没有做出有效响应包括(PONG/LOADING/MASTERDOWN),哨兵就会将该主节点在本结构体中的状态标记为SRI_S_DOWN主观下线
- 客观下线:当一个哨兵节点发现主节点处于主观下线状态是,会向其他的哨兵节点发出询问,该节点是不是已经主观下线了。如果超过配置参数quorum个节点认为是主观下线时,该哨兵节点就会将自己维护的结构体中该主节点标记为SRI_O_DOWN客观下线。询问命令sentinel is-master-down-by-addr
- master选举:在认为主节点客观下线的情况下,哨兵节点之间会发起一次选举,命令为:sentinel is-master-down-by-addr 只是run_id这次会将自己的run_id带进去,希望接受者将自己设置为主节点。如果超过半数以上的节点返回将该节点标记为leacer的情况下,将由该leader对故障进行迁移
2.3 cluster 集群模式
核心:数据分区,也就是分布式方式存储数据,一方面突破了 Redis 单机内存大小的限制,存储容量大大增加,另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力
高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似),当任意节点发送故障时,集群仍然可以对外提供服务
数据分片:Redis 集群引入了哈希槽的概念,有 16384 个哈希槽(编号 0~16383)集群的每个节点负责一部分哈希槽(平均分配到每个节点),每个 Key 通过 CRC16 校验后对 16384 取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作
三、redis 安装及三种模式的实验
3.1 redis 安装
安装依赖包,下载redis源码包,并解压安装
yum -y install gcc gcc-c++ make
wget -P /opt http://download.redis.io/releases/redis-5.0.9.tar.gz //下载
cd /opt && tar -xzvf redis-5.0.9.tar.gz //解压
cd redis-5.0.9
make && make PREFIX=/usr/local/redis install //安装
cd utils/ && ./install_server.sh //配置项设置,一直回车直到出现(Please select the redis executable path [])之后,手动输入:/usr/local/redis/bin/redis-server(我手残,直接复制的)
ln -s /usr/local/redis/bin/* /usr/local/bin/ //执行的命令优化
netstat -napt | grep 6379 //检查redis是否启动
3.2 redis 主从同步
实验环境:
master服务器:192.168.177.130
slave1服务器:192.168.177.120
slave2服务器:192.168.177.113
步骤一:三台redis服务器关闭防火墙、selinux、安装ntp并且同步时钟
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
yun -y install ntp
ntpdate ntp.aliyun.com
步骤二:修改master配置文件
vim /etc/redis/6379.conf
//定位70行,修改监听地址为:0.0.0.0
70 bind 0.0.0.0
//定位137行,开启守护进程
137 daemonize yes
//定位172行,指定日志文件目录
172 logfile "/var/log/redis_6379.log"
//定位264行,指定工作目录
264 dir "/var/lib/redis/6379"
//定位700行,开启AOF持久化
700 appendonly yes
:wq //保存退出之后重启redis服务器
service redis_6379 restart
步骤三:修改slave1、slave2配置文件(配置相同)
配置与master基本相同,唯一不同的是slave上需要指定同步的master的IP+端口
vim /etc/redis/6379.conf
//定位70行,修改监听地址为:0.0.0.0
70 bind 0.0.0.0
//定位137行,开启守护进程
137 daemonize yes
//定位172行,指定日志文件目录
172 logfile "/var/log/redis_6379.log"
//定位264行,指定工作目录
264 dir "/var/lib/redis/6379"
//定位288行,指定需要同步的master服务器的IP+端口
288 replicaof 192.168.177.130 6379