Redis进阶:Redis的主从复制机制
Redis进阶:Redis的主从复制机制
主从复制机制介绍
单机版的Redis存在性能瓶颈,Redis通过提高主从复制实现读写分离,提高了了Redis的可用性,另一方便也能实现数据在多个Redis直接的备份。
配置一主多从
准备配置文件
本文示例是在同一台机器上启动3个Redis实例。实现一主多从,多个IP地址方式也一样,只需求修改配置文件的maste的ip地址和端口就行,这里就不在赘述了。
# 复制配置文件Redis6379.conf
[root@localhost redis-5.0.7]# cp redis6379.conf redis6380.conf
[root@localhost redis-5.0.7]# cp redis6379.conf redis6381.conf
至此我们准备了3个配置文件,供后面使用。
修改配置文件
修改主配置文件
# 修改Redis6379配置文件
[root@localhost redis-5.0.7]# vi redis6379.conf
# 修改如下部分增加密码验证
# requirepass foobared
requirepass enjoyitlife
修改从服务配置文件。
# 修改redis6380.conf配置文件
[root@localhost redis-5.0.7]# vi redis6380.conf
# 修改端口
port 6380
# 修改日志文件
logfile "redis6380.log"
# 修改pidfile
pidfile /var/run/redis_6380.pid
# 配置主服务的地址和端口 关键配置
replicaof 127.0.0.1 6379
#主开启密码验证时 从服务器也需要配置验证密码
masterauth enjoyitlife
redis6381.conf 也要按照上面的配置配置一遍。将上面的6380修改为6381即可。
启动服务
# 启动主服务 和 从服务
[root@localhost redis-5.0.7]# src/redis-server redis6379.conf
[root@localhost redis-5.0.7]# src/redis-server redis6380.conf
[root@localhost redis-5.0.7]# src/redis-server redis6381.conf
# 查看进程
[root@localhost redis-5.0.7]# ps -ef | grep redis
root 7684 1 0 10:55 ? 00:00:07 srcredis-server 127.0.0.1:6379
root 7689 1 0 10:55 ? 00:00:07 srcredis-server 127.0.0.1:6380
root 7762 1 0 11:41 ? 00:00:00 srcredis-server 127.0.0.1:6381
root 7767 7721 0 11:44 pts/2 00:00:00 grep --color=auto redis
此时,我们的Redis主从复制服务已经搭建完成,6379为主服务,6380、6381为从服务。这里需要注意是,从服务只支持读操作,只有主服务节点才支持写、更新、删除操作。
这是通过配置的方式,还有一种方式是直接在从节点客户端输入指令:replicaof 127.0.0.1 6379 ,这种方式也可以实现主从复制,但是这种方式服务Redis重启后就会失效。
另外之前的Redis的主从复制指令是通过slaveof ,现在已经替换为replicaof ,主要是因为slave有奴隶的意思,Redis的开发者们觉得不大友好,所以用replicaof 来替换了原来的指令。建议以后直接使用replicaof指令。
功能验证
可以通过info relication指令,查看主从配置信息。
# 功能验证 连接主服务客户端 输入如下指令
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2 # 可以看到当前已经上线了2个从服务节点
slave0:ip=127.0.0.1,port=6380,state=online,offset=126,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=126,lag=1
master_replid:76d6f75c4b5a59baf39473dc3f94352bebc9158f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:126
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:126
# 在从节点 输入指令
127.0.0.1:6380> info replication
# Replication
role: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_repl_offset:1204
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:76d6f75c4b5a59baf39473dc3f94352bebc9158f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1204
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1204
在主服务节点 设置一个属性,然后在从节点进行查询。
# 主节点设置属性
127.0.0.1:6379> set name "hello Redis Replication"
OK
#从节点 获取属性
127.0.0.1:6380> get name
"hello Redis Replication"
127.0.0.1:6381> get name
"hello Redis Replication"
主从复制关键点
- Redis使用异步复制,主节点和从节点是异步地处理的数据流的同步。
- 一个主服务可以有N个从节点。
- 从节点可以继续有从节点,形成复制链。
- Redis的复制在主节点是非阻塞的,可以在同步的同时处理其他请求。
- 复制在从节点也是非阻塞的,但如果是初次同步大数据量时,从节点会有一个窗口期,此时会阻塞从节点的对其他请求的处理。
- 如果主节点没开启持久化,一旦主节点重启,从节点和主节点都会丢失数据。所以建议主节点和从节点都启用持久化,同时要配置实例防止重置后自动重启。
Redis主从复制工作流程
- 从节点连接上主节点。通PING指令访问主节点。
- 主从节点通过PSYNC指令发送旧的replicationID和偏移量。
- 主节点通过该方式发送从节点需要的增量数据。如果从节点没有历史记录的replicationID和偏移量,就会进行一个全量同步。
全量复制流程:
- 主节点服务启动,开启持久化,产生RDB文件。
- 主节点接受客户端的操作指令,并进行缓冲数据。
- 主节点保存完成数据时, 主节点将数据集文件传输给从节点。
- 从节点将保存接受到的数据集文件在磁盘上,然后加载文件到内存。实现主从复制。
主从复制有一定的窗口期,可以通过下面的参数进行配置:
min-replicas-to-write 复制到写<number of replicas>
min-replicas-max-lag 最小复制最大延迟<number of seconds>
主从复制的数据过期问题
- 从节点不会主动触发过期的Key的删除工作,而是在主节点进行删除过期数据,然后在同步到从节点上。
- 在执行Lua脚本时,不会执行任何Key的过期操作。这可以防止 key 在脚本中间过期,保证将相同的脚本发送到从节点 ,从而在使主从节点的数据集保持一致。
故障转移
当主节点在出现故障后,此时就需要提升从节点升级为主节点,这时就需要手动切换,而且存在较大的风险,同时还要改一堆的程序配置,Redis提供了哨兵机制进行自动故障转移,下期我们在具体介绍。
以上就是Redis中主从复制操作的相关介绍了,更多其他指令可以参考官网,Redis官网,谢谢阅读,希望对你有所帮助。
Redis进阶:Redis的主从复制机制的更多相关文章
- Redis进阶:Redis的持久化机制
Redis进阶:Redis的持久化机制 Redis的持久化机制目前包括RBD和AOF两种方式. RDB持久化 RDB持久化方式是在指定的时间间隔对数据进行快照存储.过期的键值不会被存储到快照中.如果恢 ...
- Redis进阶:Redis的哨兵模式搭建
Redis进阶:Redis的哨兵模式搭建 哨兵机制介绍 单机版的Redis存在性能瓶颈,Redis通过提高主从复制实现读写分离,提高了了Redis的可用性,另一方便也能实现数据在多个Redis直接的备 ...
- 解密Redis的持久化和主从复制机制
Redis持久化 Redis 提供了多种不同级别的持久化方式: RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AOF 持久化记录服务器执 ...
- Redis的持久化和主从复制机制
Redis持久化 Redis 提供了多种不同级别的持久化方式: RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot) AOF 持久化记录服务器执行 ...
- 深入分析Redis的主从复制机制
一.前言 最近由于疫情影响,时间比较多,所以开始学习之前一直想学,但是却没时间学的Redis.这两天研究了一下Redis的持久化以及主从复制机制,现在已经很晚了,就不多废话了.这篇博客就来谈一谈R ...
- Redis主从复制机制详解
Redis主从复制机制详解 Redis有两种不同的持久化方式,Redis服务器通过持久化,把Redis内存中持久化到硬盘当中,当Redis宕机时,我们重启Redis服务器时,可以由RDB文件或AOF文 ...
- Redis 主从复制机制(集群)与 哨兵机制
1,什么是redis 主从复制 支持多个数据库之间的数据同步.只能一个主数据库(master),可以一个或者多个从数据库(slave) 主数据库,可以读写 从数据库,只可以读 当主数据库,做写的操作的 ...
- Redis进阶实践之十 Redis主从复制的集群模式
一.引言 Redis的基本数据类型,高级特性,与Lua脚本的整合等相关知识点都学完了,说是学完了,只是完成了当前的学习计划,在以后的时间还需继续深入研究和学习.从今天开始来讲一下有关Re ...
- Redis进阶实践之十八 使用管道模式加速Redis查询
一.引言 学习redis 也有一段时间了,该接触的也差不多了.后来有一天,以为同事问我,如何向redis中批量的增加数据,肯定是大批量的,为了这主题,我从新找起了解决方案.目前 ...
随机推荐
- python修炼之路——控制语句
Python编程之print python2.x和python3.x的print函数区别:python3.x的print函数需要加括号(),python2.x可以不加. #-*- coding:utf ...
- oracle partition 分区
--范围分区create table person( id int, name varchar2(20), birth date, sex char(2))partition by range (bi ...
- Eclipse中对一个项目进行复制粘贴为一个新项目
1:对目标项目执行右键,选择“Copy”,然后在空白处右键,选择“Paste”结果如下图: 2:右键新项目,点击Properties, 3:打开Navigator视图 4:打开.settings文件夹 ...
- JS中for循环嵌套
for 循环 for语句也是一种前测试循环语句,但它具有在 执行循环之前初始化变量 和 定义循环后要执行的代码的能力 for循环中专门提供了位置来放置循环的三个表达式 定义一个循环需要做实现这三步: ...
- mysql 普通用户与权限
1.创建用户 mysql> create user 'myself'@'%' identified by 'Myself'; Query OK, 0 rows affected mysql> ...
- mysql NULL函数 语法
mysql NULL函数 语法 作用:如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录.这意味着该字段将以 NULL 值保存. 说明:NULL 值的处理方式与其 ...
- nbu还原集群数据库异常问题
集群数据库软件均已安装完毕,现在想从NBU上还原数据库,但在还原控制文件报错 [oracle@oracle-db1 ~]$ rman target / Recovery Manager: Releas ...
- sqli-libs(7)
导出文件GET字符型注入 0x01介绍 导出到文件就是可以将查询结果导出到一个文件中,如常见的将一句话木马导出到一个php文件中,sqlmap中也有导出一句话和一个文件上传的页面 常用的语句是: s ...
- 大数据笔记(二十七)——Spark Core简介及安装配置
1.Spark Core: 类似MapReduce 核心:RDD 2.Spark SQL: 类似Hive,支持SQL 3.Spark Streaming:类似Storm =============== ...
- Java源码阅读-Integer(基于jdk1.8)
public final class Integer extends Number implements Comparable<Integer> Integer 由final修饰了,所以该 ...