Redis之主从复制解读

举报
yd_249383650 发表于 2023/09/28 11:16:05 2023/09/28
【摘要】 ​ 目录基本概述作用如何配置主从复制命令配置(Slaveof ) 配置文件配置主从复制缺点主从复制原理主从复制常见问题解答命令补充(info replication)基本概述主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master/Leader),后者称为从节点(Slave/Follower)数据的复制是单向的!只能由主节点复制到从节点(主节点以...

 

目录

基本概述

作用

如何配置主从复制

命令配置(Slaveof ) 

配置文件配置

主从复制缺点

主从复制原理

主从复制常见问题解答

命令补充(info replication)




基本概述

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master/Leader),后者称为从节点(Slave/Follower)数据的复制是单向的!只能由主节点复制到从节点(主节点以写为主、从节点以读为主)

数据的复制是单向的,只能由主节点到从节点。

编辑

默认情况下,每台Redis服务器都是主节点,一个主节点可以有0个或者多个从节点,但每个从节点只能有一个主节点 。

作用

1、数据备份:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务
的冗余。
3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写
少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
4、高可用(集群)基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

如何配置主从复制

命令配置(Slaveof ) 

Redis Slaveof 命令可以将当前服务器转变为指定服务器的从属服务器(slave server)。如果当前服务器已经是某个主服务器(master server)的从属服务器,那么执行 SLAVEOF host port 将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。

另外,对一个从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。

利用『 SLAVEOF NO ONE 不会丢弃同步所得数据集』这个特性,可以在主服务器失败的时候,将从属服务器用作新的主服务器,从而实现无间断运行。

slaveof no one

使当前数据库停止与其他数据库的同步,转成主数据库

redis 127.0.0.1:6379> SLAVEOF 127.0.0.1 6379
OK
 
redis 127.0.0.1:6379> SLAVEOF NO ONE
OK

返回值:总是返回 OK 。

 在 redis-cli 客户端中执行 slaveof 命令只会对当前环境生效,重启后失效。要想永久生效,需要在 redis.conf 配置文件中添加 slaveof 配置。

配置文件配置

编辑redis-conf配置文件

需要启动多个服务,就需要配置多个配置文件。每个配置文件对应修改以下信息:(端口号、pid文件名、日志文件名、rdb文件名)

cp redis.conf redis_master79.conf
cp redis.conf redis_sub80.conf 
cp redis.conf redis_sub81.conf 
ls
# redis.conf  redis_master79.conf  redis_sub80.conf  redis_sub81.conf

vi redis_master79.conf  

# redis_master79.conf 【做主节点】
port 6379
logfile "6379.log"
pidfile /var/run/redis_6379.pid
dbfilename dump6379.rdb

vi redis_sub80.conf 

# redis_sub80.conf 【做从节点1】
port 6380
logfile "6380.log"
pidfile /var/run/redis_6380.pid
dbfilename dump6380.rdb

vi redis_sub81.conf  

# redis_sub81.conf 【做从节点2】
port 6381
logfile "6381.log"
pidfile /var/run/redis_6381.pid
dbfilename dump6381.rdb

根据指定的配置文件启动redis 

# redis-server /usr/local/bin/kconfig/redis_master79.conf
# redis-server /usr/local/bin/kconfig/redis_sub80.conf
# redis-server /usr/local/bin/kconfig/redis_sub81.conf
# ps -ef |grep redis
polkitd    4770   4750  0 10:27 ?        00:00:00 redis-server *:6379
root       5717      1  0 10:37 ?        00:00:00 redis-server *:6380
root       5724      1  0 10:37 ?        00:00:00 redis-server *:6381
root       5729   4366  0 10:37 pts/0    00:00:00 grep --color=auto redis

主从复制缺点

复制延时,信号衰减。由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。

master挂了,不会自动重选一个master,且剩余的slave不能执行写命令。每次master挂了都只能人工进行干预

主从复制原理

  • 当从连接上主服务器之后,从服务器向主服务发送进行数据同步消息 - 全量复制
  • 主服务器接收到从服务器发送过来同步消息,把主服务数据进行持久化rbd文件,把rdb文件发送从服务器,从服务器拿到rdb进行读取
  • 每次主服务器进行写操作之后,和从服务器进行数据同步(这里是主服务器主动) - 增量复制
     

主从复制常见问题解答

1、从机是否可以执行写命令?

从机不可以执行写命令

 2、从机切入点问题 ,也就是slave是从头开始复制还是从切入点开始复制?

假设:

  master启动,写到k3

  slave1跟着master同时启动,跟着写到k3

  slave2写到k3后才启动,那之前的也是会复制过来的

3、主机shutdown后情况如何?从机是变为master还是原地待命 ?

从机不动,原地待命,从机数据可以正常使用;等待主机重启动归来 

4、 主机shutdown后,重启后主从关系还在吗(配置文件)?从机能够顺利复制吗?

主从关系依旧在,也能顺利复制


命令补充(info replication)

replication 相关的信息:

参数名 含义
role 如果实例不是任何节点的从节点,则值是”master”,如果实例从某个节点同步数据,则是”slave”。 请注意,一个从节点可以是另一个从节点的主节点

主节点 

127.0.0.1:6379> info replication
# Replication
# 角色
role:master
# 从节点的连接数
connected_slaves:2
# 从节点详细信息 IP PORT 状态 命令(单位:字节长度)偏移量 延迟秒数
# 主节点每次处理完写操作,会把命令的字节长度累加到master_repl_offset中。
# 从节点在接收到主节点发送的命令后,会累加记录子什么偏移量信息slave_repl_offset,同时,也会每秒钟上报自身的复制偏移量到主节点,以供主节点记录存储。
# 在实际应用中,可以通过对比主从复制偏移量信息来监控主从复制健康状况。
slave0:ip=192.168.10.102,port=6379,state=online,offset=23866,lag=0
slave1:ip=192.168.10.103,port=6379,state=online,offset=23866,lag=0
# master启动时生成的40位16进制的随机字符串,用来标识master节点
master_replid:acc2aaa1f0bb0fd79d7d3302f16bddcbe4add423
master_replid2:0000000000000000000000000000000000000000
# master 命令(单位:字节长度)已写入的偏移量
master_repl_offset:23866
second_repl_offset:-1
# 0/1:关闭/开启复制积压缓冲区标志(2.8+),主要用于增量复制及丢失命令补救
repl_backlog_active:1
# 缓冲区最大长度,默认 1M
repl_backlog_size:1048576
# 缓冲区起始偏移量
repl_backlog_first_byte_offset:1
# 缓冲区已存储的数据长度
repl_backlog_histlen:23866

从节点 

127.0.0.1:6379> info replication
# Replication
# 角色
role:slave
# 主节点详细信息
master_host:192.168.10.101
master_port:6379
# slave端可查看它与master之间同步状态,当复制断开后表示down
master_link_status:up
# 主库多少秒未发送数据到从库
master_last_io_seconds_ago:1
# 从服务器是否在与主服务器进行同步 0否/1是
master_sync_in_progress:0
# slave复制命令(单位:字节长度)偏移量
slave_repl_offset:24076
# 选举时,成为主节点的优先级,数字越大优先级越高,0 永远不会成为主节点
slave_priority:100
# 从库是否设置只读,0读写/1只读
slave_read_only:1
# 连接的slave实例个数
connected_slaves:0
# master启动时生成的40位16进制的随机字符串,用来标识master节点
master_replid:acc2aaa1f0bb0fd79d7d3302f16bddcbe4add423
# slave切换master之后,会生成了自己的master标识,之前的master节点的标识存到了master_replid2的位置
master_replid2:0000000000000000000000000000000000000000
# master 命令(单位:字节长度)已写入的偏移量
master_repl_offset:24076
# 主从切换时记录主节点的命令偏移量+1,为了避免全量复制
second_repl_offset:-1
# 0/1:关闭/开启复制积压缓冲区标志(2.8+),主要用于增量复制及丢失命令补救
repl_backlog_active:1
# 缓冲区最大长度,默认 1M
repl_backlog_size:1048576
# 缓冲区起始偏移量
repl_backlog_first_byte_offset:1
# 缓冲区已存储的数据长度
repl_backlog_histlen:24076




【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。