redis 笔记04 服务器、复制
服务器
1. 一个命令请求从发送到完成主要包括以下步骤:
1). 客户端将命令请求发送给服务器
2). 服务器读取命令请求,并分析出命令参数
3). 命令执行器根据参数查找命令的实现函数,然后执行实现函数并得出命令回复
4). 服务器将命令回复返回给客户端
2. serverCron函数默认每隔100毫秒执行一次,它的工作主要包括更新服务器状态信息,处理服务器接收的SIGTERM信号,管理客户端资源和数据库状态,检查并执行持久化操作等等。
3. 服务器从启动到开始处理客户端的命令请求需要执行以下步骤:
1). 初始化服务器状态结构。为结构中的各个属性设置默认值。
2). 载入服务器配置选项。
3). 初始化服务器数据结构。包括创建共享对象(思想),如一些常用字符串("OK"等),整数1到10000的字符串对象等等。
4). 还原数据库状态,即载入RDB或者AOF文件。
5). 执行事件循环,开始接受客户端的连接请求。
4. serverCron函数执行的主要操作:
1). 更新服务器时间缓存。每次获取系统当前时间太耗资源,可以将系统时间缓存起来。不重要的事件使用缓存时间,重要的事件依旧获取当前系统时间。(思想)
2). 更新LRU时钟。服务器时间缓存的一种。每个Redis对象都有一个lru属性,这个lru属性保存了对象最后一次被命令访问的时间。
3). 更新服务器每秒执行命令次数。可以通过INFO stats 命令的instantaneous_ops_per_sec域查看。
4). 更新服务器内存峰值记录。INFO memory命令的used_memory_peak和used_memory_peak_human两个域分别以两种格式记录了服务器的内存峰值。
5). 处理SIGTERM信号。服务器关闭信号。接收到该信号后,服务器在关闭自身之前会进行RDB持久化操作。(思想)
6). 管理客户端资源。关闭,重新分配输入缓冲区等。
7). 管理数据库资源。对服务器中的一部分数据库进行检查,删除过期键,对字段进行收缩操作等。
8). 执行被延迟的BGREWRITEAOF。
9). 检查持久化操作的运行状态。检查新的RDB文件是否新建完成,检查是否满足AOF重写条件等。
10). 将AOF缓冲区中的内容写入AOF文件
11). 关闭异步客户端。关闭那些输出缓冲区大小超出限制的客户端。
12). 增加cronloopse计数器的值。也即是serverCron函数执行的次数。
复制
1. Redis2.8以前的复制功能不能高效地处理断线后重复制情况,但Redis2.8新添加的部分重同步功能可以解决这个问题。
2. 部分重同步通过复制偏移量、复制积压缓冲区、服务器运行ID三个部分来实现。
3. 在复制操作刚开始的时候,从服务器会成为主服务器的客户端,并通过向主服务器发送命令请求来执行复制步骤,而在复制操作的后期,主从服务器会互相成为对方的客户端。
4. 主服务器通过向从服务器传播命令来更新从服务器的状态,保存主从服务器一致,而从服务器则通过向主服务器发送命令进行心跳检测,以及命令丢失检测。
5. 在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器(从服务器)去复制另一个服务器(主服务器)。
6. 旧版复制功能的实现:
1). 同步
a. 从服务器向主服务器发送SYNC命令
b. 主服务器执行BGSAVE命令,后台生成一个RDB文件,并使用缓存区记录从现在开始执行的所有写命令
c. 主服务器将RDB文件发送给从服务器,从服务器载入RDB文件
d. 主服务器将缓冲区的命令发送给从服务器
2). 命令传播:为了让主从服务器一直保持一致状态,主服务器需要对从服务器执行命令传播操作:主服务器将自己执行的写命令,发送给从服务器执行。
7. 旧版复制功能的缺陷: 断线复制会重新复制主服务器中的所有内容。
8. 新版复制功能的实现,Redis从2.8版本开始,使用PSYNC命令代替SYNC命令来执行复制时的同步操作。PSYNC命令具有完整重同步和部分重同步两种模式:
1). 完整重同步:执行的步骤和SYNC命令的执行步骤基本一样。
2). 部分重同步:只同步断开后的操作。
9. 部分重同步的实现:
1). 复制偏移量:主从服务器会分别维护一个复制偏移量。通过对比主从服务器的复制偏移量,程序可以很容易地知道主从服务器是否处于一致状态。
2). 复制积压缓冲区 : 复制积压缓冲区是由主服务器维护的一个固定长度先进先出队列,默认大小为1M。缓冲区里面会保存着一部分最近传播的写命令,并且复制积压缓冲区会为队列中
的每个字节记录相应的复制偏移量。
3). 服务器运行ID:初次连接时,主服务器会将运行ID传给从服务器,从服务器将该ID保存起来。断开重连时,根据此ID判断之前是否有复制关系。
10. 正确估算和设置复制积压缓冲区的大小非常重要。估算公式:second*write_size_per_second , second为连接平均所需时间。write_size_per_second 表示主服务器每秒产生的
写命令数据量。例如:每秒1M,5秒才能连接上,缓冲区大小就不能低于5M。安全起见可以设置为2倍。
11. PSYNC命令的实现:
PSYNC命令的调用方法有两种:
1). PSYNC ? -1 : 之前没有复制过
2). PSYNC <runid> <offset> , runid 主服务器运行ID , offset 偏移量
主服务器回复:
1). 完整重同步
2). 部分同步
3). 识别不了PSYNC,Redis版本低于2.8
12. 复制的实现
1). 设置主服务器的地址和端口:SLAVEOF <master_ip> <master_port>
2). 建立套接字连接
3). 发送PING命令
4). 身份验证
5). 发送端口信息,将从服务器监听端口通知给主服务器。
6). 同步
7). 命令传播
13. 心跳检测,在命令传播阶段,从服务器默认会以每秒一次的频率,向主服务器发送命令:REPLCONF ACK <replication_offset> (思想)
1). 检测从服务器的网络连接状态
2). 辅助实现min-slaves配置选项。防止主服务器在不安全的情况下执行写命令。例如,我们向主服务器提供以下设置:
min-slaves-to-write 3
min-slaves-max-lag 10
那么在从服务器的数量少于3个,或者三个从服务器的延迟(lag)值都大于或等于10秒时,主服务器将拒绝执行写命令。
3). 检测命令丢失。通过比较偏移量,可以检测出网络断线时,丢失的数据。重新发送给从服务器。
14. REPLCONF ACK命令和复制积压缓冲区都是Redis 2.8版本新增的,所以为了保证复制时主从服务器的数据一致性,最好使用2.8或以上版本
redis 笔记04 服务器、复制的更多相关文章
- Redis:学习笔记-04
Redis:学习笔记-04 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 10. Redis主从复制 1 ...
- Redis笔记(1)数据结构与对象
1.前言 此系列博客记录redis设计与实现一书的笔记,提取书本中的知识点,省略相关说明,方便查阅. 2.基本数据结构 2.1 简单动态字符串SDS(simple dynamic string) 结构 ...
- Redis笔记(八)Redis的持久化
Redis相比Memcached的很大一个优势是支持数据的持久化, 通常持久化的场景一个是做数据库使用,另一个是Redis在做缓存服务器时,防止缓存失效. Redis的持久化主要有快照Snapshot ...
- Redis的主从同步复制
先来看一下Redis的主从同步复制的原理: 在Slave启动并连接到Master之后,它将主动发送一条SYNC命令.此后Master将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台 ...
- 实战录 | Redis的主从服务器搭建
<实战录>导语 云端卫士<实战录>栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,希望对于关注我们的朋友有所裨益.本期分享人为云端卫士安全平台工程师田全磊,将带来Red ...
- 【原生态跨平台:ASP.NET Core 1.0(非Mono)在 Ubuntu 14.04 服务器上一对一的配置实现-篇幅1】
鸡冻人心的2016,微软高产年. build 2016后 各种干货层出不穷. 1 Win10 集成了bash ,实现了纳德拉的成诺,Microsoft Love Linux!!! 2 跨平台 ,收 ...
- OGG学习笔记03-单向复制简单故障处理
OGG学习笔记03-单向复制简单故障处理 环境:参考:OGG学习笔记02-单向复制配置实例 实验目的:了解OGG简单故障的基本处理思路. 1. 故障现象 故障现象:启动OGG源端的extract进程, ...
- Redis笔记——技术点汇总
目录 · 特点 · 安装 · 数据库 · 服务器命令 · 数据类型及其操作命令 · 数据结构 · string · list · set · hash · zset · 发布与订阅 · 排序 · 事务 ...
- Redis笔记5-redis高可用方案
一.哨兵机制 有了主从复制的实现以后,如果想对主服务器进行监控,那么在redis2.6以后提供了一个"哨兵"的机制.顾名思义,哨兵的含义就是监控redis系统的运行状态.可以启动多 ...
随机推荐
- css3 一个简单的静态立方体
<meta charset="utf8"> <style> .cube { position: absolute; left: 50%; top: 250p ...
- .htaccess伪静态实例分享
首先配置服务器启动重写模块打开 Apache 的配置文件 httpd.conf .将#LoadModule rewrite_module modules/mod_rewrite前面的#去掉.保存后重启 ...
- 第二百三十二节,Bootstrap排版样式
Bootstrap排版样式 学习要点: 1.页面排版 本节课我们主要学习一下 Bootstrap 全局 CSS 样式中的排版样式,包括了标题.页面 主体.对齐.列表等常规内容. 一.页面排版 Boot ...
- 实现Netty服务器与CocosCreate通信
尽量采用无锁化Netty通信处理棋牌房间逻辑 一,棋牌类服务器的特点 1,棋牌类不分区不分服 一般来说,棋牌游戏都是不分区不分服的.所以棋牌类服务器要满足随着用户量的增加而扩展的需要,所以需要设计Ga ...
- TaoKeeper
基于zookeeper的监控管理工具taokeeper,由淘宝团队开源的zk管理中间件: 按照taokeeper官方说明 http://jm-blog.aliapp.com/?p=1450 下载tao ...
- hdu 5090 Game with Pearls(最大匹配)
Game with Pearls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- java-web 过滤器 & 监听器 & 拦截器
Tomcat 的容器分为四个等级.真正管理 Servlet 的容器是 Context 容器,一个 Context 对应一个 Web 工程.在 Tomcat 的配置文件里能够非常easy发现这一点.例如 ...
- python 的时间复杂度
Python内置方法的时间复杂度 本文翻译自Python Wiki 本文基于GPL v2协议,转载请保留此协议. 本页面涵盖了Python中若干方法的时间复杂度(或者叫“大欧”,“Big O”).该时 ...
- Delphi数据库处理
Delphi数据库处理 第一节 BDE.ADO.InterBase和dbExpress Delphi中处理数据库主要有两种方法,也就是BDE.ADO,从Delphi 6.0开始还加入了一种dbExpr ...
- HYSBZ 2565 最长双回文串 (回文树)
2565: 最长双回文串 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1377 Solved: 714 [Submit][Status][Dis ...