0%

觉得这篇论文的技术含量不高 但有利于快速的了解一下相关的技术

绪论

互联网的快速发展使得数据量持续爆发式的增长。应用架构也由向上扩展(Scale-up,提高单机性能)向分布式,横向扩展(Scale-out)。

传统关系型数据库:

要求 难题
事务一致性 高并发读写
读写实时性 海量数据的高效率存储和访问
复杂SQL查询 高扩展性和可用性

在很多互联网业务中:传统关系型数据库面临的难题是必须要解决的,而要求的哪些内容又不是业务必须的。

NoSQL 技术综述

NoSQL 可以说是解决另外一种数据存储问题,它不需要保证事务的ACID特性,对读写的实时性也不做强要求。但是由于数据的规模大,对存储的可扩展性,高可用性和高并发读写有很大的要求。
第一节先介绍NoSQL的一个定义,可以具有一定的启发意义。引入CAP理论,说明鱼与熊掌不可兼得。为了高可用而放弃对事务的支持。
为了满足可扩展性,数据需要重新编码而不是用强耦合的表结构。使得数据可以按照一定的规则分布到不同的节点上。
为了满足高可用性,则需要多副本存储数据,那么保持数据的一致性的要求有哪些协议。

NoSQL 概念与特性

NoSQL定义:

InfoSys Technologies 的首席技术架构师 Sourav Mazumder提出了非关系数据库的一个较为严谨的描述:

  1. 使用可扩展的松耦合类型数据模式来对数据进行逻辑建模;
  2. 为遵循CAP定理的跨多节点数据分布模型而设计,支持水平伸缩;
  3. 拥有在磁盘和(或)内存中的数据持久化能力;
  4. 支持多种接口来进行数据访问。

NoSQL 因为对性能和可扩展性的要求而不支持事务机制,一般只提供对行级别的原子性的保证不支持跨行更新的原子性,即对于k-v对,只保证对一个key中的value的修改是原子性的。

CAP理论:

  • 一致性(Consistence) (等同于所有节点访问同一份最新的数据副本)
  • 可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)
  • 分区容错性(Network partitioning)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择[3]。)

根据定理,分布式系统只能满足三项中的两项而不可能满足全部三项。P是分布式系统一定存在的现象,那只能在C和A之间选择一个。考虑这样的一个场景,为了保证C,那么各个数据节点的数据必须一致,一个节点更新数据之后,如果这时候出现了网络分区(P),这个更新就不能通知到所有的节点。为了满足C,那么只能等待那个分区节点恢复通讯之后,达到C才能提供服务。这样就不满足A了。

现在觉得CAP定理已经基本上是一个理论了,由于Raft等一致性算法存在,使得只要大部分节点有用,就能使得系统有用。所以在满足C的情况下A也可以基本满足。那剩下的就是Raft等一致性算法对于性能的影响了

根据CAP理论, NoSQL有两个层次的一致性:强一致性和最终一致性(存在不一致窗口)。

数据模型

数据库的数据模型指的是数据在数据库中的组织方式,数据库的操作模型指的是存取这些数据的方式。

  1. k-v值得数据模型:
    key-value存储
    key-结构化数据存储:它将key-value存储中value的扩展为结构化的数据类型,包括数字、字符串、列表、集合以及有序集合。
    key-文档存储:value是结构化文档,通常这些文档是被转换成JSON或类似JSON的结构进行存储。
    BigTable的列式存储:列式存储可以这样理解,将行ID、列簇号、列号以及时间戳一起组成一个Key,然后
    将Value按key的顺序进行存储。列存储中不同于行存储(上面的3个是行存储)。
  2. 图结构数据模型

分布式扩展

分布式的可扩展性,其实主要是数据要如何分布到不同的节点上。而访问时的负载均衡,各个节点中的数据比较均匀,添加节点和删除节点时的动态迁移。都是需要考虑的。

数据如何存储到不同节点上,在k-v的模型下还是很容易实现的:

  1. 哈希分区
    最简单的h(key)mod(n)的值分布到n个节点中。
  2. 范围分区
    为没有节点维护一个key的范围,将范围内的数据存到对应的节点中。

范围分区是比哈希分区在实践中更好的一种分区方式,可以更好的达到数据的均衡分布和动态迁移。但是要维护更多的元数据信息。

详细讲解见:带着问题学习分布式系统之数据分片

数据可靠性

  1. 单机可靠性:写到磁盘,提升性能合并多个写,在flush下盘。
  2. 多机可靠性:
    最简单的是主从数据同步的方式:所有在master上执行的操作,都会通过类似于操作日志的结构顺序地传递给slave上再执行一遍。若master宕机,slave可以继续执行完master传来的操作日志并且成为新的master。可能中间会导致一些数据丢失,因为master同步到是非阻塞的,并不知道操作是否已经完成。

这样说raft也是主从数据同步的一种方式,只是保证了数据的强一致性,和故障的自动恢复。这两个就是分布式系统的两个想要实现性质和实现难点

数据的可靠性是通过冗余数据保证的,上面的多机可靠性是异步同步复制(保证数据一致性的最弱的一个版本)。

Paxos可以是一个去中心化的模型,不好实现。(性能也不好)现在主流的还是使用中心化副本控制协议。

详细讲解见:带着问题学习分布式系统之中心化复制集

MongoDB 简介

MongoDB 的设计定位是在具有key/value存储方式的高性能和高度扩展性的同时,具备传统的关系数据库管理系统的丰富功能,集两者的优势于一身,MongoDB使用数据结构松散的BSON格式,面向文档存储数据,使用自动分片(auto-sharding) 范围分区实现海量数据存储,支持全类型索引,使用的查询语言语法类似面向对象查询语言,可以实现类似关系数据库单表查询的绝大部分功能,支持主从和复制集(replica set) 两种数据复制机制

replica set 是是一组数据库节点存储相同数据互作冗余,通过节点之间的数据同步和主节点选举提供故障自动转移和成员节点自动恢复。 可以使用raft一致性算法

详细见:MongoDB 存储与查询机制

参考文献

[1]沈姝. NoSQL数据库技术及其应用研究[D].南京信息工程大学,2012.
wiki cap定理
[3] CAP理论十二年回顾:”规则”变了. InfoQ.
带着问题学习分布式系统之数据分片
带着问题学习分布式系统之中心化复制集

前言

一路走来,很多巧合组合在一起。使得我现在在看分布式系统。

大二时因为需要创新学分,就申报了《可重复数据删除系统》的srp项目。觉得是因为这个项目,在面试华为实习时,被分到了华为的Cloudfs项目组,算是进入了云计算这个领域。在这个项目中接触了docker容器,cicd,文件系统等开发知识。

结束实习之后为了以后能够更好的在项目组中发展,觉得有必要好好的学习一下分布式系统相关的知识。所以在选毕设的时候有目标的选一些和分布式相关的项目。这时候刚好看到 《TiDB架构分析和简单应用》简单了解TiDB之后,觉得TiDB是一个很好的项目。也很满足自己现在想要学习分布式的一些理念。就选了这个作为我的毕设题目。

欢迎各位对我的总结提出意见,如果觉得我有什么讲错的,讲的不好的,欢迎各位指出。我将不胜感激!

关系数据库

在研究分布式数据库之前让我们先了解一些关系型数据的一些基本知识。使得我们理解分布式数据时有一个好的基础。

汗颜,但我重新看《数据库系统概念》时,感觉自己好像之前完全没有学过这本书。

下面我主要分SQL语句和事务两部分讲解。

SQL语句

事务

参考文献

《数据库系统概念 原书第六版》

分布式系统

以Google三驾马车开始:

  1. Google File System:
    中文版 英文版
  2. Google MapReduce:
    中文版 英文版
  3. Google BigTable:
    中文版 英文版

参考文献

Google三驾马车论文

分布式数据库

TiDB实现

背景

一直想要有一个自己的博客,简约而清晰。但一开始苦于没有合适的平台,就一直没有搭建。
最近在找资料的时候经常看到我这个模板的网站,就google了一下,开始了自己搭建网站之路。

github pages 提供了服务器,hexo提供了博客框架

  1. Github Pages 是什么
    如果你对编程有所了解,就一定听说过github。它号称程序员的Facebook,有着极高的人气,许多重要的项目都托管在上面。
    简单说,它是一个具有版本管理功能的代码仓库,每个项目都有一个主页,列出项目的源文件。
    但是对于一个新手来说,看到一大堆源码,只会让人头晕脑涨,不知何处入手。他希望看到的是,一个简明易懂的网页,说明每一步应该怎么做。因此,github就设计了Pages功能,允许用户自定义项目首页,用来替代默认的源码列表。所以,github Pages可以被认为是用户编写的、托管在github上的静态网页。

  2. hexo 博客框架
    有了github pages之后,你的静态页面能够托管了,但是如何编写和管理这些静态页面呢?
    就有了Hexo。而且支持使用Markdown模板生成静态页面,这正符合我的需求。

Hexo安装与快速上手

Hexo 官方文档

安装前提

安装 Hexo 相当简单。然而在安装前,您必须检查电脑中是否已安装下列应用程序:

  1. Git
  2. Nodejs

安装与使用

1
2
3
4
5
6
# 设置 npm 为国内镜像提升安装速度,如果你已经设置过了请忽略
npm config set registry https://registry.npm.taobao.org/

# 安装 Hexo
npm install -g hexo-cli

使用查看 hello-world

申请github pages与hexo部署git

制作自己的github pages网页:官方文档

按照步骤等到自己的 https://yourname.github.io 网站

部署git:

  1. 按照 hexo-deployer-git:
    npm install hexo-deployer-git --save
  2. 修改 _config.yml 中的 deploy参数:
    如下:
    1
    2
    3
    4
    deploy:
    type: git
    repo: git@github.com:karellincoln/karellincoln.github.io.git
    branch: master
    具体参数看hexo官方文档。

配置与next主题

网站通用配置

修改 _config.yml 文件

  1. 语言: language: zh-Hans
  2. 主题: theme: next
  3. 添加评论:
    disqus_shortname: your_disqus_shortname
    disqus需要翻墙,申请账号之后选 I want to install Disqus on my site
    添加自己的shortname和在配置文件中添加关联的网站。
    详细教程
  4. 添加资源文件夹:post_asset_folder: true
    为true以后 hexo new [layout] <title> 会生成对应的title文件夹。在.md文件中可以使用相对路径引用title文件夹中的文件。
    如:[images](images.png) 直接使用相对路径

next 主题配置

Next github网址与教程

  1. 下载NexT:
    git clone --branch v5.1.2 https://github.com/iissnan/hexo-theme-next themes/next

  2. 更改网址主题:如上2

  3. 开启评论:

    1
    2
    3
    4
    5
    # Disqus
    disqus:
    enable: true
    shortname: karellincoln
    count: true
  4. 添加tags 和 categories(标签和目录):

    1
    2
    hexo new page "tags"
    hexo new page "categories"

    其他配置

  5. 其他个人和插入配置

Hexo个人网站的协同合作

在_config.yml 中部署git之后,使用hexo deploy 会直接push到branch参数的分支(master)上。而push上去的网站的代码,源文档没有push上去,不利于多机或多人共同工作。

解决方案:

  1. 在yourname.github.io项目上添加新的分支保存源文档,便于管理。
    做完hexo的安装和设置主题之后,在项目目录下执行

    1
    2
    3
    4
    5
    6
    7
    git init
    git checkout -b newbranch
    git add -A
    git commit -m "comment"
    git remote add origin "github project"

    git push -u origin newbranch
  2. git push 会报错:因为当前的项目中有子git 项目Next,而没有对应的submodule信息。
    为了方便直接删除next中的.git文件夹。
    add,commit之后重新push。
    这里没有验证过,我是通过 git submodule add ... 方式添加子模块解决的。

  3. 为了方便,在github官网将newbranch设置为默认分支。

  4. 到了新的电脑上时,我们需要将项目先下载到本地,然后再进行hexo初始化。

    1
    2
    3
    4
    5
    git clone https://github.com/yourname/yourname.github.io.git
    cd yourname.github.io
    npm install hexo
    npm install
    npm install hexo-deployer-git –save

使用markdown和一些有用的标签插件

  1. Front-matter
    Front-matter 是文件最上方以 ---分隔的区域,用于指定个别文件的变量,举例来说:

    1
    2
    3
    4
    5
    6
    7
    8
    title: Hello World
    date: 2013/7/13 20:46:25
    categories:
    - Diary
    - Life
    tags:
    - PS3
    - Games

    其中tags标签下的 PS3 和Games是平级的,但是categories 下的Diary和Life是有层级的相当于Diary/Life目录下。

  2. 我觉得有一个经常可能需要用到的一个,引用自己其他篇文章,能不能直接引用当前文件夹的title.md文件呢?
    结果发现不可以!!!!
    需要采用 /year/month/day/title 的方式引用自己的文章。

  3. 标签插件

给Hexo搭建的博客增加百度谷歌搜索引擎验证

在网站中添加html验证文件。同时配置sitemap文件方便google搜索。
具体操作参考:给Hexo搭建的博客增加百度谷歌搜索引擎验证

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment