zoukankan      html  css  js  c++  java
  • Redis主从实战

         为了提升redis高可用性,除了备份redis dump数据之外,还需要创建redis主从架构,可以利用从将数据库持久化,(我们所说的数据持久化将是将数据保存到写磁盘上,保证不会因为断电等因素丢失数据)

          Redis需要经常将内存中的数据同步到磁盘来保证持久化,redis支持两种持久化方式:一种是snapshotting(快照)是默认的方式,另一种是Append-only-file(缩写写就是aof的方式)

          Redis主从复制,也就是说当用户在往master端主redis写入 数据的时候,会通过redis sync机制将数据发送到redis slave,slave也会执行相同操作确保数据一致性,且实现redis主从复制非常简单,同时redis slave上还可以开启二级slave,三级slave从库;实现一主多从的架构 ,与mysql主从非常类似;

    [半持久化RDB]

    半持久化RDB模式也是Redis备份默认的方式,是通过快照(snapshotting)完成的,当符合在redis.conf配置中设置的条件时,redis会自动将内存中的数据进行快照并存储在硬盘上,完成数据备份;

      Redis进行RDB快照的条件 由用户在配置文件中自定义,由两个参数构成;时间和改动的键的个数,当在指定的时间内被更改的键的个数大于指定的数值时就会进行快照。在配置文件中预制了三个条件

    save    900  1    #900秒内有至少1个键被更改则进行快照

    save    300   10    #300秒内有至少10个键被更改 则进行快照

    save    60      10000    #60秒内至少10000个键被更改则进行快照

    Ps:默认可以存在多个条件,多个条件之间是或者的关系,也就是说满足其中 一个条件就会进行快照,如果想要禁止自动快照,只需要将save参数删除即可,redis快照默认会被存在 redis数据目录中,默认文件名为dump.rdb,可以通过该配置dir和dbfilename两个参数分指定存储路径和文件名。也可以在redis命令行中执行config get dir查看redis数据保存路径;

    Redis RDB 实现快照的过程:redis使用fork函数复制一份当前进程的副本,这个当前进程也就是父进程,副本也是指子进程,父进程继续接受并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件,当子进程写入完所有数据之后会用该临时文件替换旧的RDB文件,至此一次快照完成

    【半持久化AOF模式】

      如果数据很重要如果无法承受任何损失,可以考虑使用AOF方式进行持久化,默认是没有开启AOF(append noly file)的方式的持久化模式

        在启动时redis会逐个执行AOF文件中的命令来将硬盘中的数据载入到内存中,载入的速度与RDB相比会慢一下,开启AOF持久化后执行一条会更改redis中的数据命令,redis就会将该命令写入硬盘中的AOF文件,AOF文件保存位置和RDB位置相同,都是通过dir参数设置的,默认文件名是appendonly.aof,可以通过appendfilename参数修改名称

      Redis允许同时开启AOF和RDB,既保证了数据安全性又使得备份操作简单,此时重启redis后,redis会使用AOF文件来恢复数据,因为AOF方式的持久化可能丢失的数据更少,在redis.conf中通过appendonly参数开启redis AOF模式

    1 appendonly  yes     #开启AOF持久化功能
    2 appendfilename appendonly.aof     #AOF持久化保存文件名称
    3 auto-aof-rewrite-percentage 100   #当AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据;
    4 auto-aof-rewrite-min-size 64mb    #允许重写的最小AOF文件大小配置写入AOF文件后,要求系统刷新硬盘缓存机制
    5 appendfsync always   #每次执行写入都会执行同步,最安全也最慢;
    6 #appendfsync everysec   #每秒自行同步操作
    7 #appendfsync no    #不主动进行同步操作,而是完全交给操作系统来做,每30秒一次,最快也最不安全

    【部署】

    # wget http://download.redis.io/releases/redis-4.0.5.tar.gz

    # tar zxvf redis-4.0.5.tar.gz -C /usr/src/

    # cd /usr/src/redis-4.0.5/
    # make

    # cd src/
    # make install PREFIX=/usr/local/redis

    # cp redis.conf  /usr/local/redis/

    mkdir /usr/local/redis/etc -p
    mkdir /usr/local/redis/var -p

    cp redis.conf /usr/local/redis/etc

    # export PATH=/usr/local/redis/bin:$PATH
    # nohup /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf &

    # vim /usr/local/redis/etc/redis.conf      #Redis-master的redis.conf配置文件

     1 daemonize yes
     2 pidfile /var/run/redis.pid
     3 port 6379
     4 tcp-backlog 511
     5 timeout 0
     6 tcp-keepalive 0
     7 loglevel notice
     8 logfile /usr/local/redis/var/redis.log
     9 databases 16
    10 save 900 1
    11 save 300 10
    12 save 60 10000
    13 stop-writes-on-bgsave-error yes
    14 rdbcompression yes
    15 rdbchecksum yes
    16 dbfilename redis.rdb
    17 dir /data/redis/
    18 slave-serve-stale-data yes
    19 slave-read-only yes
    20 repl-disable-tcp-nodelay no
    21 slave-priority 100
    22 appendonly no
    23 appendfilename "appendonly.aof"
    24 appendfsync everysec
    25 no-appendfsync-on-rewrite no
    26 auto-aof-rewrite-percentage 100
    27 auto-aof-rewrite-min-size 64mb
    28 lua-time-limit 5000
    29 slowlog-log-slower-than 10000
    30 slowlog-max-len 128
    31 latency-monitor-threshold 0
    32 notify-keyspace-events ""
    33 hash-max-ziplist-entries 512
    34 hash-max-ziplist-value 64
    35 list-max-ziplist-entries 512
    36 list-max-ziplist-value 64
    37 set-max-intset-entries 512
    38 zset-max-ziplist-entries 128
    39 zset-max-ziplist-value 64
    40  hll-sparse-max-bytes 3000
    41 activerehashing yes
    42 client-output-buffer-limit normal 0 0 0
    43 client-output-buffer-limit slave 256mb 64mb 60
    44 client-output-buffer-limit pubsub 32mb 8mb 60
    45 hz 10
    46 aof-rewrite-incremental-fsync yes
    47 bind 0.0.0.0

    redis-slave从配置文件

     1 daemonize yes
     2 pidfile /var/run/redis.pid
     3 port 6379
     4 slaveof 192.168.17.129 6379
     5 tcp-backlog 511
     6 timeout 0
     7 tcp-keepalive 0
     8 loglevel notice
     9 logfile /usr/local/redis/var/redis.log
    10 databases 16
    11 save 900 1
    12 save 300 10
    13 save 60 10000
    14 stop-writes-on-bgsave-error yes
    15 rdbcompression yes
    16 rdbchecksum yes
    17 dbfilename redis.rdb
    18 dir /data/redis/
    19 slave-serve-stale-data yes
    20 slave-read-only yes
    21 repl-disable-tcp-nodelay no
    22 slave-priority 100
    23 appendonly no
    24 appendfilename "appendonly.aof"
    25 appendfsync everysec
    26 no-appendfsync-on-rewrite no
    27 auto-aof-rewrite-percentage 100
    28 auto-aof-rewrite-min-size 64mb
    29 lua-time-limit 5000
    30 slowlog-log-slower-than 10000
    31 slowlog-max-len 128
    32 latency-monitor-threshold 0
    33 notify-keyspace-events ""
    34 hash-max-ziplist-entries 512
    35 hash-max-ziplist-value 64
    36 list-max-ziplist-entries 512
    37 list-max-ziplist-value 64
    38 set-max-intset-entries 512
    39 zset-max-ziplist-entries 128
    40 zset-max-ziplist-value 64
    41 hll-sparse-max-bytes 3000
    42 activerehashing yes
    43 client-output-buffer-limit normal 0 0 0
    44 client-output-buffer-limit slave 256mb 64mb 60
    45 client-output-buffer-limit pubsub 32mb 8mb 60
    46 hz 10
    47 aof-rewrite-incremental-fsync yes

    【问题拓展】

    redis-slave端redis主从无法同步 ,连接被拒绝,这种情况在排除防火墙,selinux之外,那就是redis-master中的配置文件bind参数

    原因:如果redis主服务器绑定了127.0.0.1,那么跨服务器IP的访问就会失败,从服务器用IP和端口访问主的时候,主服务器发现本机6379端口绑在了127.0.0.1上,也就是只能本机才能访问,外部请求会被过滤,这是linux的网络安全策略管理的

    在redis-master端的redis.conf配置文件中

    bind 127.0.0.1

    改成

    bind  0.0.0.0

    可能会有人会想过直接将其注释,这种做法是错误的,注释掉之后,redis-slave端日志仍然报错

    恢复正常之后,将redis启动并进入命令终端验证即可

    【Redis启动脚本】

    vim  /etc/init.d/redis 

    # redis Startup script for Redis Server
    # chkconfig: - 80 12
    # description: Redis is an open source, advanced key-value store.
    # processname: redis-server
    #This is the redis startup script written by Xiaoyu on 05.27, 2018.
    # config: /usr/local/redis/etc/redis.conf
    # pidfile: /var/run/redis.pid
    source /etc/init.d/functions
    BIN="/usr/local/redis/bin"
    CONFIG="/usr/local/redis/etc/redis.conf"
    PIDFILE="/var/run/redis.pid"
    ### Read configuration
    [ -r "$SYSCONFIG" ] && source "$SYSCONFIG"
    RETVAL=0
    prog="redis-server"
    desc="Redis Server"
    start() {
    if [ -e $PIDFILE ];then
    echo "$desc already running...."
    exit 1
    fi
    echo -n $"Starting $desc: "
    daemon $BIN/$prog $CONFIG
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
    return $RETVAL
    }
    stop() {
    echo -n $"Stop $desc: "
    killproc $prog
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog $PIDFILE
    return $RETVAL
    }
    restart() {
    stop
    start
    }
    case "$1" in
    start)
    start
    ;;
    stop)
    stop
    ;;
    restart)
    restart
    ;;
    condrestart)
    [ -e /var/lock/subsys/$prog ] && restart
    RETVAL=$?
    ;;
    status)
    status $prog
    RETVAL=$?
    ;;
    *)
    echo $"Usage: $0 {start|stop|restart|condrestart|status}"
    RETVAL=1
    esac
    exit $RETVAL
  • 相关阅读:
    【cdq分治】【P4390】[BOI2007]Mokia 摩基亚
    【树上莫队】【SP10707】 COT2
    【费用流】【网络流24题】【P1251】 餐巾计划问题
    【费用流】【网络流24题】【P4014】 分配问题
    【MST】P2323 [HNOI2006]公路修建问题
    【组合数学】【P5216】DLS采花
    【线段树】【P4198】 楼房重建
    【整体二分】【P3527】 [POI2011]MET-Meteors
    【线性基/神仙题】P4151 [WC2011]最大XOR和路径
    【枚举&数据结构】【P2484】 [SDOI2011]打地鼠
  • 原文地址:https://www.cnblogs.com/bixiaoyu/p/9094874.html
Copyright © 2011-2022 走看看