分布式数据库技术相关知识概述

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式数据库技术相关知识概述相关的知识,希望对你有一定的参考价值。

分布式数据库技术-基础知识概述

1. NoSQL数据库的类型有哪些?

NoSQL数据库的四种类型是:

  1. 键值数据库,应用于分布式数据存储与管理;
  2. 列族数据库,用于分布式数据存储与管理;
  3. 文档数据库,应用于存储索引并管理面向文档的数据或者类似的半结构化数据;
  4. 图形数据库。

键值对存储数据库,列存储数据库,文档型数据库,图形数据库

2. 怎么判断一个数据库是否是NoSQL数据库?

  • 非关系型
  • 分布式
  • 开放源码
  • 具有横向扩展能力

3. NoSQL技术诞生的最初发点是为了解决什么问题?

  1. 解决传统关系型数据库无法解决的数据存储及访问问题。
  2. 要解决大数据应用问题。
  3. 要解决互联网上应用问题。
  4. 要解决处理速度的响应和海量数据的储存问题。

4. 列族数据库存储结构?

  1. 命名空间
  2. 行键
  3. 列族

5. NoSQL数据库有哪些不同类型并举例说明?

  1. 键值数据库

相关产品:Redis、Riak、SimpleDB、Chordless、Scalaris、Memcached

  1. 列族数据库

相关产品:BigTable、HBase、Cassandra、HadoopDB、GreenPlum、PNUTS

3 . 文档数据库

相关产品:MongoDB、CouchDB、ThruDB、CloudKit、Perservere、Jackrabbit

  1. 图形数据库

相关产品:Neo4J、OrientDB、InfoGrid、GraphDB

6. 文档数据库存储的基本元素是哪些?

  1. 键值对
  2. 文档
  3. 集合
  4. 数据库

7. Nosql事务处理的BASE特点指的是?

基本可用、软状态、最终一致性

8. TRDB擅长解决哪些问题,NoSQL擅长解决问题?

  • TRDB擅长解决结构化数据
  • NoSQL擅长解决非结构或半结构化数据

9. CAP定理的三大特性?

一致性,可用性,分区容错性

10. MongoDB的特点是什么?

  1. 高性能
  2. 丰富的查询语言
  3. 高可用性
  4. 水平扩展能力
  5. 多个存储引擎的支持

数据文件存储格式为BSONB;
对于文档内的对象可以创建索引;
将图片、视频等文件转换成二进制的数据;

11. MongoDB由什么语言编写和实现的?

  • C++

12. MongoDB数据库的命名规则?

  • 符合UTF-8标准的字符串
  • 不能是空字符串,如""
  • 不得含有“”(空格)、.、$、/、\\、\\0(空字符)
  • 区分大小写,建议全部小写
  • 名称最多为64字节
  • 不得使用保留的数据库名,如admin、local、config、test

13. MongoDB成为最好NoSQL数据库的原因是什么?

  • 面向文件的
  • 高性能
  • 高可用性
  • 易扩展性
  • 丰富的查询语言

14. MongoDB运行必须需要大量RAM内存?

不需要大量内存

15. Redis的基本数据结构类型有哪些?Redis集群模式?

  • String类型、Hash类型、链表、Set集合

  • Redis的集群模式中可以实现多个节点同时提供写操作,redis集群模式采用无中心结构,每个节点都保存数据,节点之间互相连接从而知道整个集群状态。

16. MongoDB的主要特征是什么?mongodb的分片集群的组成?

MongoDB的主要特征是:MongoDB的提供了一个面向文档存储,操作起来比较简单和容易。

特点

  1. MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
  2. Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  3. MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段。
  4. Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  5. Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  6. Map函数和Reduce函数是使用javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  7. GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  8. MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。

一个 MongoDB 分片集群的组成:

  1. shard:每个分片是整体数据的一部分子集。每个分片都可以部署为副本集。强烈建议在生产环境下将分片部署为副本集且最少部署 2 个分片
  2. mongos:充当查询路由器,提供客户端应用程序和分片集群之间的接口。应用程序直接连接 mongos 即可,可以部署一个或多个。
  3. config servers:配置服务器存储集群的元数据和配置(包括权限认证相关)。从 MongoDB 3.4 开始,必须将配置服务器部署为副本集(CSRS,全称是 Config Servers Replica Set)。

17. MongoDB配置文件采用什么格式?

采用YAML格式

18. MongoDB和Redis数据库有什么区别?

  • Redis主要把数据存储在内存中,其“缓存”的性质远大于其“数据存储“的性质,其中数据的增删改查也只是像变量操作一样简单;
  • MongoDB却是一个“存储数据”的系统,增删改查可以添加很多条件,就像SQL数据库一样灵活
名称	
类型	
数据存储选项	
查询类型	
附加功能
Redis	
基于内存的非关系型数据库	
字符串、列表、集合、哈希、有序集合	
针对数据类型有专属命令,另有批量操作和不完全的事务支持	
发布与订阅、复制、持久化、脚本扩展
MongoDB	
基于硬盘的非关系型文档存储数据库	
无 schema 的 BSON 文档	
创建、读取、更新、删除、条件查询等	
复制、分片、空间索引等

19. MongoDB中查看数据库和集合的命令?

show  dbs;

20. 什么是“mongod”进程和“mongo”进程?

  1. mongod是处理MongoDB系统的主要进程。它处理数据请求,管理数据存储,和执行后台管理操作。

当我们运行mongod命令意味着正在启动MongoDB进程,并且在后台运行。

  1. 什么是"mongo" 它是一个命令行工具用于连接一个特定的mongod实例。

当我们没有带参数运行mongo命令它将使用默认的端口号和localhost连接

21. MongoDB中的基本命令?根据条件修改一条数据和多条数据的内容命令?

  • update() 方法
db.集合名称.update(query, update, multi: boolean)
  • query:查询条件
  • update:更新操作符
  • multi:可选,默认是false,表示只更新找到的第一条数据,值为true表示把满足条件的数据全部更新
db.stu.update(name:'hr',name:'mnc')           # 全文档进行覆盖更新
db.stu.update(name:'hr',$set:name:'hys')    # 指定键值更新操作
db.stu.update(,$set:gender:0,multi:true)  # 更新全部

multi参数必须和$set一起使用!

  • save() 方法
db.集合名称.save(document)
db.stu.save(_id:'20170101', name:'gj', gender:2)
db.stu.save(name:'gj', gender:2)
db.stu.find()

save() 方法通过传入的文档替换已有文档

:如果 save() 法也指定了_id,则对文档进行更新;未指定_id则会执行插入功能,MongoDB 默认自动生成一个不重复的_id

  • update() 方法仅适用于修改某条数据中的某个键值;
  • save() 方法适用于修改整条数据。

22. Redis的几个常见命令?Redis中常见字符串命令

STRING 拥有一些和其他键值存储相似的命令,比如 GET(获取值),SET(设置值),DEL(删除值)
1.$ redis-cli  
2.redis-cli 127.0.0.1:6379> set hello redis  
3.OK  
4.redis-cli 127.0.0.1:6379> get hello  
5."redis"  
6.redis-cli 127.0.0.1:6379> del hello  
7.(integer) 1  
8.redis-cli 127.0.0.1:6379> get hello  
Redis中的列表
LPUSH 命令可用于将元素推入列表的左侧
RPUSH 命令可将元素推入列表的右侧
LPOP 和 RPOP 就分别从列表的左侧和右侧弹出元素
LINDEX 可以获取指定位置上的元素
LRANGE 可以获取指定范围的全部元素

Redis 字符串执行自增和自减的命令列表如下:

命令用法说明
INCRINCR keykey 存储的值加上 1
DECRDECR keykey 存储的值减去 1
INCRBYINCRBY key incrementkey 存储的值加上 increment
DECRBYDECRBY key decrementkey 存储的值减去 decrement
INCRBYFLOATINCRBYFLOAT key incrementkey 存储的值加上浮点数 increment

Redis 还可以对字节串的一部分内容进行读取/写入:

命令用法说明
APPENDAPPEND key valuevalue 追加到 key 键存储的值的末尾
GETRANGEGETRANGE key start end获取 startend 间的子串
SETRANGESETRANGE key offset valuestart 偏移量开始,将与 value 长度一致的子串设置为 value

常用的列表命令:

命令用法说明
LPUSHLPUSH key value [value ...]将一个或多个 value 推入到列表的左侧
RPUSHRPUSH key value [value ...]将一个或多个 value 推入到列表的右侧
LLENLLEN key返回列表 key 的长度
LREMLREM key count value根据参数 count 的值,移除列表中与参数 value 相等的元素

23. Redis订阅命令?

Redis 发布订阅命令:

序号命令及描述
1PSUBSCRIBE pattern [pattern ...]
订阅一个或多个符合给定模式的频道。
2PUBSUB subcommand [argument [argument ...]]
查看订阅与发布系统状态。
3PUBLISH channel message
将信息发送到指定的频道。
4PUNSUBSCRIBE [pattern [pattern ...]]
退订所有给定模式的频道。
5SUBSCRIBE channel [channel ...]
订阅给定的一个或多个频道的信息。
6UNSUBSCRIBE [channel [channel ...]]
指退订给定的频道。

24. Redis消息发布/订阅机制的原理是什么?主要命令有哪些?

发布原理:发布消息时现根据chanel找到对应订阅者链表,然后遍历发送消息。

订阅原理:Redis的底层结构中,Redi服务器结构体中定义了一个pubsub_channels字典,维护了频道和订阅者的对应关系,每次客户端添加订阅时将对应的客户端信息添加到链表的末尾

主要命令:

  1. ping 沟通命令,查看状态
  2. dbsize 查看当前数据库中key的数量
  3. selectdb切换库命令
  4. flushdb 删除当前数据库的所有数据
  5. exit或者quit 退出客户端连接

25. 如何启动redis服务?

  1. 直接启动
    进入redis根目录下,在bin目录中找到redis-server,执行如下命令:./redis-server &

注意:如果加上 ‘&’ ,使得redis以后台程序方式运行

  1. 通过指定的配置文件启动
    同样,在redis的根目录下进行启动,只不过这次启动命令中需要指定对应的配置文件:
#首先需要找到自己指定的配置文件,然后启动服务时在后面添加即可
./redis-server /etc/redis/redis.conf

redis-server redis.conf

26. Redis 数据库对大小写敏感不?Redis选择不同的数据库使用什么命令?

  1. Redis的Key值是大小写敏感,使用字符窜做键值时注意大小写
  2. SELECT index

27. 单机环境下什么是影响数据库读写速度的最大瓶颈?

机械硬盘

28. 把数据从硬盘读写处理,改为内存处理,是属于什么类型的扩展?

  1. 纵向扩展👌
  2. 把大数据放在不同服务器的内存上进行处理 是 横向扩展

29. NoSQL主要解决了大数据环境下的什么问题?

NoSQL主要解决了大数据环境下的数据存储处理速度问题

30. 进行大数据分析,NoSQL相对TRDB至少具有什么优势?

技术优势和成本优势

扩展简单;快速读写;成本低廉;数据模型灵活;

  1. 擅长大量数据的写入和读取
  2. 快速的查询响应,灵活的数据模型
  3. 数据结构变更或更新非常方便,不需要更改已有数据的数据结构
  4. 击碎了性能瓶颈,可以使执行速度变的更快

31. 键值数据库、文档数据库、列族数据库对值查找能力的比较?

键值数据库对值查询功能较弱、文档数据库较强、列族数据库很强

键值数据库

  • 优点:扩展性好,灵活性好,大量操作时性能高
  • 缺点:数据无结构化,通常只被当做字符串或者二进制数据,只能通过键来查询值

文档数据库

  • 优点:数据结构灵活,可以根据 value 构建索引
  • 缺点:缺乏统一查询语法

列族数据库

  • 优点:可扩展性强,查找速度快,复杂性低
  • 缺点:功能局限,不支持事务的强一致性

32. Redis安装包如何使用? 发布者和订阅者的消息订阅机制?

发布者和订阅者不是直接传输消息的,是通过代理来传输的。

  1. Redis安装包如何使用?
  • 创建redis 用户和数据目录
  • 编辑redis服务启动文件
  • 验证redis 启动
  • 使用客户端连接redis
  • 创建命令软连接
  • 编译安装后的命令
  1. 发布者和订阅者的消息订阅机制?
  • Redis提供了基于“发布/订阅”模式的消息机制,当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher)。而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE命令接收信息的时候,我们称这个客户端为订阅者(subscriber)。
  • 为了解耦发布者(publisher)和订阅者(subscriber)之间的关系,Redis 使用了 channel (频道)作为两者的中介 —— 发布者将信息直接发布给 channel ,而 channel 负责将信息发送给适当的订阅者,发布者和订阅者之间没有相互关系,也不知道对方的存在。
  • Jedis客户端回调方法是阻塞的。数据量大,逻辑处理复杂,会导致本地堆集过多的消息,异步处理避坑
  • Jedis订阅方法subscribe本身也是阻塞的,如果你是在系统启动的时候去加载订阅者,注意异步避坑,防止阻塞,系统一直停在这个位置,不能完全启动
  • 消息分发方式是广播,对于同一个channel,每个订阅者都可以收到同样的消息,如果此消息不能被重复消费,注意使用分布式锁避坑
  • 如果没有订阅者,发布者的消息会被丢弃,没有存储机制,所以在发布消息之前,确保订阅者已经完成订阅操作

33. 大型网站应用时对于海量数据的解决方案有哪些?

  1. 使用缓存;
  2. 页面静态化技术;
  3. 数据库优化;
  4. 分离数据库中活跃的数据;
  5. 批量读取和延迟修改;
  6. 读写分离;
  7. 使用NoSQL和Hadoop等技术;
  8. 分布式部署数据库;
  9. 应用服务和数据服务分离;
  10. 使用搜索引擎搜索数据库中的数据;
  11. 进行业务的拆分;

34. 论述TRDB与NoSQL的技术特点区别?

NoSQL是弥补传统关系型数据库技术的不足而产生的新的数据库技术。

  1. 数据库数据存储模式不一样,TRDB为强数据存储模式,NOSQL为弱数据存储模式(没有严格的限制)﹔
  2. 分布式技术是NOSQL的核心技术思路,而TRDB以集中部署一台物理机为最初出发点;
  3. TRDB的事务严格遵循ACID原则(ACID强事务,确保数据的可用和准确性。而NOSQL遵循Base原则;
  4. TRDB都遵循SQL操作标准,NOSQL没有统一的操作标准;
  5. TRDB基于单机的硬盘数据处理技术为主,NOSQL基于分布式的或者内存数据处理技术为主;
TRDB:1)使用强存储模式技术。
     (2)采用SQL技术标准来定义和操作数据库
     (3)采用强事务保证可用性及安全性
     (4)主要采用单机集中式处理(CP,Centralized Processing)方式。

NoSQL:1)使用弱存储模技术
      (2)没有采用SQL技术标准来定义和操作数据库
      (3)采用弱事务保证数据可用性及安全性或根本没有事务处理机制。
      (4)主要采用多机分布式处理(DP,Distributed Processing)方式

35. 实例化一个mongo客户端,服务器地址:localhost(本地),端口号:27017

MongoClient mongoclient = new MongoClient(“localhost”,27017);

36. 实例化一个mongo数据库, 创建并获取数据库中集合,在集合中插入一条文档。

MongoClient mongoclient=new MongoClient(“localhost”,27017);
MongoDataBase mongodatabase=new MongoDatabase(“mydb”);
mongoDatabase.createCollection("test");
MongoCollection collection = mongoDatabase.getcollection(“test”);
Document document = new Document();
document.append(“id”,1);
collection.insertOne(document);

Python代码

from pymongo import MongoClient

# 如果是本地连接host,port参数可以省略(27017是默认端口)
client = Mongoclient("localhost", 27017)

# 数据库和集合能够自动创建
collection = client[mydb][test]
# collection = client.db名.集合名 # 与上边用法相同

collection.insert("name":"zz","age":19)

37. 实例化一个mongo客户端,服务器IP地址,端口号:27017,实例化一个mongo数据库db, 创建集合,获取数据库中集合tt文档中具有n和a属性值,在集合tt中获取文档中的内容,打印输出每条文档中的键 “n”对应的值。

 try 
      /********* Begin *********/ 
      //启动本地服务,端口号为27020 
      MongoClient mongoClient = new MongoClient("localhost",27017);     
      //连接名为databaseName数据库  
      MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName");     
      //获取集合test 
      MongoCollection<Document> collection =mongoDatabase.getCollection("test");
      //创建集合test1
      mongoDatabase.createCollection("test1");
      //获取集合test1
      MongoCollection<Document> collection=mongoDatabase.getCollection("test1")
      MongoCollection<Document> tt = mongoDatabase.getCollection("tt");
	  FindIterable<Document> documents =tt.find(); 
      collection.insertMany(tt);
      collection.find("n":$all)
	  for (Document document : documents) 
			System.out.println(document.getString("n"));
	  

from pymongo import MongoClient

# 如果是本地连接host,port参数可以省略(27017是默认端口)
client = Mongoclient("localhost", 27017)

# 数据库和集合能够自动创建
col = client[db][tt]  # 获取db数据库中的tt集合

# 获取具有n和a属性的文档也就是,一行行的字典数据
# $exists:检查某个键是否存在,1表示存在,0表示不存在
for doc in db.roles.find('n':'$exists':True):    
	print(doc["n"])  # 打印输出每条文档中的键 “n”对应的值
	

38. 使用 Java 代码在mongodb中完成文档的检索(查询)、更新与删除。

检索文档

使用驱动 com.mongodb.client.MongoCollection 类中的 find() 方法来获取集合中的所有文档。

此方法返回一个游标,所以你需要遍历这个游标。

//检索所有文档  
/**  
 * 1. 获取迭代器FindIterable<Document>   
 * 2. 获取游标MongoCursor<Document>   
 * 3. 通过游标遍历检索出的文档集合   
 **/  
FindIterable<Document> findIterable = collection.find();  
MongoCursor<Document> mongoCursor = findIterable.iterator();  
while(mongoCursor.hasNext())  
	System.out.println(mongoCursor.next());  
 

更新文档

你可以使用 com.mongodb.client.MongoCollection 类中的 updateMany() 方法来更新集合中的文档:

//更新文档:将第一关例子文档中nums=90的文档修改为nums=100  
collection.updateMany(Filters.eq("nums", 90), new Document("$set",new Document("nums",100)));  

删除文档

要删除集合中的第一个文档,首先你需要使用 com.mongodb.DBCollection 类中的 findOne() 方法来获取第一个文档,然后使用 remove() 方法删除。

//删除符合条件的第一个文档  
collection.deleteOne(Filters.eq("nums", 100));  
//删除所有符合条件的文档  
collection.deleteMany (Filters.eq("nums", 100));  

39. 创建集合t2将以下文档插入 db2 数据库的 t2 集合中;检索 t2 中的所有文档;更新 Xi 的信息为25岁;删除Xiao的信息。

_id		name	sex		age
1		Xi		man		23
try 
	    //启动本地服务,端口号为27020 
	    MongoClient mongoClient = new MongoClient("localhost",27017);     
	    //连接名为databaseName数据库  
	    MongoDatabase mongoDatabase = mongoClient.getDatabase("db2");     
	    //获取集合test 
	    MongoCollection<Document> collection =mongoDatabase.getCollection("t2");
	    //插入要求中的数据到集合t2
	    Document document1=new Document();
	    document1.append("_id","1");
	    document1.append("name","Xiaoming");
	    document1.append("sex","man");
	    document1.append("age",23);
	    
	    List<Document> documents = new ArrayList<Document>();    
	    documents.add(document1);    
	    collection.insertMany(documents);
	    //更新 Xiaohong 的信息为23岁
	    collection.updateMany(Filters.eq("name", "Xiaohong"), new Document("$set",new Document("age",25)));
	    //删除Xiaoliang的信息
	    collection.deleteOne (Filters.eq("name", "Xiaoliang")); 
	    
     catch (Exception e) 
    	System.err.println( e.getClass().getName() + ": " + e.getMessage());
    

40. HBase对于空(NULL)的列,占不占用存储空间?MapReduce的基本设计思想?

不占用,计算向数据靠拢

MapReduce基本设计思想:

  1. 对付大数据并行处理:分而治之。
  2. 上升到抽象模型:Map与Reduce。在此过程中,首先将输入数据划分成许多个块,并分别使用一个Map函数对每一个数据块进行 并行处理,第一步输出中间结果。然后将中间结果进行混洗和排序,再递交给Reduce进行处理。同理,Reduce也采用并行计算,最后输出最终结果。
  3. 上升到结构:自动并行化并隐藏底层细节。

41. Spark 的四大组件?Spark的主要特点?

四大组件:

  • SparkStreaming, 针对实时数据进行流式计算的组件;
  • SparkSQL, 用来操作结构化数据的组件;
  • GraphX, Spark面向图计算提供的框架与算法库; MLlib, 一个机器学习算法库。

Spark 主要特点:

  1. 速度快
  2. 易用性
  3. 通用性
  4. 兼容性

42. Spark是hadoop哪个组件的替代方案? Spark为什么比Mapreduce快?Hadoop和Spark能否部署在同一个集群?

  • Mapreduce,因为迭代计算,交互式计算,且rdd中间运算结果在内存中,延迟小,task以线程维护,任务启动快。

可以

43. Hadoop和Spark能不能同时部署?

Hadoop和Spark不是互斥的,可以一起工作。

44. Spark的几个主要概念:RDD、DAG、阶段、分区、窄依赖、宽依赖?

RDD:Resillient Distributed Dataset (弹性分 布式数据集)的简称,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型
DAG:Directed Acyclic Graph (有 向无环图)的简称,反映RDD之间的依赖关系
阶段:是作业的基本调度单位,一个作业会分为多组任务,每组任务被称为“阶段”,或者也被称为“任务集”。
分区:一个就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个可以分成多个分区,每个分区就是一个数据集片段。
宽依赖:宽依赖是指1个父RDD分区对应多个子RDD分区
窄依赖:窄依赖是指1个父RDD分区对应1个子RDD的分区

45. spark集群部署模式有哪几种?SparkContext的概念?Executor,Worker?Spark组成部件有哪些?

模式:本

以上是关于分布式数据库技术相关知识概述的主要内容,如果未能解决你的问题,请参考以下文章

分布式数据库技术相关知识概述

《鸿蒙理论知识01》HarmonyOS概述之技术特性

springboot上传图片文件相关知识

SQLServer数据库收缩相关知识

Python之爬虫框架概述

1.大数据概述