前言
我建议大家看下这个,否则后面你不知道我在说什么。
1.ES数据库相关概念
啥是Es,说白了就是支持文档搜索的分布式数据库,专门方便搜索的,GITHUB京东现在都在用。
1.ES的数据库存放在哪里?
一开始安装的时候有个配置文件elasticsearch.conf,里面会让你设置data的存放位置,我一般是放在ES文件夹下的data文件夹内。ES的逻辑是大部分的数据都存放在硬盘内,但是会把一些索引什么的放在内存内,方便检索。
2.ES为什么会占用很多内存?可否优化
主要是java占用了内存,这是ES必须要java环境所导致的,在jvm.conf可以对java内存占用做个限制,不过我一般都是默认,默认基本就够了。一般是1G内存,但是ES建议设置成机器内存的二分之一。
3.ES支持多检索么?
支持,肯定支持,还支持汉字,英文,数字搜索,我搜monlog中存在“disk”这个字段的文档时,瞬时就搜出来了,快的飞起。
4.ES有无配套的python库?是否好用?
有个同名的库elasticsearch,我认为很好用了,我把它的大部分功能都封装成接口了,在测试脚本文件夹下。
5.ES的基本术语?
索引:相当于DB的database
Type:相当于DB的table
Index:有相似特征的documents集合
Source:想当于DB的信息
主分片:每个文档都存储在一个主要分片上。当你索引一个文档时,索引首先生成在主分片上,然后才到主分片的所有副本上。默认情况下,索引有5个主分片
副本分片:每个主分片可以有零个或多个副本。副本是主分片的一个拷贝,有两个作用:
1、故障转移:如果主分片有问题,副本分片可以提升为主分片;
2、提高性能:获取和搜索请求可以处理主分片或副本分片。
6.ES和ETCD有哪些不一样?
1.ES支持更多的存储格式
2.ES检索数据很快
3.ES更多的就是作为日志系统使用,契合需求
4.ES数据会落盘,不会占用过多内存。
7.ES可否支持多节点和可扩容?
多节点肯定支持,在你安装的时候conf文件配置就会让你填写节点名还有节点内ip。
扩容:一般是水平扩容,同集群中节点之间可以扩容缩容。只需要在参数上配置新增的hosts就可以。
8.如果宕机,怎么保障数据的安全不丢失?
分两种情况:
第一种就是三个机器,挂了主节点,或者是挂了其中一个,这种情况,在安装设置时有个参数,master.node,这个意思是允许这个节点被设置为主节点,如果主节点挂掉,其他的节点会被重新选举为主节点。继续接力。
第二种,全部挂掉,这时候所有的机器都挂了,你根本就没办法,解决了问题,开机,ES会自动的寻找备份节点/文件恢复数据,在找到备份之后,ES会在不影响系统的情况下恢复数据,同时继续接力。
2.Redis相关概念
1.Redis的数据放在哪?
Redis一般都是将数据直接放到内存里,当然,你可以设置一个阀值,到了界限保存到硬盘。
2.为什么Redis这么快?
放在内存里,数据文件小,基本就是实时的,肯定快啊。
3.Redis的弊端在哪?
成也内存,败也内存,如果数据量大,内存占用的也就越多,持久化也就越麻烦。
扩容麻烦的不行。
网络不好,万一备份失败,所有数据就GG了。
持久化的操作阻塞主线程
持久化方案弊端明显
4.如何保持数据的持久化?
两种方法:
设定阀值,定时保存。
设定key过期时间,不过我想日志文件还是不要这么操作了吧。
5.如果宕机,数据怎么保存?
RDB方式(默认),当符合一定条件时Redis会自动将内存中的所有数据进行快照并存储在硬盘上。
进行快照的条件可以由用户在配置文件中自定义,
由两个参数构成:时间和改动的键的个数。当在指定的时间内被更改的键的个数大于指定的数值时就会进行快照。RDB是redis默认采用的持久化方式。
6.Redis的基本术语
Redis集合:你可以想象成(“key”,”value”)
Redis支持的5种数据类型:String, hash, list, set, zset
Redis持久化:RDB
Redis数据存在内存中。
Redis一般应用在缓存中。
7.为什么选redis?
速度快,读取快,反正就是快。
分布式,可扩缩,支持的数据量中规中矩。
8.对可扩容的支持如何?
Redis使用了一致性哈稀进行分片,那么不同的key分布到不同的Redis-Server上,当我们需要扩容时,需要增加机器到分片列表中。
这时候会使得同样的key算出来落到跟原来不同的机器上,这样如果要取某一个值,会出现取不到的情况,之前的缓存相当于全部失效。对于扩容问题,Redis的作者提出了一种名为Pre-Sharding的方式。即事先部署足够多的Redis服务。
3.Mongodb相关概念
1.mongodb基本术语
sql术语/概念 |
MongoDB术语/概念 |
解释/说明 |
database |
database |
数据库 |
table |
collection |
数据库表/集合 |
row |
document |
数据记录行/文档 |
column |
field |
数据字段/域 |
index |
index |
索引 |
table joins |
|
表连接,MongoDB不支持 |
primary key |
primary key |
主键,MongoDB自动将_id字段设置为主键 |
2.mongodb和我们的系统能否契合
契合,因为mongodb本身自己支持分布式,并且支持多种存储形式,所以和我们本身存的数据比较契合。而且mongodb比较好搭建,不像redis还要编译,ES需要java。开箱即用,只是要配conf文件。
3.mongodb的缺点
l 不支持事务操作
l 占用空间过大
l MongoDB没有如MySQL那样成熟的维护工具
l 无法进行关联表查询,不适用于关系多的数据
l 复杂聚合操作通过mapreduce创建,速度慢
| 模式自由, 自由灵活的文件存储格式带来的数据错误
4.宕机了怎么办?
1、Mongos节点宕机
一个Mongos进程应该运行在每一个应用程序服务器上,这个服务器应该独占这个Mongos进程,并且通过它与分片集群来通讯。
Mongos进程不是持久化的,相反,它们在启动的时候从Config Server上收集所有必须的配置信息。
这表明,任何一个应用程序服务器节点故障,对作为一个整体的分片集群来讲并没有什么影响,所有别的应用程序服务器将依然是继续正常工作。
在这种情况下,恢复是一个相当简单的事情,我们只需要去启动一个新的应用程序服务器和一个新的Mongos进程即可。
2、分片中的某一个Mongod节点宕机
每一个分片由n个服务器构成,这n个服务器被配置为一个复制集(replica set)。如果在复制集中的任何一个节点宕机,在这个分片上读与写操作任然是允许的。
更加重要的是,宕机服务器上的数据都不会丢失,因为复制机制存在一个选项,那就是强制复制写操作到分片的其它节点上再返回,这与在Dynamo上设置write=2类似。
3、分片中的所有Mongod节点宕机
如果一个分片中的全部节点(replicas)都宕机了,在该分片内的数据将不能被访问。然而,操作任然是继续进行,只不过是由别的分片分担。看文档就可以弄清楚为什么这样。
如果分片被配置为一个复制集(Replicas set),至少一个成员应该在另外一个数据中心,那样的话,整个分片都宕机几乎是不可能的。为了有更大的冗余度,推荐这样进行配置。
5.数据持久化的支持如何?
mongodb默认每隔100毫秒或者写入数据达到若干兆字节后,便会将这些操作写入到日志。即mongodb不会在每次写入的时候都写入到日志,而是会成批量的提交更改。因此,在默认设置情况下,mongodb不会丢失超过100毫秒的数据。
因此,在Mongodb中存在丢失数据的可能。
我这里的建议是双备份,一份定时备份,一份日志文件备份。
6.可扩容的支持如何?
比较麻烦,mongodb建集群是这三个数据库中最麻烦的。
你需要一台主节点,一台备份节点,还有个特奇葩的仲裁节点,这个节点不存任何东西,只是作为主节点挂掉之后,选举其他节点的功能。
7.mongodb和其他两个比怎么样?
除了搭建集群麻烦一些,其他的要比redis好多了,但是检索功能又比不上ES,导入速度比ES快。解压即用那种,用起来比较方便。