Redis主从复制和sentinel
之前研究了下redis集群,因为其集群需要只是建3个主节点、3个从节点,而且数据存储是以分片的方式的。但是当前项目使用场景是只需要一主一从节点,并从能failover实现高可用。看了下,Redis的主从复制功能可以实现读写分离,并通过Redis的Sentinel可以实现主从切换:当主服务器挂掉之后,自动将其中一个从服务器升级为主服务器。然后跟着官网尝试搭建,这里记录一下。
以下摘录中文网上,mark一下
Redis复制很简单易用,它通过配置允许slave Redis Servers或者Master Servers的复制品。接下来有几个关于redis复制的非常重要特性:
- 一个Master可以有多个Slaves。
- Slaves能过接口其他slave的链接,除了可以接受同一个master下面slaves的链接以外,还可以接受同一个结构图中的其他slaves的链接。
- redis复制是在master段是非阻塞的,这就意味着master在同一个或多个slave端执行同步的时候还可以接受查询。
- 复制在slave端也是非阻塞的,假设你在redis.conf中配置redis这个功能,当slave在执行的新的同步时,它仍可以用旧的数据信息来提供查询,否则,你可以配置当redis slaves去master失去联系是,slave会给发送一个客户端错误。
- 为了有多个slaves可以做只读查询,复制可以重复2次,甚至多次,具有可扩展性(例如:slaves对话与重复的排序操作,有多份数据冗余就相对简单了)。
- 通过复制可以避免master全量写硬盘的消耗:只要配置 master 的配置文件redis.conf来“避免保存”(注释掉所有”save”命令),然后连接一个用来持久化数据的slave即可。但是这样要确保masters 不会自动重启。
主节点:172.16.0.196 6379
从节点:172.16.0.196 6380
当前目录
/usr/local/redis-3.0.7/master_slaver
创建主从两个目录,并将redis.conf分别拷贝到目录
mkdir master
mkdir slaver
cp ../redis.conf ./master
cp ../redis.conf ./master
daemonize yes
logfile "master.log"
dir ./master
port 6380
slaveof 172.16.0.196 6379
logfile "slaver.log"
dir ./slaver
../src/redis-server ./master/redis.conf
../src/redis-server ./slaver/redis.conf
ps -ef | grep redis
# root 15776 1 0 11:29 ? 00:00:00 ../src/redis-server 172.16.0.196:6379
# root 15778 1 0 11:29 ? 00:00:00 ../src/redis-server 172.16.0.196:6380
../src/redis-cli -p 6379
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.16.0.196,port=6380,state=online,offset=4187,lag=1
master_repl_offset:4187
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:4186
以下摘录中文网上,mark一下
Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
- 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
- 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。
虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器, 你可以在启动一个普通 Redis 服务器时通过给定 –sentinel 选项来启动 Redis Sentinel 。
cp ../sentinel.conf ./
# 哨兵监控这个master,在至少quorum个哨兵实例都认为master down后把master标记为odown
# (objective down客观down;相对应的存在sdown,subjective down,主观down)状态。
# slaves是自动发现,所以你没必要明确指定slaves。
sentinel monitor mymaster 127.0.0.1 6379 2
# master或slave多长时间(默认30秒)不能使用后标记为Objectively Down状态。
sentinel down-after-milliseconds mymaster 60000
# 若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。
sentinel failover-timeout mymaster 180000
# 指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长
sentinel parallel-syncs mymaster 1
../src/redis-sentinel sentinel.conf &
./src/redis-cli -p 26379
127.0.0.1:26379> SENTINEL masters
1) 1) "name"
2) "mymaster"
3) "ip"
4) "127.0.0.1"
5) "port"
6) "6379"
7) "runid"
8) "6f6e0c2a5391d2b561e4620bb74662077778a63d"
9) "flags"
10) "master"
11) "pending-commands"
12) "0"
13) "last-ping-sent"
14) "0"
15) "last-ok-ping-reply"
16) "642"
17) "last-ping-reply"
18) "642"
19) "down-after-milliseconds"
20) "30000"
...
ps -ef | grep redis
root 16435 1 0 15:20 ? 00:00:00 ../src/redis-server *:6379
root 16439 1 0 15:20 ? 00:00:00 ../src/redis-server *:6380
root 16443 1 0 15:20 ? 00:00:00 ../src/redis-sentinel *:26379 [sentinel]
root 16450 15305 0 15:20 pts/0 00:00:00 grep redis
kill -9 16435
ps -ef | grep redis
root 16439 1 0 15:20 ? 00:00:00 ../src/redis-server *:6380
root 16443 1 0 15:20 ? 00:00:00 ../src/redis-sentinel *:26379 [sentinel]
root 16456 15305 0 15:23 pts/0 00:00:00 grep redis
./src/redis-cli -p 26379
127.0.0.1:26379> SENTINEL masters
1) 1) "name"
2) "mymaster"
3) "ip"
4) "172.16.0.196"
5) "port"
6) "6380"
7) "runid"
8) "9a550c707548331a0f773c1fad9159872cd1957b"
9) "flags"
10) "master"
11) "pending-commands"
12) "0"
13) "last-ping-sent"
14) "0"
15) "last-ok-ping-reply"
16) "652"
17) "last-ping-reply"
18) "652"
19) "down-after-milliseconds"
20) "30000"
...