redis的主从复制原理及步骤

怎么玩:
1.配从库不赔主库
2.从库配置:slaceof 主库IP主库端口
在没有SLAVEOF之前,三个机器处于都是master的角色,但是当执行SLAVEOF之后,主机的角色就是role
,从机的角色就是slave,执行SLAVEOF之后,会把主机上的所有数据按照主从复制的原则复制一份,并且从机上不能够
修改和创建数据,只能在主机上进行创建和修改数据
                                      主机
[[email protected] Desktop]$ su
Password:
[[email protected] Desktop]# cd /etc/redis
[[email protected] redis]# ls -l
total 192
-rw-r--r--. 1 root root 46710 Nov 23 14:52 redis6379.conf
-rw-r--r--. 1 root root 46710 Nov 23 14:55 redis6380.conf
-rw-r--r--. 1 root root 46710 Nov 23 14:57 redis6381.conf
-rw-r--r--. 1 root root 46698 Nov 21 17:36 redis.conf
[[email protected] redis]# redis-server redis6379.conf
[[email protected] redis]# redis-cli
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k3 v3
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
3) "k3"
127.0.0.1:6379> set k4 v4
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=501,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=501,lag=0
master_repl_offset:501
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:500
127.0.0.1:6379> set k6 v6
OK

从机1
[[email protected] Desktop]# redis-server /etc/redis/redis6380.conf
[[email protected] Desktop]# redis-cli
127.0.0.1:6379> exit
[[email protected] Desktop]# redis-server /etc/redis/redis6380.conf
[[email protected] Desktop]# redis-cli -p 6380
127.0.0.1:6380> INFO replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> clear
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6380> get k4
"v4"
127.0.0.1:6380> get k2
"v2"
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:6
master_sync_in_progress:0
slave_repl_offset:515
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> set k6 v66
(error) READONLY You can‘t write against a read only slave.
127.0.0.1:6380> get k6
"v6"

从机2
[[email protected] 123456]# redis-server /etc/redis/redis6381.conf
[[email protected] 123456]# redis-cli -p 6381
127.0.0.1:6381> INFO replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6381> get k4
"v4"
127.0.0.1:6381> get k1
"v1"
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:2
master_sync_in_progress:0
slave_repl_offset:529
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> set k6 v666
(error) READONLY You can‘t write against a read only slave.
127.0.0.1:6380> get k6
"v6"

当主机关机或者停止工作的时候角色变化:
127.0.0.1:6379> SHUTDOWN
not connected> exit

127.0.0.1:6380> keys *
1) "k2"
2) "k4"
3) "k1"
4) "k3"
5) "k6"
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:4338
master_link_down_since_seconds:18
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

127.0.0.1:6381> INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:4338
master_link_down_since_seconds:208
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

当主机重新开始的时候:
[[email protected] redis]# redis-server redis6379.conf
[[email protected] redis]# redis-cli
127.0.0.1:6379> set k7 v7
OK
从机1
127.0.0.1:6380> get k7
"v7"
从机2
127.0.0.1:6381> get k7
"v7"

主机正常工作但是其中一个从机坏了!每次与master断开,都需要重新连接,除非写进配置文件redis.conf中
127.0.0.1:6379> set k8 v8
OK
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=1703,lag=1
master_repl_offset:1703
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:1702
127.0.0.1:6379> get k8
"v8"
从机重新开始连接,
[[email protected] Desktop]# redis-server /etc/redis/redis6380.conf
[[email protected] Desktop]# redis-cli -p 6380
127.0.0.1:6380> INFO replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> get k8
(nil)

主从复制的薪火相传
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=85,lag=0
master_repl_offset:85
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:84
127.0.0.1:6379> keys *
1) "k3"
2) "k4"
3) "k1"
4) "k7"
5) "k2"
6) "k6"
7) "k8"
127.0.0.1:6379> set k9 v9
OK
127.0.0.1:6379> get k9
"v9"
从机1;80是79的从机
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
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:9
master_sync_in_progress:0
slave_repl_offset:85
slave_priority:100
slave_read_only:1
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=71,lag=1
master_repl_offset:71
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:70
127.0.0.1:6380> get k9
"v9"

81是80的从机:
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6381> INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:71
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381> get k9
"v9"

主从复制之反客为主:当主机停止工作的时候,从机2SLAVEOF no one,从机3重新SLAVEOF 127.0.0.1 6380
[[email protected]calhost Desktop]# redis-server /etc/redis/redis.conf
[[email protected] Desktop]# redis-cli
127.0.0.1:6379> SHUTDOWN
not connected> EXIt

[[email protected] Desktop]# redis-server /etc/redis/redis6380.conf
[[email protected] Desktop]# redis-cli -p 6380
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6380> keys *
1) "k1"
2) "k6"
3) "k4"
4) "k3"
5) "k7"
6) "k2"
7) "k9"
8) "k8"
127.0.0.1:6380> SLAVEOF no one
OK
127.0.0.1:6380> clear
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> set k10 v10
OK
127.0.0.1:6380> get k10
"v10"

[[email protected] Desktop]# redis-server /etc/redis/redis6381.conf
[[email protected] Desktop]# redis-cli -p 6381
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6381> keys *
1) "k1"
2) "k7"
3) "k3"
4) "k9"
5) "k4"
6) "k6"
7) "k2"
8) "k8"
127.0.0.1:6381> INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:43
master_link_down_since_seconds:563
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6381> get k10
"v10"
127.0.0.1:6381>

复制原理:
slave启动成功连接到master后会发送一个sync命令
Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,
在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步
全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
但是只要是重新连接master,一次完全同步(全量复制)将被自动执行

哨兵配置:
[[email protected] redis]# vim sentinel.conf
[[email protected] redis]# redis-sentinel sentinel.conf
[[email protected] Desktop]# redis-server /etc/redis/redis.conf
[[email protected] Desktop]# redis-cli
127.0.0.1:6379> SHUTDOWN
not connected> exi
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> exit
[[email protected] Desktop]# redis-server /etc/redis/redis.conf
[[email protected] Desktop]# redis-cli
127.0.0.1:6379> keys *
1) "k10"
2) "k1"
3) "k9"
4) "k8"
5) "k6"
6) "k4"
7) "k2"
8) "k3"
9) "k7"
127.0.0.1:6379> SHUTDOWN
not connected> exit
[[email protected] Desktop]#

哨兵会监控到主机停止工作并且让从机2称为主机:
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=263864,lag=1
master_repl_offset:263864
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:263576
repl_backlog_histlen:289
127.0.0.1:6380> set k10 v10
OK

从机三成为2的从机:
127.0.0.1:6381> INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:264130
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381> get k10
"v10"

当主机1开始工作之后:
[[email protected] Desktop]# redis-server /etc/redis/redis.conf
[[email protected] Desktop]# redis-cli
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379> get k10
"v10"

原文地址:https://www.cnblogs.com/mxf97826/p/8687664.html

时间: 2024-08-03 13:36:28

redis的主从复制原理及步骤的相关文章

5.如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍一下么?redis 的哨兵原理能介绍一下么?

作者:中华石杉 作者:中华石杉 面试题 如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍一下么?redis 的哨兵原理能介绍一下么? 面试官心理分析 其实问这个问题,主要是考考你,redis 单机能承载多高并发?如果单机扛不住如何扩容扛更多的并发?redis 会不会挂?既然 redis 会挂那怎么保证 redis 是高可用的? 其实针对的都是项目中你肯定要考虑的一些问题,如果你没考虑过,那确实你对生产系统中的问题思考太少. 面试题剖析 如果你用 redis 缓存技术的话,

redis的主从复制原理

1. 前言 和MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况.为了分担读压力,Redis支持主从复制,Redis主从复制可以根据是否是全量分为全量同步和增量同步. 2. 旧版复制功能实现 redis复制功能分为同步和命令传播两种操作: (1)同步操作负责将从数据库的状态更新为和主数据库状态一致 (2)命令传播操作则用于当主服务器状态修改时,让从服务器状态重新回到一致 2.1 同步 同步操作由sync操作完成: (1)从服务器向主服务器发送syn

redis之(十四)redis的主从复制的原理

一:redis主从复制的原理,步骤. 第一步:复制初始化 --->从redis启动后,会根据配置,向主redis发送SYNC命令.2.8版本以后,发送PSYNC命令. --->主redis收到SYNC命令后,开始在后台保存快照文件(即RDB持久化的过程),并将保存快照期间接收到的命令缓存起来. --->当主redis完成快照后,主redis会将快照文件和缓存命令发送给从redis.复制初始化结束. --->当主redis的复制初始化结束后,主redis每当收到写命令就会异步将写命令

Redis主从复制原理总结

和Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况.为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步.下图为级联结构. 全量同步Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份.具体步骤如下: -  从服务器连接主服务器,发送SYNC命令: -  主服务器接收到SYNC命名后,开始执行BGSA

Redis主从复制以及主从复制原理

Redis 是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的 API.从 2010年 3 月 15 日起,Redis 的开发工作由 VMware 主持.从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助. 概述 在现有企业中 80%公司大部分使用的是 redis 单机服务,在实际的场景当中单一节点的 redis 容易面临风险. 面临问题 1. 机器故障.我们部署到一台 Redis 服务器,当发生机

linux Mysql 主从复制 原理介绍和步骤详解

大家好,我是霸王卸甲,今天我给大家带来的是linux数据库中的主从复制的简单介绍和步骤详解. 主从复制 mysql主从复制 灵活 一主一从 主主复制 一主多从---扩展系统读取的性能,因为读是在从库读取的: 多主一从---5.7开始支持 联级复制--- 用途及条件 mysql主从复制用途 实时灾备,用于故障切换 读写分离,提供查询服务 备份,避免影响业务 主从部署必要条件: 主库开启binlog日志(设置log-bin参数) 主从server-id不同 从库服务器能连通主库 主从原理mysql主

(06)redis的主从复制操作步骤

1.关于主从复制的说明 持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障,如下图: 主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务. 主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过

Redis基础学习(五)—Redis的主从复制

一.概述     Redis的主从复制策略是通过其持久化的rdb文件来实现的,其过程是先dump出rdb文件,将rdb文件全量传输给slave,然后再将dump后的操作实时同步到slave中.让从服务器(slave server)成为主服务器(master server)的精确复制品. 以下是关于 Redis 复制功能的几个重要方面: (1)Redis 使用异步复制.从Redis 2.8 开始,从服务器会以每秒一次的频率向主服务器报告复制流(replication stream)的处理进度. (

NOSQL之【redis的主从复制】

一.Redis的Replication: 下面的列表清楚的解释了Redis Replication的特点和优势.    1). 同一个Master可以同步多个Slaves.    2). Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力.因此我们可以将Redis的Replication架构视为图结构.    3). Master Server是以非阻塞的方式为Slaves提供服务.所以在Master-Slave同步期间,客户端仍然可以提交查询或修改