• Redis主从复制


    一、Redis主从复制概述

    (1)主从复制概述

    • 为了分担Redis的读写压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构
    • Redis主从复制的同步类型分为全量同步和增量同步

    全量同步

    Redis的全量同步一般发生在Slave服务器初始化阶段,也就是刚加入集群或者是Slave宕机重启后,这个时候Slave需要将Master上所有的数据进行同步,下面是同步的过程:(同步的命令为写命令)

    1. **Slave服务器连接Master服务器,发送SYNC(同步)命令,Slave服务器初次向Master服务器进行同步时,是不会影响Master服务器接收客户端的请求的 **
    2. Master服务器接收到Slave服务器的SYNC命令后,开始执行bgsave命令拍摄数据库快照生成RDB文件并且使用缓冲区记录此后执行的所有命令,也就是说Master会做一个当前数据库的快照,然后会把之后执行的所有命令放到自己的缓存中
    3. Master服务器上bgsave命令执行完成后,会向所有的Slave服务器发送RDB文件,并且在发送期间继续记录被执行的命令至自己的缓存中
    4. Slave服务器在接收到Master服务器的RDB文件后,会丢掉自己的所有数据,然后载入RDB文件,其实这个时候的Slave已经是完成全量备份了,但是因为RDB文件之后还有被执行的命令,所以还需向Master服务器同步之后执行的命令
    5. Master服务器向Slave服务器发送在缓存中的被执行的命令
    6. Slave服务器完成对RDB文件的载入后,会继续接收Master服务器发送过来的缓存区的命令进行同步

    完成了上面的操作就完成了Slave从服务器的初始化操作,从服务器此时就可以接收来自用户的读请求了,之后进行同步Master主服务器的数据都是增量同步

    增量同步

    Redis的增量同步是发生在Slave从服务器初始化阶段完成之后开始正常工作时,Master主服务器发生的写操作会同步到Slave从服务器的过程

    Master主服务器每接收到一个写操作,就会给Slave从服务器发送相同的写操作,然后Slave从服务器进行同步

    (2)Redis主从的同步策略

    • Redis主从最开始连接的时候,Slave从服务器会进行全量同步
    • 在全量同步结束之后,Slave从服务器之后的同步都是增量同步
    • 如果有需要,Slave服务器在任何时候都是可以进行全量同步的
    • Redis的同步策略是:无论如何,Slave服务器首先会先尝试进行增量同步,如果同步失败,则Slave从服务器进行全量同步
    • 建议开启Master主服务器的持久化功能,因为在多台Slave服务器宕机需要重启的情况下,在重启后每台Slave从服务器都会向Master主服务器发送SYNC(同步)的请求,和Master服务器进行全量同步,这样会导致Master主服务器的IO快速增加而导致Master主服务器宕机

    二、配置Redis的主从复制

    (1)实验环境

    系统ip主机名redis版本扮演角色
    Centos7.4192.168.100.202masterredis-5.0.4master主服务器
    Centos7.4192.168.100.203slaveredis-5.0.4slave从服务器

    (2)实验目的

    实现Redis主从复制

    (3)实验步骤

    配置两台服务器的Redis,安装Redis两台服务器相同,主机名不同、ip不同,下面只写master的配置

    [root@Centos7 ~]# hostnamectl set-hostname master
    [root@Centos7 ~]# su
    [root@master ~]# systemctl stop firewalld
    [root@master ~]# setenforce 0
    setenforce: SELinux is disabled
    [root@master ~]# mount /dev/cdrom /mnt/
    mount: /dev/sr0 写保护,将以只读方式挂载
    mount: /dev/sr0 已经挂载或 /mnt 忙
           /dev/sr0 已经挂载到 /mnt 上
    [root@master ~]# ll
    总用量 1928
    -rw-------. 1 root root    1264 112 18:27 anaconda-ks.cfg
    -rw-r--r--  1 root root 1966337 69 01:16 redis-5.0.4.tar.gz
    [root@master ~]# tar xf redis-5.0.4.tar.gz
    [root@master ~]# cd redis-5.0.4
    [root@master redis-5.0.4]# make
    [root@master redis-5.0.4]# mkdir -p /usr/local/redis
    [root@master redis-5.0.4]# cp /root/redis-5.0.4/src/redis-server /usr/local/redis/
    [root@master redis-5.0.4]# cp /root/redis-5.0.4/src/redis-cli /usr/local/redis/
    [root@master redis-5.0.4]# cp /root/redis-5.0.4/redis.conf  /usr/local/redis/ 
    [root@master redis-5.0.4]# vim /usr/local/redis/redis.conf   #修改
    。。。。。。
      68 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      69 bind 192.168.100.202  #修改为本机地址,如果为127.0.0.1就只能本机访问
      70 
    。。。。。。
      87 # are explicitly listed using the "bind" directive.
      88 protected-mode no  #关闭redis的保护模式,如果为yes的话其他客户端就无法连接到此服务器
      89 
    。。。。。。
     135 # Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
     136 daemonize yes  #开启redis的后台守护程序,即在redis开启之后是放在后台运行的
     137 
    。。。。。。
     262 # Note that you must specify a directory here, not a file name.
     263 dir /usr/local/redis/rdb
     264 
    。。。。。。
     506 #
     507 requirepass 123123  #去掉注释,修改redis的密码为123123
     508 
    #保存退出
    [root@slave2 redis-5.0.4]# mkdir /usr/local/redis/rdb
    [root@master redis-5.0.4]# vim /etc/init.d/redis
    #!/bin/sh
    # chkconfig: 2345 80 90
    # description: Start and Stop redis
    #PATH=/usr/local/bin:/sbin:/usr/bin:/bin
    REDISPORT=6379
    EXEC=/usr/local/redis/redis-server
    REDIS_CLI=/usr/local/redis/redis-cli
    PIDFILE=/var/run/redis_6379.pid
    CONF="/usr/local/redis/redis.conf"
    AUTH="123123"
    LISTEN_IP=$(netstat -utpln |grep redis-server |awk '{print $4}'|awk -F':' '{print $1}')
    
    case "$1" in
        start)
            if [ -f $PIDFILE ]
            then
                    echo "$PIDFILE exists, process is already running or crashed"
            else
                    echo "Starting Redis server..."
                    $EXEC $CONF
            fi
            if [ "$?"="0" ]
            then
                  echo "Redis is running..."
            fi
            ;;
        stop)
            if [ ! -f $PIDFILE ]
            then
                    echo "$PIDFILE does not exist, process is not running"
            else
                    PID=$(cat $PIDFILE)
                    echo "Stopping ..."
                    $REDIS_CLI -h $LISTEN_IP -p $REDISPORT -a $AUTH SHUTDOWN
                    while [ -x ${PIDFILE} ]
                   do
                        echo "Waiting for Redis to shutdown ..."
                        sleep 1
                    done
                    echo "Redis stopped"
            fi
            ;;
       restart|force-reload)
            ${0} stop
            ${0} start
            ;;
      *)
        echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
            exit 1
    esac
    [root@master redis-5.0.4]# chkconfig --add redis
    [root@master redis-5.0.4]# chmod 755 /etc/init.d/redis
    [root@master redis-5.0.4]# ln -s /usr/local/redis/* /usr/local/bin/
    [root@master redis-5.0.4]# /etc/init.d/redis start 
    Starting Redis server...
    5233:C 09 Jun 2021 01:25:53.069 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    5233:C 09 Jun 2021 01:25:53.069 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=5233, just started
    5233:C 09 Jun 2021 01:25:53.069 # Configuration loaded
    Redis is running...
    [root@master redis-5.0.4]# netstat -anpt | grep 6379
    tcp        0      0 192.168.100.202:6379    0.0.0.0:*               LISTEN      5234/redis-server 1 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105

    配置master服务器主配置文件

    [root@master redis-5.0.4]# vim /usr/local/redis/redis.conf #修改
    。。。。。。
     456 #
     457  min-replicas-to-write 1 #设置slave服务器的数量,当slave服务器少于这个数量时,Master主服务器会停止接收客户端的一切写请求
     458  min-replicas-max-lag 10 #设置主服务器和从服务器之间同步数据的超时时间,当超过此时间时,master主服务器会停止客户端的一切写操作,单位为秒
     459 #
    。。。。。。
    [root@master redis-5.0.4]# /etc/init.d/redis restart   #重启redis
    Stopping ...
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    Redis stopped
    Starting Redis server...
    5291:C 09 Jun 2021 02:04:39.132 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    5291:C 09 Jun 2021 02:04:39.132 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=5291, just started
    5291:C 09 Jun 2021 02:04:39.132 # Configuration loaded
    Redis is running...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    配置slave服务器主配置文件

    [root@slave redis-5.0.4]# vim /usr/local/redis/redis.conf 
    。。。。。。
     285 #
     286 replicaof 192.168.100.202 6379  #在从服务器上指定主服务器的ip和端口
     287 
    。。。。。。
     292 #
     293 masterauth 123123  #指定主服务器上redis的密码
     294
    。。。。。。
    #保存退出
    [root@slave redis-5.0.4]# /etc/init.d/redis restart  #重启服务
    Stopping ...
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    Redis stopped
    Starting Redis server...
    5304:C 09 Jun 2021 02:11:32.241 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    5304:C 09 Jun 2021 02:11:32.241 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=5304, just started
    5304:C 09 Jun 2021 02:11:32.241 # Configuration loaded
    Redis is running...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    验证主从复制

    ******(1)登录主服务器的redis,创建key
    [root@master ~]# redis-cli -h 192.168.100.202 -a 123123
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    192.168.100.202:6379> keys *
    (empty list or set)
    192.168.100.202:6379> set aaa bbb
    OK
    192.168.100.202:6379> keys *
    1) "aaa"
    192.168.100.202:6379> 
    
    ******(2)切换到从服务器的reids,查看是否同步,并且是否可以写入
    [root@slave redis-5.0.4]# redis-cli -h 192.168.100.203 -a 123123
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    192.168.100.203:6379> keys *
    1) "aaa"
    192.168.100.203:6379> set bbb ccc
    (error) READONLY You can't write against a read only replica.  #发现无法写入数据
    
    
    ————————————————————————————————————————————————————
    使用info命令在主服务器上查看从服务器复制信息
    192.168.100.202:6379> info replication
    # Replication
    role:master
    connected_slaves:1
    min_slaves_good_slaves:1
    slave0:ip=192.168.100.203,port=6379,state=online,offset=712,lag=0  #slave的信息
    master_replid:2550f57c98e18e6cb41d2c9172cc5ee5d2bbebfd
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:712
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:712
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    linux下离线安装telnet
    智慧工地施工如何应用室内定位uwb技术
    32位汇编逆向分析基础
    直面秋招:非科班生背水一战,最终拿下阿里字节等大厂offer
    Scala函数式编程
    vue 第一次复习
    Java线程池ThreadPoolExecutor源码解析
    总结七大排序算法
    测绘人必看:0基础使用土方量算,一看就会!
    HTML网页设计结课作业 web课程设计网页规划与设计 网页设计成品DW静态网页 Web大学生网页成品 web网页设计期末课程大作业
  • 原文地址:https://blog.csdn.net/rzy1248873545/article/details/125599898