全文搜索引擎 Elasticsearch 集群搭建入门教程
介绍
ElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。基百科、Stack Overflow、Github 都采用它。
本文从零开始,讲解如何使用 Elasticsearch 搭建自己的全文搜索引擎。每一步都有详细的说明,大家跟着做就能学会。
环境
1、VMware
2、Centos 6.6
3、Elasticsearch 5.5.2
4、JDK 1.8
VMware 安装以及在 VMware 中安装 Centos 这个就不说了,环境配置直接默认就好,不过分配给机器的内存最好设置大点(建议 2G),
使用 dhclient 命令来自动获取 IP 地址,查看获取的 IP 地址则使用命令 ip addr 或者 ifconfig ,则会看到网卡信息和 lo 卡信息。
给虚拟机额中的 linux 设置固定的 ip(因为后面发现每次机器重启后又要重新使用 dhclient 命令来自动获取 IP 地址)
1vim /etc/sysconfig/network-scripts/ifcfg-eth0
修改:
1onboot=yes
2bootproto=static
增加:(下面可设置可不设置)
1IPADDR=192.168.1.113 网卡IP地址
2GATEWAY=192.168.1.1
3NETMASK=255.255.255.0
设置好之后,把网络服务重启一下, service network restart
修改 ip 地址参考: http://jingyan.baidu.com/article/e4d08ffdd417660fd3f60d70.html
关注我
大环境都准备好了,下面开始安装步骤:
安装 JDK 1.8
先卸载自带的 openjdk,查找 openjdk
1rpm -qa | grep java
卸载 openjdk
1yum -y remove java-1.7.0-openjdk-1.7.0.65-2.5.1.2.el65.x8664
2yum -y remove java-1.6.0-openjdk-1.6.0.0-11.1.13.4.el6.x86_64
解压 JDK 安装包:
附上jdk1.8的下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
解压完成后配置一下环境变量就 ok
1、在/usr/local/下创建Java文件夹
1cd /usr/local/ 进入目录
2mkdir java 新建java目录
2、文件夹创建完毕,把安装包拷贝到 Java 目录中,然后解压 jdk 到当前目录
1cp /usr/jdk-8u144-linux-x64.tar.gz /usr/local/java/ **注意匹配你自己的文件名** 拷贝到java目录
2tar -zxvf jdk-8u144-linux-x64.tar.gz 解压到当前目录(Java目录)
3、解压完之后,Java目录中会出现一个jdk1.8.0_144的目录,这就解压完成了。之后配置一下环境变量。
编辑/etc/下的profile文件,配置环境变量
1vi /etc/profile
进入profile文件的编辑模式
在最后边追加一下内容(配置的时候一定要根据自己的目录情况而定哦!)
1 JAVA_HOME=/usr/local/java/jdk1.8.0_144
2 CLASSPATH=$JAVA_HOME/lib/
3 PATH=$PATH:$JAVA_HOME/bin
4 export PATH JAVA_HOME CLASSPATH
之后保存并退出文件之后。
让文件生效:
1source /etc/profile
在控制台输入Java 和 Java -version 看有没有信息输出,如下: java -version
1java version "1.8.0_144"
2 Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
3 Java HotSpot(TM) Client VM (build 25.60-b23, mixed mode)
能显示以上信息,就说明 JDK 安装成功啦
安装 Maven
因为后面可能会用到 maven ,先装上这个。
1、下载 maven
1wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bin.tar.gz
2、解压至 /usr/local 目录
1tar -zxvf apache-maven-3.2.5-bin.tar.gz
3、配置公司给的配置
替换成公司给的 setting.xml 文件,修改关于本地仓库的位置, 默认位置:${user.home}/.m2/repository
4、配置环境变量etc/profile
最后添加以下两行
1export MAVEN_HOME=/usr/local/apache-maven-3.2.5
2export PATH=${PATH}:${MAVEN_HOME}/bin
5、测试
1[root@localhost ~]# mvn -v
2Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-14T09:29:23-08:00)
3Maven home: /usr/local/apache-maven-3.2.5
VMware 虚拟机里面的三台机器 IP 分别是:
1192.168.153.133
2192.168.153.134
3192.168.153.132
配置 hosts
在 /etc/hosts下面编写:ip node 节点的名字(域名解析)
1vim /etc/hosts
新增:
1192.168.153.133 es1
2192.168.153.134 es2
3192.168.153.132 es3
设置 SSH 免密码登录
安装expect命令 : yum -y install expect
将 ssh_p2p.jar 随便解压到任何目录下: (这个 jar 包可以去网上下载)
1unzip ssh_p2p.zip
修改 resource 的 ip 值
1vim /ssh_p2p/deploy_data/resource (各个节点和账户名,密码,free代表相互都可以无密码登陆)
1#设置为你每台虚拟机的ip地址,用户名,密码
2address=(
3"192.168.153.133,root,123456,free"
4"192.168.153,134,root,123456,free"
5"192.168.153.132,root,123456,free"
6)
修改 start.sh 的运行权限
1chmod u+x start.sh
运行
1./start.sh
测试:
ssh ip地址 (测试是否可以登录)
安装 ElasticSearch
下载地址: https://www.elastic.co/downloads/elasticsearch
1wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.2.tar.gz
2cd /usr/local
3tar -zxvf elasticsearch-5.5.2.tar.gz
su tzs
切换到 tzs 用户下 ( 默认不支持 root 用户)
sh /usr/local/elasticsearch/bin/elasticsearch -d
其中 -d 表示后台启动
在 vmware 上测试是否成功:curl http://localhost:9200/
出现如上图这样的效果,就代表已经装好了。
elasticsearch 默认 restful-api 的端口是 9200 不支持 IP 地址,也就是说无法从主机访问虚拟机中的服务,只能在本机用 http://localhost:9200 来访问。如果需要改变,需要修改配置文件 /usr/local/elasticsearch/config/elasticsearch.yml 文件,加入以下两行:
1network.bind_host: 0.0.0.0
2network.publish_host: _nonloopback:ipv4
或去除 network.host 和 http.port 之前的注释,并将 network.host 的 IP 地址修改为本机外网 IP。然后重启,Elasticsearch
关闭方法(输入命令:ps -ef | grep elasticsearch
,找到进程,然后 kill 掉就行了。
如果外网还是不能访问,则有可能是防火墙设置导致的 ( 关闭防火墙:service iptables stop
)
修改配置文件:
1vim config/elasticsearch.yml
修改 :
1cluster.name : my-app (集群的名字,名字相同的就是一个集群)
2
3node.name : es1 (节点的名字, 和前面配置的 hosts 中的 name 要一致)
4
5path.data: /data/elasticsearch/data (数据的路径。没有要创建(`mkdir -p /data/elasticsearch/{data,logs}`),并且给执行用户权限 `chown tzs /data/elasticsearch/{data,logs} -R ` )
6path.logs: /data/elasticsearch/logs (数据 log 信息的路径,同上)
7network.host: 0.0.0.0 //允许外网访问,也可以是自己的ip地址
8http.port: 9200 //访问的端口
9discovery.zen.ping.unicast.hosts: ["192.168.153.133", "192.168.153.134", "192.168.153.132"] //各个节点的ip地址
记得需要添加上:(这个是安装 head 插件要用的, 目前不需要)
1http.cors.enabled: true
2http.cors.allow-origin: "*"
最后在外部浏览器的效果如下图:
安装 IK 中文分词
可以自己下载源码使用 maven 编译,当然如果怕麻烦可以直接下载编译好的
https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v5.5.2
注意下载对应的版本放在 plugins 目录下
解压
1unzip elasticsearch-analysis-ik-5.5.2.zip
在 es 的 plugins 下新建 ik 目录
1mkdir ik
将刚才解压的复制到ik目录下
1cp -r elasticsearch/* ik
删除刚才解压后的
1rm -rf elasticsearch
2rm -rf elasticsearch-analysis-ik-5.5.2.zip
IK 带有两个分词器
ik_max_word :会将文本做最细粒度的拆分;尽可能多的拆分出词语
ik_smart:会做最粗粒度的拆分;已被分出的词语将不会再次被其它词语占有
安装完 IK 中文分词器后(当然不止这种中文分词器,还有其他的,可以参考我的文章 Elasticsearch 默认分词器和中分分词器之间的比较及使用方法),测试区别如下:
ik_max_word
执行:
1curl -XGET 'http://192.168.153.134:9200/_analyze?pretty&analyzer=ik_max_word' -d '联想是全球最大的笔记本厂商'
结果:
1{
2 "tokens" : [
3 {
4 "token" : "联想",
5 "start_offset" : 0,
6 "end_offset" : 2,
7 "type" : "CN_WORD",
8 "position" : 0
9 },
10 {
11 "token" : "是",
12 "start_offset" : 2,
13 "end_offset" : 3,
14 "type" : "CN_CHAR",
15 "position" : 1
16 },
17 {
18 "token" : "全球",
19 "start_offset" : 3,
20 "end_offset" : 5,
21 "type" : "CN_WORD",
22 "position" : 2
23 },
24 {
25 "token" : "最大",
26 "start_offset" : 5,
27 "end_offset" : 7,
28 "type" : "CN_WORD",
29 "position" : 3
30 },
31 {
32 "token" : "的",
33 "start_offset" : 7,
34 "end_offset" : 8,
35 "type" : "CN_CHAR",
36 "position" : 4
37 },
38 {
39 "token" : "笔记本",
40 "start_offset" : 8,
41 "end_offset" : 11,
42 "type" : "CN_WORD",
43 "position" : 5
44 },
45 {
46 "token" : "笔记",
47 "start_offset" : 8,
48 "end_offset" : 10,
49 "type" : "CN_WORD",
50 "position" : 6
51 },
52 {
53 "token" : "本厂",
54 "start_offset" : 10,
55 "end_offset" : 12,
56 "type" : "CN_WORD",
57 "position" : 7
58 },
59 {
60 "token" : "厂商",
61 "start_offset" : 11,
62 "end_offset" : 13,
63 "type" : "CN_WORD",
64 "position" : 8
65 }
66 ]
67}
ik_smart
执行:
1curl -XGET 'http://localhost:9200/_analyze?pretty&analyzer=ik_smart' -d '联想是全球最大的笔记本厂商'
结果:
1{
2 "tokens" : [
3 {
4 "token" : "联想",
5 "start_offset" : 0,
6 "end_offset" : 2,
7 "type" : "CN_WORD",
8 "position" : 0
9 },
10 {
11 "token" : "是",
12 "start_offset" : 2,
13 "end_offset" : 3,
14 "type" : "CN_CHAR",
15 "position" : 1
16 },
17 {
18 "token" : "全球",
19 "start_offset" : 3,
20 "end_offset" : 5,
21 "type" : "CN_WORD",
22 "position" : 2
23 },
24 {
25 "token" : "最大",
26 "start_offset" : 5,
27 "end_offset" : 7,
28 "type" : "CN_WORD",
29 "position" : 3
30 },
31 {
32 "token" : "的",
33 "start_offset" : 7,
34 "end_offset" : 8,
35 "type" : "CN_CHAR",
36 "position" : 4
37 },
38 {
39 "token" : "笔记本",
40 "start_offset" : 8,
41 "end_offset" : 11,
42 "type" : "CN_WORD",
43 "position" : 5
44 },
45 {
46 "token" : "厂商",
47 "start_offset" : 11,
48 "end_offset" : 13,
49 "type" : "CN_WORD",
50 "position" : 6
51 }
52 ]
53}
安装 head 插件
elasticsearch-head 是一个 elasticsearch 的集群管理工具,它是完全由 html5 编写的独立网页程序,你可以通过插件把它集成到 es。
安装 git
1yum remove git
2yum install git
3git clone git://github.com/mobz/elasticsearch-head.git 拉取 head 插件到本地,或者直接在 GitHub 下载 压缩包下来
安装nodejs
先去官网下载 node-v8.4.0-linux-x64.tar.xz
1tar -Jxv -f node-v8.4.0-linux-x64.tar.xz
2mv node-v8.4.0-linux-x64 node
环境变量设置:
1vim /etc/profile
新增:
1export NODE_HOME=/opt/node
2export PATH=$PATH:$NODE_HOME/bin
3export NODE_PATH=$NODE_HOME/lib/node_modules
使配置文件生效(这步很重要,自己要多注意这步)
1source /etc/profile
测试是否全局可用了:
1node -v
然后
1mv elasticsearch-head head
2cd head/
3npm install -g grunt-cli
4npm install
5grunt server
再 es 的配置文件中加:
1http.cors.enabled: true
2http.cors.allow-origin: "*"
在浏览器打开 http://192.168.153.133:9100/
就可以看到效果了,
遇到问题
把坑都走了一遍,防止以后再次入坑,特此记录下来
1、ERROR Could not register mbeans java.security.AccessControlException: access denied ("javax.management.MBeanTrustPermission" "register")
改变 elasticsearch 文件夹所有者到当前用户
1sudo chown -R noroot:noroot elasticsearch
这是因为 elasticsearch 需要读写配置文件,我们需要给予 config 文件夹权限,上面新建了 elsearch 用户,elsearch 用户不具备读写权限,因此还是会报错,解决方法是切换到管理员账户,赋予权限即可:
1sudo -i
2
3chmod -R 775 config
2、[WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
原因是elasticsearch默认是不支持用root用户来启动的。
解决方案一:
1Des.insecure.allow.root=true
修改 /usr/local/elasticsearch-2.4.0/bin/elasticsearch
,
添加
1ES_JAVA_OPTS="-Des.insecure.allow.root=true"
或执行时添加:
1sh /usr/local/elasticsearch-2.4.0/bin/elasticsearch -d -Des.insecure.allow.root=true
注意:正式环境用root运行可能会有安全风险,不建议用root来跑。
解决方案二:添加专门的用户
1useradd elastic
2chown -R elastic:elastic elasticsearch-2.4.0
3su elastic
4sh /usr/local/elasticsearch-2.4.0/bin/elasticsearch -d
3、UnsupportedOperationException: seccomp unavailable: requires kernel 3.5+ with CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER compiled in
只是警告,使用新的linux版本,就不会出现此类问题了。
4、ERROR: [4] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
原因:无法创建本地文件问题,用户最大可创建文件数太小
解决方案:切换到 root 用户,编辑 limits.conf 配置文件, 添加类似如下内容:
1vim /etc/security/limits.conf
添加如下内容:
1* soft nofile 65536
2* hard nofile 131072
3* soft nproc 2048
4* hard nproc 4096
[2]: max number of threads [1024] for user [tzs] is too low, increase to at least [2048]
原因:无法创建本地线程问题,用户最大可创建线程数太小
解决方案:切换到root用户,进入limits.d目录下,修改90-nproc.conf 配置文件。
1vim /etc/security/limits.d/90-nproc.conf
找到如下内容:
1soft nproc 1024
修改为
1* soft nproc 2048
[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
原因:最大虚拟内存太小
root用户执行命令:
1sysctl -w vm.max_map_count=262144
或者修改 /etc/sysctl.conf 文件,添加 “vm.max_map_count”设置
设置后,可以使用
1$ sysctl -p
[4]: system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
原因:Centos6不支持SecComp,而ES5.4.1默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动。
详见 :https://github.com/elastic/elasticsearch/issues/22899
解决方法:在elasticsearch.yml中新增配置bootstrap.system_call_filter,设为false,注意要在Memory下面:
1bootstrap.memory_lock: false
2bootstrap.system_call_filter: false
5、 java.lang.IllegalArgumentException: property [elasticsearch.version] is missing for plugin [head]
再 es 的配置文件中加:
1http.cors.enabled: true
2http.cors.allow-origin: "*"
最后
整个搭建的过程全程自己手动安装,不易,如果安装很多台机器,是否可以写个脚本之类的自动搭建呢?可以去想想的。首发于:http://www.54tianzhisheng.cn/2017/09/09/Elasticsearch-install/ ,转载请注明出处,谢谢配合!