服务器

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. css3 一个简单的静态立方体

    <meta charset="utf8"> <style> .cube { position: absolute; left: 50%; top: 250p ...

  2. .htaccess伪静态实例分享

    首先配置服务器启动重写模块打开 Apache 的配置文件 httpd.conf .将#LoadModule rewrite_module modules/mod_rewrite前面的#去掉.保存后重启 ...

  3. 第二百三十二节,Bootstrap排版样式

    Bootstrap排版样式 学习要点: 1.页面排版 本节课我们主要学习一下 Bootstrap 全局 CSS 样式中的排版样式,包括了标题.页面 主体.对齐.列表等常规内容. 一.页面排版 Boot ...

  4. 实现Netty服务器与CocosCreate通信

    尽量采用无锁化Netty通信处理棋牌房间逻辑 一,棋牌类服务器的特点 1,棋牌类不分区不分服 一般来说,棋牌游戏都是不分区不分服的.所以棋牌类服务器要满足随着用户量的增加而扩展的需要,所以需要设计Ga ...

  5. TaoKeeper

    基于zookeeper的监控管理工具taokeeper,由淘宝团队开源的zk管理中间件: 按照taokeeper官方说明 http://jm-blog.aliapp.com/?p=1450 下载tao ...

  6. hdu 5090 Game with Pearls(最大匹配)

    Game with Pearls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  7. java-web 过滤器 &amp; 监听器 &amp; 拦截器

    Tomcat 的容器分为四个等级.真正管理 Servlet 的容器是 Context 容器,一个 Context 对应一个 Web 工程.在 Tomcat 的配置文件里能够非常easy发现这一点.例如 ...

  8. python 的时间复杂度

    Python内置方法的时间复杂度 本文翻译自Python Wiki 本文基于GPL v2协议,转载请保留此协议. 本页面涵盖了Python中若干方法的时间复杂度(或者叫“大欧”,“Big O”).该时 ...

  9. Delphi数据库处理

    Delphi数据库处理 第一节 BDE.ADO.InterBase和dbExpress Delphi中处理数据库主要有两种方法,也就是BDE.ADO,从Delphi 6.0开始还加入了一种dbExpr ...

  10. HYSBZ 2565 最长双回文串 (回文树)

    2565: 最长双回文串 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1377  Solved: 714 [Submit][Status][Dis ...