redis 笔记04 服务器、复制

服务器数据库

1. 一个命令请求从发送到完成主要包括如下步骤:缓存

    1). 客户端将命令请求发送给服务器安全

    2). 服务器读取命令请求,并分析出命令参数服务器

    3). 命令执行器根据参数查找命令的实现函数,而后执行实现函数并得出命令回复网络

    4). 服务器将命令回复返回给客户端数据结构

2. serverCron函数默认每隔100毫秒执行一次,它的工做主要包括更新服务器状态信息,处理服务器接收的SIGTERM信号,管理客户端资源和数据库状态,检查并执行持久化操做等等。异步

3. 服务器从启动到开始处理客户端的命令请求须要执行如下步骤:函数

    1). 初始化服务器状态结构。为结构中的各个属性设置默认值。oop

    2). 载入服务器配置选项。spa

    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或以上版本

相关文章
相关标签/搜索