全文搜索引擎 Elasticsearch 集群搭建入门教程

介绍

ElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 开发的,并做为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,可以达到实时搜索,稳定,可靠,快速,安装使用方便。基百科、Stack Overflow、Github 都采用它。html

本文从零开始,讲解如何使用 Elasticsearch 搭建本身的全文搜索引擎。每一步都有详细的说明,你们跟着作就能学会。html5

环境

一、VMwarejava

二、Centos 6.6node

三、Elasticsearch 5.5.2linux

四、JDK 1.8git

VMware 安装以及在 VMware 中安装 Centos 这个就不说了,环境配置直接默认就好,不过度配给机器的内存最好设置大点(建议 2G),github

使用 dhclient 命令来自动获取 IP 地址,查看获取的 IP 地址则使用命令 ip addr 或者 ifconfig ,则会看到网卡信息和 lo 卡信息。web

给虚拟机额中的 linux 设置固定的 ip(由于后面发现每次机器重启后又要从新使用 dhclient 命令来自动获取 IP 地址)apache

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

修改:npm

onboot=yes
bootproto=static

增长:(下面可设置可不设置)

IPADDR=192.168.1.113            网卡IP地址
GATEWAY=192.168.1.1
NETMASK=255.255.255.0

设置好以后,把网络服务重启一下, service network restart

修改 ip 地址参考: http://jingyan.baidu.com/arti...

大环境都准备好了,下面开始安装步骤:

安装 JDK 1.8

先卸载自带的 openjdk,查找 openjdk

rpm -qa | grep java

卸载 openjdk

yum -y remove  java-1.7.0-openjdk-1.7.0.65-2.5.1.2.el65.x8664
yum -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/technet...

解压完成后配置一下环境变量就 ok

一、在/usr/local/下建立Java文件夹

cd /usr/local/                                    进入目录
mkdir java                                     新建java目录

二、文件夹建立完毕,把安装包拷贝到 Java 目录中,而后解压 jdk 到当前目录

cp /usr/jdk-8u144-linux-x64.tar.gz /usr/local/java/    **注意匹配你本身的文件名**  拷贝到java目录
tar -zxvf jdk-8u144-linux-x64.tar.gz       解压到当前目录(Java目录)

三、解压完以后,Java目录中会出现一个jdk1.8.0_144的目录,这就解压完成了。以后配置一下环境变量。
编辑/etc/下的profile文件,配置环境变量

vi /etc/profile                  进入profile文件的编辑模式

在最后边追加一下内容(**配置的时候必定要根据本身的目录状况而定哦!**)

 JAVA_HOME=/usr/local/java/jdk1.8.0_144
 CLASSPATH=$JAVA_HOME/lib/
 PATH=$PATH:$JAVA_HOME/bin
 export PATH JAVA_HOME CLASSPATH

以后保存并退出文件以后。

让文件生效: source /etc/profile

在控制台输入Java 和 Java -version 看有没有信息输出,以下: java -version

java version "1.8.0_144"
 Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
 Java HotSpot(TM) Client VM (build 25.60-b23, mixed mode)

能显示以上信息,就说明 JDK 安装成功啦


安装 Maven

由于后面可能会用到 maven ,先装上这个。

一、下载 maven

wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bin.tar.gz

二、解压至 /usr/local 目录

tar -zxvf apache-maven-3.2.5-bin.tar.gz

三、配置公司给的配置

替换成公司给的 setting.xml 文件,修改关于本地仓库的位置, 默认位置: ${user.home}/.m2/repository

四、配置环境变量etc/profile 最后添加如下两行

export MAVEN_HOME=/usr/local/apache-maven-3.2.5
export PATH=${PATH}:${MAVEN_HOME}/bin

五、测试

[root@localhost ~]# mvn -v
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-14T09:29:23-08:00)
Maven home: /usr/local/apache-maven-3.2.5

VMware 虚拟机里面的三台机器 IP 分别是:

192.168.153.133
192.168.153.134
192.168.153.132

配置 hosts

在 /etc/hosts下面编写:ip node 节点的名字(域名解析)

vim  /etc/hosts

新增:

192.168.153.133  es1
192.168.153.134  es2
192.168.153.132  es3

设置 SSH 免密码登陆

安装expect命令 : yum -y install expect

将 ssh_p2p.jar 随便解压到任何目录下: (这个 jar 包能够去网上下载)

unzip ssh_p2p.zip

修改 resource 的 ip 值

vim /ssh_p2p/deploy_data/resource  (各个节点和帐户名,密码,free表明相互均可以无密码登录)
#设置为你每台虚拟机的ip地址,用户名,密码
address=(
"192.168.153.133,root,123456,free"
"192.168.153,134,root,123456,free"
"192.168.153.132,root,123456,free"
)

修改 start.sh 的运行权限

chmod u+x start.sh

运行

./start.sh

测试:

ssh ip地址 (测试是否能够登陆)

安装 ElasticSearch

下载地址: https://www.elastic.co/downlo...

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.2.tar.gz
cd /usr/local
tar -zxvf   elasticsearch-5.5.2.tar.gz

su tzs 切换到 tzs 用户下 ( 默认不支持 root 用户)

sh /usr/local/elasticsearch/bin/elasticsearch -d 其中 -d 表示后台启动

在 vmware 上测试是否成功:curl http://localhost:9200/

test

出现如上图这样的效果,就表明已经装好了。

elasticsearch 默认 restful-api 的端口是 9200 不支持 IP 地址,也就是说没法从主机访问虚拟机中的服务,只能在本机用 http://localhost:9200 来访问。若是须要改变,须要修改配置文件 /usr/local/elasticsearch/config/elasticsearch.yml 文件,加入如下两行:

network.bind_host: 0.0.0.0
network.publish_host: _nonloopback:ipv4

或去除 network.host 和 http.port 以前的注释,并将 network.host 的 IP 地址修改成本机外网 IP。而后重启,Elasticsearch

关闭方法(输入命令: ps -ef | grep elasticsearch ,找到进程,而后 kill 掉就好了。

若是外网仍是不能访问,则有多是防火墙设置致使的 ( 关闭防火墙:service iptables stop )

修改配置文件:vim config/elasticsearch.yml

cluster.name : my-app (集群的名字,名字相同的就是一个集群)

node.name : es1 (节点的名字, 和前面配置的 hosts 中的 name 要一致)

path.data: /data/elasticsearch/data (数据的路径。没有要建立(mkdir -p /data/elasticsearch/{data,logs}),而且给执行用户权限 chown tzs /data/elasticsearch/{data,logs} -R
path.logs: /data/elasticsearch/logs (数据 log 信息的路径,同上)
network.host: 0.0.0.0 //容许外网访问,也能够是本身的ip地址
http.port: 9200 //访问的端口
discovery.zen.ping.unicast.hosts: ["192.168.153.133", "192.168.153.134", "192.168.153.132"] //各个节点的ip地址

记得须要添加上:(这个是安装 head 插件要用的, 目前不须要)
http.cors.enabled: true
http.cors.allow-origin: "*"

最后在外部浏览器的效果以下图:

test-on-bro

安装 IK 中文分词

能够本身下载源码使用 maven 编译,固然若是怕麻烦能够直接下载编译好的

https://github.com/medcl/elas...

注意下载对应的版本放在 plugins 目录下

解压

unzip elasticsearch-analysis-ik-5.5.2.zip

在 es 的 plugins 下新建 ik 目录

mkdir ik

将刚才解压的复制到ik目录下

cp -r elasticsearch/* ik

删除刚才解压后的

rm -rf elasticsearch
rm -rf elasticsearch-analysis-ik-5.5.2.zip

IK 带有两个分词器

ik_max_word :会将文本作最细粒度的拆分;尽量多的拆分出词语

ik_smart:会作最粗粒度的拆分;已被分出的词语将不会再次被其它词语占有

安装完 IK 中文分词器后(固然不止这种中文分词器,还有其余的,能够参考个人文章 Elasticsearch 默认分词器和中分分词器之间的比较及使用方法),测试区别以下:

ik_max_word

curl -XGET 'http://192.168.153.134:9200/_analyze?pretty&analyzer=ik_max_word' -d '联想是全球最大的笔记本厂商'

{
  "tokens" : [
    {
      "token" : "联想",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "全球",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "最大",
      "start_offset" : 5,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "的",
      "start_offset" : 7,
      "end_offset" : 8,
      "type" : "CN_CHAR",
      "position" : 4
    },
    {
      "token" : "笔记本",
      "start_offset" : 8,
      "end_offset" : 11,
      "type" : "CN_WORD",
      "position" : 5
    },
    {
      "token" : "笔记",
      "start_offset" : 8,
      "end_offset" : 10,
      "type" : "CN_WORD",
      "position" : 6
    },
    {
      "token" : "本厂",
      "start_offset" : 10,
      "end_offset" : 12,
      "type" : "CN_WORD",
      "position" : 7
    },
    {
      "token" : "厂商",
      "start_offset" : 11,
      "end_offset" : 13,
      "type" : "CN_WORD",
      "position" : 8
    }
  ]
}
ik_smart

curl -XGET 'http://localhost:9200/_analyze?pretty&analyzer=ik_smart' -d '联想是全球最大的笔记本厂商'

{
  "tokens" : [
    {
      "token" : "联想",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "全球",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "最大",
      "start_offset" : 5,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "的",
      "start_offset" : 7,
      "end_offset" : 8,
      "type" : "CN_CHAR",
      "position" : 4
    },
    {
      "token" : "笔记本",
      "start_offset" : 8,
      "end_offset" : 11,
      "type" : "CN_WORD",
      "position" : 5
    },
    {
      "token" : "厂商",
      "start_offset" : 11,
      "end_offset" : 13,
      "type" : "CN_WORD",
      "position" : 6
    }
  ]
}

安装 head 插件

elasticsearch-head 是一个 elasticsearch 的集群管理工具,它是彻底由 html5 编写的独立网页程序,你能够经过插件把它集成到 es。

效果以下图:(图片来自网络)

安装 git

yum remove git
yum install git
git clone git://github.com/mobz/elasticsearch-head.git   拉取 head 插件到本地,或者直接在 GitHub 下载 压缩包下来

安装nodejs

先去官网下载 node-v8.4.0-linux-x64.tar.xz

tar -Jxv -f  node-v8.4.0-linux-x64.tar.xz
mv node-v8.4.0-linux-x64  node

环境变量设置:

vim  /etc/profile

新增:

export NODE_HOME=/opt/node
export PATH=$PATH:$NODE_HOME/bin
export NODE_PATH=$NODE_HOME/lib/node_modules

使配置文件生效(这步很重要,本身要多注意这步)

source /etc/profile

测试是否全局可用了:

node -v

而后

mv elasticsearch-head head
cd head/
npm install -g grunt-cli
npm install
grunt server

再 es 的配置文件中加:

http.cors.enabled: true
http.cors.allow-origin: "*"

在浏览器打开 http://192.168.153.133:9100/ 就能够看到效果了,

遇到问题

把坑都走了一遍,防止之后再次入坑,特此记录下来

一、ERROR Could not register mbeans java.security.AccessControlException: access denied ("javax.management.MBeanTrustPermission" "register")

改变 elasticsearch 文件夹全部者到当前用户

sudo chown -R noroot:noroot elasticsearch

这是由于 elasticsearch 须要读写配置文件,咱们须要给予 config 文件夹权限,上面新建了 elsearch 用户,elsearch 用户不具有读写权限,所以仍是会报错,解决方法是切换到管理员帐户,赋予权限便可:

sudo -i

chmod -R 775 config

二、WARN [] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root

缘由是elasticsearch默认是不支持用root用户来启动的。

解决方案一:Des.insecure.allow.root=true

修改/usr/local/elasticsearch-2.4.0/bin/elasticsearch,

添加 ES_JAVA_OPTS="-Des.insecure.allow.root=true"

或执行时添加: sh /usr/local/elasticsearch-2.4.0/bin/elasticsearch -d -Des.insecure.allow.root=true

注意:正式环境用root运行可能会有安全风险,不建议用root来跑。

解决方案二:添加专门的用户

useradd elastic
chown -R elastic:elastic  elasticsearch-2.4.0
su elastic
sh /usr/local/elasticsearch-2.4.0/bin/elasticsearch -d

三、UnsupportedOperationException: seccomp unavailable: requires kernel 3.5+ with CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER compiled in

只是警告,使用新的linux版本,就不会出现此类问题了。

四、ERROR: [4] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

缘由:没法建立本地文件问题,用户最大可建立文件数过小

解决方案:切换到 root 用户,编辑 limits.conf 配置文件, 添加相似以下内容:

vim /etc/security/limits.conf

添加以下内容:

*  soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* 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 配置文件。

vim /etc/security/limits.d/90-nproc.conf

找到以下内容:

  • soft nproc 1024

修改成

  • soft nproc 2048

[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

缘由:最大虚拟内存过小

root用户执行命令:

sysctl -w vm.max_map_count=262144

或者修改 /etc/sysctl.conf 文件,添加 “vm.max_map_count”设置
设置后,可使用
$ 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/el...

解决方法:在elasticsearch.yml中新增配置bootstrap.system_call_filter,设为false,注意要在Memory下面:
bootstrap.memory_lock: false
bootstrap.system_call_filter: false

五、 java.lang.IllegalArgumentException: property [elasticsearch.version] is missing for plugin [head]

再 es 的配置文件中加:

http.cors.enabled: true
http.cors.allow-origin: "*"

最后

整个搭建的过程全程本身手动安装,不易,若是安装不少台机器,是否能够写个脚本之类的自动搭建呢?能够去想一想的。首发于:http://www.54tianzhisheng.cn/... ,转载请注明出处,谢谢配合!

相关文章
相关标签/搜索