1. 主从复制
2. 哨兵
3. 集群
判断集群是是否正常:
①集群监控
②消息通知
③故障转移
④配置中心
使用一个或者多个哨兵(Sentinel)实例组成的系统,对redis节点进行监控,在主节点出现故障的情况下,能将从节点中的一个升 级为主节点,进行故障转义,保证系统的可用性。
首先主节点的信息是配置在哨兵(Sentinel)的配置文件中
哨兵节点会和配置的主节点建立起两条连接命令连接和订阅连接
PS:Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
哨兵会通过命令连接每10s发送一次INF0命令,通过INFO命令,主节点会返回自己的run_id和自己的从节点信息
哨兵会对这些从节点也建立两条连接命令连接和订阅连接
哨兵通过命令连接向从节点发送INFO命令,获取到他的一些信息:
- run_id(redis服务器id)
- role(职能)
- 从服务器的复制偏移量offset
- 其他
通过命令连接向服务器的_sentinel:hello频道发送一条消息,内容包括自己的ip端口、run_id、配置(后续投票的时候会用到)等
通过订阅连接对服务器的sentinel:hello频道做了监听,所以所有的向该频道发送的哨兵的消息都能被接受到
解析监听听到的消息,进行分析提取,就可以知道还有那些别的哨兵服务节点也在监听这些主从节点了,更新结构体将这些哨兵节点记录下来
向观察到的其他的哨兵节点建立命令连接-------没有订阅连接
主观下线
客观下线
master选举
故障迁移
优点
缺点
redis的哨兵模式基本已经可以实现高可用、读写分离,但是在这种模式每台redis服务器都存储相同的数据,很浪费内存资源, 所以在redis3.0上加入了cluster群集模式,实现了redis的分布式存储,也就是说每台redis节点存储着不同的内容 根据官方推荐,集群部署至少要3台以上的master节点,最好使用3主3从六个节点的模式。
Cluster群集由多个redis服务器组成的分布式网络服务群集,群集之中有多个master主节点,每一个主节点都可读可写,节点之 间会相互通信,两两相连,redis群集无中心节点
在redis-cluster群集中,可以给每个一个主节点添加从节点,主节点和从节点直接遵循主从模型的特性,当用户需要处理更多读 请求的时候,添加从节点可以扩展系统的读性能
redis-cluster的故障转移:redis群集的主机节点内置了类似redis
sentinel的节点故障检测和自动故障转移功能,当群集中的某个主节点下线时,群集中的其他在线主节点会注意到这一点,并且 对已经下线的主节点进行故障转移
集群进行故障转移的方法和redis
sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以群集 不必另外使用redis sentinel
master节点:192.168.100.10
slave1节点:192.168.100.20
slave2节点:192.168.100.30
①安装Redis(所有主机)
yum install -y gcc gcc-c++ make
cd /opt
tar zxvf redis-5.0.7.tar.gz
cd /opt/redis-5.0.7/
make && make PREFIX=/usr/local/redis install
cd /opt/redis-5.0.7/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/
vim /etc/redis/6379.conf
#70行,修改bind 项,0.0.0.0监听所有网段
bind 0.0.0.0
#137行,开启守护进程
daemonize yes
#172行,指定日志文件目录
logfile /var/log/redis_6379.log
#264行,指定工作目录
dir /var/lib/redis/6379
#700行,开启AOF持久化功能
appendonly yes
/etc/init.d/redis_6379 restart
vim /etc/redis/6379.conf
#70行,修改bind 项,0.0.0.0监听所有网卡
bind 0.0.0.0
#137行,开启守护进程
daemonize yes
#172行,指定日志文件目录
logfile /var/log/redis_6379.log
#264行,指定工作目录
dir /var/lib/redis/6379
#288行,指定要同步的Master节点IP和端口
replicaof 192.168.163.10 6379
#700行,开启AOF持久化功能
appendonly yes
/etc/init.d/redis_6379 restart
tail -f /var/log/redis_6379.log
redis-cli info replication
master节点:192.168.100.10
slave1节点:192.168.100.20
slave2节点:192.168.100.30
①修改redis配置文件(所有节点)
vim /opt/redis-5.0.7/sentinel.conf
#17行,关闭保护模式
protected-mode no
#21行,Redis哨兵默认的监听端口
port 26379
#26行,指定sentinel为后台启动
daemonize yes
#36行,指定日志存放路径
logfile "/var/log/sentinel.log"
#65行,指定数据库存放路径
dir "/var/lib/redis/6379"
#84行,修改 指定该哨兵节点监控192.168.163.10:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel monitor mymaster 192.168.163.10 6379 2
#113行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel down-after-milliseconds mymaster 30000
#146行,故障节点的最大超时时间为180000(180秒)
sentinel failover-timeout mymaster 180000
cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &
redis-cli -p 26379 info Sentinel
#查看redis-server进程号
ps aux | grep redis
#杀死 Master 节点上redis-server的进程号,模拟故障
kill -9 30605 #Master节点上redis-server的进程号
tail -f /var/log/sentinel.log
#-------日志信息------------
32928:X 08 May 2021 16:21:46.083 # +switch-master mymaster 192.168.100.10 6379 192.168.100.30 6379
32928:X 08 May 2021 16:21:46.083 * +slave slave 192.168.100.20:6379 192.168.100.20 6379 @ mymaster 192.168.100.30 6379
32928:X 08 May 2021 16:21:46.083 * +slave slave 192.168.100.10:6379 192.168.100.10 6379 @ mymaster 192.168.100.30 6379
32928:X 08 May 2021 16:21:56.098 # +sdown slave 192.168.100.10:6379 192.168.100.10 6379 @ mymaster 192.168.100.30 6379
redis-cli -p 26379 INFO Sentinel
Master1:192.168.10.10
Master2:192.168.10.11
Master3:192.168.10.12
Slave1:192.168.10.20
Slave2:192.168.10.21
Slave3:192.168.10.22
cd /etc/redis/
mkdir -p redis-cluster/redis6379
cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis6379/
cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis6379/
#其他5个文件夹的配置文件以此类推修改,注意6个端口都要不一样。
cd /etc/redis/redis-cluster/redis6379
vim redis.conf
bind 192.168.10.10 #69行,修改bind项,监听自己的IP
protected-mode no #88行,修改,关闭保护模式
port 7001 #92行,修改,redis监听端口,
daemonize yes #136行,以独立进程启动
cluster-enabled yes #832行,取消注释,开启群集功能
cluster-config-file nodes-6379.conf #840行,取消注释,群集名称文件设置,无需修改
cluster-node-timeout 15000 #846行,取消注释群集超时时间设置
appendonly yes #699行,修改,开启AOF持久化
scp /etc/redis/redis-cluster/redis6379/redis.conf [email protected]:/etc/redis/redis-cluster/redis6379/redis.conf
scp /etc/redis/redis-cluster/redis6379/redis.conf [email protected]:/etc/redis/redis-cluster/redis6379/redis.conf
scp /etc/redis/redis-cluster/redis6379/redis.conf [email protected]:/etc/redis/redis-cluster/redis6379/redis.conf
scp /etc/redis/redis-cluster/redis6379/redis.conf [email protected]:/etc/redis/redis-cluster/redis6379/redis.conf
scp /etc/redis/redis-cluster/redis6379/redis.conf [email protected]:/etc/redis/redis-cluster/redis6379/redis.conf
vim /etc/redis/redis-cluster/redis6379/redis.conf
#修改69行bind监听自己的IP
#修改92行监听端口自定义修改,每个节点不一样即可
cd /etc/redis/redis-cluster/redis6379/
redis-server redis.conf
启动集群:
redis-cli --cluster create 192.168.10.10:7001 192.168.10.11:7003 192.168.10.12:7005 192.168.10.20:7006 192.168.10.21:7004 192.168.10.22:7002 --cluster-replicas 1
redis-cli -h 192.168.10.10 -p 7001 -c #加-c参数,节点之间就可以互相跳转
cluster slots #查看节点的哈希槽编号范围
set sky blue
cluster keyslot sky #查看name键的槽编号