以太工坊

以太工坊

以太工坊

复习课

考试题型

  1. 论述题(30分) -论述自己对概念的理解
  2. 分布式数据库设计及查询优化(20) -分布式数据库的设计,分片的设计、定义、对应的查询优化
  3. 分布式存取优化(30) -物理上的特征指标、传输代价的计算
  4. 存储结构设计 (10) -HBase设计、布隆过滤器设计(PPT)
  5. 分布式事务 (10) -一致性、并发控制
    三次作业分别对应了2、3、4项

章节回顾

第一章

• 大数据的由来(为什么会产生大数据存储系统?横向拓展需求、系统可靠可用、一致性需求在传统的关系模型下无法有效解决
• 大数据的特点
• 大数据需要怎样的存储系统

第二章

• 客户/服务器的体系结构(不同体系结构中AP功能的变化
• share nothing 架构、分库分表架构、存算分离架构与客户/服务器架构之间的关系(开放性问题,结合PPT与自己的理解)参考文章
• 关系型分布式数据库系统的模式结构
• 分布式数据库系统的数据透明性(三种、定义,举例;给操作语句判定是那种透明性)
• 多数据库系统和分布式数据库系统的区别与联系

第三章

• 分布式数据库设计的分片原则、定义(运算)、表示方法
• 分布式数据库的查询优化策略及片段查询优化方法
• 分布式查询的存取优化方法、特征参数的计算(选择运算、投影运算、自然连接运算、半连接运算)

第四章

• HBase解决了HDFS的哪些问题?具有哪些特点?
• HBase数据库中region的含义及其特性。同一个表不同行的数据可以存放在不同的服务器,同一个表相同行的数据也可以存放在不同的服务器。这句话如何理解?

一个服务器是Region的存储机构,但存储一个Region不代表存储一个表;每个Region都包含若干个Store,一个Store就是一个列族,是把列族作为对象存储的,不一定是一个表的,可能是不同表的分片。

• HBase增删改查的真正操作内容是什么?
• HBase的读写流程

HDFS 的优势: (大文件存储、多副本、自动分块)

  1. 如果仅用HDFS进行数据管理,存在一些问题:
  2. HDFS不支持对数据的随机改写
  3. HDFS没有数据表的概念
  4. HDFS无法针对行数统计、过滤扫描等常见数据查询
  5. 功能实现快捷操作,一般需要通过Mapreduce实现。

    HBase底层采用HDFS存储,但是文件结构和元数据等自身维护。具体来说具有以下特点:

  6. 采用面向列加键值对的存储模式
  7. 可实现便捷的横向扩展
  8. 可以实现自动的数据分片
  9. 实现较为严格的读写一致性和自动故障转移
  10. 实现对全文的检索与过滤(过滤器)

第五章

每种数据结构主要解决什么样的问题(场景)?实现原理?例如跳表主要支持快速写入,支持区间查询,更新代价低。B+树虽然也支持,但更新代价高,不支持大数据场景。LSM树跳表(内存)和多路文件归并、布隆过滤器(外存)的结合。

(1)跳跃表
• 解决的问题类型(快速写入、更新代价低、支持区间查询)
• 查找和插入的流程(实现原理)
跳表是LSM树的内存结构;
(2)LSM树
• 解决的问题类型 (“顺序写入,随机查找”)
• 什么是compaction?分为哪两种类型?优缺点。
• 为什么说LSM树是一种写入友好的数据结构?

(3)布隆过滤器
• 解决的问题类型(有效排除一些对象)
• 构造方法和查询过程(实现原理)

(4)为什么说HBase是一种“顺序写入,随机查找”的分布式数据库?

第六章

(1)嵌套事务的概念
(2)分布式数据库的一致性级别的内容,并可举例说明
(3)分布式数据库的CAP理论和BASE理论(会举例说明)
(4)分布式事务提交协议(两阶段提交协议执行流程,存在的问题-阻塞,解决的方法-终结协议
(5)HBase的一致性ACID特性的实现方法(了解)
(6)分布式一致性算法Paxos(主要流程)

第七章

• 并发控制的基本概念(解决的问题、可串行化调度)
• 分布式并发控制解决的问题(三种分布式锁的应用场景、方案思路)
• 分布式事务可串行化判定(题目)
• 三种分布式锁的应用场景及具体解决方案

主要介绍使用docker export快速导出单个容器镜像。

都说docker有”一次运行,处处使用”的优点,是实现Dev-ops的有力工具,那么本文相关内容就是其中一环。

利用export与import

先在某个容器里做一些修改,在根目录写入一个文本文件:

root@minedl:~# docker run -it ubuntu:latest
root@ba2179ff43aa:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@ba2179ff43aa:/# echo 1111 >> 1.txt
root@ba2179ff43aa:/# cat 1.txt
1111

使用docker export导出容器的镜像:

root@minedl:~# docker export ba2179ff43aa > me.tar
root@minedl:~# ls
me.tar  snap

使用docker import导入镜像,可以看到导入了名称为me的镜像:

root@minedl:~# docker import - me <  me.tar
sha256:8f5e159f2e21451ff2341526572bc3c67e9240454df0341a2ce447586b9e29a1
root@minedl:~# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
me            latest    8f5e159f2e21   4 seconds ago   77.8MB
mydoc         latest    40dd787fd6e9   9 minutes ago   77.8MB

使用导入的me镜像创建容器,查看之前在另一个容器做的修改是否保留:

root@minedl:~# docker run -it me /bin/bash
root@3f21d7037f50:/# ls
1.txt  bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@3f21d7037f50:/# cat 1.txt
1111

看到这已经不是之前那个容器,但是修改是保留了的。

针对单个容器可以使用这种方式快速导入导出,但如果是docker compose创建的容器群,就需要使用load和save了,load和import这两组命令除了使用场景不同,最关键的是export没有保存容器历史版本,可以看作一个时间点的快照。更详细的内容可以参考这篇文章

除了使用文件转移容器,还可以使用docker hub与docker file等方式。

0%