ES的分布式原理能说一下吗?(es是如何实现分布式的啊?)
ES中用来存储数据的基本单位是索引,比如说你现在要在es中存储一些订单数据,你就应该在es中创建一个索引,所有的订单数据就卸载这个索引里面去,一个索引差不多就是相当于mysql中的一张表。 index->type->mapping->document->field
index:mysql中的一张表
type:没法跟mysql里去对比,一个index里可以有多个type,每个type的字段都差不多,但是有一些略微的差别。
比如说。有个index,是订单index,里面专门放订单数据的,就好比说你在mysql中建表,有些订单是实物商品的订单,有些事虚拟商品的订单。这两种订单大部分字段是一样的,有略微一些的差别。
所以就会在订单index里键两个type,一个是实物订单的type,一个是虚拟商品订单的type。这两个type大部分字段是一样的,少部分字段不一样
很多情况下一个index里可能就一个type,但是如果一个index里有多个type的情况,你可以认为index是一个类别的表,具体的每个type代表具体的一个mysql的表定义表结构的,
每个type有一个mapping,如果你认为一个type是一个具体的表,index代表了多个type的同属于一个类型,mapping就是这个type的表结构定义,你在mysql中创建一个表,肯定是要定义表结构,里面有哪些字段,每个字段是什么类型。。。
mapping就代表了这个type的表结构定义,定义这个type中每个字段名称,字段是什么类型的,然后还有这个字段的各种配置。
实际上你往index里的一个type里面写的每一条数据就是叫做document,一条document就代表了mysql中某个表里的一行数据,每个document有多个field。每个field就代表这个document中的一个字段值。
ES写入数据的工作原理是什么啊?ES查询数据的工作原理是什么啊?
es写入数据过程:
1)客户端选择一个节点请求过去,这个节点就是协调节点(随便找的节点)
2)协调节点对数据(document)内容进行路由,将请求节点转发给对应的节点
3)实际的节点上的分片处理请求,然后将数据同步到副本分片
4)协调节点主分片和备份副分片处理完之后返回给客户端
写数据的底层原理:
数据写到shard里首先先写到内存buffer中去,同时写到进程日志中去,这时客户端是搜不到的,不管客户端写了多少数据,默认每隔一秒钟将数据refresh到磁盘文件中去,每秒钟会产生一个新的磁盘文件,磁盘文件上还有一层os cash, 属 于操作系统的缓存,refresh后buffer中会被清空
数据丢失问题:设置一个参数,每次写入buffer直接写入磁盘文件中,但是会影响写的性能
es读数据过程:
查询,get某一条数据,写入某个document,这个document会自动给你分配一个唯一的id,根据这个id进行hash路由到对应的分片上去
es搜索数据过程:
客户端搜索一个关键字,请求指向一个节点,这个节点就是协调节点,协调节点会将这个关键字去其他shard中做匹配,拿到所有返回的docid,然后拿着这些docid去找document,将筛选这些document返回给客户端
ES在数据量很大的情况下如何提高查询效率啊?
(1)性能优化的杀手锏--filesystem cache
我们的es数据实际是保存在磁盘文件中,磁盘文件数据操作系统会自动将里面的数据缓存到os cache中去
es底层依赖于filesystem cache,其实我们查询一个数据时是从磁盘缓存到filesystem cache中然后再返回给客户端的,所以我们走内存效率会非常
我们要给filesystem cash分配足够的内存,来保证我们的查询效率,我们尽量将关键字段放到索引库中,采用es+mysql这么一个架构,我们通过es中的关键字段再去mysql中进行查询返回给用户
(2)数据预热
上述方案做了,我们的每台机器写入的数据量还是超过了filesystem cache一倍,我们就可以在后台搞个程序,每隔一定时间主动访问一次,将磁盘中的数据刷入filesystem cache中去,这样用户再查询的时候就直接在filesystem cache中命中提高效率
(3)冷热分离
两个索引库,一个放冷数据,一个放热数据
ES生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?(中小型公司)
(1)es生产集群我们部署了5台机器,每台机器是6核64G的,集群总内存是320G
(2)我们es集群的日增量大概是2000万条,每天日增量数据是500MB,每月增量数据大概是6亿,15G。目前系统已经运行了几个月,现在es集群里数据总量大概是100g左右
(3) 目前线上有5个索引(这个结合你们自己业务来,看看自己有哪些数据可以放es的),每个索引的数据量大概是20G,所以这个数据量之内,我们每个索引分配的是8个shard,比默认的5个shard多了3个shard。
|
|