搭建elasticsearch集群及故障转移(3)

1、书接上文html

上篇博客说到单台es状态为yellow,须要搭建集群解决。若是你资源有限只有一台机器, cp一个elasticsearch,使用相同命令在本机再启动一个es实例,再次检查集群健康, 发现unassigned_shards减小, active_shards增多。下面看es介绍、es配置文件和es集群搭建。java


2、es介绍node

一、elasticsearch(下文称es)是一款分布式且高可扩展的全文搜索和分析引擎,自己是基于Lucene进行开发,但ES足够简单易用,提供丰富的API,部署容易。elasticsearch 已经提供了大部分设置,都是合理的默认配置。因此你没必要进行烦人的配置就能够尝试一下。大多数时候,这些默认的配置就足以运行一个生产集群了。linux


二、分片以及水平扩展.数据库

elasticsearch用于构建高可用和可扩展的系统。扩展的方式能够是购买更好的服务器(纵向扩展)或者购买更多的服务器(横向扩展),elasticsearch能从更强大的硬件中得到更好的性能,可是纵向扩展也有必定的局限性。真正的扩展应该是横向的,它经过增长节点来传播负载和增长可靠性。对于大多数数据库而言,横向扩展意味着你的程序将作很是大的改动来利用这些新添加的设备。对比来讲,elasticsearch天生是分布式的:它知道如何管理节点来提供高扩展和高可用。bootstrap


三、集群和节点服务器

节点(node)是你运行的elasticsearch实例。一个集群(cluster)是一组具备相同cluster.name的节点集合,他们协同工做,共享数据并提供故障转移和扩展功能,当有新的节点加入或者删除节点,集群就会感知到并平衡数据。集群中一个节点会被选举为主节点(master),它用来管理集群中的一些变动,例如新建或删除索引、增长或移除节点等,固然一个节点也能够组成一个集群。网络


四、节点通讯并发

咱们可以与集群中的任何节点通讯,包括主节点。任何一个节点互相知道文档存在于哪一个节点上,它们能够转发请求到咱们须要数据所在的节点上。咱们通讯的节点负责收集各节点返回的数据,最后一块儿返回给客户端。这一切都由elasticsearch透明的管理。app



四、分片(shard)与副本分片(replica shard)

分片用于elasticsearch在你的集群中分配数据。想象把分片看成数据的容器。文档存储在分片中,而后分片分配给你集群中的节点上。当你的集群扩容或缩小,elasticsearch将会自动在你的节点间迁移分片,以使集群保持平衡。


一个分片(shard)是一个最小级别的“工做单元(worker unit)”,它只是保存索引中全部数据的一小片.咱们的文档存储和被索引在分片中,可是咱们的程序不知道如何直接与它们通讯。取而代之的是,他们直接与索引通讯.elasticsearch中的分片分为主分片和副本分片,复制分片只是主分片的一个副本,它用于提供数据的冗余副本,在硬件故障以后提供数据保护,同时服务于像搜索和检索等只读请求,主分片的数量和复制分片的数量均可以经过配置文件配置。可是主切片的数量只能在建立索引时定义且不能修改.相同的分片不会放在同一个节点上。



五、集群生态:

(1)、同集群中节点之间能够扩容缩容

(2)、主分片的数量会在其索引建立完成后修正,可是副本分片的数量会随时变化

(3)、相同的分片不会放在同一个节点上




六、集群健康(cluster health)

es中用三种颜色状态表示:green,yellow,red.

green:全部主分片(Primary Shard)和副本分片(Replica Shard)均可用

yellow:全部主分片可用,但不是全部副本分片均可用

red:不是全部的主分片均可用

[root@ossec-server plugins]# curl -XGET http://localhost:9200/_cluster/health\?pretty

{

  "cluster_name" : "elasticsearch", #集群的名字

  "status" : "yellow",              #集群的状态  

  "timed_out" : false,

  "number_of_nodes" : 2,            #节点数

  "number_of_data_nodes" : 1,       #数据节点数

  "active_primary_shards" : 216,    #主分片数,216个index库

  "active_shards" : 216,            #共有216个分片

  "relocating_shards" : 0,

  "initializing_shards" : 0,

  "unassigned_shards" : 216,        #未指定节点,配置了副本,仅用一台机器部署会出现这种状况

  "number_of_pending_tasks" : 0,

  "number_of_in_flight_fetch" : 0

}



3、elasticsearch配置文件详解

[root@elasticsearch-node02 config]# tree

.

├── elasticsearch.yml

└── logging.yml

第一个是es的基本配置文件,第二个是日志配置文件。下面主要讲elasticsearch.yml。


cluster.name: elasticsearch

配置es的集群名称,默认是elasticsearch,es会自动发如今同一网段下的es,若是在同一网段下有多个集群,就能够用这个属性来区分不一样的集群。


node.name: "Franz Kafka"

节点名,默认随机指定一个name列表中名字,该列表在es的jar包中config文件夹里name.txt文件中,其中有不少做者添加的有趣名字。


node.master: true

指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master,若是这台机挂了就会从新选举master。


node.data: true

指定该节点是否存储索引数据,默认为true。


index.number_of_shards: 5

设置默认索引分片个数,默认为5片。


index.number_of_replicas: 1

设置默认索引副本个数,默认为1个副本。


path.conf: /path/to/conf

设置配置文件的存储路径,默认是es根目录下的config文件夹。


path.data: /path/to/data

设置索引数据的存储路径,默认是es根目录下的data文件夹,能够设置多个存储路径,用逗号隔开,例:

path.data: /path/to/data1,/path/to/data2


path.work: /path/to/work

设置临时文件的存储路径,默认是es根目录下的work文件夹。


path.logs: /path/to/logs

设置日志文件的存储路径,默认是es根目录下的logs文件夹


path.plugins: /path/to/plugins

设置插件的存放路径,默认是es根目录下的plugins文件夹


bootstrap.mlockall: true

设置为true来锁住内存。由于当jvm开始swapping时es的效率会下降,因此要保证它不swap,能够把ES_MIN_MEM和ES_MAX_MEM两个环境变量设置成同一个值,而且保证机器有足够的内存分配给es。同时也要容许elasticsearch的进程能够锁住内存,linux下能够经过`ulimit -l unlimited`命令。


network.bind_host: 192.168.0.1

设置绑定的ip地址,能够是ipv4或ipv6的,默认为0.0.0.0。


network.publish_host: 192.168.0.1

设置其它节点和该节点交互的ip地址,若是不设置它会自动判断,值必须是个真实的ip地址。


network.host: 192.168.0.1

这个参数是用来同时设置bind_host和publish_host上面两个参数。


transport.tcp.port: 9300

设置节点间交互的tcp端口,默认是9300。


transport.tcp.compress: true

设置是否压缩tcp传输时的数据,默认为false,不压缩。


http.port: 9200

设置对外服务的http端口,默认为9200。


http.max_content_length: 100mb

设置内容的最大容量,默认100mb


http.enabled: false

是否使用http协议对外提供服务,默认为true,开启。


gateway.type: local

gateway的类型,默认为local即为本地文件系统,能够设置为本地文件系统,分布式文件系统,hadoop的HDFS,和amazon的s3服务器,其它文件系统的设置方法下次再详细说。


gateway.recover_after_nodes: 1

设置集群中N个节点启动时进行数据恢复,默认为1。


gateway.recover_after_time: 5m

设置初始化数据恢复进程的超时时间,默认是5分钟。


gateway.expected_nodes: 2

设置这个集群中节点的数量,默认为2,一旦这N个节点启动,就会当即进行数据恢复。


cluster.routing.allocation.node_initial_primaries_recoveries: 4

初始化数据恢复时,并发恢复线程的个数,默认为4。


cluster.routing.allocation.node_concurrent_recoveries: 2

添加删除节点或负载均衡时并发恢复线程的个数,默认为4。


indices.recovery.max_size_per_sec: 0

设置数据恢复时限制的带宽,如入100mb,默认为0,即无限制。


indices.recovery.concurrent_streams: 5

设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5。


discovery.zen.minimum_master_nodes: 1

设置这个参数来保证集群中的节点能够知道其它N个有master资格的节点。默认为1,对于大的集群来讲,能够设置大一点的值(2-4)


discovery.zen.ping.timeout: 3s

设置集群中自动发现其它节点时ping链接超时时间,默认为3秒,对于比较差的网络环境能够高点的值来防止自动发现时出错。


discovery.zen.ping.multicast.enabled: false

设置是否打开多播发现节点,默认是true。


discovery.zen.ping.unicast.hosts: ["host1", "host2:port", "host3[portX-portY]"]

设置集群中master节点的初始列表,能够经过这些节点来自动发现新加入集群的节点。


下面是一些查询时的慢日志参数设置

index.search.slowlog.level: TRACE

index.search.slowlog.threshold.query.warn: 10s

index.search.slowlog.threshold.query.info: 5s

index.search.slowlog.threshold.query.debug: 2s

index.search.slowlog.threshold.query.trace: 500ms


index.search.slowlog.threshold.fetch.warn: 1s

index.search.slowlog.threshold.fetch.info: 800ms

index.search.slowlog.threshold.fetch.debug:500ms

index.search.slowlog.threshold.fetch.trace: 200ms



4、搭建es集群

一、搭建elasticsearch集群很简单,只要cluster.name设置一致,而且机器在同一网段下,启动的es会自动发现对方,组成集群。elasticsearch采用广播的方式自动发现节点,须要等待一段时间才能发现新的节点。搭建完成后, 集群健康从yellow恢复到green


二、默认的elasticsearch把本身和0.0.0.0地址绑定,HTTP传输的监听端口在[9200-9300],节点之间

通讯的端口在[9300-9400]。(范围的意思是说若是一个端口已经被占用,它将会自动尝试下一个端口)


三、集群最好是3个以上节点,方便故障转移


四、默认状况下,eleasticsearch会把插件、日志、最重要的是你的数据都放在安装目录下。这可能会不幸的意外,经过安装新的elasticsearch就可能把安装目录覆盖了。若是你不当心,你可能擦除你全部的数据,建议更改数据、日志和插件路径

path.data: /home/elk/data

path.logs: /home/elk/logs

path.plugins: /home/elk/plugins




五、脑裂的危害:

这个配置必定程度地防止脑裂(没法发现部分节点)问题。设置最小主节点数Minimum Master Nodes。最小主节点数的设置对集群的稳定是很是重要的。该设置对预防脑裂是有帮助的,即一个集群中存在两个master。这个配置就是告诉elasticsearch除非有足够可用的master候选节点,不然就不选举master,只有有足够可用的master候选节点才进行选举。


六、该设置应该始终被配置为有主节点资格的法定节点数,法定节点数:(主节点资格的节点数/2)+1。

即最少须要2个节点才会选举master节点(即产生集群)。在配置文件的注释中看到官方的建议是,数字设置为【节点个数/2+1】,向上取整,本人的是3个节点,所以设置为2;


发现集群的超时时间为10s。默认状况下,一个节点会认为,若是master节点在3秒以内没有应答,那么这个节点就是死掉了,而增长这个值,会增长节点等待响应的时间,从必定程度上会减小误判。

discovery.zen.minimum_master_nodes: 2

discovery.zen.ping_timeout: 10s


七、节点类型

在配置集群中的节点时, 应该明确指定各节点的角色类型。如

(1)、node.mater:true & node.data:true

既为master,也为data节点,负责集群协调工做和数据存储等


(2)、node.mater:true & node.data:false

为master节点,负责集群协调工做等


(3)、node.mater:false & node.data:true

为data节点,负责索引数据和搜索等


(4)、node.mater:false & node.data:false

既不是master,也不是data节点,负责搜索负载均衡(从data节点抓取数据并做处理)


八、主节点配置

elasticsearch-node01配置:(我配了节点数以后,logstash和es起不来,不知道什么缘由,我就不配了)

[root@ossec-server config]# egrep -v '^$|^#' /home/elk/elasticsearch-1.6.0/config/elasticsearch.yml 

cluster.name: elasticsearch

node.name: "elasticsearch-node01"

node.master: true

node.data: true

bootstrap.mlockall: true

http.max_content_length: 2000mb

http.compression: true

index.cache.field.type: soft

index.cache.field.max_size: 50000

index.cache.field.expire: 10m


九、从节点配置

elasticsearch-node02配置:

[root@elasticsearch-node02 ~]# yum install java-1.8.0-openjdk

[root@elasticsearch-node02 ~]# java -version

openjdk version "1.8.0_91"


[root@elasticsearch-node02 ~]# egrep -v '^$|^#' /usr/local/elasticsearch-1.6.0/config/elasticsearch.yml

cluster.name: elasticsearch

node.name: "elasticsearch-node02"

node.master: false

node.data: true

path.data: /home/elk/data

path.work: /home/elk/work

path.logs: /home/elk/logs

path.plugins: /home/elk/plugins

bootstrap.mlockall: true

transport.tcp.port: 9301

http.port: 9201

http.max_content_length: 2000mb

http.compression: true

index.cache.field.type: soft

index.cache.field.max_size: 50000

index.cache.field.expire: 10m


开启bootstrap.mlockall,须要执行ulimit -l unlimited

bootstrap.mlockall: true

ulimit -l unlimited


[root@elasticsearch-node02 config]# ulimit -n 65535


[root@elasticsearch-node02 config]# ulimit -a

core file size          (blocks, -c) 0

data seg size           (kbytes, -d) unlimited

scheduling priority             (-e) 0

file size               (blocks, -f) unlimited

pending signals                 (-i) 62835

max locked memory       (kbytes, -l) unlimited

max memory size         (kbytes, -m) unlimited

open files                      (-n) 65535

pipe size            (512 bytes, -p) 8

POSIX message queues     (bytes, -q) 819200

real-time priority              (-r) 0

stack size              (kbytes, -s) 10240

cpu time               (seconds, -t) unlimited

max user processes              (-u) 62835

virtual memory          (kbytes, -v) unlimited

file locks                      (-x) unlimited


[root@elasticsearch-node02 config]# cat /etc/security/limits.conf 

root             hard    memlock          unlimited

root             hard    memlock          unlimited


十、集群搭建完成以后,查看ossec-server上es集群状态,已变为green

[root@ossec-server config]# curl -XGET http://localhost:9200/_cluster/health\?pretty

{

  "cluster_name" : "elasticsearch",

  "status" : "green",

  "timed_out" : false,

  "number_of_nodes" : 3,

  "number_of_data_nodes" : 2,

  "active_primary_shards" : 216,

  "active_shards" : 432,

  "relocating_shards" : 0,

  "initializing_shards" : 0,

  "unassigned_shards" : 0,

  "number_of_pending_tasks" : 0,

  "number_of_in_flight_fetch" : 0

}



[root@elasticsearch-node02 ~]# curl -XGET http://localhost:9201/_cluster/health\?pretty

{

  "cluster_name" : "elasticsearch",

  "status" : "green",

  "timed_out" : false,

  "number_of_nodes" : 3,

  "number_of_data_nodes" : 2,

  "active_primary_shards" : 216,

  "active_shards" : 432,

  "relocating_shards" : 0,

  "initializing_shards" : 0,

  "unassigned_shards" : 0,

  "number_of_pending_tasks" : 0,

  "number_of_in_flight_fetch" : 0

}


因为我只搞了2台node,就不演示es故障转移了,须要的话请参考下面文章


参考文章:

http://www.searchtech.pro/articles/2013/02/18/1361194291548.html

http://www.cnblogs.com/dennisit/p/4133131.html

相关文章
相关标签/搜索