Redis运维和开发学习笔记(5) 主从复制和sentinel哨兵模式

Redis运维和开发学习笔记(5) 主从复制和sentinel哨兵模式

主从复制

将主节点的数据改变同步给从节点

  • 作用
    1. 备份数据
    2. 读写分离
  • 存在的问题:
    1. 手动干预切主等操作
    2. 主节点的写能力受到单机限制
    3. 主节点的存储能力受到单机限制

主从模式的故障恢复

  1. 当主节点发生故障时,客户端连接主节点失败,两个从节点和主连接失败
  2. (人工)选取一个从节点slaveof no one使其成为新的主节点
  3. 更新应用方信息,重启
  4. 让另一个从节点连接新主
  5. 原来的主恢复作为从,去连接新主

哨兵

blog

拓扑结构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qDHbOoMx-1572053628652)(media/15653345582593/%206.2%20%E6%8B%93%E6%89%91%EF%BC%88171%EF%BC%89.png)]

复制配置

复制过程

命令:slaveof slaveof 127.0.0.1:6379

  1. 保存主节点信息
    • 执行slaveof后会打印日志
id=38 addr=127.0.0.1:47458 fd=6 name= age=2700 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
参数	含义
id	客户端连接的唯一标识,这个id是随着Redis的连接自增的,重启Redis后会重置为0。
addr	客户端的地址和端口
fd	套接字所使用的文件描述符
age	以秒计算的已连接时长
idle	以秒计算的空闲时长看, age=idle时则此链接为空连接
flags	客户端 flag
db	该客户端正在使用的数据库 ID
sub	已订阅频道的数量
psub	已订阅模式的数量
multi	在事务中被执行的命令数量
qbuf	输入缓冲区总量(字节为单位, 0 表示没有分配查询缓冲区)
qbuf-free	输入缓冲区剩余容量(字节为单位, 0 表示没有剩余空间)
obl	输出缓冲区的长度(字节为单位, 0 表示没有分配输出缓冲区)
oll	输出列表包含的对象数量(当输出缓冲区没有剩余空间时,命令回复会以字符串对象的形式被入队到这个队列里)
omem	输出缓冲区和输出列表占用的内存总量
events	文件描述符事件
cmd	最近一次执行的命令
  1. 主从建立socket连接
    • 每秒运行定时任务维护复制逻辑,直到成功;或者slaveof no one取消复制
    • 连接失败:Error condition on socket for SYNC:{socket_error_reason}
  2. 发送pingmingling
    1. 检查主从质检网络套接字是否可用
    2. 检测主从节点当前是否可接收处理命令
    3. 日志:Master replied to PING, replication can continue...
  3. 权限验证
    5. 主节点:如果配置了requirepass,就需要认证
    6. 从节点:配置相应的masterauth。
  4. 同步数据集
  5. 命令持续复制
    7. 上面的操作已经把数据同步完了,后面就持续把写命令发送给从库

数据同步

复制偏移量

  • 主节点在处理完毕写入命令之后,会把命令的字节长度做累加记录,统计信息在master_repl_offset
  • 对比主从节点的复制偏移量,判断是否数据一致

复制积压缓冲区(repl_backlog)

  • 保存在主节点上的一个固定长度的队列,默认为1M

  • 保存最近已复制的数据,用于部分复制和复制命令丢失的数据补救

  • 参数含义

    repl_backlog_active:1开启复制缓冲区
    repl_backlog_size:1048576缓冲区最大长度
    repl_backlog_first_byte_offset:2起始偏移量,计算当前缓冲区 可用范围
    repl_backlog_histlen:969335已保存数据的有效长度

参数信息

主库(info replication)

 127.0.0.1:7001> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=7004,state=online,offset=969336,lag=1
master_repl_offset:969336
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:969335

从库(info replication)

127.0.0.1:7004> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:7001
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:969350
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

主节点运行id

节点启动后动态分配的ID,用于唯一识别节点,ID变更后会发生全量复制

重启后会改变,需要使用debug reload命令重启并保持ID不变(命令会阻塞当前节点主线程),阻塞期间先生成rdb快照,并清空数据后再加载rdb文件。对于大数据量的主节点和无法容忍阻塞的应用场景慎用

  • 参数
127.0.0.1:7002> info server
# Server
redis_version:3.2.4
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:53849fee5fb41517
redis_mode:cluster
os:Linux 3.10.0-957.1.3.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.5
process_id:24334
run_id:698e129042d03211b71e7c3117e37731a3bc5eca
tcp_port:7002
uptime_in_seconds:700399
uptime_in_days:8
hz:10
lru_clock:4879595
executable:/usr/local/redis/3.2/redis-server
config_file:/etc/redis.d/redistest_7002.conf

psync(178)

  • 从节点使用psync命令完成部分复制和全量复制功能。

总览图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Effective C++学习第八天

条款26:尽可能延后变量定义式的出现时间当你定义了一个变量,如果在使用变量之前出现异常,那么你得承受一次构造成本和析构成本,而且你没有使用该变量;本条款给出的建议是延迟变量的定义,直到非得使用该变量…

Redis运维和开发学习笔记(6) 监控Redis工作状态-info命令

Redis运维和开发学习笔记(6) 监控Redis工作状态-info命令 文章目录Redis运维和开发学习笔记(6) 监控Redis工作状态-info命令info serverinfo clientinfo memoryinfo persistenceinfo statsinfo commandstatsinfo cpuinfo clusterinfo keyspaceinfo server Redis服务器相关的通用…

Effective C++学习第九天

条款32:确定你的public继承塑模出is-a模型class D(derived)以public形式继承class B(base),则每一个类型为D的对象同时也是一个类型为B的对象,反之不成立,因此B比D表现出更加一般化的…

Effective C++学习第十天

条款36:绝不重新定义继承而来的non-virtual函数non-virtual函数执行的是静态绑定,在编译器就已经决定,因此对象对用的函数只和指针的类型有关,而与指针所指的对象无关;记住non-virtual函数的性质:不变性凌驾…

Redis运维和开发学习笔记(7) 内存管理和过期策略

Redis运维和开发学习笔记(7) 内存管理和过期策略 文章目录Redis运维和开发学习笔记(7) 内存管理和过期策略内存回收策略惰性删除定时任务删除maxmemory过期策略allkeys-lru主从搭建测试搭建完毕主从测试结果volatile-lru测试结果volatile-ttl测试结果allkeys-lru内存回收策略 …

Effective C++学习第十一天

条款41:了解隐式接口和编译期多态面向对象编程世界总是以显式接口(源码可见的接口)和运行期多态(virtual)解决问题;对于templates及泛型编程的世界,隐式接口和编译期多态显得更加重要&#xff1…

Redis源码分析(零)学习路径笔记

文章目录第一阶段第二阶段 熟悉Redis的内存编码结构第三阶段 熟悉Redis数据类型的实现第四阶段 熟悉Redis数据库的实现第五阶段 熟悉客户端和服务器端的代码实现第六阶段 这一阶段主要是熟悉Redis多机部分的代码实现关于测试方面的文件有一些工具类的文件如下SORT命令的实现一些…

Effective C++学习第十二天

条款47:请使用traits classes表现类型信息STL有五类迭代器分类,input迭代器(只读,一次,向前)、output迭代器(可写,一次,向前)、forward迭代器(读/…

Redis源码分析(一)redis.c //redis-server.c

Redis源码分析(一)redis.c //redis-server.c 入口函数 int main() 4450 int main(int argc, char **argv) {4451 initServerConfig();4452 if (argc 2) {4453 ResetServerSaveParams();4454 loadServerConfig(argv[1]);4455 …

Linux 学习

1.linux文本命令行语言环境设置命令 查看当前语言环境: echo ¥LANG 修改: LANG选择的语言环境’ 引申:https://blog.csdn.net/huoyunshen88/article/details/41113633 2.linux中的硬链接和软连接 linux中文件的储存方式&#xf…

vivo C/C++工程师视频面试总结 20180802

1.自我介绍:有点儿紧张了,直接把自己简历上的一些信息信息说了一遍,说完之后在介绍了一下自己的平时的爱好和兴趣,感觉面试官没有理我,直接进入下一环节了。 2.项目详情:主要是自己最近的一个项目和自己负…

Redis源码分析(二)redis-cli.c

文章目录1. int main()2. parseOptions(int argc, char **argv) 进行ip和port的改变3. lookupCommand(char *name) 查找命令,判断命令合法3.2 strcasecmp(name,cmdTable[j].name)3.1 redisCommand cmdTable[]4. cliSendCommand(int argc, char **argv)4.1 cliConnec…

C语言中有bool变量吗?

1.C/C中定义的数据类型: C语言中定义了6种基本数据类型:short,int,long,float,double,char 4种构造类型:数组,结构体(struct),共用类型(union),枚举类型(enum) 指针类型和空类型 C语…

redis源码剖析(三)——基础数据结构

文章目录SDS链表字典这篇文章关于 Redis 的基础数据:SDS SDS (Simple Dynamic String)是 Redis 最基础的数据结构。直译过来就是”简单的动态字符串“。Redis 自己实现了一个动态的字符串,而不是直接使用了 C 语言中的字符串。 sds 的数据结…

C++迭代器使用错误总结

指针和迭代器的区别: 迭代器: (1)迭代器不是指针,是类模板,表现的像指针。他只是模拟了指针的一些功能,通过重载了指针的一些操作符,->,*, --等封装了指针,是一…

redis源码剖析(四)跳表

文章目录整数集合跳跃表压缩列表总结整数集合 当一个集合只包含整数,且这个集合的元素不多的时候,Redis 就会使用整数集合 intset 。首先看 intset 的数据结构: typedef struct intset {// 编码方式uint32_t encoding;// 集合包含的元素数量…

vivo C/C++工程师 HR视频面试问题总结20180807

一开始没想到这次视频面是HR面试,还以为是技术面试,毕竟上次面试的时候技术问题问的相对比较少,所以面试准备方向有点儿错了,不过还是总结一下具体问题。 1)自我介绍:吸取了上次自我介绍的经验,…

在Redis客户端设置连接密码 并演示密码登录

我们先连接到Redis服务 然后 我们要输入 CONFIG SET requirepass “新密码” 例如 CONFIG SET requirepass "A15167"这样 密码就被设置成立 A15167 我们 输入 AUTH 密码 例如 AUTH A15167这里 返回OK说明成功了 然后 我们退出在登录就真的需要 redis-cli -h IP地…

redis源码剖析(五)—— 字符串,列表,哈希,集合,有序集合

文章目录对象REDIS_STRING (字符串)REDIS_LIST 列表REDIS_SET (集合)REDIS_ZSET (有序集合)REDIS_HASH (hash表)int refcount(引用计数器)unsigned lru:REDIS_LRU_BITS对象 对于 Re…

函数sscanf小结

1.sscanf用于处理固定格式的字符串&#xff0c;包含在头文件<cstdio>中&#xff0c;函数原型为&#xff1a; int sscanf(const char *buffer,const char*format,[]argument ]...); 其中:buffer代表着要存储的数据&#xff0c;format 代表格式控制字符串&#xff0c;arg…