多机数据库的实现

一、复制

  slaveof  主服务器ip地址。形成主从关系。

  1、同步  

     从向主服务器发送sync命令。

     主服务器收到sync命令执行bgsave,生成rdb文件,缓冲区同时记录从现在开始执行的所有命令。

     主服务器执行完毕bgsave命令,会将rdb文件发送给从服务器,从服务器接收并载入这个rdb文件,同步给主服务器状态

     主服务器发送缓冲区的命令给从服务器,从服务器执行当前命令,保持数据最终一致。 

  2、命令传播

    第一步同步,类似于初始化。

    后续还需要,主从服务器实时同步。

    主服务器将 写命令同步发送给从服务器执行。保持主从一致。

  3、断点续传

    psync 分为完全同步,部分同步

    (1)复制偏移量

      • 主服务器每次想从服务器创博N个字节数据时,同时将自己的复制偏移量加N.
      • 从服务器接收N个字节数据,同时更新自己的偏移量加N.       

    (2)复制积压缓冲区

      • 主服务器将缓冲区命令发送给从服务器,同时更新复制积压缓冲区,标记命令字节的偏移量。
      • 主服务器会根据这个积压偏移量,选择同步命令的方式。              

    (3)同步服务器ID

        根据ID和存储的ID对比选择不同的同步方式。

二、Sentinel

  哨兵策略是redis高可用的解决方案(一个或者多个哨兵实例组成的哨兵系统),可以监视多个主服务器。

   (1)故障转移

      • 监测到主服务器下线,选举主服务器下的一个从服务器升级为主服务器.
      • 通知其他从服务器,更新主服务器地址.
      • 监视下线服务器,并将下线的服务器升级为从服务器.

三、集群

  集群实现了分布式数据库解决方案

  1、节点:cluster meet <ip><port>

    node节点发送上述命令到指定的ip:port节点,它们进行握手,成功后,将指定的ip:port节点添加到node的集群中。

  2、启动节点

    一个节点就是一个运行在集群模式下的redis服务器,根据cluster-enable来判断是否开启集群模式。

  3、配置槽位:通过分片方式来保存数据库中的键值对,集群的整个数据库被分为 0~16384个槽位

    cluster addslots <一个或者多个槽位>

   节点之间互相同步自己的槽位

    数据库要处理的键属于哪个槽 ->指派当前节点->没有的话,moved,下一个->直到找到为止

       键槽位算法:cluster keyslot <key>

4、重新分片

    moved  槽的负责权有一个节点转移到另一个节点

  ask   槽迁移过程中使用的临时措施

  5、复制故障转移

    集群分为主节点和从节点,主节点用于处理槽,子节点用于复制主节点

    在主节点下线时,代替主节点继续处理命令请求。

    cluster replicate <node-id>  node-id 为主节点,接收此命令的节点为子节点

Redis 设计与实现 (五)--多机数据库的实现的更多相关文章

  1. Redis设计与实现2.1:数据库和事件

    数据库和事件 这是<Redis设计与实现>系列的文章,系列导航:Redis设计与实现笔记 数据库 数据库的结构定义在 redis.h/redisServer 这个结构体中,这个结构体有许多 ...

  2. Redis(三):多机数据库的实现

    复制 在Redis中,用户可以通过SLAVEOF命令或是slaveof选项设置服务器的主从关系,从(SLAVE)服务器会复制主(Master)服务器. 旧版复制功能实现(2.8以前) 旧版复制功能主要 ...

  3. Redis学习笔记三:多机数据库的实现

    1.复制 执行slaveof命令或者设置slaveof选项,让一个服务器去复制另外一个服务器. 旧版复制功能的实现(Redis 2.8 之前的版本) 复制功能分为同步和命令传播两个操作. 同步(syn ...

  4. Redis 设计与实现 (二)--数据库

    typedef struct redisDb { dict *dict; /* The keyspace for this DB */ dict *expires; /* Timeout of key ...

  5. Redis设计与实现(一~五整合版)【搬运】

    Redis设计与实现(一~五整合版) by @飘过的小牛 一 前言 项目中用到了redis,但用到的都是最最基本的功能,比如简单的slave机制,数据结构只使用了字符串.但是一直听说redis是一个很 ...

  6. Redis多机数据库

    复制 PSYNC命令具有完整重同步(full resynchronization)和部分重同步(partial resynchronization)两种模式: ·其中完整重同步用于处理初次复制情况:完 ...

  7. 探索Redis设计与实现9:数据库redisDb与键过期删除策略

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  8. Redis | 第4章 Redis中的数据库《Redis设计与实现》

    目录 前言 1. Redis中的数据库 2. 数据库的键空间 3. 键的生成时间与过期时间 4. Redis中的过期键删除策略 5. AOF.RDB和复制功能对过期键的处理 5.1 生成 RDB 文件 ...

  9. 《Redis设计与实现》- 数据库

    1. 服务器中数据库结构 Redis 服务器将所有数据库都保存在服务器状态 redisServer 结构的 db 数组中,由 redisDb 结构代表一个数据库 struct redisServer ...

随机推荐

  1. [转] JavaScript中in操作符(for..in)、Object.keys()和Object.getOwnPropertyNames()的区别

    ECMAScript将对象的属性分为两种:数据属性和访问器属性.每一种属性内部都有一些特性,这里我们只关注对象属性的[[Enumerable]]特征,它表示是否通过 for-in 循环返回属性,也可以 ...

  2. spark ML pipeline 学习

    一.pipeline 一个典型的机器学习过程从数据收集开始,要经历多个步骤,才能得到需要的输出.这非常类似于流水线式工作,即通常会包含源数据ETL(抽取.转化.加载),数据预处理,指标提取,模型训练与 ...

  3. RabbitMQ原理图

    一.RabbitMQ 原理图 二.Rabbit 交换器讲解 1 Direct 交换器(发布与订阅 完全匹配)                       1.2搭建环境               1 ...

  4. 2018-2019 20165220 网络对抗 Exp5 MSF基础

    实验任务 1.1一个主动攻击实践,如ms08_067; (1分) 1.2 一个针对浏览器的攻击,如ms11_050:(1分) 1.3 一个针对客户端的攻击,如Adobe:(1分) 1.4 成功应用任何 ...

  5. Spark WordCount的两种方式

    Spark WordCount的两种方式. 语言:Java 工具:Idea 项目:Java Maven pom.xml如下: <properties> <spark.version& ...

  6. 谈谈代码中的this

    js中我们常常会遇到this,this的具体指向问题对于很多同学来说是很懵懂的:就想lz刚开始接触时候就是一脸的懵逼,经常被一些题目转的眼花缭乱.那么今天lz就跟大家一起交流一下这个this的指向问题 ...

  7. python可视化库 Matplotlib 00 画制简单图像

    1.下载方式:直接下载Andaconda,简单快捷,减少准备环境的时间 2.图像 3.代码:可直接运行(有详细注释) # -*- encoding:utf-8 -*- # Copyright (c) ...

  8. On the Optimal Approach of Survivable Virtual Network Embedding in Virtualized SDN

    Introduction and related work 云数据中心对于虚拟技术是理想的创新地方. 可生存性虚拟网络映射(surviavable virtual network embedding ...

  9. Hive管理表分区的创建,数据导入,分区的删除操作

    Hive分区和传统数据库的分区的异同: 分区技术是处理大型数据集经常用到的方法.在Oracle中,分区表中的每个分区是一个独立的segment段对象,有多少个分区,就存在多少个相应的数据库对象.而在P ...

  10. 根据dateFormatter创建NSDate类型数据

    根据dateFormatter 2000-01-01 创建NSDate类型数据 NSDateFormatter *dateFormatter = [NSDate shareDateFormatter] ...