Elasticsearch是当今最流行的分布式搜索引擎,首先介绍下使用场景,比如:
全文检索
比如找到与搜索词项(term)最相关的维基百科文章。
聚合
比如在广告网络中,可视化的搜索词项的竞价直方图。
地理空间API
比如在顺风车平台,匹配最近的司机和乘客。
接下来重点介绍下几个概念和配置:
master节点
主要功能是维护元数据,管理集群各个节点的状态,数据的导入和查询都不会走master节点,所以master节点的压力相对较小,因此master节点的内存分配也可以相对少些;但是master节点是最重要的,如果master节点挂了或者发生脑裂了,你的元数据就会发生混乱,那样你集群里的全部数据可能会发生丢失,所以一定要保证master节点的稳定性。node.master属性为true(默认)。
data node
是负责数据的查询和导入的,它的压力会比较大,它需要分配多点的内存,选择服务器的时候最好选择配置较高的机器(大内存,多核CPU,SSD);data node要是坏了,可能会丢失一小份数据。应将其node.data属性设置为false。
client node
是作为任务分发用的,它里面也会存元数据,但是它不会对元数据做任何修改。client node存在的好处是可以分担下data node的一部分压力;因为es的查询是两层汇聚的结果,第一层是在data node上做查询结果汇聚,然后把结果发给client node,client node接收到data node发来的结果后再做第二次的汇聚,然后把最终的查询结果返回给用户;如果我们将node.master属性和node.data属性都设置为false,那么该节点就是一个客户端节点,扮演一个负载均衡的角色,将到来的请求路由到集群中的各个节点。
配置模式
node.master node.data remark
true true default(默认)
true false coordinator(协调者)
false true workhorse(主力)
false false search load balancer(负载均衡器)
数据节点和非数据节点通信情况:
data nodes的通信协议采用tcp(http.enabled设置成false),主要负责搜索引擎的“运算”(indexing、searching)。
non data nodes采用http进行通信,主要负责请求的分发(scatter)、结果的合并(gather)等。
client---(http)--->non data nodes---(tcp)--->data nodes
为了使新加入的节点快速确定master位置,调整配置如下:
discovery.zen.ping.multicast.enabled: false //multicast多播
discovery.zen.ping.unicast.hosts: ["master1", "master2", "master3"] //unicast 单播
减缓脑裂问题,适当调整配置:
discovery.zen.ping_timeout(默认值是3秒)//如果master节点在3秒之内没有应答,那么这个节点就是死掉了
discovery.zen.minimum_master_nodes(默认是1)//一个节点需要看到的具有master节点资格的最小数量,然后才能在集群中做操作。官方的推荐值是(N/2)+1;默认3台集群的情况设置2;
分片和副本设置:
index.number_of_shards: 5 //设置默认索引分片个数,默认为5片。
index.number_of_replicas: 1 //设置默认索引副本个数,默认为1个副本。
全文检索
比如找到与搜索词项(term)最相关的维基百科文章。
聚合
比如在广告网络中,可视化的搜索词项的竞价直方图。
地理空间API
比如在顺风车平台,匹配最近的司机和乘客。
接下来重点介绍下几个概念和配置:
master节点
主要功能是维护元数据,管理集群各个节点的状态,数据的导入和查询都不会走master节点,所以master节点的压力相对较小,因此master节点的内存分配也可以相对少些;但是master节点是最重要的,如果master节点挂了或者发生脑裂了,你的元数据就会发生混乱,那样你集群里的全部数据可能会发生丢失,所以一定要保证master节点的稳定性。node.master属性为true(默认)。
data node
是负责数据的查询和导入的,它的压力会比较大,它需要分配多点的内存,选择服务器的时候最好选择配置较高的机器(大内存,多核CPU,SSD);data node要是坏了,可能会丢失一小份数据。应将其node.data属性设置为false。
client node
是作为任务分发用的,它里面也会存元数据,但是它不会对元数据做任何修改。client node存在的好处是可以分担下data node的一部分压力;因为es的查询是两层汇聚的结果,第一层是在data node上做查询结果汇聚,然后把结果发给client node,client node接收到data node发来的结果后再做第二次的汇聚,然后把最终的查询结果返回给用户;如果我们将node.master属性和node.data属性都设置为false,那么该节点就是一个客户端节点,扮演一个负载均衡的角色,将到来的请求路由到集群中的各个节点。
配置模式
node.master node.data remark
true true default(默认)
true false coordinator(协调者)
false true workhorse(主力)
false false search load balancer(负载均衡器)
数据节点和非数据节点通信情况:
data nodes的通信协议采用tcp(http.enabled设置成false),主要负责搜索引擎的“运算”(indexing、searching)。
non data nodes采用http进行通信,主要负责请求的分发(scatter)、结果的合并(gather)等。
client---(http)--->non data nodes---(tcp)--->data nodes
为了使新加入的节点快速确定master位置,调整配置如下:
discovery.zen.ping.multicast.enabled: false //multicast多播
discovery.zen.ping.unicast.hosts: ["master1", "master2", "master3"] //unicast 单播
减缓脑裂问题,适当调整配置:
discovery.zen.ping_timeout(默认值是3秒)//如果master节点在3秒之内没有应答,那么这个节点就是死掉了
discovery.zen.minimum_master_nodes(默认是1)//一个节点需要看到的具有master节点资格的最小数量,然后才能在集群中做操作。官方的推荐值是(N/2)+1;默认3台集群的情况设置2;
分片和副本设置:
index.number_of_shards: 5 //设置默认索引分片个数,默认为5片。
index.number_of_replicas: 1 //设置默认索引副本个数,默认为1个副本。
swap设置
bootstrap.mlockall: true //设置为true来锁住内存不进行swapping,因为当jvm开始swapping时es的效率 会降低,所以要保证它不swap。
客户端选择
传输客户端:一个集群和应用程序之间的通信层,属于外部客户端
节点客户端:实际上是一个集群中的节点,属于内部客户端
系统调整:
vm.swappiness = 1或者swapoff -a 禁止swap打开
sysctl -w vm.max_map_count=262144 文件描述符
注意事项:最好将master节点与data节点分离,避免data节点的压力导致master脑裂;
【原创】原创文章,更多关注敬请关注微信公众号。