zoukankan      html  css  js  c++  java
  • redis主从复制

    转自:http://blog.csdn.net/lijunxian1013/article/details/51994254

    通常使用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,并且 主服务器Master配置(192.168.1.11) 从服务器Slave配置 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

    主服务器 从服务器192.168.1.1 # 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的[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的 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,但是权重值最低redis.conf中的[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 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

  • 相关阅读:
    【学习篇】JavaScript可折叠区域
    hdu 2201 (简单数学概率)
    hdu 2552 (这题很强大)
    hdu 2212 (简单数学)
    hdu 2124 (赤裸裸的贪心)
    hdu 2570 (贪心)
    hdu 2401 (简单数学)
    hdu 2537(水)
    hdu4432
    hdu 1181 (搜索BFS,深搜DFS,并查集)
  • 原文地址:https://www.cnblogs.com/sweet521/p/6085383.html
Copyright © 2011-2022 走看看