服务器

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 服务器、复制的更多相关文章

  1. Redis:学习笔记-04

    Redis:学习笔记-04 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 10. Redis主从复制 1 ...

  2. Redis笔记(1)数据结构与对象

    1.前言 此系列博客记录redis设计与实现一书的笔记,提取书本中的知识点,省略相关说明,方便查阅. 2.基本数据结构 2.1 简单动态字符串SDS(simple dynamic string) 结构 ...

  3. Redis笔记(八)Redis的持久化

    Redis相比Memcached的很大一个优势是支持数据的持久化, 通常持久化的场景一个是做数据库使用,另一个是Redis在做缓存服务器时,防止缓存失效. Redis的持久化主要有快照Snapshot ...

  4. Redis的主从同步复制

    先来看一下Redis的主从同步复制的原理: 在Slave启动并连接到Master之后,它将主动发送一条SYNC命令.此后Master将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台 ...

  5. 实战录 | Redis的主从服务器搭建

    <实战录>导语 云端卫士<实战录>栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,希望对于关注我们的朋友有所裨益.本期分享人为云端卫士安全平台工程师田全磊,将带来Red ...

  6. 【原生态跨平台:ASP.NET Core 1.0(非Mono)在 Ubuntu 14.04 服务器上一对一的配置实现-篇幅1】

    鸡冻人心的2016,微软高产年. build 2016后 各种干货层出不穷. 1 Win10 集成了bash  ,实现了纳德拉的成诺,Microsoft Love Linux!!! 2 跨平台  ,收 ...

  7. OGG学习笔记03-单向复制简单故障处理

    OGG学习笔记03-单向复制简单故障处理 环境:参考:OGG学习笔记02-单向复制配置实例 实验目的:了解OGG简单故障的基本处理思路. 1. 故障现象 故障现象:启动OGG源端的extract进程, ...

  8. Redis笔记——技术点汇总

    目录 · 特点 · 安装 · 数据库 · 服务器命令 · 数据类型及其操作命令 · 数据结构 · string · list · set · hash · zset · 发布与订阅 · 排序 · 事务 ...

  9. Redis笔记5-redis高可用方案

    一.哨兵机制 有了主从复制的实现以后,如果想对主服务器进行监控,那么在redis2.6以后提供了一个"哨兵"的机制.顾名思义,哨兵的含义就是监控redis系统的运行状态.可以启动多 ...

随机推荐

  1. C++ 类的多态一(virtual关键字--构造函数深刻理解)

    //virtual关键字--构造函数深刻理解 #include<iostream> using namespace std; /* C语言编译器,c++编译器全部是静态链编,就是一段一段代 ...

  2. django form POST方法提交表达

    之前就着手开始尝试用django来简化web开发的流程周期,果不其然,速度还行,当然前期的产品那就相当粗糙了.举例来说,就连最基本的登录都是抄别人的,最可怕的是用GET方法提交表单,今天就尝试解决这个 ...

  3. Asp.net中使用文本框的值动态生成控件的方法

    这篇文章主要介绍了Asp.net中使用文本框的值动态生成控件的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 看到一个网友,有论坛上问及,动态的生成checkbox控件,在文本框中输入一个“花 ...

  4. wchat_t与char互转

     C++ Code  1234567891011121314151617181920212223242526   //窄字符转宽字符 void ConvertA2W(wchar_t* the_strw ...

  5. SQL Server 数据库分离与附加(图文教程)

    from:http://www.jb51.net/article/36624.htm 一.概述 SQL Server提供了“分离/附加”数据库.“备份/还原”数据库.复制数据库等多种数据库的备份和恢复 ...

  6. 总结 一下UML 类图的关系

    1,实线三角 表示 泛化  是一种继承关系,它指定了子类如何特化父类的所有特征和行为 2,虚线三角 表示 实现  是一种类与接口的关系,表示类是接口所有特征和行为的实现 3,空心菱形 表示 聚合 是整 ...

  7. SQL Server 2008 R2 开启远程连接

    因为sql server 2008默认是不允许远程连接的,sa帐户也是默认禁用的,如果想要在本地用SSMS(SQL Server Management Studio Express) 连接远程服务器上 ...

  8. JRE not compatible with workspace .class file compatibility: 1.7

    在进行Eclipse开发的时候,经常会遇到一些小问题,现在开始每天积累一些小问题的解决方法.出现:JRE not compatible with workspace .class file compa ...

  9. Java模拟并发

    =========================one============================= public class Bingfa { public static void m ...

  10. python类的相关知识第二部分

    类的继承.多态.封装 一.类的继承 1.应用场景: 类大部分功能相同,大类包含小类的情况 例如: 动物类 共性:都要吃喝拉撒.都有头有脚 特性: 猫类.走了很轻,叫声特别,喜欢白天睡觉 狗类.的叫声很 ...