高可用Redis(九):Redis Sentinel

1.主从复制高可用的问题

主从复制高可用的作用

1.为master提供备份,当master宕机时,slave有完整的备份数据
2.对master实现分流,实现读写分离

但是主从架构有一个问题

1.如果master宕机,故障转移需要手动完成或者由别的工具来完成,从slave中选择一个slave做为新的master

写能力和存储能力受限
只能在一个节点是写入数据
所有数据只能保存在一个节点上

1133627-20181017141126029-629752756.png

上图模拟了主从复制架构中一主两从情况下,master宕机,则slave从master同步数据也断开,此时client向master写入数据会失败,读写分离时读取数据正常,但不能更新数据

master出现故障之后,手动进行故障转移步骤

1.选择一个slave,执行slave no one命令使之成为一个master
    

1133627-20181017141137430-1361658034.png

2.对其余的slave执行slaveof new master命令,将这些slave指定为新的master的slave
    

1133627-20181017141150471-1681819750.png

3.client会对新的master进行写入数据,从slave中读取原来的数据
    

1133627-20181017141203294-2138659270.png

上面的操作过程需要手动完成,或者编写脚本,由脚本来执行这个过程,但是这个过程是有问题的:

怎么判断一个Redis节点是有问题的,怎么通知client对新master进行写入操作
怎么保证一个完整的事务实现过程

上面的过程就可以使用Redis Sentinel来实现

2.Redis Sentinel架构说明

Redis Sentinel的功能:对Redis节点进行监控,故障判断,故障转移,故障通知

1133627-20181017141211881-1582401590.png

对于Redis的主从架构,Redis Sentinel会运行几个sentinel进程

sentinel进程不操作数据,而是对Redis故障进行判断和转移

同时多个sentinel运行,即使一个sentinel进程运行异常,还有别的sentinel继续运行,可以保证对故障节点判断的准确性,同时保证Redis的高可用

对于redis-cli来说,Redis cli不会再记录Redis的IP和端口,而是从sentinel获取Redis信息,然后进行连接Redis节点,进行数据写入和读取操作

多个Redis Sentinel对所有的master和slave进行监控,会实时记录master和slave的地址信息

1133627-20181017141221315-1881829736.png

Redis Sentinel故障转移步骤:

1.当某个master发生故障,多个sentinel会监控到这个异常,这些sentinel会按照一定规则从多个slave中选中一个做为新的master,并通知别的slave从新的master中同步数据
2.当某个slave转换为新的master,sentinel会记录新的master的地址信息和slave的地址信息,通知Redis cli
3.Redis cli接收到新的master和slave的信息,就会向新的master写入数据,从slave中读取数据
4.等到原来的master重启之后,会变成新的master的slave,并从新的master同步数据

1133627-20181017141230706-1335593867.png

在上面的步骤里,sentinel实现了Redis的故障自动发现,自动转移和自动通知

说明:一套Redis sentinel集合可以通知master-name做为标识同时监控多套主从架构

3.Redis Sentinel安装配置

3.1 环境说明

实验在两台虚拟机上完成,IP地址分别为:192.168.81.100和192.168.81.101

在两台虚拟机上运行4个redis-server,其中

192.168.81.100的6379端口为master节点
192.168.81.100的6380端口为slave节点
192.168.81.101的6379端口和6380端口为slave节点

在192.168.81.101的26379,26380,26381端口开启三个sentinel进行监控

3.2 在192.168.81.100虚拟机上配置主从节点

[root@localhost ~]# cd /etc/                            # 进入/etc目录
[root@localhost ~]# systemctl stop redis                # 关闭系统中运行的redis
[root@localhost etc]# cp redis.conf redis_6379.conf     # 复制redis配置文件,以端口区分,方便后面进行配置
[root@localhost etc]# cp redis.conf redis_6380.conf     # 复制redis配置文件,以端口区分,方便后面进行配置
[root@localhost etc]# vi redis_6379.conf                # 编辑redis-server配置文件,修改下面几行
    bind 0.0.0.0                                        # 修改bing选项,才能从系统外连接redis
    protected-mode yes                                  # 开启保存模式
    port 6379                                           # 指定redis运行的端口
    daemonize yes                                       # 以守护进程启动redis
    pidfile "/var/run/redis_6379.pid"                   # 指定redis运行时pid保存路径
    logfile "/var/log/redis/redis_6379.log"             # 指定redis运行时日志保存路径
    dir /var/lib/redis_6379                             # 指定redis运行时数据文件保存路径
    
[root@localhost etc]# vi redis_6380.conf                # 修改redis-server,修改下面几行
    bind 0.0.0.0
    port 6380                                           # 指定redis运行的端口
    daemonize yes
    pidfile "/var/run/redis_6380.pid"
    logfile "/var/log/redis/redis_6380.log"
    dir /var/lib/redis_6380
    slaveof 192.168.81.100 6379                         # 指定redis-server为192.168.81.100:6379的slave
    
[root@localhost etc]# redis-server /etc/redis_6379.conf     # 指定配置文件运行redis-server
[root@localhost etc]# redis-server /etc/redis_6380.conf     # 指定配置文件运行redis-server
[root@localhost etc]# ps aux | grep redis-server            # 查看redis-server是否运行
root       2548  0.3  1.7 155192 17720 ?        Ssl  23:14   0:00 redis-server 0.0.0.0:6379
root       2562  1.3  1.7 155192 17596 ?        Ssl  23:15   0:00 redis-server 0.0.0.0:6380
root       2567  0.0  0.0 112648   960 pts/3    R+   23:15   0:00 grep --color=auto redis-server
[root@localhost etc]# redis-cli -p 6380 info replication    # 进入6380端口运行redis客户端,并执行'info replication'命令
# Replication
role:slave                              # 角色为slave
master_host:192.168.81.100              # master为192.168.81.100
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:1919
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

3.3 在192.168.81.101虚拟机上配置从节点

[root@mysql ~]# cd /etc/                                # 操作同192.168.81.100相同
[root@mysql ~]# systemctl stop redis
[root@mysql etc]# cp redis.conf redis_6379.conf
[root@mysql etc]# cp redis.conf redis_6380.conf
[root@mysql etc]# vi redis_6379.conf
    bind 0.0.0.0
    protected-mode yes
    port 6379
    daemonize yes
    pidfile "/var/run/redis_6379.pid"
    logfile "/var/log/redis/redis_6379.log"
    dir /var/lib/redis_6379
    slaveof 192.168.81.100 6379                         # 指定redis-server为192.168.81.100:6379的slave
    
[root@mysql etc]# vi redis_6380.conf    
    bind 0.0.0.0
    port
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值