0°

ElasticSearch大数据分布式弹性搜索引擎使用—从0到1

此时你应该会收到一个Error的提示:

WrapperSimpleApp Error: Unable to locate the class org.elasticsearch.bootstrap.ElasticsearchF : java.lang.ClassNotFoundException: org.elasticsearch.bootstrap.ElasticsearchF

 

23

 

第一次看到这个我有点蒙,这个ElasticsearchF是个什么对象。命名有点特殊,再进一步查看Exception的信息,其实是一个ClassNotFoundException异常。说明找不到这个ElasticSearchF类。

两种可能性,第一就是java elasticsearch相关包的问题,确实缺少这个类。但是这个可能性很小,因为我们之前直接运行elasticsearch是成功的。我当时用jd-gui翻了下es的包,确实没有这个类。

第二就是这里的配置错误,应该就个手误,确实没有ElasticsearchF这个类。

我们查看下service/elasticsearch.conf配置文件里是不是有这个‘elasticsearchF’字符串。(wrapper包是使用当前目录下的elasticsearch.conf作为配置文件使用的)

grep –i elasticsearchf elasticsearch.conf

 

24

 

确实有这个字符串,我们进行编辑保存,去掉最后的‘F’。

 

25

 

然后我们在进行启动尝试。

./elasticsearch console

我不知道你是不是会和我的情况一样,提示相关命令都是不规范的。

 

26

 

这个运行链路基本上经过三个路径,第一个就是service/elasticsearch shell启动脚本,然后获取命令分析命令再启动exec下的相关java servicewrapper程序。

这个java servicewrapper程序,版本是3.5.14。根据上述思路,通过查看elasticsearch shell程序,它在接收到外部的命令之后会启动exec下的java servicewrapper程序。我想试着编辑了下elasticsearch shell文件,输出一些信息出来,查看下是不是获取相关路径或者参数之类的导致错误。(遇到问题不怕,至少我们要一路跟下去,看下究竟是怎么回事。)

vim ./elasticsearch

esc

:/console

找下console在哪里,然后加上调试文本信息,输出到界面上。

 

27

 

再运行,查看命令参数是否有问题。

 

28

 

查看了下,输出的参数基本都没有问题。一时无解。好奇心作怪,本想再进一步看下exec/elasticsearch-linux-x86-64.so文件的,后来发现打开根本就看不懂。所以就另寻其他方法,我找了windows版本servicewrapper,发现windows的elasticsearchservicewrapper是没有32位的servicewrapper的。我试着运行起来基本上也是报相同的错误,但是windows的wrapper的error信息比较多点,提示出错的原因在哪里。

我想修改下日志的输出级别,看能否输出一些可以用的信息。编辑service/elasticsearch.conf wrapper包专用配置。

# Log Level for console output. (See docs for log levels) wrapper.console.loglevel=TRACE

# Log Level for console output. (See docs for log levels) wrapper.console.loglevel=TRACE

我们将日志输出级别设置成trace,有两处需要设置,我们再看输出信息。

 

29

 

是输出了一些有用的信息,可以查看log文件详情。

WrapperManager Debug: Received a packet LOGFILE : /usr/share/elasticsearch/logs/service.log

但是有关于error的信息还是只有一条。

这里就告一段落。我们的目的是为了使用console来运行,想查看下一些运行日志,但是跑不起来也无所谓,我们继续执行安装操作。

(哪位博友如果知道问题在哪里的可以分享出来,我觉得这个问题不是一个偶发性问题,应该都会遇到。我先抛出问题,至少可以服务将来的使用者。这里先谢谢了。)

其实,如果你不使用elasticsearch servicewrapper来包装而是自己去下载java serivcewrapper来包装elasticsearch也是可以的,实现起来也很方便。

我们回到主题,既然我们无法console运行,也看不了一些wrapper console执行时的情况,那我们就只能进行安装了。

2.5.3 servicewrapper安装 (elasticsearch init.d 启动文件设置user、openfile、configpath)

按照elasticsearch servicewrapper parameter参数指示,我们执行安装。

./elasticsearch install

Installing the Elasticsearch daemon..

守护进程安装完成。我们还是前去系统目录下查看是不是安装成功(技术人员始终保持一个严谨的心态是有必要的。)前往/etc/init.d/目录下查看。

ll /etc/init.d/

-rwxrwxr–. 1 root root 4496 10月 4 01:43 elasticsearch

我这里设置过chmod u+x ./elasticsearch。别忘记设置文件的执行权限,这在我们【2.1节】里将结果,这里就不重复了。

我们开始编辑elasticsearch启动文件。

 

30

 

主要就是这段,填写好配置的es的专用账户(elasticsearch【2.2.节】),还有相应的文件路径。这里先忽略MAX_OPEN_FILES、MAX_MAP_COUNT两个配置项,在后面【3.3.节】配置部分会讲解到。

2.5.4 chkconfig -add 加入linux启动服务列表

将其添加到系统服务中,以便被系统自动启动。

chkconfig –add elasticsearch

chkconfig –list

 

31

 

已经添加好系统自启动服务列表中。

service elasticsearch start

启动es实例,等待端口启动完成,稍等片刻查看端口情况。

netstat –tnl

 

32

 

9300端口比9200端口先启动,因为9300端口是 cluster内部管理端口。9200是rest endpoint 服务端口。当然,这个时间延长不会很长。

端口都启动成功之后,我们查看下能否正常访问es实例。

curl -get http://192.168.0.103:9200/ { "name" : "node-1", "cluster_name" : "orderSearch_cluster", "version" : { "number" : "2.3.4", "build_hash" : "e455fd0c13dceca8dbbdbb1665d068ae55dabe3f", "build_timestamp" : "2016-06-30T11:24:31Z", "build_snapshot" : false, "lucene_version" : "5.5.0" }, "tagline" : "You Know, for Search" }

我们还是使用_cat rest endpoint来查看。

curl -get http://192.168.0.103:9200/_cat/nodes 192.168.0.103 192.168.0.103 4 61 0.00 d * node-1

如果你可以在本机访问,但是在外部浏览器中无法访问,很可能是防火墙的设置问题,你可以去设置下防火墙。

 

33

 

vim /etc/sysconfig/iptables

重启网络服务,以便加载防火墙设置项。

service network restart

然后再尝试看能否外部访问,如果不行你就telnet端口下。

因为访问不了还有一个原因是和elasticsearch.yml一个配置项有关系。见【3.1.1节】。

重启机器,查看es实例是否会自动启动。

shutdown –r now

稍等片刻,然后尝试连接机器。

如果没出什么意外,都应该正常的,端口也启动成功了。说明我们完成了es实例自启动功能,它现在作为linux系统服务被自动管理。

安装成服务之后,elasticsearch servicewrapper和我们就没有太多关系了。因为它的parameter都是围绕者我们基于servicewrapper来使用的。

2.6.安装_plugin/head管理插件(辅助管理)

为了很好的管理集群,我们需要相应的工具,head是比较流行和通用的,而且是免费的。当然还有很多好用的其他工具,如,Bigdesk、Marvel(商用收费)。plugin的安装都大同小异,我们这里就使用通用的head工具。

先看下,head给我们带来的清晰的集群节点管理视图。

 

34

 

这是有三个节点的es集群实例。它是一个二维矩阵排列,最上面横向是索引,最左边是节点,交叉的地方是索引的分片信息和分片比例。

安装head插件还是比较方便的,你也可以直接copy文件的方式使用。在elasticsearch的home目录下有一个plugins目录,它是所有插件的目录,所有的插件都会在这个文件夹查找和加载。

我们看下安装head插件方法。在elasticsearch/bin 目录下有一个plugin可执行文件,它是专门用来安装插件用的程序。

./plugin -install mobz/elasticsearch-head

插件的查找路径有几个elasticsearch官网是一个,github是一个。这里会先尝试在github上查找,稍等片刻,等待安装完成。我们尝试访问head插件地址rest地址/_plugin/head。

 

35

 

看到这个界面基本安装成功了,node-1默认是master节点。

2.7.安装chrom中的elasticsearch客户端插件

chrom中有很多可以使用的elasticsearch客户端插件,便于开发和维护,建议直接使用chrom中的插件。只要搜索下elasticsearch关键字就会出来很多。

 

36

 

有两个比较常用,也比较好用,EalsticSearch Toolbox、Sense(自动提示dsl编辑工具)。chrom插件都是那么的酷,使用起来都很赏心悦目。

 

37

 

elasticsearch toolbox 可以很方便的查询和导出数据。

 

38

 

sense可以让你编辑elasticsearch dsl 特定语言会有启动提示帮助,这样编写起复杂的dsl效率会高而且不易出错。其他的工具我也没用过,感觉都可以尝试用用看。

(备注:如果你无法访问chrom商店中心就需要特殊处理下,这里就不解释了。)

2.8.使用elasticsearch自带的_cat工具

在一些特殊的情况下你可能无法直接使用plugin来帮你管理或者查看集群情况。此时你可以直接使用elasticsearch自带的rest _cat查看集群情况,比如,你可能发现_plugin/head有一些节点没有上来,但是你又不确定发生了什么情况,你就可以使用/_cat/nodes来查看所有node的情况。有时候确实有的节点没有启动起来,但是大多数情况下都是各自为政(脑裂),你可能需要让他们重新选举或者加快的选举过程。

http://192.168.0.20:9200/_cat/nodes?v (查看nodes情况)

 

39

 

_cat rest端点带有一个v的参数,这个参数是帮助你阅读的参数。_search rest端点带有pretty参数,这个参数是帮助查询数据阅读的。每一个端点基本上都有各自的辅助阅读参数。

http://192.168.0.20:9200/_cat/shards?v(查看shards情况)

 

40

 

http://192.168.0.20:9200/_cat/ (查看所有可以cat的功能)

 

41

 

你可以查看系统 aliases别名、segments片段(看下每个片段的提交版本一致性)、indices索引集合等等。

2.9.clone 虚机(修改IP、HWaddr、UUID配置,最后修改下系统时间)

当我们完成了对一台机器的安装之后,接下来就需要搭建分布式系统。分布式系统就需要多节点机器,按照es分布式集群搭建最佳实践,你至少需要三个节点。所以我们将已经安装完成的这个机器clone出来两台,一共三台组成可以工作的三个节点的分布式系统。

首先clone当前安装完成的机器,192.168.0.103,clone好之后启动起来修改几个配置即可。(因为你是clone出来的,所以配置已经重复,比如,网卡地址、IP地址)

编辑网卡配置文件:

vim /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth3 HWADDR=00:0C:29:CF:48:23 TYPE=Ethernet UUID=b848e750-d491-4c9d-b2ca-c853f21bf40b ONBOOT=yes NM_CONTROLLED=yes BOOTPROTO=static BROADCAST=192.168.233.255 IPADDR=192.168.0.103 NETMASK=255.255.255.0 GATEWAY=192.168.0.1

DEVICE 是网卡标示,根据你本地的网卡标识修改成对应的即可,可以通过ifconfig查看。HWADDR网卡地址,随意修改下,保证在你的网段内不重复即可。UUID也是和HWADDR一样修改。

IP地址修改成你自己觉得合适的IP,最好参考你当前物理机器的相关配置。GATEWAY网关地址要参考你物理机器的网关地址,如果你的虚拟机使用的是桥接模式的网络连接,这里就需要设置,要不然网络就连接不上。

重启网络服务:

service network restart

稍等片刻,ssh重新连接,然后ifconfig看下网络相关参数是否正确,最后再ping一下外部网址和你当前物理机器的IP,保证网络都是通畅的。

最后我们需要修改下linux的系统时间,这是为了防止服务器时间不一致,导致很多细微的问题,比如,es集群master选举的时间戳问题、log4j输出的日志的记录问题等等。在分布式系统中,时钟非常重要。

date -s '20161008 20:47:00'

时区的话如果你需要也可以设置,这里暂时不需要。

根据你自己的需要,你clone几台机器。按照默认的方式我们大概约定为,192.168.0.10、192.168.0.20、192.168.0.30,这三台机器将组成一个es分布式集群。

3.配置

集群的各个节点我们已经准备好了,我们接下来准备配置集群,让这三个节点可以连接在一起。这里涉及的配置比较简单,只是完成集群的一个基本常用功能,如有特殊的需求可以自行查看elasticsearch官网或者百度,这方面的资料已经很丰富了。

这里的一些配置我们其实已经受益于elasticsearch servicewrapper简化了很多。

从这里开始,我们将对三台机器进行配置,192.168.160.10、192.168.160.20、192.168.160.30。

3.1.elasticsearch.yml配置

在elasticsearch的config目录下都是配置文件。导航到 cd /usr/share/elasticsearch/config目录。

3.1.1.IP访问限制、默认端口修改9200

这里有两个需要提醒下,第一个就是IP访问限制,第二个就是es实例的默认端口号9200。IP访问限制可以限定具体的IP访问服务器,这有一定的安全过滤作用。

# Set the bind address to a specific IP (IPv4 or IPv6): # network.host: 0.0.0.0

如果设置成0.0.0.0则是不限制任何IP访问。一般在生产的服务器可能会限定几台IP,通常用于管理使用。

默认的端口9200在一般情况下也有点风险,可以将默认的端口修改成另外一个,这还有一个原因就是怕开发人员误操作,连接上集群。当然,如果你的公司网络隔离做的很好也无所谓。

# # Set a custom port for HTTP: # http.port: 9200 transport.tcp.port: 9300

这里的9300是集群内部通讯使用的端口,这个也可以修改掉。因为连接集群的方式有两种,通过扮演集群node也是可以进入集群的,所以还是安全起见,修改掉默认的端口。

(备注:记得修改三个节点的相同配置,要不然节点之间无法建立连接工作,也会报错。)

3.1.2.集群发现IP列表、node、cluster名称

紧接着修改集群节点IP地址,这样可以让集群在规定的几个节点之间工作。elasticsearch,默认是使用自动发现IP机制。就是在当前网段内,只要能被自动感知到的IP就能自动加入到集群中。这有好处也有坏处。好处就是自动化了,当你的es集群需要云化的时候就会非常方便。但是也会带来一些不稳定的情况,如,master的选举问题、数据复制问题。

导致master选举的因素之一就是集群有节点进入。当数据复制发生的时候也会影响集群,因为要做数据平衡复制和冗余。这里面可以独立master集群,剔除master集群的数据节点能力。

固定列表的IP发现有两种配置方式,一种是互相依赖发现,一种是全量发现。各有优势吧,我是使用的依赖发现来做的。这有个很重要的参考标准,就是你的集群扩展速度有多快。因为这有个问题就是,当全量发现的时候,如果是初始化集群会有很大的问题,就是master全局会很长,然后节点之间的启动速度各不一样。所以我采用了靠谱点的依赖发现。

你需要在192.168.0.20的elasticsearch中配置成:

# ——————————— Discovery ———————————- # # Pass an initial list of hosts to perform discovery when new node is started: # The default list of hosts is ["127.0.0.1", "[::1]"] # discovery.zen.ping.unicast.hosts: [ "192.168.0.10:9300" ]

让他去发现10的机器,以此内推,完成剩下的30的配置。

(备注:网上有很多针对不同场景的发现配置,大家可以就此抛砖引玉,对这个主题感兴趣的可以百度很多资料的。)

然后你需要配置下集群名称,就是你当前节点所在集群的名称,这有助于你规划你的集群。只有集群名称一样才能组成一个逻辑集群。

# ———————————- Cluster ———————————– # # Use a descriptive name for your cluster: # cluster.name: orderSearch_cluster # # ———————————— Node ———————————— # # Use a descriptive name for the node: # node.name: node-2

以此类推,完成另外两个节点的配置。cluster.name的名称必须保持一样。然后分别设置node.name。

3.1.3.master node 启动切换

这里有一个小小的经验分享下,就是我在使用集群的时候,因为我是虚拟化出来的机器所以经常会关闭和重启集群。有时候发现集群master宣酒会有一个问题就是,如果你的集群关闭的方式不对,会直接影响下个master选举的逻辑。

我查了下选举的大概逻辑,它会根据分片的数据的前后新鲜程度来作为选举的一个重要逻辑。(日志、数据、时间都会作为集群master全局的重要指标)

因为考虑到数据一致性问题,当然是用最新的数据节点作为master,然后进行新数据的复制和刷新其他node。

如果你发现有一个节点迟迟进不了集群,可以尝试重启下es服务,让集群master重新全局。

3.2.linux 打开最大文件数设置(用作index时候的系统阀值)

在linux系统中,要想使用最大化的系统资源需要向操作系统去申请。由于elasticsearch需要在index的时候用到大量的文件句柄资源,在原来linux默认的资源下可能会不够用。所以这里就需要我们在使用的时候事先设置好。

这个配置在《ElasticSearch 可扩展的开源弹性搜索解决方案》一书中作为重点配置介绍,可想而知还是有不少人踩到过的坑。

这个配置在elasticsearch service wrapper中帮我们配置好了。

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!