Redis主从+sentinel实现主从架构高可用

 每日运维   2018-06-01 18:37   460 人阅读  0 条评论

前言

上一篇文章做了Redis的主从架构实现读写分离,但是并没有高可用,主从复制会有一定的问题,比如,有一主三从,如果主服务器离线,那么所有写操作则无法进行,为了避免这样的情况发生,Redis引入了sentinel(哨兵)机制。

 

思考一个问题:在redis主从复制架构中,如果主服务器宕机那么这个复制集群能否正常提供服务?答案当然是不能。

 

sentinel工作过程

sentinel安装在另外的主机上,sentinel主机既能监控又能提供配置功能,向sentinel指明主redis服务器即可(仅监控主服务器),sentinel可以从主服务中获取主从架构信息,并分辨从节点,sentinel可以监控当前整个主从服务器架构的工作状态,一旦发现master离线的情况,sentinel会从多个从服务器中选择并提升一个从节点成为主节点,当主节点被从节点取代以后,那么IP地址则发生了改变,客户所连接之前的主节点IP则无法连接,此时可以向sentinel发起查询请求,sentinel会告知客户端新的主节点的IP,所以sentinel是redis在主从架构中实现高可用的解决方案,sentinel为了误判和单点故障,sentinel也应该组织为集群,sentinel多个节点同时监控redis主从架构,一旦有一个sentinel节点发现redis的主节点不在线时,sentinel会与其他的sentinel节点协商其他的sentinel节点是否也为同样发现redis的主节点不在线的情况,如果sentinel的多个节点都发现redis的主节点都为离线的情况,那么则判定redis主节点为离线状态,以此方式避免误判,同样也避免了单点故障

 

sentinel作用

Sentinel就是来解决redis复制集群主节点单点问题的,作用如下:

1、监控:sentinel会不断的检查你的主服务器和从服务器是否运行正常

2、当被监控的某个redis服务器出现问题时,sentinel可以通过API向管理员或者其他应用程序发送通知

3、自动故障转移:当一个主服务器不能正常工作时,sentinel会开始一次自动故障转移操作,他会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主机的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。

 

sentinel概述

sentinel也是一个分布式系统,可以在一个架构中运行多个sentinel进程,多个进程之间使用“流言协议”接收redis主节点是否离线,并使用“投票协议”是否实现故障转移,选择哪一个redis的从服务器成为主服务器

 

sentinel架构需要考虑的问题

1、sentinel节点故障

2、sentinel节点无法连接到主节点

 

解决方法:配置sentinel的高可用

 

Redis主从+sentinel架构图

Redis主从+sentinel实现主从架构高可用  第1张

架构说明:

1、如果主节点修复后再上线,就会变成从节点。

2、客户端程序连接时,应该链接sentinel节点

 

sentinel          192.168.10.21

master           192.168.10.27

slave1            192.168.10.29

slave2            192.168.10.22

 

配置注意事项:

1、主服务器和从服务器都不能使用127.0.0.1地址,否则会复制失败。

2、从服务器监听地址需要和主服务器在同一个网段,不要使用0.0.0.0

3、时间同步,只要是集群都需要做这个

4、如果master使用requirepass开启了认证功能,从服务器要使用masteauth <PASSWORD>来连入服务器请求使用此密码进行认证。

 

Redis主从+sentinel部署

一、master节点安装redis

1、源码安装

cd /a01/apps/apps_src/

tar -zxvf redis-4.0.8.tar.gz

cd redis-4.0.8

make

make PREFIX=/a01/apps/redis install

 

2、做好软链接

ln -s /a01/apps/redis/bin/* /usr/bin/

 

3、创建Redis相关目录

mkdir -p /etc/redis

mkdir -p /a01/apps/redis/data

mkdir -p /var/log/redis

mkdir -p /var/run/redis

 

4、创建Redis运行用户

useradd redis

 

5、授权

chown -R redis:redis /a01/apps/redis/

chown -R redis:redis /var/log/redis/

chown -R redis:redis /var/run/redis/

 

6、创建Redis配置文件

cp /a01/apps/apps_src/redis-4.0.8/redis.conf /etc/redis/

 

7、修改Redis配置文件

vim /etc/redis/redis.conf

 

bind 192.168.10.27

daemonize yes

appendonly yes

 

8、启动redis

/a01/apps/redis/bin/redis-server /etc/redis/redis.conf

 

9、检查是否启动成功

ps aux | grep redis

 

二、slave1节点安装redis(主从)

安装过程和master一样,只不过监听地址和配置文件不同

 

1、修改配置文件

vim /etc/redis/redis.conf

 

bind 192.168.10.29

daemonize yes

appendonly yes

slaveof 192.168.10.27 6379

slave-read-only yes

slave-serve-stale-data yes

 

2、启动redis

/a01/apps/redis/bin/redis-server /etc/redis/redis.conf

 

三、slave2节点安装redis(主从)

安装过程和master一样,只不过监听地址和配置文件不同

 

1、修改配置文件

vim /etc/redis/redis.conf

 

bind 192.168.10.22

daemonize yes

appendonly yes

slaveof 192.168.10.27 6379

slave-read-only yes

slave-serve-stale-data yes

 

2、启动redis

/a01/apps/redis/bin/redis-server /etc/redis/redis.conf

 

四、查看一下主从是否配置成功并测试

1、登录master查看

 

redis-cli -h 192.168.10.27

192.168.10.27:6379> info

 

# Replication

role:master

connected_slaves:2

slave0:ip=192.168.10.29,port=6379,state=online,offset=714,lag=0

slave1:ip=192.168.10.22,port=6379,state=online,offset=714,lag=0

 

2、测试主从

master设置一个键值对:

192.168.10.27:6379> set nong kaige

OK

192.168.10.27:6379> get nong

"kaige"

 

slave1查看:

192.168.10.29:6379> get nong

"kaige"

 

slave2查看:

192.168.10.22:6379> get nong

"kaige"

 

五、配置sentinel

1、源码安装

cd /a01/apps/apps_src/

tar -zxvf redis-4.0.8.tar.gz

cd redis-4.0.8

make

make PREFIX=/a01/apps/redis install

 

2、做好软链接

ln -s /a01/apps/redis/bin/* /usr/bin/

 

3、创建Redis相关目录

mkdir -p /etc/redis

mkdir -p /a01/apps/redis/data

mkdir -p /var/log/redis

mkdir -p /var/run/redis

 

4、创建Redis运行用户

useradd redis

 

5、授权

chown -R redis:redis /a01/apps/redis/

chown -R redis:redis /var/log/redis/

chown -R redis:redis /var/run/redis/

 

6、创建sentinel配置文件

cp /a01/apps/apps_src/redis-4.0.8/sentinel.conf /etc/redis/

 

7、修改sentinel配置文件

vim /etc/redis/sentinel.conf

 

bind 0.0.0.0

port 26379

sentinel monitor mymaster 192.168.10.27 6379 1           #设置监控的redis主节点

sentinel down-after-milliseconds mymaster 30000        #如果30秒内检测不到master节点存活,则认为master节点故障从而进行转移操作

sentinel parallel-syncs mymaster 1                               #设置故障转移后,允许多少从服务器连接主节点发起同步请求

sentinel failover-timeout mymaster 60000                    #故障转移超时时间,单位毫秒

 

8、启动sentinel

/a01/apps/redis/bin/redis-sentinel /etc/redis/sentinel.conf

Redis主从+sentinel实现主从架构高可用  第2张

 

六、登录sentinel查看

1、查看sentinel状态

redis-cli -h 192.168.10.21 -p 26379

192.168.10.21:26379> info sentinel

 

# Sentinel

sentinel_masters:1

sentinel_tilt:0

sentinel_running_scripts:0

sentinel_scripts_queue_length:0

sentinel_simulate_failure_flags:0

master0:name=mymaster,status=ok,address=192.168.10.27:6379,slaves=2,sentinels=1

 

2、获取主节点的信息

192.168.10.21:26379> sentinel masters

 

1)  1) "name"

    2) "mymaster"

    3) "ip"

    4) "192.168.10.27"

    5) "port"

    6) "6379"

    7) "runid"

    8) "6ec6d0dea7fcf06256906192c4f495c1e02339ea"

    9) "flags"

   10) "master"

……

 

3、获取mymaster集群的从节点信息

192.168.10.21:26379> sentinel slaves mymaster

 

七、验证sentinel故障转移能否成功

1、非正常关闭redis主节点,模拟主节点故障(当然直接关闭redis服务也可以)

 

ps aux | grep redis

kill -s 9 4474

 

2、登录sentinel查看主节点是否改变(之前是192.168.10.27)

192.168.10.21:26379> info sentinel

 

# Sentinel

sentinel_masters:1

sentinel_tilt:0

sentinel_running_scripts:0

sentinel_scripts_queue_length:0

sentinel_simulate_failure_flags:0

master0:name=mymaster,status=ok,address=192.168.10.22:6379,slaves=2,sentinels=1

 

以上表明,sentinel故障转移成功!!!

 

3、重新启动之前的主节点

/a01/apps/redis/bin/redis-server /etc/redis/redis.conf

 

4、登录现在的主节点,查看重启之前的主节点之后,会不会自动恢复为主节点

redis-cli -h 192.168.10.22

192.168.10.22:6379> info replication

 

# Replication

role:master

connected_slaves:2

slave0:ip=192.168.10.29,port=6379,state=online,offset=90888,lag=1

slave1:ip=192.168.10.27,port=6379,state=online,offset=90888,lag=0

 

以上表明,主的故障离线后,sentinel重新选了其中一个从的成为了新的主节点,在原来的主节点重新上线后,仍然不会恢复为主节点!!!

 

注意

将来客户端应连接sentinel,向sentinel发请求去寻址,并根据sentinel的反馈,进行连接新的redis主节点,这一点需要使用redis专用客户端来实现。redis客户端会根据sentinel返回的新节点IP进行连接


本文地址:https://linux365.cn/30.html
版权声明:本文为原创文章,版权归 每日运维 所有,欢迎分享本文,转载请保留出处!

 发表评论


表情

还没有留言,还不快点抢沙发?