目录
一、Redis集群模式
1.Redis高可用集群
Redis集群有三种模式,分别是主从同步/复制、哨兵模式、Cluster
①主从复制:主从复制是高可用Redis的基础,哨兵和集群都是在这个基础上实现高可用的,主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复
缺陷:故障恢复无法自动化,写操作无法负载均衡,存储能力受限。
②哨兵模式:在主从复制的基础上,实现了自动化的故障恢复
缺陷:写操作无法负载均衡,基于主从复制存储能力还是收到了限制
③集群模式:解决了Redis的写操作负载均衡,以及存储能力限制的问题,实现了较为完善的高可用。
2.Redis集群
Redis是一个开源的keycvalue存储系统,受到了各大互联网公司的热爱。Redis3.0版本之前只支持单例模式,3.0以后才开始支持集群,采用的是P2P模式,完全去中心化,不存在中心节点或者代理节点
为了实现集群的高可用,判断节点是否能正常使用(健康),redis-cluster有一个投票容错机制:当集群中超过半数的节点投票认为某个节点失效,那么这个节点就失效(挂掉)
当集群中任意一个节点挂掉,并且这个节点没有从节点(备份节点),那么这个集群整个就挂掉。
PS:
集群中内置了16384个slot(哈希槽),并且把所有物理节点映射到了这个16384个【0-16383】slot上,即把16384个slot平均分配到各个节点上。
当需要在Redis集群存放一个数据时(key-value),redis会先对key进行crc16算法,得到结果后,对这个16384个槽进行求余,这个余数会对应【0-16383】其中的一个槽,进而决定数据存储到哪个节点上,所以一旦当某个节点挂了,该节点对应的slot就无法使用,导致整个集群无法工作。
三个节点:A覆盖0-5460,B覆盖5461-10922,C覆盖10923-16383,每个节点有5460个哈希槽
四个节点:A覆盖0-1364、5461-6826、10923-12287,B覆盖1365-5460,C覆盖6827-10922,D覆盖12288-16383,每个节点有4095个哈希槽
Redis集群理论上有最多16384个节点
二、redis主从复制
1.主从复制
redis持久化保证了服务器出现问题或者重启,不会丢失数据,当服务器出问题或者重启会导致数据丢失,因为redis是把数据放在内存上的,而持久化是把内存中的数据保存到磁盘上,所以当redis重启后会从硬盘上加载数据,从而保证数据安全。
为了避免出现单点故障,通常就是把数据复制多个放在不同的服务器上,即使一台出现问题,另外的服务器也可以顶上继续提供服务
为此redis数据库提供了复制(replication)功能,可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上
在复制的概念里,数据库分为两类,一个是主(master)数据库,另外的则是从(slave)数据库。
主数据库可以进行读写操作,当写操作导致的数据更新时自动将数据同步给从数据库,一般从数据库是只读的并接受主数据库发来的数据。
所以一个主数据库可以拥有多个从数据库,但是一个从数据库只能拥有一个主数据库
2.主从复制流程
①启动slave机器进程,它会向maste机器发送同步(rsync)请求,请求连接
②不管是第一次连接还是重连,master都会开启一个后台进程,将数据快照(rdb文件)保存到数据文件中(执行rdb操作),同时master还会记录修改数据的所有命令(aof)并缓存到数据文件中(aof文件)。
③后台进程完成缓存操作后,master机器就会向slave机器发送数据文件,slave机器将数据文件保存到硬盘上,然后在将其加载到内存中,接着master机器就会将修改的数据操作(aof文件)一起发送给slave机器,若slave出现故障或者重启,当恢复正常后会自动重新连接。
④master机器收到slave机器的连接后,将其完成的数据文件发送给slave机器,如果是多个slave机器的话,就会在后台启动一个进程以保存数据文件,然后将其发送给所有的slave机器,保证所有slave机器工作正常
三、Redis哨兵模式
1.哨兵模式集群架构
哨兵是Redis集群架构中非常重要的一个组件,哨兵的出现主要是为了解决主从复制出现故障还要人为解决问题
2.哨兵模式主要的功能
①集群监控
负责监控Redis的主和从数据库是否正常工作
②消息通知
当某个Redis数据库有故障了,那么哨兵就负责发送消息通知给管理员
③故障转移
当Master Redis挂掉了,会自动切换master到slave上
④配置中心
故障发生后,转移了master,就会通知client客户端新的master地址
使用一个或者多个哨兵实例组成的系统,对redis节点进行监控 在主节点出现故障的情况下,能将从节点中的一个升级为主节点,进行故障转移,保证系统正常工作
3.哨兵监控系节点过程
以三台redis为例,一主两从
①三个哨兵之间先建立连接,周期加测队友状态
②哨兵会向master节点(在配置文件中指定的)发送两条连接,分别是命令连接和订阅连接(为了周期性获取master节点的数据)
③哨兵向master周期性发送info命令,在master正常的情况下就会返回redis-cli info replication master节点的信息和从节点的位置
④哨兵通过master返回的信息,再会向slave节点发送info命令,slaves返回数据,从而哨兵集群就可以获取到redis所有集群信息
⑤哨兵会向服务器发送命令连接,建立自己的hello频道,哨兵会向这个hello频道建立订阅,用于哨兵之间的消息共享
4.哨兵模式下的故障转移
①主观下线
哨兵节点会每秒一次的频率向建立了命令连接的实例发送PING命令,如果在down-after-milliseconds毫秒内没有做出有效响应包括(PONG/LOADING/MASTERDOWN)以外的响应,哨兵就会将该实例在本结构中的状态标记为SRI_S_DOWN主观下线
②客观下线
当一个哨兵节点发现主节点处于主观下线时,会向其他的哨兵节点发出询问,该节点是不是已经主观下线了。如果超过配置参数quorum个节点认为是主观下线时,该哨兵节点就会将自己维护的结构体中该主节点标记为SRIO DOWN
③master选举
在认为主节点客观下线了,哨兵节点之间就会发起一次选举,每个哨兵节点都会优先选自己,然后去询问别的哨兵,如果别的哨兵还没来得即选自己,则会选第一个发来选举的哨兵,如果超过半数以上的票,就会就行故障迁移
四、Cluster群集
redis哨兵基本上可以实现高可用、读写分离,但是在这个模式下,每台redis服务器存储着相同的数据,比较浪费内存资源,所以redis3.0以上的版本加入了Cluster群集,实现了redis的分布式存储,相当于每台redis存储着不同的内容,官方推荐集群部署至少三台以上的master节点,最好是3主3从,6个节点的模式。Cluster群集由多个redis服务器组成的分布式网络服务群集,群集中有很多的master主节点,每个节点都可以读写,节点之间相互通信,主从两两相连,redis群集没有中心节点
在Cluster群集中,可以给每个主节点添加从节点,主节点和从节点直接遵循主从模型的特性,当用户需要处理更多的请求的时候,添加从节点可以扩展系统的读性能
Cluster的故障转移:redis群集的主节点内置了类似的redissentinel的节点故障检测和自动故障转移功能
当群集中某个节点下线,群集中的其他在线主节点会注意到,并且对已经下线的主节点进行故障转移,群集故障转移的方法和哨兵模式下进行故障转移的方法基本一样,不同的是,群集里转移的是当前主节点下的从节点,让从节点负责他的主节点的工作,不需要另外使用redissentinel
五、Redis主从模式搭建
70 bind 0.0.0.0 ##修改监听地址为0.0.0.0
137 daemonize yes ##开启守护进程
172 logfile /var/log/redis_6379.log ##指定日志文件目录
264 dir /var/lib/redis/6379 ##指定工作目录
700 appendonly yes ##开启AOF持久化功能
/etc/init.d/redis_6379 restart ##重启服务使配置生效
slave1/2
vim /etc/redis/6379.conf
70 bind 0.0.0.0 ##修改监听地址为0.0.0.0
137 daemonize yes ##开启守护进程
172 logfile/var/log/redis_6379.log
264 dir /var/lib/redis/6379 ##指定工作目录
288 replicaof 192.168.72.21 6379 ##添加一条指定要同步的Master节点IP和端口
700 appendonly yes ##开启AOF持久化功能
/etc/init.d/redis_6379 restart ##重启服务使使配置生效
验证主从效果
cat /vat/log/redis_6379.log
redis-cli info replication
master创建key和值,slave1和slave2同步
master
slave1
slave2
六、哨兵模式
三台服务器均修改
vim redis-5.0.7/sentinel.conf
17 protected-mode no #关闭保护模式
21 port 26379 #Redis哨兵默认的监听端口
26 daemonize yes #开启守护进程
36 logfile "/var/log/sentinel.log" #指定日志存放路径
65 dir /var/lib/redis/6379 #指定数据库存放路径
84 sentinel monitor mymaster 192.168.72.21 6379 2 #指定哨兵节点;2:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
113 sentinel down-after-milliseconds mymaster 3000 #判定服务器down掉的时间周期,默认30000毫秒 (30秒)
146 sentinel failover- timeout mymaster 180000 #故障节点的最大超时时间为180000 (180秒)
启动哨兵模式
各服务器先启动主节点在启动从节点
cd redis-5.0.7
redis-sentinel sentinel.conf & #使用redis-sentinel启动,再使用sentinel.conf,&:放在在后台启动
master
slave1
slave2
redis-cli -p 26379 info sentinel ##查看哨兵信息;哨兵端口26379
模拟故障
netstat -antp | grep redis ##查看redis-server的进程号
kill -9 15391 ##杀死Master 节点_上的redis-server 的进程号
验证结果
tail -f /var/log/sentinel.log #查看实时日志
watch -n 1 redis-cli -p 26379 info sentinel ##先复制一个msater的会话,查看哨兵信息
##查看哨兵信息;status会从sdown->odown->ok,快速变化
①:status=sdown ##s表示主观下线
②:status=odown ##o即objectively客观下线
七、Cluster集群
redis的集群一般需要6个节点,3主3从。方便起见,这里所有节点在同一台服务器上模拟
以端口号进行区分: 3个主节点端口号: 6001/6002/6003, 对应的从节点端口号: 6004/ 6005/ 6006
创建6个端口工作目录
./install_server.sh
/usr/local/redis/bin/redis-server
ln -s /usr/local/redis/bin/* /usr/local/bin/
cd /etc/redis/
mkdir -p redis-cluster/redis600{1..6} #创建redis 6个端口的工作目录
#!/bin/bash
for i in {1..6}
do
cp redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i
cp redis-5.0.7/src/redis-cli redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
done
cd /etc/redis/redis-cluster/redis 6001
vim redis.conf
69 bind 127.0.0.1 ##注释掉bind项或不修改,默认监听所有网卡
88 protected -mode no ##修改,关闭保护模式
92 port 6001 ##修改,redis监听端口
136 daemonize yes ##开启守护进程,以独立进程启动
832 cluster-enabled yes ## 取消注释,开启群集功能
840 cluster-config-file nodes-6001.conf ##取消注释,群集名称文件设置
846 cluster-node-timeout 15000 ##取消注释群集超时时间设置
其他五个配置文件除端口号和文件名称外其余改动相同,复制redis6001至redis6002-6006
手动启动六次
cd /etc/redis/redis-cluster/redis6001
redis-server redis.conf ###启动服务
写入脚本执行脚本
vim /opt/redis_start.sh ##根据对应配置文件启动redis
#!/bin/bash
for d in {1..6}
do
cd /etc/redis/redis-cluster/redis600$d
redis-server redis.conf
done
sh -x /opt/redis_start.sh
ps -ef | grep redis
redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1
测试集群
redis-cli -p 6001 -c
cluster slots