Redis主从复制(小白的“升级打怪”成长之路)

十年老架构带你深入学习Redis(3):主从复制 在使用读写分离之前,可以考虑其他方法增加Redis的读负载能力:如尽量优化主节点(减少慢查询、减少持久化等其他情况带来的阻塞等)提高负载能力;使用Redis集群同时提高读负载能力和写负载能力等。如果使用读写分离,可以使用哨兵,使主从节点的故障切换尽可能自动化,并减少对应用程序的侵入。下面回顾一下本文的主要内容:1、主从复制的作用:宏观的了解主从复制是为了解决什么样的问题,即数据冗余、故障恢复、读负载均衡等。2、主从复制的操作:即slaveof命令。 阅读详情

目录

一、环境概述

二、Redis主从结构

2.1、一主一从结构

2.2、一主多从结构

2.3、树状主从结构

三、主从复制原理

3.1、复制流程

3.2、复制类型

3.2.1、全量复制

3.2.2、部分复制

3.3、心跳(heart beat)

3.4、异步复制

四、主从配置管理

4.1、建立复制

4.2、断开复制

4.3、安全性

4.4、只读(默认)

4.5、传输延迟

五、部署Redis主从复制

5.1、案例环境

5.2、案例步骤推荐

5.3、案例实施

1、编译安装

2、yum安装


一、环境概述

在分布式集群系统中为了解决服务单点故障问题,通常会把数据复制出多个副本部署到不同的机器中,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提供了复制功能,实现了相同数据的多个Redis副本。复制功能是高可用Redis的基础,Redis的哨兵和集群(Cluster)模式都是在主从复制模式的基础上实现的。复制也是Redis日常运维的常见维护点。因此深刻理解复制的工作原理与使用技巧对日常的运维非常有帮助。

二、Redis主从结构

2.1、一主一从结构

一主一从结构是Redis最简单的复制拓扑结构,用于主节点出现宕机时从节点来提供故障转移支持。当应用写命令并发量较高且需要持久化时,可以只在从节点上开启AOF,这样既保证数据安全性同时,也避免了持久化对主节点的性能压力。

2.2、一主多从结构

一主多从结构(又称为星型拓扑结构)使得应用端可以利用多个从节点实现读写分离方案。对于读占比较大的场景,可以把读命令发送到多个从节点来分担主节点压力。同时在日常开发中如果需要执行一些比较耗时的读命令,可以在其中一台从节点上执行,防止慢查询对主节点造成阻塞从而影响线上服务的稳定性。对于写并发量较高的场景,多个从节点会导致主节点写命令的多次发送从而过度消耗网络带宽,同时也加重了主节点的负载影响服务稳定性。

2.3、树状主从结构

树状结构(级联结构)使得从节点不但可以复制主节点数据,同时可以作为其他从节点的主节点继续向下层复制。通过引入中间复制层,可以有效降低主节点负载和需要传送给从节点的数据量。当主节点需要挂载多个从节点时为了避免对主节点的性能干扰,可以采用树状主从结构降低主节点压力。

三、主从复制原理

3.1、复制流程

在从节点执行slaveof命令后,复制过程便开始运作,大致分为6个过程:

  1. 保存主节点信息

执行slaveof命令后从节点只保存主节点的地址信息便直接返回,这时建立复制流程还没有开始,在从节点执行info replication命令可以看到主节点的相关信息,并在日志中记录复制启动信息。

  1. 主从建立socket连接

从节点内部通过每秒运行的定时任务维护复制相关逻辑,当定时任务发现存在新的主节点后,会尝试与该节点建立网络连接。

从节点会建立一个socket套接字连接,专门用于接收主节点发送的复制命令。如果从节点无法建立连接,定时任务会无限重试,直到连接成功或者执行slaveof no one命令取消复制。

  1. 发送ping命令

连接建立成功后,从节点发送ping请求进行首次通信,目的在于:

  • 检测主从之间网络套接字是否可用。

  • 检测主节点当前是否可接受处理命令。

如果发送ping命令后,从节点没有收到主节点回复pong或者超时未回复,从节点会断开复制连接,等待下次定时任务发起重连。

  1. 权限验证

如果主节点设置了requirepass参数,则需要密码验证,从节点必须配置masterauth参数保证与主节点相同的密码才能通过验证。如果验证失败复制将终止,从节点重新发起复制流程。

  1. 同步数据集

主从复制连接正常通信后,对于首次建立复制的场景,主节点会把所有的数据全部发送给从节点,这部分操作是耗时最长的步骤。在同步过程中会分为两种情况:全量同步和部分同步。

  1. 命令持续复制

当主节点把当前的数据同步给从节点后,便完成了复制建立的流程。接下来主节点会持续地把写命令发送给从节点,保证数据的一致性。

3.2、复制类型

Redis在2.8及以上版本使用psync命令完成主从数据同步,过程分为:全量复制和部分复制。

  • 全量复制:一般用于初次复制的场景,Redis早期支持的复制功能只有全量复制,他会把主节点全部数据一次性发送给从节点,当数据量较大时,会对主从节点和网络造成很大的开销。

  • 部分复制:用于处理在主从复制中因网络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主节点会补发丢失数据给从节点。而补发的数据量远远小于全量数据,可以有效避免全量复制的过高开销。

部分复制是对老版复制的重大优化,有效避免了不必要的全量复制操作。因此当使用复制功能时,尽量采用2.8以上版本的Redis。

psync命令运行时需要以下组件的支持:

  1. 复制偏移量

参与复制的主从节点都会维护自身复制偏移量。主节点在处理完写入命令后,会把命令的字节长度做累加记录,统计信息在info replication中的master_repl_offset指标中。

从节点每秒钟上报自身的复制偏移量给主节点,因此主节点也会保存从节点复制偏移量。并且从节点在收到主节点发送的命令后,也会累加记录自身的偏移量,记录在自己的统计信息中。

  1. 复制积压缓冲区

复制积压缓冲区是保存在主节点上的一个固定长度的队列,默认大小为1MB,当主节点进行主从复制时,写命令不但会发送给从节点,还会写入复制积压缓冲区中。

缓冲区本质上是一个先进先出的定长队列,可以实现保存最近已复制数据的功能,用于部分复制和复制命令丢失的数据补救。统计信息记录与info replication中

  • repl_backlog_active:1 //开启复制缓冲区

  • repl_backlog_size:1048576 //缓冲区最大大小

  • repl_backlog_first_byte_offset:7479 //起始偏移量

  • repl_backlog_histlen:1048576 //已保存数据的有效长度

  1. 主节点运行ID

每个Redis节点启动后,都会动态分配一个运行ID,用来唯一识别一个Redis节点。从节点通过保存主节点的运行ID,来判断自己正在向谁进行复制,当主的运行ID改变后,从节点将进行全量复制。

注意:Redis重启时,运行ID会随之改变

若不希望从节点对主节点进行全量复制,则需要保持主节点ID不变,而当修改配置文件需要重启操作时,可以对主节点使用redis-cli debug reload命令来进行对配置文件的重新加载,而不用关闭Redis。但是,debug reload命令会阻塞Redis主进程,阻塞期间会生成本地RDB快照并清空数据之后再加载RDB文件。因此对于无法容忍阻塞的场景,谨慎使用。

  1. psync命令

命令格式:psync { runID } { offset }

runID:主节点的运行id。

offset:当前从节点已复制的数据偏移量。

流程说明:

  1. 从节点发送psync命令给主节点,如果没有runID,默认值为?,如果是第一次复制,则offset默认值为-1.

  2. 主节点根据psync参数和自身数据情况决定响应结果。

  • 如果回复+FULLRESYNC {runID} {offset},从节点开始全量复制。

  • 如果回复+CONTINUE,从节点开始部分复制。

  • 如果回复+ERR,说明主节点版本低于2.8,不支持psync,从节点会发送sync命令进行全量复制。

3.2.1、全量复制

全量复制流程说明:

  1. 从节点发送psync命令给主节点,psync ? -1

  2. 主节点根据命令解析出当前进行全量复制,回复+FULLRESYNC相应。

  3. 从节点接收主节点的相应数据保存运行ID和偏移量offset。

  4. 主节点执行bgsave保存RDB文件(持久化)到本地。

  5. 主节点发送RDB文件给从节点,从节点把接收的RDB文件保存在本地并直接作为从节点的数据文件。

注意:对于数据量较大的主节点,生成的RDB文件超过6GB以上时要格外小心。如果传输时间超过repl-timeout所配置的值(默认60秒),从节点将放弃接受RDB文件并清理已经下载的临时文件,导致全量复制失败。

  1. 从节点开始接收RDB文件到完成期间,主节点仍然响应读写命令,所以在RDB文件传输期间,主节点会将修改操作保存在缓冲区中。当从节点加载完RDB文件后,主节点再把缓冲区中的数据发送给从节点,保证数据一致。

注意:高流量写入场景可能会导致主节点复制客户端缓冲区溢出,默认配置为client-output-buffer-limit slave 256MB 64MB 60,如果60秒内缓冲区消耗持续大于64MB或者直接超过256MB时,主节点将直接关闭复制客户端连接,造成复制失败。

对于主节点,当发送完所有的数据后就认为全量复制完成,但是对于从节点全量复制还有后续步骤要处理。

  1. 从节点接收完主节点传送来的全部数据后,会清空自身旧数据。

  2. 加载RDB文件。

  3. 加载完毕后,如果当前节点开启了AOF持久化功能,会立刻进行bgrewriteaof操作,为了保证全量复制后AOF持久化文件可立刻可用。

3.2.2、部分复制

当主从复制过程中,如果出现网络闪断或者命令丢失等异常情况时,从节点会向主节点要求补发丢失的命令数据,如果主节点的复制积压缓冲区内存在这部分数据则会直接发给从节点。在减少开销的同时,保证了数据的一致性。流程如下:

部分复制流程说明:

  1. 当主从网络断开,超过repl-timeout设置的时间,主会认为从故障而中断数据连接。

  2. 连接中断期间,主节点依然会响应客户端命令,但无法发送给从节点,不过主节点内部存在复制加压缓冲区,所以可以保存最近一段时间的写命令数据,默认最大1MB。

  3. 当网络恢复,从节点会重新连接到主节点。

  4. 连接恢复后,从节点会将之前保存的自己已复制的偏移量和运行ID用psync命令发送给主节点,要求进行部分复制操作。

  5. 主节点接到psync命令后,核对信息。之后根据offset在自身复制积压缓冲区查找,如果偏移量之后的数据存在缓冲区中,则对从节点发送+CONTINUE响应,表示可以进行部分复制。

  6. 主节点根据偏移量把复制积压缓冲区里的数据发给从节点,保证主从复制进入正常状态。

3.3、心跳(heart beat)

主从节点在建立复制后,他们之间维护着长连接并彼此发送心跳命令。

心跳的关键机制如下:

1、主从都有心跳检测机制,各自模拟成对方的客户端进行通信,通过 client list 命令查看复制相关客户端信息,主节点的连接状态为 flags = M,从节点的连接状态是 flags = S。

2、主节点默认每隔 10 秒对从节点发送 ping 命令,可修改配置repl-ping-slave-period 控制发送频率。

3、从节点在主线程每隔一秒发送 replconf ack{offset}命令,给主节点上报自身当前的复制偏移量。

4、主节点收到 replconf 信息后,判断从节点超时时间,如果超过repl-timeout 60 秒,则判断节点下线。

注意:为了降低主从延迟,一般把 redis主从节点部署在相同的机房/同城机房,避免网络延迟带来的网络分区造成的心跳中断等情况。

3.4、异步复制

主节点不但负责数据读写,还负责把写命令同步给从节点,写命令的发送过程是异步完成,也就是说主节点处理完写命令后立即返回客户端,并不等待从节点复制完成。异步复制的步骤很简单,如下:

1、主节点接受处理命令

2、主节点处理完后返回响应结果

3、对于修改命令,异步发送给从节点,从节点在主线程中执行复制的命令。

四、主从配置管理

4.1、建立复制

主从复制配置方式有三种:

  • 在配置文件中加入slaveof {masterHost} {masterPort}随Redis启动生效("CONFIG SET masterauth "you_master_password"手动密码验证)

  • 在redis-server启动命令后加入--slaveof {masterHost} {masterPort}

  • 直接使用命令redis-cli -h IP slaveof {masterHost} {masterPort}生效。

4.2、断开复制

slaveof命令不但可以建立复制,也可以执行slaveof no one来断开与主节点复制关系。

4.3、安全性

主节点通常会设置requirepass参数进行密码验证,这时所有的客户端访问必须使用auth命令实行校验。因此需要在从节点配置masterauth参数与主节点密码保持一致。

4.4、只读(默认)

默认情况下,从节点使用slave-read-only=yes配置为只读模式。由于复制只能从主节点到从节点,对于从节点的任何修改主节点都是无法感知的,修改从节点会造成主从数据不一致。因此建议线上将从节点设置为只读模式。

4.5、传输延迟

主从节点一般在不同机器上,复制时的网络延迟就成为需要考虑的问题,Redis为我们提供了repl-disable-tcp-nodelay参数用于控制是否关闭TCP_NODELAY,默认为no,为开启状态。

设置为no时,表示开启TCP_NODELAY,允许小包发送,使得网络延迟变小,但是会增加网络带宽消耗。

设置为yes时,表示关闭TCP_NODELAY,主节点会将小包合并发送,默认发送时间间隔取决于Linux内核,一般为40ms。节省了带宽,但是增大了延迟。

五、部署Redis主从复制

5.1、案例环境

系统IP地址主机名所需软件Redis角色及端口
CentOS 7.9192.168.200.111master.redis.commaster:6379
CentOS7.9192.168.200.112slave.redis.comslave:6379(6379.conf)slave:6380(6380.conf)

5.2、案例步骤推荐

  • 安装并配置master角色的redis服务;

  • 安装并配置slave角色的redis服务(双实例);

  • 配置master角色的文件;

  • 配置slave角色的文件;

  • 验证主从复制功能;

5.3、案例实施

1、编译安装

安装并配置master角色的redis服务,从主机进行同样的安装配置

root@localhost ~]# hostname master.redis.com
#从主机名不一样
​
root@localhost ~]# bash
​
root@master ~]# iptables -F
​
root@master ~]# systemctl stop firewalld
​
root@master ~]# setenforce 0
​
setenforce: SELinux is disabled

下载redis源码包,解压并进入解压路径,从主机进行同样的安装配置

root@localhost ~]# wget
<http://download.redis.io/releases/redis-4.0.10.tar.gz>
​
root@localhost ~]# tar xf redis-4.0.10.tar.gz -C
/usr/src/
​
root@localhost ~]# cd /usr/src/redis-4.0.10/

执行make编译安装,从主机进行同样的安装配置

之前我们都会执行./configure 进行编译从而生成Makefile,redis的源码包中则直接提供了Makefile文件所以在解压完成之后直接进行make编译即可)

root@localhost redis-4.0.10]# ls | grep --color Makefile
#可以看到解压路径下自带的
​
Makefile
​
root@localhost redis-4.0.10]# make
​
Hint: It's a good idea to run 'make test' ;)
​
make1]: 离开目录"/usr/src/redis-4.0.10/src"
#显示如下信息表示编译安装成功
​
root@localhost redis-4.0.10]# make install

redis其实可以不用执行make install 但是为了后面方便我们执行所以执行make install

在安装过程中,若想更改默认的安装路径,可使用以下命令格式来进行安装操作。

make PREFIX=安装路径 install

生成启动脚本及配置文件信息

make install只是生成了二进制文件到系统中,并没有启动脚本和配置文件,所以此时使用redis默认提供的install_server.sh脚本进行生成启动脚本和配置文件。

root@localhost redis-4.0.10]# cd utils/
#在解压路径下的utils中
​
root@localhost 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]
#设置服务端口号
​
Selecting default: 6379
​
Please select the redis config file name /etc/redis/6379.conf]
#设置主配置文件存放位置
​
Selected default - /etc/redis/6379.conf
​
Please select the redis log file name /var/log/redis_6379.log]
#设置reids日志存放位置
​
Selected default - /var/log/redis_6379.log
​
Please select the data directory for this instance
/var/lib/redis/6379] #设置数据目录
​
Selected default - /var/lib/redis/6379
​
Please select the redis executable path
/usr/local/bin/redis-server] #设置执行命令
​
Selected config:
​
Port : 6379 //服务端口
​
Config file : /etc/redis/6379.conf //配置文件
​
Log file : /var/log/redis_6379.log //日志文件
​
Data dir : /var/lib/redis/6379 //数据目录
​
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/6379.conf => /etc/init.d/redis_6379
​
Installing service...
​
Successfully added to chkconfig!
​
Successfully added to runlevels 345!
​
Starting Redis server...
​
Installation successful! #显示此信息表示配置成功
​
在执行安装脚本后redis服务其实已经启动了
​
root@localhost ~]# netstat -lnpt |grep 6379
​
tcp 0 0 127.0.0.1:6379 0.0.0.0:LISTEN 6956/redis-server
1

我们已经为redis生成了启动脚本及配置文件 所以此时我们已经可以控制redis的启动及停止了。

修改redis配置文件

##设置服务监听IP地址

root@master ~]# sed -i '/^bind
127.0.0.1$/s/127.0.0.1/192.168.200.111/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
​
##设置redis的密码为123456
​
root@master ~]# sed -i '/requirepass/s/foobared/123456/g'
/etc/redis/6379.conf
​
##开启redis的密码
​
root@master ~]# sed -i '/requirepass 123456/s/^#//g'
/etc/redis/6379.conf
​
root@master ~]# service redis_6379 restart
​
Stopping ...
​
Redis stopped
​
Starting Redis server...
​
root@master ~]# netstat -lnpt | grep redis
​
tcp 0 0 192.168.200.111:6379 0.0.0.0:LISTEN
72473/redis-server

安装并配置slave角色的redis服务(双实例);

创建第一个实例:

root@slave redis-4.0.10]# cd utils/
​
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]
​
Selecting default: 6379
​
Please select the redis config file name
/etc/redis/6379.conf]
​
Selected default - /etc/redis/6379.conf
​
Please select the redis log file name
/var/log/redis_6379.log]
​
Selected default - /var/log/redis_6379.log
​
Please select the data directory for this instance
/var/lib/redis/6379]
​
Selected default - /var/lib/redis/6379
​
Please select the redis executable path
/usr/local/bin/redis-server]
​
Selected config:
​
Port : 6379
​
Config file : /etc/redis/6379.conf
​
Log file : /var/log/redis_6379.log
​
Data dir : /var/lib/redis/6379
​
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/6379.conf => /etc/init.d/redis_6379
​
Installing service...
​
Successfully added to chkconfig!
​
Successfully added to runlevels 345!
​
Starting Redis server...
​
Installation successful!

创建第二个实例:

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!

修改redis_6379配置文件

root@slave utils]# sed -i '/^bind
127.0.0.1$/s/127.0.0.1/192.168.200.112/g'
/etc/redis/6379.conf
​
##关闭redis的保护模式
​
root@slave utils]# sed -i '/protected-mode/s/yes/no/g'
/etc/redis/6379.conf
​
##开启redis的后台守护进程模式
​
root@slave utils]# sed -i '/daemonize/s/no/yes/g'
/etc/redis/6379.conf
​
##设置redis的密码为123456
​
root@slave utils]# sed -i '/requirepass/s/foobared/123456/g'
/etc/redis/6379.conf
​
##开启redis的密码
​
root@slave utils]# sed -i '/requirepass 123456/s/^#//g'
/etc/redis/6379.conf
​
root@slave utils]# service redis_6379 restart
​
Stopping ...
​
Redis stopped
​
Starting Redis server...
​
root@slave utils]# netstat -lnpt | grep 6379
​
tcp 0 0 192.168.200.112:6379 0.0.0.0:LISTEN 4970/redis-server
1
​
修改redis_6380配置文件
​
root@slave utils]# sed -i '/^bind
127.0.0.1$/s/127.0.0.1/192.168.200.112/g'
/etc/redis/6380.conf
​
##关闭redis的保护模式
​
root@slave utils]# sed -i '/protected-mode/s/yes/no/g'
/etc/redis/6380.conf
​
##开启redis的后台守护进程模式
​
root@slave utils]# sed -i '/daemonize/s/no/yes/g'
/etc/redis/6380.conf
​
##设置redis的密码为123456
​
root@slave utils]# sed -i '/requirepass/s/foobared/123456/g'
/etc/redis/6380.conf
​
##开启redis的密码
​
root@slave utils]# sed -i '/requirepass 123456/s/^# //g'
/etc/redis/6380.conf
​
root@slave utils]# service redis_6380 restart
​
Stopping ...
​
Redis stopped
​
Starting Redis server...
​
root@slave utils]# netstat -lnpt | grep 6380
​
tcp 0 0 192.168.200.112:6380 0.0.0.0:LISTEN 5151/redis-server
1

验证两个实例运行状态

root@slave utils]# netstat -lnpt | grep redis
​
tcp 0 0 192.168.200.112:6379 0.0.0.0:LISTEN 4970/redis-server
1
​
tcp 0 0 192.168.200.112:6380 0.0.0.0:LISTEN 5151/redis-server
1
​
root@slave utils]# redis-cli -h 192.168.200.112 -a 123456 -p
6379
​
Warning: Using a password with '-a' option on the command line
interface may not be safe.
​
192.168.200.112:6379> ping
​
PONG
​
192.168.200.112:6379> exit
​
root@slave utils]# redis-cli -h 192.168.200.112 -a 123456 -p
6380
​
Warning: Using a password with '-a' option on the command line
interface may not be safe.
​
192.168.200.112:6380> ping
​
PONG
​
192.168.200.112:6380> exit

配置master角色的文件

root@master ~]# vim /etc/redis/6379.conf
​
451 min-slaves-to-write 2
​
##设置slave节点的数量,如果slave节点数量少于此值,那么master节点将停止客户端的一切写请求
​
452 min-slaves-max-lag 10
​
##master与slave之间同步数据的超时时间,若超过此时间,master节点将停止客户端的一切写操作
​
root@master utils]# killall -9 redis-server
​
root@master utils]# rm -rf /var/run/redis_6379.pid
​
root@master utils]# service redis_6379 start
​
Starting Redis server...

配置slave角色的文件

root@slave ~]# vim /etc/redis/6379.conf
​
282 slaveof 192.168.200.111 6379
​
##指定master的ip地址以及端口
​
289 masterauth 123456
​
##指定master的连接密码
​
root@slave ~]# killall -9 redis-server
​
root@slave ~]# rm -rf /var/run/redis_6379.pid
​
root@slave ~]# service redis_6379 start
​
Starting Redis server...
​
root@slave ~]# vim /etc/redis/6380.conf
​
282 slaveof 192.168.200.111 6379
​
##指定master的ip地址以及端口
​
289 masterauth 123456
​
##指定master的连接密码
​
root@slave ~]# rm -rf /var/run/redis_6380.pid
​
root@slave ~]# service redis_6380 start
​
Starting Redis server...

验证主从复制

登录master节点创建键值对

​
root@master ~]# redis-cli -h 192.168.200.111 -a 123456 -p
6379
​
Warning: Using a password with '-a' option on the command line
interface may not be safe.
​
192.168.200.111:6379> set name crushlinux
​
OK
​
192.168.200.111:6379> keys 
​
1) "name"
​
192.168.200.111:6379> get name
​
"crushlinux"
​
192.168.200.111:6379> info replication ##查看复制信息
​
# Replication
​
role:master
​
connected_slaves:2
​
min_slaves_good_slaves:2
​
slave0:ip=192.168.200.112,port=6379,state=online,offset=245,lag=0
​
slave1:ip=192.168.200.112,port=6380,state=online,offset=245,lag=0
​
master_replid:f83f8b0c6e047622f4ee2bbd330710a95c0fac90
​
master_replid2:0000000000000000000000000000000000000000
​
master_repl_offset:245
​
second_repl_offset:-1
​
repl_backlog_active:1
​
repl_backlog_size:1048576
​
repl_backlog_first_byte_offset:1
​
repl_backlog_histlen:245
​
192.168.200.111:6379> exit

登录slave节点验证键值同步情况,并测试无法写入

root@slave ~]# redis-cli -h 192.168.200.112 -p 6379 -a
123456
​
Warning: Using a password with '-a' option on the command line
interface may not be safe.
​
192.168.200.112:6379> keys 
​
1) "name"
​
192.168.200.112:6379> get name
​
"crushlinux"
​
192.168.200.112:6379> set age 18
​
(error) READONLY You can't write against a read only
slave.
​
192.168.200.112:6379> info replication
​
# Replication
​
role:slave
​
master_host:192.168.200.111
​
master_port:6379
​
master_link_status:up
​
master_last_io_seconds_ago:6
​
master_sync_in_progress:0
​
slave_repl_offset:231
​
slave_priority:100
​
slave_read_only:1
​
connected_slaves:0
​
master_replid:db686a58a36053284602ecbf22b72a83c82b193c
​
master_replid2:0000000000000000000000000000000000000000
​
master_repl_offset:231
​
second_repl_offset:-1
​
repl_backlog_active:1
​
repl_backlog_size:1048576
​
repl_backlog_first_byte_offset:1
​
repl_backlog_histlen:231
​
192.168.200.112:6379> exit
​
root@slave ~]# redis-cli -h 192.168.200.112 -p 6380 -a
123456
​
Warning: Using a password with '-a' option on the command line
interface may not be safe.
​
192.168.200.112:6380> keys 
​
1) "name"
​
192.168.200.112:6380> get name
​
"crushlinux"
​
192.168.200.112:6380> set age 18
​
(error) READONLY You can't write against a read only
slave.
​
192.168.200.112:6380> exit

2、yum安装

准备两台OpenEuler主机(ip分别为192.168.58.180、192.168.58.182、192.168.58.183)

配置master服务器

####192.168.58.180
##安装redis-server
[root@localhost ~]# yum install -y redis-server
​
##更改配置文件
[root@localhost ~]# vim /etc/redis.conf 
##找到bind 127.0.0.1 -::1并把它改为:
bind 192.168.58.180 
​
##找到protected-mode no把它改为:
protected-mode no
​
​
[root@nfs-server ~]# systemctl start redis

配置slave服务器

####192.168.58.182
##安装redis-server
[root@localhost ~]# yum install -y redis
​
##更改配置文件
[root@localhost ~]# vim /etc/redis.conf
##找到bind 127.0.0.1 -::1并把它改为:
bind 192.168.58.182
​
##找到protected-mode no把它改为:
protected-mode no
​
##找到# replicaof <masterip> <masterport>把它改为:
replicaof 192.168.58.180 6379
​
​
[root@localhost ~]# systemctl start redis
####192.168.58.183
##安装redis-server
[root@localhost ~]# yum install -y redis
​
##更改配置文件
[root@localhost ~]# vim /etc/redis.conf
##找到bind 127.0.0.1 -::1并把它改为:
bind 192.168.58.183
​
##找到protected-mode no把它改为:
protected-mode no
​
##找到# replicaof <masterip> <masterport>把它改为:
replicaof 192.168.58.180 6379
​
​
[root@localhost ~]# systemctl start redis

在master服务器上设置键值对

####192.168.58.180
[root@localhost ~]# redis-cli -h 192.168.58.180
192.168.58.180:6379> set a 1
OK
192.168.58.180:6379> get a
"1"
192.168.58.180:6379> mset b 2 c 3 d 4
OK
192.168.58.180:6379> get b
"2"
192.168.58.180:6379> get c
"3"
192.168.58.180:6379> get d
"4"
192.168.58.180:6379> keys *
1) "d"
2) "a"
3) "b"
4) "c"

在slave服务器上验证

####192.168.58.182
[root@localhost ~]# redis-cli -h 192.168.58.182
192.168.58.182:6379> get a
"1"
192.168.58.182:6379> keys *
1) "d"
2) "a"
3) "b"
4) "c"
####192.168.58.183
[root@localhost ~]# redis-cli -h 192.168.58.183
192.168.58.183:6379> get a
"1"
192.168.58.183:6379> keys *
1) "d"
2) "a"
3) "b"
4) "c"

这样一主两从的配置就完成了

看到感觉有帮助的朋友,劳烦动动发财的小手给博主点个赞

Redis系列-复制 Redis系列-复制 一.什么是复制? Redis复制是不同Redis实例之间的数据同步,其中我们将被复制的Redis实例称之为主服务器,复制数据的Redis实例称之为从服务器。复制的方式通常为主服务器将数据发送到从服务器,从服务器接收到数据,将数据保存在当前实例中,最终的目标是保证主服务器与从服务器间的数据一致及同步。 二.复制的实现 1.同步 1.1 SYNC 从服务器通过向... 阅读详情

相关推荐

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

ProceduralMan的博客 7410

Redis:主从复制

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。

CRUD工程师 4700

斯坦福HumanPlus机器人核心技术解析:从HST强化学习框架到HIT模仿学习的实现路径

本文深入解析了斯坦福HumanPlus人形机器人的核心技术实现路径。其核心在于HST强化学习框架与HIT模仿学习架构的协同:HST作为“小脑”,通过rsl_rl框架在仿真中训练稳健的低级运动控制;HIT作为“大脑”,基于改进的Transformer架构学习高级任务规划。文章详细拆解了从算法原理、代码实现到硬件部署的全流程,为复现这一前沿机器人系统提供了实战指南。

weixin_29082143的博客 281

redis数据库部署(一)主从复制

目录 一、主从复制基本概念 1、Redis主从复制的概念 2、Redis主从复制的作用 3、Redis主从复制的流程 二、主从复制实际操作 1、Redis主从复制的搭建 2、安装Redis(所有主机) 3、修改Master节点Redis配置文件(192.168.220.100) 4、修改Slave节点Redis配置文件 5、验证主从效果 6、在Master节点上验证从节点 一、主从复制基本概念 1、Redis主从复制的概念 主从复制,是指将一台Redis服务器的数...

wulei_123456789的博客 1785

centos7部署mysql8.0.35,主从复制,主主集群

centos7 linux部署mysql,主从复制,主主模式

zaixiaqin的博客 1989

别让你的URDF模型在Gazebo里‘躺平’:手把手教你配置libgazebo_ros_diff_drive插件让两轮小车动起来

本文详细解析了如何在Gazebo中配置libgazebo_ros_diff_drive插件,使两轮小车模型实现动态仿真。从URDF模型到传动装置,再到差速驱动插件的精细调参,手把手教你解决机器人‘躺平’问题,提升ROS1与Gazebo仿真的实战能力。

weixin_42552716的博客 333

Redis 主从复制

Redis 主从复制与哨兵模式的详细介绍与使用

Mwt258的博客 3269

Android功耗系列专题理论之十一:高通QCOM平台待机功耗问题分析方法

本文详细介绍了高通QCOM平台待机功耗问题的分析方法。首先强调测试环境标准化的重要性,包括关闭无线功能、日志记录和非必要传感器。重点分析了硬件连接检查、驱动配置验证、电源管理策略优化等关键步骤。文章详细讲解了射频校准、时钟源/中断分析、子系统状态检查等专业技术方法,并提供了具体的命令行操作示例。此外还介绍了外设拆解、外灌电压测试等硬件排查手段,以及功耗分解板、波形分析等高级诊断技术。最后强调了固件版本验证和环境因素测试的必要性,为工程师提供了系统性的功耗问题排查思路。

770

Redis Sentinel哨兵集群(小白的“升级打怪”成长之路)

整个过程是完全自动的,不需要人工来介入,所以这套方案很有效的解决了Redis的高可用问题。当Sentinel主观下线的节点是主节点时,该Sentinel节点会通过Sentinel is-master-down-by-addr命令向其他Sentinel节点询问对主节点的判断,当超过半数的Sentinel节点都认为主节点确实有问题,这时该Sentinel节点会做出客观下线的决定,这样客观下线的含义是比较明显了,也就是大部分Sentinel节点都对主节点的下线做了同意的判定,那么这个判定就是客观的。

deeper_wind的博客 934

DSP的CLA调试技巧

本文介绍了基于TMS320F28377D的CLA(Control Law Accelerator)开发实战教程,涵盖基础配置、编程、调试与优化全流程。主要内容包括:CLA核心特性及其作为实时控制协处理器的优势;开发环境搭建与工程配置要点;CLA任务调度、数据交换及编程约束;调试技巧如断点设置和性能分析方法;进阶应用案例(批量除法运算)及优化策略;以及推荐的学习资源和硬件平台。教程强调数据一致性和任务同步问题,为快速上手CLA开发提供实用指导。

1040

利用R语言通过holtwinters模型进行预测

使用Holt-Winters模型进行预测的第一步是对模型进行拟合。该函数需要两个参数:您的时间序列数据和一个“seasonal”参数,该参数指示您的数据的周期性(例如,如果您的数据按月记录,则应将“seasonal”参数设置为12,因为一年有12个月)。拟合模型后,您可以使用“forecast()”函数进行预测。该函数需要两个参数:您的拟合模型以及您要进行预测的时间段的长度。要使用Holt-Winters模型,您需要安装并加载“forecast”包。以下是进行Holt-Winters模型预测的示例代码。

Mrrunsen的博客 1696

高级运维开发工程师的打怪升级之路

人生就像一场游戏,充满了挑战与机遇。作为高级运维开发工程师,我们在职业生涯中不断面对各种困难,为了梦想、为了家人、为了自己,我们不懈奋斗。今天,让我们一起回顾这段充满挑战的“打怪升级”之旅,看看如何从一名初出茅庐的新人成长为行业内的佼佼者。在初级阶段,运维开发工程师的工作可能显得琐碎且缺乏成就感,但这些基础工作为后续的发展奠定了坚实的基础。每年的“金三银四”是跳槽的高峰期,但并不是每个人都能顺利找到理想的工作。掌握80%互联网公司会用到的技术,才能在职场中具备更强的竞争力。

软件架构师笔记 1432

1篇1章4节:生成对抗网络GAN和图像生成领域的StyleGAN

AI图像生成技术的革命性突破:从GAN到StyleGAN 近年来,人工智能在图像生成领域取得显著进展,尤其是生成对抗网络(GAN)的发展推动了技术的飞跃。从早期的基础GAN到渐进式GAN(Progressive GAN),再到革命性的StyleGAN,AI生成图像的逼真度已接近人类创作水平。StyleGAN通过引入风格潜向量和自适应实例归一化,实现了对图像风格与内容的精细控制,广泛应用于人脸生成、艺术创作及影视行业。后续的StyleGAN2解决了“斑点”问题,StyleGAN3进一步优化纹理过渡,提升了图像

MD Code 213

高级运维工程师打怪升级之路

人生就像一场游戏,这场游戏给我们带来了的许多困难,但是我们为了梦想,为了家人,为了自己不断奋斗着,努力工作。 今天就让我带着大家一起回顾高级运维工程师打怪升级之路。 运维工程师在刚入行阶段是一很苦逼的,可能干着修电脑、掐网线、搬机器的活,显得没地位!时间也很碎片化,各种零碎的琐事围绕着你,也很难体现个人价值,渐渐的对行业很迷茫,觉得没什么发展前途。 这些枯燥无味工作的确会使人匮乏!技术是枯燥无味的...

李振良的技术博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

运维工程师的打怪升级之路

人生就像一场游戏,这场游戏给我们带来了的许多困难,但是我们为了梦想,为了家人,为了自己不断奋斗着,努力工作。 今天就让我带着大家一起回顾高级运维工程师打怪升级之路。 运维工程师在刚入行阶段是一很苦逼的,可能干着修电脑、掐网线、搬机器的活,显得没地位!时间也很碎片化,各种零碎的琐事围绕着你,也很难体现个人价值,渐渐的对行业很迷茫,觉得没什么发展前途。 这些枯燥无味工作的确会使人匮乏!技术是枯燥...

yaodunlin的博客 6016

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

高级运维工程师的打怪升级之路

运维工程师在前期是一个很苦逼的工作,在这期间可能干着修电脑、掐网线、搬机器的活,显得没地位!时间也很碎片化,各种零碎的琐事围绕着你,很难体现个人价值,渐渐的对行业很迷茫,觉得没什么发展前途。 这些枯燥无味工作的确会使人匮乏,从技术层面讲这些其实都是基本功,对后期的运维工作会无形中带来一定的帮助,因为我也是这么过来的,能深刻体会到。所...

weixin_34161032的博客 106

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: NFS文件存储及部署论坛(小白的“升级打怪”成长之路)
下一篇: Redis Sentinel哨兵集群(小白的“升级打怪”成长之路)
deeper_wind
博客等级 码龄2年 262粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值