Redis非关系型数据库(四)高可用

目录

一、Redis集群模式

1.Redis高可用集群

2.Redis集群

二、redis主从复制

1.主从复制

2.主从复制流程

三、Redis哨兵模式

1.哨兵模式集群架构

2.哨兵模式主要的功能

3.哨兵监控系节点过程

4.哨兵模式下的故障转移

四、Cluster群集

五、Redis主从模式搭建

六、哨兵模式

七、Cluster集群


一、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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值