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

    Redis主从结构

    一主一从结构
    一主一从结构是Redis最简单的渎职结构,用于主节点出现宕机是从节点提供故障转移支持。当应用写命令并发量较高且需要之九华是,可以只从节点开启AOF

    避免了持久化对主节点的性能压力,也保证了数据的安全性

    树状主从结构
    树状结构(级联结构)可以使节点不但复制节点复制,同时还可以从其他的主节点接着复制,当主节点需要挂载多个节点是为了避免对主节点的性能干扰

    主从复制原理

    复制流程

    • 保存主节点信息

    • 主从建立socket连接

    • 发送ping命令

    • 权限验证

    • 同步数据集

    • 命令持续复制

    复制类型

    • 全量复制:用于初次复制的场景,把主节点全部数据一次性发送给从节点,,因为数据量较大,所以会对主节点和网络早成很大的开销

    • 部分复制:用于处理在主从复制中因为一些原因导致的数据中断,主节点会补发丢失的数据给从节点。

    复制偏移量

    参与复制的主节点会把命令的字节长度做累加记录,统计信息在info replication 中的master_repl_offset指标中
    从节点每秒中上报自身的复制偏移量给主节点,因此主节点会保存从节点复制偏移量,记录在自己的统计信息中

    复制挤压缓冲区

    是保存在主节点上的一个固定长度的队列,默认为1MB,当朱姐进行主从复制是,写命令不当会发送到从节点,还会写入复制挤压缓冲区

    本质是一个先进先出的定长队列,可以实现保存最近已复制数据的功能

    主节点运行ID

    每个Redis节点启动后,都会动态分配一个运行id,从节点通过保存主节点的运行id,来判断先谁复制
    Redis重启后运行id会随之改变
    若不希望从节点对主节点进行全量复制,需要保持主节点id不变,重启后可以使用Redis-cli debug reload 命令来进行对配置文件的重新加载,但是此命令会对主节点造成阻塞

    psync命令

    • 命令格式:psync {runid(节点id)} {offset(复制偏移量)}

    全量复制

    • 对于数据量大的主节点,生成的rdb文件超过60G时,注意传输时间超过repl-timeout所配置的值,从节点会放弃接受RDB文件并清理已经下载好的临时文件

    • 如果60秒内缓冲区消耗过大于64MB或者直接超过256MB,主节点会直接关闭复制客户端连接

    部分复制
    当全量复制失败后,从节点会向主节点的复制缓冲区要求补发丢失的命令数据。

    心跳

    主节点在建立复制后,会维护者长连接并彼此发送心跳命令

    可以使用命令 client list 来查看

    主节点连接转态:flags=M
    从节点连接状态:flags=S

    异步复制

    主节点不但负责数据的读写,还负责写命令同步给从节点,也就是主节点处理完并写入命令后,不在搭理从节点复制是否完成

    实验

    21 master.redis.com redis master 6379
    22 slave.redis.com redis slave 6379, slave 6380

    wget http://download.redis.io/releases/redis-4.0.10.tar.gz
    tar xf redis-4.0.10.tar.gz -C /usr/src
    cd /usr/src/redis-4.0.10
    make && make install
    cd utils
    ./install_server.sh
    
    #设置监听地址
    [root@master ~]# sed -i '/^bind 127.0.0.1$/s/127.0.0.1/192.168.200.21/g' /etc/redis/6379.conf 
    #关闭redis的保护模式
    [root@master ~]# sed -i '/protected-mode/s/yes/no/g' /etc/redis/6379.conf 
    #开启Redis的后台守护模式
    [root@master ~]# sed -i '/daemonize/s/no/yes/g' /etc/redis/6379.conf 
    #设置密码123456
    [root@master ~]# sed -i '/requirepass/s/foobared/123456/g' /etc/redis/6379.conf 
    #开启密码
    [root@master ~]# sed -i '/requirepass 123456/s/^#//g' /etc/redis/6379.conf 
    
    [root@master ~]# /etc/init.d/redis_6379 restart
    

    安装并配置slave

    cd utils
    ./install_server.sh
    #第一个6379直接回车
    #第一个设置为6380,之后全都是6380
    [root@slave utils]# ./install_server.sh 
    Welcome to the redis service installer
    This script will help you easily set up a running redis server
    
    Please select the redis port for this instance: [6379] 6380
    Please select the redis config file name [/etc/redis/6380.conf] 
    Selected default - /etc/redis/6380.conf
    Please select the redis log file name [/var/log/redis_6380.log] 
    Selected default - /var/log/redis_6380.log
    Please select the data directory for this instance [/var/lib/redis/6380] 
    Selected default - /var/lib/redis/6380
    Please select the redis executable path [/usr/local/bin/redis-server] 
    Selected config:
    Port           : 6380
    Config file    : /etc/redis/6380.conf
    Log file       : /var/log/redis_6380.log
    Data dir       : /var/lib/redis/6380
    Executable     : /usr/local/bin/redis-server
    Cli Executable : /usr/local/bin/redis-cli
    Is this ok? Then press ENTER to go on or Ctrl-C to abort.
    Copied /tmp/6380.conf => /etc/init.d/redis_6380
    Installing service...
    Successfully added to chkconfig!
    Successfully added to runlevels 345!
    Starting Redis server...
    Installation successful!
    
    
    [root@slave utils]# sed -i '/^bind 127.0.0.1$/s/127.0.0.1/192.168.200.22/g' /etc/redis/6379.conf
    [root@slave utils]# sed -i '/protected-mode/s/yes/no/g' /etc/redis/6379.conf 
    [root@slave utils]# sed -i '/daemonize/s/no/yes/g' /etc/redis/6379.conf 
    [root@slave utils]# sed -i '/requirepass/s/foobared/123456/g' /etc/redis/6379.conf 
    [root@slave utils]# sed -i '/requirepass 123456/s/^#//g' /etc/redis/6379.conf 
    [root@slave utils]#  /etc/init.d/redis_6379 restart
    Stopping ...
    Redis stopped
    Starting Redis server...
    [root@slave utils]# sed -i '/^bind 127.0.0.1$/s/127.0.0.1/192.168.200.22/g' /etc/redis/6380.conf
    [root@slave utils]# sed -i '/protected-mode/s/yes/no/g' /etc/redis/6380.conf 
    [root@slave utils]# sed -i '/daemonize/s/no/yes/g' /etc/redis/6380.conf 
    [root@slave utils]# sed -i '/requirepass/s/foobared/123456/g' /etc/redis/6380.conf 
    [root@slave utils]# sed -i '/requirepass 123456/s/^#//g' /etc/redis/6380.conf 
    [root@slave utils]#  /etc/init.d/redis_6380 restart
    Stopping ...
    Redis stopped
    Starting Redis server...
    
    
    

    修改master配置文件

    [root@master ~]# vim /etc/redis/6379.conf 
     451  min-slaves-to-write 2  #设置slave节点数量
     452  min-slaves-max-lag 10  #超时时间
    [root@slave utils]#  /etc/init.d/redis_6379 restart
    

    修改slave配置文件

    [root@slave utils]# vim /etc/redis/6379.conf 
     282  slaveof 192.168.200.21 6379  #指定master的ip地址以及端口
     289  masterauth 123456  #指定master的连接密码
    [root@slave utils]# vim /etc/redis/6380.conf 
     282  slaveof 192.168.200.21 6379
     289  masterauth 123456
    [root@slave utils]#  /etc/init.d/redis_6379 restart
    [root@slave utils]#  /etc/init.d/redis_6380 restart
    

    测试

    192.168.200.21:6379> info replication
    # Replication
    role:master
    connected_slaves:2
    min_slaves_good_slaves:2
    slave0:ip=192.168.200.22,port=6380,state=online,offset=826,lag=0
    slave1:ip=192.168.200.22,port=6379,state=online,offset=812,lag=0
    master_replid:6b0329415c064d10796db380f492ea61a8eb0065
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:826
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:826
    192.168.200.21:6379> set name whml
    OK
    [root@slave utils]# redis-cli -h 192.168.200.22 -a 123456 -p 6379
    192.168.200.22:6379> key *
    (error) ERR unknown command 'key'
    192.168.200.22:6379> keys *
    1) "name"
    [root@slave utils]# redis-cli -h 192.168.200.22 -a 123456 -p 6380
    192.168.200.22:6380> keys *
    1) "name"
    
  • 相关阅读:
    营山护照办理
    非北京人员 办理护照
    护照填写注意事项
    美国会议签证——我是正当理由去美国,我能支付(或有人为我支付)我在美国期间的所有费用,办完事我肯定回来, 邀请信,行程表这些材料齐全即可
    urllib2使用2
    python 异常
    python urllib和urllib2 区别
    python类继承
    gcc编译4个阶段
    Vim中如何全选并复制?
  • 原文地址:https://www.cnblogs.com/wml3030/p/15515261.html
Copyright © 2011-2022 走看看