redis主从复制(代码片段)

礁之 礁之     2023-01-19     375

关键词:

文章目录

一、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 

配置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...

配置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)登录主服务器的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

redis(主从复制哨兵模式集群)概述及部署(代码片段)

Redis(主从复制、哨兵模式、集群)概述及部署前言一、Redis主从复制1、Redis主从复制的概念2、Redis主从复制的作用3、Redis主从复制的流程4、Redis主从复制的搭建1、环境配置/安装包2、安装Redis(所有主机)3、修改... 查看详情

缓存加速------redis主从复制,哨兵模式,集群(代码片段)

目录前言一.Redis主从复制1.Redis主从复制概述2.Redis主从复制作用3.Redis主从复制流程4.搭建Redis主从复制①环境准备②安装Redis③修改Redis配置文件(Master节点操作)④修改Redis配置文件(Slave节点操作)⑤验证主从效果⑥在Master节点上验... 查看详情

缓存加速------redis主从复制,哨兵模式,集群(代码片段)

目录前言一.Redis主从复制1.Redis主从复制概述2.Redis主从复制作用3.Redis主从复制流程4.搭建Redis主从复制①环境准备②安装Redis③修改Redis配置文件(Master节点操作)④修改Redis配置文件(Slave节点操作)⑤验证主从效果⑥在Master节点上验... 查看详情

redis主从复制-哨兵-集群相关部署(代码片段)

Redis主从复制+哨兵+集群一.主从复制-哨兵-集群二.主从复制1.主从复制的作用2.主从复制流程3.部署Redis主从复制三.哨兵模式1.哨兵模式的原理2.哨兵模式的作用3.哨兵结构由两部分组成,哨兵节点和数据节点部署哨兵模式... 查看详情

redis高可用之主从复制哨兵模式集群模式(代码片段)

目录前言一、Redis主从复制1.1Redis主从复制的概念1.2Redis主从复制的作用1.3Redis主从复制的流程1.4Redis主从复制的搭建1.4.1环境准备,在主从服务器上安装Redis服务1.4.2修改Master节点Redis配置文件1.4.3修改Slave节点Redis配置文件验证... 查看详情

redis主从复制哨兵集群模式(代码片段)

Redis主从复制、哨兵、集群模式单节点模式SpringBoot整合@Bean(name="singleClient")publicRedissonClientsingleRedissonClient()tryConfigconfig=newConfig();config.useSingleServer().setAddress("redis://& 查看详情

redis的主从复制哨兵模式以及群集模式(相关概念及实验详解)(代码片段)

目录前言一.Redis主从复制1.Redis主从复制概述2.Redis主从复制作用3.Redis主从复制流程4.搭建Redis主从复制①环境准备②安装Redis③修改Redis配置文件(Master节点操作)④修改Redis配置文件(Slave节点操作)⑤验证主从效果⑥在Master节点上验... 查看详情

redis主从复制和sentinel(代码片段)

主从复制数据副本扩展读性能一个master可以有多个slave一个slave只能有一个master数据流只能从mater流向slaveslaveof命令式复制:redis-8380>slaveof127.0.0.1:6379配置复制:slaveofipport#具体看版本slaveof/replicaofipportslave-read-onlyyes1、主从复制de... 查看详情

redis_11_redis集群实现主从复制应对高并发(代码片段)

文章目录一、前言二、主从复制搭建三、主从复制原理3.1连接阶段3.2数据同步阶段3.3命令传播阶段3.4小结四、主从复制不足五、尾声一、前言Redis搭建的集群有三个作用:1、Redis集群实现主从复制应对高并发2、Redis集群实现Se... 查看详情

redis_08_redis集群实现主从复制应对高并发(代码片段)

文章目录一、前言二、主从复制搭建三、主从复制原理3.1连接阶段3.2数据同步阶段3.3命令传播阶段3.4小结四、主从复制不足五、尾声一、前言Redis搭建的集群有三个作用:1、Redis集群实现主从复制应对高并发2、Redis集群实现Se... 查看详情

redis主从复制过程和实现主从复制(代码片段)

一.redis主从复制同步实现的过程1.从服务发送一个sync同步命令给主服务要求全量同步2.主服务接收到从服务的sync同步命令时,会fork一个子进程后台执行bgsave命令(非阻塞)快照保存,生成RDB文件,并将RDB文件发送给从服务3.从服... 查看详情

redis学习--redis主从复制与redis集群搭建(代码片段)

Redis主从复制主从复制是什么主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主主从复制能干嘛读写分离,性能扩展;容灾快速恢复;怎么玩:主从复制... 查看详情

今天来聊聊redis的主从复制(代码片段)

...配置文件、设计原理、面试真题三个方面来聊一聊Redis的主从复制。在Redis复制的基础上,使用和配置主从复制非常简单,能使得从Redis服务器(下文称replica)能精确的复制主Redis服务器(下文称master)的内... 查看详情

nosql之redis主从复制哨兵和集群介绍及详细搭建步骤(代码片段)

Redis主从复制、哨兵和集群一、主从复制1.1主从复制的概念1.2主从复制的作用1.3主从复制的流程1.4部署Redis主从复制步骤1.5部署Redis主从复制的具体操作步骤(实操)二、哨兵模式2.1哨兵模式的原理2.2哨兵模式的作用2.3哨... 查看详情

redis主从哨兵集群(代码片段)

文章目录Redis主从复制哨兵模式分片集群Redis主从复制概念主从复制,是指将一台Redis服务器的数据,复制到其他Redis服务器。前者称为主节点(master/leader),后者称为从结点(slave/follower);数据的... 查看详情

深入学习redis:主从复制(代码片段)

...is的持久化中曾提到,Redis高可用的方案包括持久化、主从复制(及读写分离)、哨兵和集群。其中持久化侧重解决的是Redis数据的单机备份问题(从内存到硬盘的备份);而主从复制则侧重解决数据的多机... 查看详情

redis主从集群搭建及主从复制原理解析(代码片段)

...b;并解析了他们的应用场景;本篇文章会紧接着写redis主从集群的搭建,并详解其中配置,以及主从复制的原理解析。高可用主从集群在Redis中要达到高可用, 查看详情

高可用集群架构——redis的主从复制与哨兵模式,cluster(代码片段)

...redis的集群模式1、三种模式2、redis集群与哈希槽二、Redis主从复制概述1、Redis主从复制概述2、主从复制流程三、哨兵模式1、简单介绍2、哨兵的工作原理5、哨兵模式下的故障迁移四、Cluster群集redis-Cluster的故障转移:实验部分一、... 查看详情