Redis-主从复制与Sentinel

主从复制(master/slave)

主机(master)数据更新后根据配置和策略,自动同步到备机(slave)。通过主从复制,能够实现读写分离容灾恢复

实现主从复制非常简单,只需要在从(slave)执行slaveof <masterip> <masterport>命令即可,也可以在配置文件redis.conf中配置启动redis时自动实现主从复制。

特别注意:如果master设置了requirepass,则slave必须设置masterauth,否则会复制失败

################################# REPLICATION #################################

# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# another Redis server. A few things to understand ASAP about Redis replication.
#
# 1) Redis replication is asynchronous, but you can configure a master to
#    stop accepting writes if it appears to be not connected with at least
#    a given number of slaves.
# 2) Redis slaves are able to perform a partial resynchronization with the
#    master if the replication link is lost for a relatively small amount of
#    time. You may want to configure the replication backlog size (see the next
#    sections of this file) with a sensible value depending on your needs.
# 3) Replication is automatic and does not need user intervention. After a
#    network partition slaves automatically try to reconnect to masters
#    and resynchronize with them.
#
# slaveof <masterip> <masterport>

# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the slave to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the slave request.
#
# masterauth <master-password>
1.单主机上启动3个Redis实例来演示1主2从

step1:从/etc/redis.conf拷贝3份配置文件,并修改配置,分别用于3个实例

[root@VM_0_171_centos ~]# ls -l
总用量 152
-rw-r--r-- 1 root root 46755 4月   4 15:35 redis-6379.conf
-rw-r--r-- 1 root root 46746 4月   4 15:35 redis-6380.conf
-rw-r--r-- 1 root root 46777 4月   4 15:37 redis-6381.conf
[root@VM_0_171_centos ~]#

配置项

port 6380
daemonize yes
pidfile "redis-6380.pid"
logfile "redis-6380.log"
dbfilename "dump-6380.rdb"
slaveof 127.0.0.1 6379

step2:分别启动3个Redis示例,查看进程发现3个进程都已经启动,连接master查看replication信息发现6379为master,6780、6381为slave

[root@VM_0_171_centos ~]# redis-server redis-6379.conf
[root@VM_0_171_centos ~]# redis-server redis-6380.conf
[root@VM_0_171_centos ~]# redis-server redis-6381.conf
[root@VM_0_171_centos ~]# ps -ef | grep redis
root     30870     1  0 22:37 ?        00:00:00 redis-server 127.0.0.1:6379
root     30881     1  0 22:37 ?        00:00:00 redis-server 127.0.0.1:6380
root     30885     1  0 22:37 ?        00:00:00 redis-server 127.0.0.1:6381
root     30890 28045  0 22:37 pts/0    00:00:00 grep --color=auto redis
[root@VM_0_171_centos ~]# redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=29,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=29,lag=1
master_repl_offset:29
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:28
127.0.0.1:6379>

step3:验证,连接6379,保存k0;退出,连接6380,查询k0,得到刚才保存的v0,主从复制成功。

127.0.0.1:6379> keys *
1) "k1"
2) "k2"
3) "k5"
4) "k4"
5) "k3"
6) "k6"
127.0.0.1:6379> set k0 v0
OK
127.0.0.1:6379> exit
[root@VM_0_171_centos ~]# redis-cli -p 6380
127.0.0.1:6380> keys *
1) "k0"
2) "k6"
3) "k5"
4) "k2"
5) "k4"
6) "k3"
7) "k1"
127.0.0.1:6380> get k0
"v0"
127.0.0.1:6380>
2.sentinel哨兵模式

sentinel能够后台监控主机是否故障,如果故障了根据投票自动将slave转换为master,master恢复后会自动变成slave。

监控同一master的sentinel自动集群,协同工作。

示例
step1:复制/etc/redis-sentinel.conf,修改配置

#以守护进程启动
daemonize yes
#sentinel默认端口
port 26379
#工作目录
dir "/tmp"
#监控的master,最后的1表示1个sentinel认为master短线就干预,进行主从切换
sentinel monitor mymaster 127.0.0.1 6379 1
#master30000毫秒无响应,sentinel就认为它已经断线
sentinel down-after-milliseconds mymaster 30000
#在执行故障转移时, 最多可以有多少个slave同时对新的master进行同步, 这个数字越小, 完成故障转移所需的时间就越长,但越大就意味着越多的slave因为复制而不可用。可以通过将这个值设为 1 来保证每次只有一个slave处于不能处理命令请求的状态。
sentinel parallel-syncs mymaster 1
#故障转移的毫秒数
sentinel failover-timeout mymaster 180000
#日志文件
logfile /var/log/redis/sentinel.log

step2:后台启动sentinel(daemonize yes)

[root@VM_0_171_centos ~]# redis-sentinel redis-sentinel.conf
[root@VM_0_171_centos ~]# ps -ef | grep redis
root      2169     1  0 23:33 ?        00:00:00 redis-sentinel *:26379 [sentinel]
root      2180 28045  0 23:33 pts/0    00:00:00 grep --color=auto redis
root     31340     1  0 22:43 ?        00:00:01 redis-server 127.0.0.1:6379
root     31344     1  0 22:43 ?        00:00:01 redis-server 127.0.0.1:6380
root     31349     1  0 22:43 ?        00:00:01 redis-server 127.0.0.1:6381
[root@VM_0_171_centos ~]#

step3:停止mster,查看sentinel.log发现6380成了新的master,连接6380查看replication信息进行验证

[root@VM_0_171_centos ~]# redis-cli -p 6379
127.0.0.1:6379> shutdown
not connected> exit
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 3.2.3 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 2169
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

2169:X 04 Apr 23:33:26.845 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
2169:X 04 Apr 23:33:26.845 # Sentinel ID is 5a7283b3989cece81dea1e770e1e83b3ee174004
2169:X 04 Apr 23:33:26.845 # +monitor master mymaster 127.0.0.1 6381 quorum 1
2169:X 04 Apr 23:34:16.908 # +sdown master mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:16.908 # +odown master mymaster 127.0.0.1 6381 #quorum 1/1
2169:X 04 Apr 23:34:16.908 # +new-epoch 4
2169:X 04 Apr 23:34:16.908 # +try-failover master mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:16.920 # +vote-for-leader 5a7283b3989cece81dea1e770e1e83b3ee174004 4
2169:X 04 Apr 23:34:16.920 # +elected-leader master mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:16.920 # +failover-state-select-slave master mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:17.020 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:17.020 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:17.091 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:18.048 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:18.048 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:18.117 * +slave-reconf-sent slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:19.093 * +slave-reconf-inprog slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:19.094 * +slave-reconf-done slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:19.176 # +failover-end master mymaster 127.0.0.1 6381
2169:X 04 Apr 23:34:19.176 # +switch-master mymaster 127.0.0.1 6381 127.0.0.1 6380
2169:X 04 Apr 23:34:19.176 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
2169:X 04 Apr 23:34:19.176 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
2169:X 04 Apr 23:35:30.920 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
[root@VM_0_171_centos ~]#
[root@VM_0_171_centos ~]# redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=37410,lag=0
master_repl_offset:37410
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:7475
repl_backlog_histlen:29936
127.0.0.1:6380>

step4:恢复6379端口的redis实例,发现它成了slave

[root@VM_0_171_centos ~]# redis-server redis-6379.conf
[root@VM_0_171_centos ~]# redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:45049
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
127.0.0.1:6379>
3.特别说明
1.如果master设置了requirepass,则slave需要设置masterauth

2.slave默认是read only模式,不能写入数据

3.master宕机后,slave正常工作,master恢复后会自动与salve连接

4.slave宕机后,master及其它slave(如果slave>1)继续工作,slave恢复后需要手动通过slaveof <masterip> <masterport>连接(或者在redis.conf中配置了slave of)

5.slaveof no one可以将slave变成master供其它slave连接
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345