Redis学习笔记五:redis主从复制

      通常使用redis时,如果redis存储的是一些非常重要的数据,那么只配置一台服务器的redis是有风险的,以为如果主服务器宕机,影响到正常业务之外,最终要的是数据的丢失,因此我们常常会配置多台redis做集群,除了防止主机宕机,我们还可以实现读写分离,任务分离等。

      为了使redis其高可用,redis在2.4版本后加入了sentinel功能,主要功能是在主机宕机时自动选举出一个slave,并且将其转换为master,保证业务的正常运行。这篇文章我们就模拟配置redis的集群和sentinel监控功能


一、 配置redis集群


1、 服务器信息

      系统:centos 6.5 

      服务器: 采用3台服务器,实现一主两从

            主master:192.168.1.11

            从slave1:   192.168.1.12

            从slave1:   192.168.1.13

      确保三台机器安装了相同版本的redis,并且关闭防火墙和seLinux


2、主从服务器配置参考

编辑redis的配置文件:redis.conf

主服务器Master配置(192.168.1.11) 从服务器Slave配置(192.168.1.12 /192.168.1.13)
1、 关闭rdb快照,rdb备份交由slave进行(只需在一台slave开启rdb即可)

       #save 900 1

       #save 300 10

       #save 60 10000

2、 开启aof日志,因为主服务器的aof日志数据是最新最全的,slave在数据同步时有可能会出现延迟
       appendonly yes
       appendfsync everysec
       no-appendfsync-on-rewrite yes
       auto-aof-rewrite-percentage 100
       auto-aof-rewrite-min-size 64mb
       appendfilename appendonly.aof

3、 配置ip绑定,redis默认只绑定只允许本机的服务访问,在配置集群时,需要绑定本机的局域网ip后slave才可以连接到master服务器

        bind 127.0.0.1 192.168.1.11

1、配置master的IP和端口

格式: slaveof  192.168.1.11 6379

2、 配置密码(如果master有密码)

3、 打开 rdb快照功能(多台slave只需开一台)

       save 900 1
       save 300 10
       save 60 10000
       stop-writes-on-bgsave-error yes
       rdbcompression yes
       rdbchecksum yes
       dbfilename "dump.rdb"
       dir "/root"

4、 通常从服务器不能写,因此需要配置是否只读,配置项:

       slave-read-only yes

5、 优先级配置

       slave-priority 100


3、 配置成功后启动三台服务器的redis,启动顺序最好为先master后slave,启动后,登录到redis命令行,执行info Replication

主服务器Replication信息(192.168.1.11) 从服务器Replication信息(192.168.1.12 / 192.168.1.13)
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.12,port=6379,state=online,offset=2802,lag=0
slave1:ip=192.168.1.13,port=6379,state=online,offset=2802,lag=1

master_repl_offset:2802
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:2801

# Replication
role:slave
master_host:192.168.1.11
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:2480
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


Replication主要需要监控的信息已标红,上面的信息则表示主从启动成功


二、 sentinel监控


如果主服务器master挂了,那么我们需要切换master服务器并且将其他slave指向新的master,具体的操作流程为:选取一台slave, 该服务器是我们即将配置的new master,将其slaveof选项配为no one,并且将slave-read-only配置为no,然后将其它所有的slave指向新的master

1、 手动进行master-slave切换

1)登录192.168.1.11(master)主机的redis,执行shutdown命令关闭redis

2)登录192.168.1.12(new master),执行如下命令:

127.0.0.1:6379> slaveof no one

127.0.0.1:6379> config set slave-read-only no

3)登录192.168.1.13(slave),执行如下命令,:

127.0.0.1:6379> slaveof 192.168.1.12 6379   #若有多台slave,则所有slave都需重新指定master

此时再执行info Replication命令,发现主从一切换完毕

2、 sentinel监控实现自动切换

1、 配置文件位置

sentinel.conf配置文件一般在redis的安装包目录下,将该文件拷贝至拷贝至redis安装目录的根目录下(或/etc下,这个根据个人喜好来定)

2、 sentinel配置说明

[root@master ~]# vi /application/redis/sentinel.conf
port 26379 
# sentinel监听的端口
sentinel monitor mymaster 192.168.1.11 6379 1 
# 主服务器信息
# 注意:末尾的数字n表示当有n个哨兵同事检测到主服务器挂了时,redis才会认为master挂掉并进行从服务器的切换,这里的数字不能大于哨兵的个数,我们只有一个哨兵监控,因此配置1即可,mymaster 可随意起名,但是要与下列的配置保持一致
sentinel down-after-milliseconds mymaster 30000 
# 表示sentinel在多少毫秒后连接不到master认为master断开
sentinel parallel-syncs mymaster 1 
# 表示一次性允许多少slave指向新的new master. 这里默认为1,如果该数值过大会导致新的master服务器IO剧增,保持默认1即可
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh 
# 在重新配置new master,new slave过程,可以触发的脚本,可发邮件或者修改项目中的redis指向等

3、 启动sentinel

/application/redis/bin/redis-server /application/redis/sentinel.conf --sentinel

启动后sentinel会占据终端窗口,若想让sentinel在后台运行,执行下面命令即可:

/application/redis/redis-server /application/redis/sentinel.conf --sentinel 2>&1 >> /tmp/sentinel.log &

状态可检测日志

启动sentinel后,可看到master状态和slave的状态,窗口如下:

[root@master ~]# redis-server /application/redis/sentinel.conf --sentinel
9965:X 20 Jul 10:13:43.110 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 3.2.1 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 9965
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

9965:X 20 Jul 10:13:43.111 # Sentinel ID is 79dfd62f9884969637c28f36ced52c2b9a8ac425
9965:X 20 Jul 10:13:43.111 # +monitor master mymaster 192.168.1.11 6379 quorum 1
9965:X 20 Jul 11:25:37.147 * +slave slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.11 6379
9965:X 20 Jul 11:25:37.158 * +slave slave 192.168.1.11:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379

4、 此时我们登陆master(192.168.1.11)使用shutdown命令关闭master,

127.0.0.1:6379> shutdown
not connected>

查看两个slave的Replication的状态(使用infoReplication命令),结果如下:

192.168.1.12 192.168.1.13

# Replication
role:slave
master_host:192.168.1.11
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:17472
master_link_down_since_seconds:8     # master断开时间
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

# Replication
role:slave
master_host:192.168.1.11
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:17472
master_link_down_since_seconds:8
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机子会显示主机master为192.168.1.11,但是master_link_status状态为down,表示master已下线,此时sentinel会检测到master已经下线,经过我们设定的超时时间后(sentinel down-after-milliseconds mymaster 30000 ),leader就需要开始将选举一个salve提升为master,此slave必须为状态良好(不能处于SDOWN/ODOWN状态)且权重值最低(redis.conf中的slave-priority参数)的,当master身份被确认后,开始failover,具体流程如下:

[root@master ~]# redis-server /application/redis/sentinel.conf --sentinel
9965:X 20 Jul 10:13:43.110 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 3.2.1 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 9965
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

9965:X 20 Jul 10:13:43.111 # Sentinel ID is 79dfd62f9884969637c28f36ced52c2b9a8ac425
9965:X 20 Jul 10:13:43.111 # +monitor master mymaster 192.168.1.11 6379 quorum 1
9965:X 20 Jul 10:17:10.072 # +sdown master mymaster 192.168.1.11 6379
9965:X 20 Jul 10:17:10.072 # +odown master mymaster 192.168.1.11 6379 #quorum 1/1
9965:X 20 Jul 10:17:10.072 # +new-epoch 20
9965:X 20 Jul 10:17:10.072 # +try-failover master mymaster 192.168.1.11 6379
9965:X 20 Jul 10:17:10.093 # +vote-for-leader 79dfd62f9884969637c28f36ced52c2b9a8ac425 20
9965:X 20 Jul 10:17:10.093 # +elected-leader master mymaster 192.168.1.11 6379
9965:X 20 Jul 10:17:10.093 # +failover-state-select-slave master mymaster 192.168.1.11 6379 # Leader开始查找合适的slave
9965:X 20 Jul 10:17:10.194 # +selected-slave slave 192.168.1.13:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379  # 确定合适的slave
9965:X 20 Jul 10:17:10.194 * +failover-state-send-slaveof-noone slave 192.168.1.13:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379  # Leader向slave发送“slaveof no one”指令,此时slave已经完成master的角色转换
9965:X 20 Jul 10:17:10.279 * +failover-state-wait-promotion slave 192.168.1.13:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379   # 等待其他sentinel确认slave
9965:X 20 Jul 10:17:11.103 # +promoted-slave slave 192.168.1.13:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379   # 确认成功
9965:X 20 Jul 10:17:11.103 # +failover-state-reconf-slaves master mymaster 192.168.1.11 6379  # 开始对slaves进行reconfig操作
9965:X 20 Jul 10:17:11.172 * +slave-reconf-sent slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.11 6379 # 向指定的slave发送“slaveof”指令,告知此slave跟随新的master
9965:X 20 Jul 10:17:12.167 * +slave-reconf-inprog slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.11 6379  # 此slave正在执行slaveof + SYNC过程,如过slave收到“+slave-reconf-sent”之后将会执行slaveof操作
9965:X 20 Jul 10:17:12.167 * +slave-reconf-done slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.11 6379  # 此slave同步完成,此后leader可以继续下一个slave的reconfig操作,直至操作完所有slave
9965:X 20 Jul 10:17:12.257 # +failover-end master mymaster 192.168.1.11 6379  # 切换完成
9965:X 20 Jul 10:17:12.257 # +switch-master mymaster 192.168.1.11 6379 192.168.1.13 6379    # 切换master后,所有sentinel开始监控新的master
9965:X 20 Jul 10:17:12.259 * +slave slave 192.168.1.12:6379 192.168.1.12 6379 @ mymaster 192.168.1.13 6379
9965:X 20 Jul 10:17:12.259 * +slave slave 192.168.1.11:6379 192.168.1.11 6379 @ mymaster 192.168.1.13 6379
9965:X 20 Jul 10:17:42.270 # +sdown slave 192.168.1.11:6379 192.168.1.11 6379 @ mymaster 192.168.1.13 6379  # 11号机子下线

再查看两台slave的状态,发现192.168.1.13的role已变为master,并且192.168.1.12这台服务器已经指向了新的master

192.168.1.12 192.168.1.13

# Replication
role:slave
master_host:192.168.1.13
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:8934
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

# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.12,port=6379,state=online,offset=5776,lag=1
master_repl_offset:5917
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:5916


这时如果重新启动192.168.1.11这台原始的master主句

sentinel监控端显示:

10050:X 20 Jul 12:17:50.984 # -sdown slave 192.168.1.11:6379 192.168.1.13 6379 @ mymaster 192.168.1.11 6379
10050:X 20 Jul 12:18:00.904 * +convert-to-slave slave 192.168.1.11:6379 192.168.1.11 6379 @ mymaster 192.168.1.13 6379 # 转换为从服务器

发现sentinel已经将原有的主服务master器转换为了从服务器slave







你可能感兴趣的:(Redis)