分布式数据库技术-基础知识概述
1. NoSQL数据库的类型有哪些?
NoSQL数据库的四种类型是:
- 键值数据库,应用于分布式数据存储与管理;
- 列族数据库,用于分布式数据存储与管理;
- 文档数据库,应用于存储索引并管理面向文档的数据或者类似的半结构化数据;
- 图形数据库。
键值对存储数据库,列存储数据库,文档型数据库,图形数据库
2. 怎么判断一个数据库是否是NoSQL数据库?
- 非关系型
- 分布式
- 开放源码
- 具有横向扩展能力
3. NoSQL技术诞生的最初发点是为了解决什么问题?
- 解决传统关系型数据库无法解决的数据存储及访问问题。
- 要解决大数据应用问题。
- 要解决互联网上应用问题。
- 要解决处理速度的响应和海量数据的储存问题。
4. 列族数据库存储结构?
- 命名空间
- 行键
- 列族
- 列
5. NoSQL数据库有哪些不同类型并举例说明?
- 键值数据库
相关产品:Redis、Riak、SimpleDB、Chordless、Scalaris、Memcached
- 列族数据库
相关产品:BigTable、HBase、Cassandra、HadoopDB、GreenPlum、PNUTS
3 . 文档数据库
相关产品:MongoDB、CouchDB、ThruDB、CloudKit、Perservere、Jackrabbit
- 图形数据库
相关产品:Neo4J、OrientDB、InfoGrid、GraphDB
6. 文档数据库存储的基本元素是哪些?
- 键值对
- 文档
- 集合
- 数据库
7. Nosql事务处理的BASE特点指的是?
基本可用、软状态、最终一致性
8. TRDB擅长解决哪些问题,NoSQL擅长解决问题?
- TRDB擅长解决结构化数据
- NoSQL擅长解决非结构或半结构化数据
9. CAP定理的三大特性?
一致性,可用性,分区容错性
10. MongoDB的特点是什么?
- 高性能
- 丰富的查询语言
- 高可用性
- 水平扩展能力
- 多个存储引擎的支持
数据文件存储格式为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的提供了一个面向文档存储,操作起来比较简单和容易。
一个 MongoDB 分片集群的组成:
- shard:每个分片是整体数据的一部分子集。每个分片都可以部署为副本集。强烈建议在生产环境下将分片部署为副本集且最少部署 2 个分片
- mongos:充当查询路由器,提供客户端应用程序和分片集群之间的接口。应用程序直接连接 mongos 即可,可以部署一个或多个。
- 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”进程?
mongod
是处理MongoDB系统的主要进程。它处理数据请求,管理数据存储,和执行后台管理操作。
当我们运行mongod命令意味着正在启动MongoDB进程,并且在后台运行。
- 什么是"
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)18.redis-cli 127.0.0.1:6379> get hello
Redis中的列表
LPUSH 命令可用于将元素推入列表的左侧
RPUSH 命令可将元素推入列表的右侧
LPOP 和 RPOP 就分别从列表的左侧和右侧弹出元素
LINDEX 可以获取指定位置上的元素
LRANGE 可以获取指定范围的全部元素
对
Redis
字符串执行自增和自减的命令列表如下:
命令用法说明
INCR
INCR key
将
key
存储的值加上
1
DECR
DECR key
将
key
存储的值减去
1
INCRBY
INCRBY key increment
将
key
存储的值加上
increment
DECRBY
DECRBY key decrement
将
key
存储的值减去
decrement
INCRBYFLOAT
INCRBYFLOAT key increment
将
key
存储的值加上浮点数
increment
Redis 还可以对字节串的一部分内容进行读取/写入:
命令用法说明
APPEND
APPEND key value
将
value
追加到
key
键存储的值的末尾
GETRANGE
GETRANGE key start end
获取
start
到
end
间的子串
SETRANGE
SETRANGE key offset value
从
start
偏移量开始,将与
value
长度一致的子串设置为
value
常用的列表命令:
命令用法说明
LPUSH
LPUSH key value [value ...]
将一个或多个
value
推入到列表的左侧
RPUSH
RPUSH key value [value ...]
将一个或多个
value
推入到列表的右侧
LLEN
LLEN key
返回列表
key
的长度
LREM
LREM 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字典,维护了频道和订阅者的对应关系,每次客户端添加订阅时将对应的客户端信息添加到链表的末尾
主要命令:
ping
沟通命令,查看状态dbsize
查看当前数据库中key的数量selectdb
切换库命令flushdb
删除当前数据库的所有数据exit
或者quit
退出客户端连接
25. 如何启动redis服务?
- 直接启动 进入
redis
根目录下,在bin
目录中找到redis-server
,执行如下命令:./redis-server &
注意:如果加上 ‘&’ ,使得redis以后台程序方式运行
- 通过指定的配置文件启动 同样,在redis的根目录下进行启动,只不过这次启动命令中需要指定对应的配置文件:
#首先需要找到自己指定的配置文件,然后启动服务时在后面添加即可
./redis-server /etc/redis/redis.conf
redis-server redis.conf
26. Redis 数据库对大小写敏感不?Redis选择不同的数据库使用什么命令?
- Redis的Key值是大小写敏感,使用字符窜做键值时注意大小写
SELECT index
27. 单机环境下什么是影响数据库读写速度的最大瓶颈?
机械硬盘
28. 把数据从硬盘读写处理,改为内存处理,是属于什么类型的扩展?
- 纵向扩展👌
- 把大数据放在不同服务器的内存上进行处理 是 横向扩展
29. NoSQL主要解决了大数据环境下的什么问题?
NoSQL
主要解决了大数据环境下的数据存储处理速度问题
30. 进行大数据分析,NoSQL相对TRDB至少具有什么优势?
技术优势和成本优势
扩展简单;快速读写;成本低廉;数据模型灵活;
- 擅长大量数据的写入和读取
- 快速的查询响应,灵活的数据模型
- 数据结构变更或更新非常方便,不需要更改已有数据的数据结构
- 击碎了性能瓶颈,可以使执行速度变的更快
31. 键值数据库、文档数据库、列族数据库对值查找能力的比较?
键值数据库对值查询功能较弱、文档数据库较强、列族数据库很强。
键值数据库
- 优点:扩展性好,灵活性好,大量操作时性能高
- 缺点:数据无结构化,通常只被当做字符串或者二进制数据,只能通过键来查询值
文档数据库
- 优点:数据结构灵活,可以根据 value 构建索引
- 缺点:缺乏统一查询语法
列族数据库
- 优点:可扩展性强,查找速度快,复杂性低
- 缺点:功能局限,不支持事务的强一致性
32. Redis安装包如何使用? 发布者和订阅者的消息订阅机制?
发布者和订阅者不是直接传输消息的,是通过代理来传输的。
- Redis安装包如何使用?
- 创建redis 用户和数据目录
- 编辑redis服务启动文件
- 验证redis 启动
- 使用客户端连接redis
- 创建命令软连接
- 编译安装后的命令
- 发布者和订阅者的消息订阅机制?
- Jedis客户端回调方法是阻塞的。数据量大,逻辑处理复杂,会导致本地堆集过多的消息,异步处理避坑
- Jedis订阅方法subscribe本身也是阻塞的,如果你是在系统启动的时候去加载订阅者,注意异步避坑,防止阻塞,系统一直停在这个位置,不能完全启动
- 消息分发方式是广播,对于同一个channel,每个订阅者都可以收到同样的消息,如果此消息不能被重复消费,注意使用分布式锁避坑
- 如果没有订阅者,发布者的消息会被丢弃,没有存储机制,所以在发布消息之前,确保订阅者已经完成订阅操作
33. 大型网站应用时对于海量数据的解决方案有哪些?
- 使用缓存;
- 页面静态化技术;
- 数据库优化;
- 分离数据库中活跃的数据;
- 批量读取和延迟修改;
- 读写分离;
- 使用NoSQL和Hadoop等技术;
- 分布式部署数据库;
- 应用服务和数据服务分离;
- 使用搜索引擎搜索数据库中的数据;
- 进行业务的拆分;
34. 论述TRDB与NoSQL的技术特点区别?
NoSQL是弥补传统关系型数据库技术的不足而产生的新的数据库技术。
- 数据库数据存储模式不一样,TRDB为强数据存储模式,NOSQL为弱数据存储模式(没有严格的限制)﹔
- 分布式技术是NOSQL的核心技术思路,而TRDB以集中部署一台物理机为最初出发点;
- TRDB的事务严格遵循ACID原则(ACID强事务,确保数据的可用和准确性。而NOSQL遵循Base原则;
- TRDB都遵循SQL操作标准,NOSQL没有统一的操作标准;
- TRDB基于单机的硬盘数据处理技术为主,NOSQL基于分布式的或者内存数据处理技术为主;
TRDB:(1)使用强存储模式技术。
(2)采用SQL技术标准来定义和操作数据库
(3)采用强事务保证可用性及安全性
(4)主要采用单机集中式处理(CP,CentralizedProcessing)方式。
NoSQL:(1)使用弱存储模技术
(2)没有采用SQL技术标准来定义和操作数据库
(3)采用弱事务保证数据可用性及安全性或根本没有事务处理机制。
(4)主要采用多机分布式处理(DP,DistributedProcessing)方式
35. 实例化一个mongo客户端,服务器地址:localhost(本地),端口号:27017
MongoClient mongoclient =newMongoClient(“localhost”,27017);
36. 实例化一个mongo数据库, 创建并获取数据库中集合,在集合中插入一条文档。
MongoClient mongoclient=newMongoClient(“localhost”,27017);MongoDataBase mongodatabase=newMongoDatabase(“mydb”);
mongoDatabase.createCollection("test");MongoCollection collection = mongoDatabase.getcollection(“test”);Document document =newDocument();
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 =newMongoClient("localhost",27017);//连接名为databaseName数据库 MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName");//获取集合test MongoCollection<Document> collection = mongoDatabase.getCollection("test");//创建集合test1
mongoDatabase.createCollection("test1");//获取集合test1MongoCollection<Document> collection=mongoDatabase.getCollection("test1")
collection.insertMany(tt);
collection.find({"n":{$all}});
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),newDocument("$set",newDocument("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
1Xi man 23
/********* Begin *********///启动本地服务,端口号为27020 MongoClient mongoClient =newMongoClient("localhost",27017);//连接名为databaseName数据库 MongoDatabase mongoDatabase = mongoClient.getDatabase("db2");//获取集合test MongoCollection<Document> collection =mongoDatabase.getCollection("t2");//插入要求中的数据到集合t2Document document1=newDocument();
document1.append("_id","1");
document1.append("name","Xiaoming");
document1.append("sex","man");
document1.append("age",23);List<Document> documents =newArrayList<Document>();
documents.add(document1);
collection.insertMany(documents);//更新 Xiaohong 的信息为23岁
collection.updateMany(Filters.eq("name","Xiaohong"),newDocument("$set",newDocument("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基本设计思想:
- 对付大数据并行处理:分而治之。
- 上升到抽象模型:Map与Reduce。在此过程中,首先将输入数据划分成许多个块,并分别使用一个Map函数对每一个数据块进行 并行处理,第一步输出中间结果。然后将中间结果进行混洗和排序,再递交给Reduce进行处理。同理,Reduce也采用并行计算,最后输出最终结果。
- 上升到结构:自动并行化并隐藏底层细节。
41. Spark 的四大组件?Spark的主要特点?
四大组件:
- SparkStreaming, 针对实时数据进行流式计算的组件;
- SparkSQL, 用来操作结构化数据的组件;
- GraphX, Spark面向图计算提供的框架与算法库; MLlib, 一个机器学习算法库。
Spark 主要特点:
- 速度快
- 易用性
- 通用性
- 兼容性
42. Spark是hadoop哪个组件的替代方案? Spark为什么比Mapreduce快?Hadoop和Spark能否部署在同一个集群?
- Mapreduce,因为迭代计算,交互式计算,且rdd中间运算结果在内存中,延迟小,task以线程维护,任务启动快。
可以
43. Hadoop和Spark能不能同时部署?
Hadoop和Spark不是互斥的,可以一起工作。
44. Spark的几个主要概念:RDD、DAG、阶段、分区、窄依赖、宽依赖?
RDD:是ResillientDistributedDataset(弹性分 布式数据集)的简称,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型
DAG:是DirectedAcyclicGraph(有 向无环图)的简称,反映RDD之间的依赖关系
阶段:是作业的基本调度单位,一个作业会分为多组任务,每组任务被称为“阶段”,或者也被称为“任务集”。
分区:一个就是一个分布式对象集合,本质上是一个只读的分区记录集合,每个可以分成多个分区,每个分区就是一个数据集片段。
宽依赖:宽依赖是指1个父RDD分区对应多个子RDD分区
窄依赖:窄依赖是指1个父RDD分区对应1个子RDD的分区
45. spark集群部署模式有哪几种?SparkContext的概念?Executor,Worker?Spark组成部件有哪些?
模式:本地模式,standalone集群模式,spark on yarn集群模式,spark on mesos集群模式
组成部件:executor,driver
SparkContext是上下文
46. Spark的出现是为了解决Hadoop MapReduce的不足,试列举Hadoop MapReduce的几个缺陷,并说明Spark具备哪些优点。
Hadoop MapReduce存在以下缺点:
①表达能力有限;
②磁盘IO开销大;
③延迟高
Spark主要有如下优点:
①Spark的计算模式也属于MapReduce,但不局限于Map和Reduce操作,还提供了多种数据集操作类型,编程模型比MapReduce更灵活;
②Spark提供了内存计算,中间结果直接存放内存中,带来更高的迭代运算效率;
③Spark基于DAG的任务调度执行机制,要优于MapReduce的迭代执行机制。
文字搬运,可能存在问题!
加油!
感谢!
努力!
版权归原作者 ZSYL 所有, 如有侵权,请联系我们删除。