首页 > 数据库 >Redis之主从同步

Redis之主从同步

时间:2024-06-11 17:33:00浏览次数:15  
标签:同步 0.1 Redis redis 127.0 repl master conf 主从

概念

  • 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。
  • 前者称为主节点(master/leader),后者称为从节点(slave/follower);
  • 数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave 以读为主。
  • 默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

主从复制的作用

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

主从复制的必要性

一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的(宕机,一主二从),原因如下

  • 从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;
  • 从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有内存用作Redis存储内存一般来说,单台Redis最大使用内存不应该超过20G。

电商网站上的商品,一般都是一次上传,无数次浏览的,说专业点也就是"多读少写"。

配置主从同步

本实验是在一台主机上模拟一主俩从,单机多服务

  • 查看主从同步信息
# redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master                                                    #角色
connected_slaves:0                                             #连接的从主机
master_failover_state:no-failover
master_replid:da6862d9f9d8e0c34c4a1fa48d55a8bd37fc249b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
  • 准备配置文件
# ls
00-RELEASENOTES  CODE_OF_CONDUCT.md  COPYING  INSTALL   MANIFESTO  redis.conf      runtest          runtest-moduleapi  SECURITY.md    src    TLS.md
BUGS             CONTRIBUTING.md     deps     Makefile  README.md  redis.conf.bak  runtest-cluster  runtest-sentinel   sentinel.conf  tests  utils

复制三份配置文件

# cp redis.conf redis79.conf
# cp redis.conf redis80.conf
# cp redis.conf redis81.conf
# ls
00-RELEASENOTES     deps       redis79.conf    runtest            sentinel.conf
BUGS                INSTALL    redis80.conf    runtest-cluster    src
CODE_OF_CONDUCT.md  Makefile   redis81.conf    runtest-moduleapi  tests
CONTRIBUTING.md     MANIFESTO  redis.conf      runtest-sentinel   TLS.md
COPYING             README.md  redis.conf.bak  SECURITY.md        utils
  • 修改配置文件
# vi redis79.conf

port 6379
logfile "6379.log"
dbfilename dump6379.rdb

# vi redis80.conf

port 6380
pidfile /var/run/redis_6380.pid
logfile "6380.log"
dbfilename dump6380.rdb


# vi redis81.conf

port 6381
pidfile /var/run/redis_6381.pid
logfile "6381.log
dbfilename dump6381.rdb
  • 启动服务
# redis-server /data/apps/redis-7.0.15/redis79.conf
# redis-server /data/apps/redis-7.0.15/redis80.conf
# redis-server /data/apps/redis-7.0.15/redis81.conf
# ps -ef | grep redis
root     156305      1  0 16:19 ?        00:00:00 redis-server 127.0.0.1:6379
root     156489      1  0 16:20 ?        00:00:00 redis-server 127.0.0.1:6380
root     156503      1  0 16:20 ?        00:00:00 redis-server 127.0.0.1:6381
root     156588 142066  0 16:20 pts/1    00:00:00 grep --color=auto redis

注意:
目前三台主机均为主节点,还没有区分主从,一般情况下只需要配置从库

  • 测试可用性
# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>

#  redis-cli -p 6380
127.0.0.1:6380> ping
PONG
127.0.0.1:6380>

#  redis-cli -p 6381
127.0.0.1:6381> ping
PONG
  • 配置主从
    主(6379)从(6380、6381)
#  redis-cli -p 6380
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379         #指定主节点主机
OK
127.0.0.1:6380> info replication
# Replication
role:slave                                     #角色状态为slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_read_repl_offset:14
slave_repl_offset:14
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:abfde85bb3fca5e0e73f88547ce18eb8f1c09470
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14

#  redis-cli -p 6381
127.0.0.1:6381> ping
PONG
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:364
slave_repl_offset:364
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:abfde85bb3fca5e0e73f88547ce18eb8f1c09470
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:364
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:365
repl_backlog_histlen:0
  • 查看主库
# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> info replication
# Replication
role:master                                                    #主库
connected_slaves:2                                             #两个从库
slave0:ip=127.0.0.1,port=6380,state=online,offset=406,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=406,lag=1
master_failover_state:no-failover
master_replid:abfde85bb3fca5e0e73f88547ce18eb8f1c09470
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:406
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:406
  • 修改配置文件永久保存配置
vi /data/apps/redis-7.0.15/redis80.conf
replicaof <masterip> <masterport>
  • 验证主从同步
    只能在主库进行写入操作,自动同步到从库,从库不能写入
# redis-cli -p 6379
1
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1
OK

# redis-cli -p 6380
127.0.0.1:6380> get k1
"v1"

# redis-cli -p 6381

127.0.0.1:6381> set k2 v2
(error) READONLY You can't write against a read only replica.       #从库无法写入

主从同步原理

slave 启动成功连接到 master 后会发送一个sync命令
Masler 接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。

全量复制:slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步。

但是只要是重新连接master,一次完全同步(全量复制)将被自动执行

主从同步的集群,主库宕机,从库无法自动切换为主,造成业务不可用。
主库断开连接,从库依旧连接到主库的,但是没有写操作,这个时候,主库如果恢复,从库依旧可以直接获取到主库写的信息 !
如果是使用命令行,来配置的主从,这个时候从库如果重启了,就会变回主库。只要变为从库,数据会立即从主库同步过来。

标签:同步,0.1,Redis,redis,127.0,repl,master,conf,主从
From: https://www.cnblogs.com/OpenSourceSite/p/18242192

相关文章

  • Redis:原理、概念、用法与实例解析
    Redis:原理、概念、用法与实例解析在当今风起云涌的技术领域中,Redis犹如一颗璀璨的明星,闪耀着独特的光芒。它作为一种备受瞩目的数据存储和缓存解决方案,以其卓越的性能、丰富多样的功能以及简单易用的特性,成为了众多开发者的心头好。在这篇博客中,我们将全方位、深层次地探......
  • Redis之发布订阅
    发布订阅Redis发布订阅(pub/sub)是一种消息通信模式,发送者(pub)发送消息,订阅者(sub)接收消息。Redis客户端可以订阅任意数量的频道。消息发送者&消息接收者&频道可以想象这么一个场景。我们抖音、微博关注了哪个博主,当他发布一条文章时,系统就会给我们推送他发布的消息内......
  • 百度面试:如何用Redis实现限流?
    高并发系统有三大特征:限流、缓存和熔断,所以限流已经成为当下系统开发中必备的功能了。那么,什么是限流?如何实现限流?使用Redis能不能实现限流?接下来我们一起来看。1.什么是限流?限流是指在各种应用场景中,通过技术和策略手段对数据流量、请求频率或资源消耗进行有计划的限制,以避......
  • redis自学(46)键值设计
    Redis键值设计优雅的key结构Redis的Key虽然可以自定义,到但是最好遵循下面的几个最佳实践约定:l 遵循基本格式:[业务名称]:[数据名]:[id]l 长度不超过44字节(长度越小,占用的内存越少)l 不包含特殊字符  优点:①可读性强②避免key冲突③方便管理④更节省内存:ke......
  • Redis面试题、知识点总结,一篇文章让Redis成为面试加分项
    Redis面试题、知识点总结,一篇文章让Redis成为面试加分项前言参与了几次中大厂的面试,你会发现一面时对于八股文的考察也具有侧重点(MySQL=Redis>网络>系统>设计模式>java集合>JVM>spring)本文的目标就是通过这一篇文章让你能在面试时将Redis相关的问题回答漂亮。......
  • 安徽京准丨NTP网络授时服务器(GPS时钟同步服务器)助力化工厂系统
    安徽京准丨NTP网络授时服务器(GPS时钟同步服务器)助力化工厂系统安徽京准丨NTP网络授时服务器(GPS时钟同步服务器)助力化工厂系统京准电子科技官微——ahjzsz现代化工企业均设置自动化控制系统,大多数企业设置不止一套控制系统,有基本生产过程控制系统(BPCS)、安全仪表系统(SIS)、可......
  • (6)同步复位异步释放电路
    一、复位电路时序电路为双稳态电路,因此必须要有复位信号,而组合电路没有存储功能,因此不需要复位信号电路中的复位有两种形式:1.同步复位敏感列表中只有时钟信号没有复位信号2.异步复位敏感列表中不仅有时钟而且有复位信号为避免在释放......
  • git 教程:如何从github上拉取项目 · 进行修改并上传到自己仓库 · 一个仓库保存,多端同
    一:删除原始的远程仓库链接首先,查看当前的远程仓库链接:gitremote-v你会看到类似如下的输出:originhttps://github.com/othersusername/others-project.git(fetch)originhttps://github.com/othersusername/others-project.git(push)删除原始远程仓库链接:git......
  • Redis之持久化
    Redis持久化Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以Redis提供了持久化功能!RDB(RedisDataBase)在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时是将快照文件直接......
  • Redis在微服务架构中的角色:服务间通信与数据共享
    I.引言A.介绍微服务架构的概念和特点 微服务架构是一种设计模式,它将一个大型的单体应用分解成一组小的服务,每个服务都运行在其自身的进程中,独立地进行部署和扩展。这些服务之间通过轻量级的通信机制(如HTTPRESTfulAPI)进行交互,每个服务都围绕一个特定的业务功能进行组......