Redis主从介绍
主从服务就是用户在主服务器写入数据后,从服务器在写一份数据,一般用在如下场景:
1、辅助实现备份
2、高可用(主从复制只是redis高可用的前提)
3、异地容灾
4、分摊负载
redis主从特点介绍:
1、redis使用异步复制,从服务器会以每秒一次的频率向主服务器报告复制流的处理进度
2、一个主服务器可以有多个从服务器,从服务器也可以有自己的从服务器
3、复制功能不会阻塞主服务器,即使一个或多个从服务器正在进行初次同步,主服务器也可以继续处理命令请求
4、复制功能可以用于数据冗余,也可以通过让多个从服务器处理只读命令请求来提升扩展性
5、Redis从节点默认为只读,无须手动配置
注意事项:
看到网上很多人都说使用主从复制后可以关闭主服务器持久化操作,由从服务器执行持久化操作,这个需要分场景;比如
场景一:
一主一从环境下,主节点故障临时切换所有读写操作到从节点,但是主节点从新上线,从节点就会从新复制主节点数据,从而导致数据丢失。
场景二:
Sentinel高可用环境下,主节点故障从新上线后,会被当成从节点,而不是主节点,从而不会丢失数据。
Redis主从复制原理图说明:
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节点
配置注意事项:
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