redis主从复制+sentinel集群

Redis主从介绍

主从服务就是用户在主服务器写入数据后,从服务器在写一份数据,一般用在如下场景:
1、辅助实现备份
2、高可用(主从复制只是redis高可用的前提)
3、异地容灾
4、分摊负载

redis主从特点介绍:
1、redis使用异步复制,从服务器会以每秒一次的频率向主服务器报告复制流的处理进度
2、一个主服务器可以有多个从服务器,从服务器也可以有自己的从服务器
3、复制功能不会阻塞主服务器,即使一个或多个从服务器正在进行初次同步,主服务器也可以继续处理命令请求
4、复制功能可以用于数据冗余,也可以通过让多个从服务器处理只读命令请求来提升扩展性
5、Redis从节点默认为只读,无须手动配置

注意事项:

看到网上很多人都说使用主从复制后可以关闭主服务器持久化操作,由从服务器执行持久化操作,这个需要分场景;比如
场景一:
一主一从环境下,主节点故障临时切换所有读写操作到从节点,但是主节点从新上线,从节点就会从新复制主节点数据,从而导致数据丢失。
场景二:
Sentinel高可用环境下,主节点故障从新上线后,会被当成从节点,而不是主节点,从而不会丢失数据。
Redis主从复制原理图说明:
image002

 

 

 

 

 

 

 

 

 

 

 

1、启动一个slave以后,slave会向master发送sync请求,请求同步主库数据
2、Master会启动一个后台的子进程(BGSAVE),将数据快照保持在数据文件(.rdb)中,将数据文件发送给slave
3、Slave接收到主库的数据文件(.rdb)后保存到本地,而后把数据文件重新载入内存中,完成同步。
篇幅有限,更多内容参考:

http://redisdoc.com/topic/replication.html

sentinel介绍:

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

Sentinel就是来解决redis复制集群主节点单点问题的,作用如下:
1、监控:sentinel会不断的检查你的主服务器和从服务器是否运行正常
2、当被监控的某个redis服务器出现问题时,sentinel可以通过API向管理员或者其他应用程序发送通知
3、自动故障转移:当一个主服务器不能正常工作时,sentinel会开始一次自动故障转移操作,他会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主机的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。

sentinel配置文件介绍:

Sentinel需要专用配置文件:/etc/redis-sentinel.conf,主要配置有以下四个
(1)指明监控的主节点(可以监控多个,一组sentinel可以监控多个主节点):
sentinel monitor <master-name> <ip> <redis-port> <quorum>
(2)判断某节点不在线需要的时长,默认单位为毫秒
sentinel down-after-milliseconds <master-name> <milliseconds>
(3)设置故障转移后,允许多少从服务器连接主节点发起同步请求
sentinel parallel-syncs <master-name> <numslaves>
(4)故障转移的超时时间(单位毫秒),如果故障转移在指定时间内无法完成,则认为故障转移失败
sentinel failover-timeout <master-name> <milliseconds>
专用命令:
SENTINEL masters   列出所有监视的主服务器
SENTINEL slaves <master name>  获取指定主服务器的所有从节点
SENTINEL get-master-addr-by-name <master name>  根据master命令来获取地址
SENTINEL reset       清除服务器所有状态
SENTINEL failover <master name>  手动执行故障转移
Redis主从+sentinel架构需要考虑的问题:

1、sentinel节点故障
2、sentinel节点无法连接到主节点
解决方法,配置sentinel高可用

更多内容参考:

http://redisdoc.com/topic/sentinel.html

Redis主从+sentinel配置

实验环境说明:

  主机名 Ip地址 功能介绍
主节点 master 172.16.4.101 Redis主节点,提供读写操作
从节点-01 slave-01 172.16.4.102 Redis从节点,复制主节点数据,提供冗余作用
从节点-02 slave-02 172.16.4.103 Redis从节点,复制主节点数据,提供冗余作用
Sentinel sentinel 172.16.4.104 监控节点,一旦发现主节点宕机,则启动从节点为主节点

系统环境:

1
2
3
4
[root@master ~]# cat /etc/redhat-release
CentOS release 6.6 (Final)
[root@master ~]# uname -rn
master 2.6.32-504.el6.x86_64

软件环境:

1
redis-3.0.2-1.el6.remi.x86_64.rpm

架构图:
架构说明:
1、如果主节点修复在上线,就会变成从节点。
2、客户端程序连接时,应该链接sentinel节点
image003

 

 

 

 

 

 

 

 

 

 

 

 

 

配置注意事项:
1、主服务器和从服务器都不能使用127.0.0.1地址,否则会复制失败。
2、从服务器监听地址需要和主服务器在同一个网段,不要使用0.0.0.0
3、时间同步,只要是集群都需要做这个
4、如果master使用requirepass开启了认证功能,从服务器要使用masteauth <PASSWORD>来连入服务器请求使用此密码进行认证。

Redis安装

master节点:

(1)下载redis到本地,使用yum命令安装

1
[root@master ~]# yum localinstall redis-3.0.0-2.el6.remi.x86_64.rpm

(2)修改配置文件,设置监听的端口和设置后台启动,并且开启aof持久化功能

1
2
3
[root@master ~]# sed -i s'/^daemonize no/daemonize yes/'g /etc/redis.conf
[root@master ~]# sed -i s'/^bind 127.0.0.1/bind 172.16.4.101/'g /etc/redis.conf
[root@master ~]# sed -i s'/^appendonly no/appendonly yes/'g /etc/redis.conf

(3)启动redis,并且检查是否监听了6379端口

1
2
3
[root@master ~]# service redis start
[root@master ~]# netstat -lntp | grep redis
tcp     0     0 172.16.4.101:6379    0.0.0.0:*         LISTEN     39868/redis-server 

slave-01节点:

配置过程和主节点一样,只不过监听的地址不同

1
2
3
4
5
[root@slave-01 ~]# yum -y localinstall redis-3.0.0-2.el6.remi.x86_64.rpm
[root@slave-01 ~]# sed -i s'/^daemonize no/daemonize yes/'g /etc/redis.conf
[root@slave-01 ~]# sed -i s'/^bind 127.0.0.1/bind 172.16.4.102/'g /etc/redis.conf
[root@slave-01 ~]# sed -i s'/^appendonly no/appendonly yes/'g /etc/redis.conf
[root@slave-01 ~]# service redis start

slave-02节点:

配置过程和主节点一样,只不过监听的地址不同

1
2
3
4
5
[root@slave-02 ~]# yum -y localinstall redis-3.0.0-2.el6.remi.x86_64.rpm
[root@slave-02 ~]# sed -i s'/^daemonize no/daemonize yes/'g /etc/redis.conf
[root@slave-02 ~]# sed -i s'/^bind 127.0.0.1/bind 172.16.4.103/'g /etc/redis.conf
[root@slave-02 ~]# sed -i s'/^appendonly no/appendonly yes/'g /etc/redis.conf
[root@slave-02 ~]# service redis start

配置主从

slave-01配置:

redis配置主从的过程非常简单,只需要一行配置指明主服务器地址和端口即可

1
2
[root@slave-01 ~]# vim /etc/redis.conf
slaveof 172.16.4.101 6379

设置完成重启服务

1
[root@slave-01 ~]# service redis restart

slave-02配置:

slave-02配置和slave-01一样,同样是一个配置文件指明主节点地址即可,只不过这里使用的是sed命令直接替换配置文件

1
2
[root@slave-02 ~]# sed -i '/# slaveof <masterip> <masterport>/a\slaveof 172.16.4.101 6379' /etc/redis.conf
[root@slave-02 ~]# service redis restart

查看主从复制状态:

主节点查看复制信息

1
2
3
4
5
6
7
8
9
10
11
12
[root@master ~]# redis-cli -h 172.16.4.101  #登陆redis
172.16.4.101:6379> INFO replication                #查看复制的详细信息
# Replication
role:master          #当前节点角色
connected_slaves:2   #从节点数量
slave0:ip=172.16.4.103,port=6379,state=online,offset=141,lag=1  #显示从节点的复制信息
slave1:ip=172.16.4.102,port=6379,state=online,offset=141,lag=0
master_repl_offset:141
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:140

从节点查看复制信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@slave-01 ~]# redis-cli -h 172.16.4.102
172.16.4.102:6379> INFO replication
# Replication
role:slave                      #当前节点角色
master_host:172.16.4.101        #主节点地址
master_port:6379
master_link_status:up           #复制状态
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:225
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

验证主从复制

主节点设置一个键值对:

1
2
3
4
5
6
172.16.4.101:6379> SET name xmfb
OK
172.16.4.101:6379> KEYS *
1) "name"
172.16.4.101:6379> GET name
"xmfb"

从节点查看已经复制过来了对应的键值对:

1
2
3
4
5
6
7
8
9
10
[root@slave-01 ~]# redis-cli -h 172.16.4.101
172.16.4.101:6379>KEYS *
1) "name"
172.16.4.101:6379>GET name
"xmfb"
[root@slave-02 ~]# redis-cli -h 172.16.4.103
172.16.4.103:6379>KEYS *
1) "name"
172.16.4.103:6379> GET name
"xmfb"

配置sentinel

Sentinel安装和其他节点一样,也只是安装一个redis包,只不过配置文件和启动文件和redis不同罢了

1
[root@master ~]# yum localinstall redis-3.0.0-2.el6.remi.x86_64.rpm

修改sentinel配置文件,指定监控的主redis服务器和其他的一些监控配置

1
2
3
4
5
[root@sentinel ~]# vim /etc/redis-sentinel.conf
sentinel monitor mymaster 172.16.4.101 6379 1       #设置监控的redis主节点
sentinel down-after-milliseconds mymaster 5000      #如果5秒内检测不到mymaster节点存活,则认为主节点故障从而进行转移操作
sentinel parallel-syncs mymaster 1                  #设置故障转移后,允许多少从服务器连接主节点发起同步请求
sentinel failover-timeout mymaster 60000            #故障转移的超时时间(单位毫秒)

设置完成,启动sentinel的专用脚本redis-sentinel,启动之后检查是否监听了26379端口

1
2
3
4
[root@sentinel ~]# /etc/init.d/redis-sentinel start
[root@sentinel ~]# netstat -lntp | grep sentinel
tcp        0      0 0.0.0.0:26379               0.0.0.0:*                   LISTEN      2724/redis-sentinel
tcp        0      0 :::26379                    :::*                        LISTEN      2724/redis-sentinel

连入sentinel监听的26375端口查看sentinel的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@sentinel ~]# redis-cli -h 172.16.4.104 -p 26379
172.16.4.104:26379> INFO
# Server
redis_version:3.0.2
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:6be7fc9e6b88f79
redis_mode:sentinel
os:Linux 2.6.32-504.el6.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.7
process_id:2724
run_id:dc0fadff4036fb0a8a0d9f0ecd728d97c9e8ac38
tcp_port:26379
uptime_in_seconds:58
uptime_in_days:0
hz:11
lru_clock:16361951
config_file:/etc/redis-sentinel.conf
 
# Sentinel
sentinel_masters:1                      #监听主服务器数量
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=172.16.4.101:6379,slaves=2,sentinels=1 #监听主服务器信息

验证sentinel故障转移是否成功

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

1
2
3
4
5
6
[root@master ~]# ps aux | grep redis
redis     39868  0.1  0.7 139344  7492 ?        Ssl  23:00   0:03 /usr/bin/redis-server 172.16.4.101:6379          
root      39954  0.0  0.0 103252   832 pts/1    S+   23:28   0:00 grep redis
[root@master ~]# kill -9 39868
[root@master ~]# ps aux | grep redis
root      39956  0.0  0.0 103252   836 pts/1    S+   23:29   0:00 grep redis

登陆sentinel查看主节点已经变成了从slave-02

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
172.16.4.104:26379> INFO
# Server
redis_version:3.0.2
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:6be7fc9e6b88f79
redis_mode:sentinel
os:Linux 2.6.32-504.el6.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.7
process_id:2724
run_id:dc0fadff4036fb0a8a0d9f0ecd728d97c9e8ac38
tcp_port:26379
uptime_in_seconds:165
uptime_in_days:0
hz:12
lru_clock:16362058
config_file:/etc/redis-sentinel.conf
 
 
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=172.16.4.103:6379,slaves=2,sentinels=1 #集群主节点发生改变

登陆slave-01查看redis主节点已经变成了slave-02

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@slave-01 ~]# redis-cli -h 172.16.4.102
172.16.4.102:6379> INFO replication
# Replication
role:slave
master_host:172.16.4.103
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:4278
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

登陆slave-02查看自己已经变成了主节点,并且有了一个从节点

1
2
3
4
5
6
7
8
9
10
172.16.4.103:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.16.4.102,port=6379,state=online,offset=6405,lag=0
master_repl_offset:6405
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:6404

这个时候redis主从复制+sentinel集群就配置完成了,限于篇幅有限说明可能不是很清楚,有问题可以留言或者直接联系我qq

补充内容

sentinel还可以获取主节点的配置信息

1
172.16.4.104:26379> SENTINEL masters

获取指定主节点的从节点信息

1
172.16.4.104:26379>SENTINEL slaves mymaster

参考文档:

Redis命令参考手册:http://redisdoc.com/

redis官方站点:http://www.redis.io/

FROM: http://www.fblinux.com/?p=157




展开阅读全文

没有更多推荐了,返回首页