elasticsearch部署
Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。
Cluster 集群
一个 Elasticsearch 集群由一个或多个节点(Node)组成,每个集群都有一个共同的集群名称作为标识。
Node 节点
一个 Elasticsearch 实例即一个 Node,一台机器可以有多个实例,正常使用下每个实例应该会部署在不同的机器上。Elasticsearch 的配置文件中可以通过 node.master、node.data 来设置节点类型。
node.master:表示节点是否具有成为主节点的资格
node.data:表示节点是否存储数据
注意:此属性的值为true,并不意味着这个节点就是主节点。 因为真正的主节点,是由多个具有主节点资格的节点进行选举产生的。 所以,这个属性只是代表这个节点是不是具有主节点选举资格
主节点+数据节点(默认)
node.master: true
node.data: true
节点即有成为主节点的资格,又存储数据。这个时候如果某个节点被选举成为了真正的主节点,那么他还要存储数据,这样对于这个节点的压力就比较大了。Elasticsearch 默认每个节点都是这样的配置,在测试环境下这样做没问题。实际工作中建议不要这样设置,这样相当于主节点和数据节点的角色混合到一块了。
数据节点
node.master: false
node.data: true
节点没有成为主节点的资格,不参与选举,只会存储数据。在集群中需要单独设置几个这样的节点负责存储数据,后期提供存储和查询服务。主要消耗磁盘,内存。
主节点
node.master: true
node.data: false
不会存储数据,有成为主节点的资格,可以参与选举,有可能成为真正的主节点。普通服务器即可(CPU、内存消耗一般)。
Index 索引
一个集群下可以有多个索引,每个索引是一系列相同格式文档的集合(Elasticsearch 6.x 已不支持一个索引下多个Type)。
Shard 分片
每个索引有一个或多个分片,每个分片存储不同的数据。分片可分为主分片( primary shard)和复制分片(replica shard),复制分片是主分片的拷贝。默认每个主分片有一个复制分片(默认一个索引创建后会有5个主分片,即:5主+5复制=10个分片),一个索引的复制分片的数量可以动态地调整,复制分片从不与它的主分片在同一个节点上(防止单点故障)。
复制分片有两个作用:
- 提高恢复能力:当主分片挂掉时,某个复制分片可以变成主分片;
- 提高性能:get 和 search 请求既可以由主分片又可以由复制分片处理;
集群健康值
- green:所有主要分片和复制分片都可用
- yellow:所有主要分片可用,但不是所有复制分片都可用
- red:不是所有的主要分片都可用
当集群状态为 red,它仍然正常提供服务,它会在现有存活分片中执行请求,我们需要尽快修复故障分片,防止查询数据的丢失;
单个节点部署
Elastic 需要 Java 8 环境。注意要保证环境变量JAVA_HOME
正确设置。
安装完 Java,就可以跟着官方文档安装 Elastic。直接下载压缩包。
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zip
$ unzip elasticsearch-5.5.1.zip
$ cd elasticsearch-5.5.1/
进入解压后的目录,运行下面的命令,启动 Elastic。
$ ./bin/elasticsearch
如果这时报错"max virtual memory areas vm.maxmapcount [65530] is too low",要运行下面的命令。
$ sudo sysctl -w vm.max_map_count=262144
如果一切正常,Elastic 就会在默认的9200端口运行。这时,打开另一个命令行窗口,请求该端口,会得到说明信息。
$ curl localhost:9200
{
"name" : "atntrTf",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "tf9250XhQ6ee4h7YI11anA",
"version" : {
"number" : "5.5.1",
"build_hash" : "19c13d0",
"build_date" : "2017-07-18T20:44:24.823Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
上面代码中,请求9200端口,Elastic 返回一个 JSON 对象,包含当前节点、集群、版本等信息。
按下 Ctrl + C,Elastic 就会停止运行
默认情况下,Elastic 只允许本机访问,如果需要远程访问,可以修改 Elastic 安装目录的config/elasticsearch.yml
文件,去掉network.host
的注释,将它的值改成0.0.0.0
,然后重新启动 Elastic。
network.host: 0.0.0.0
上面代码中,设成0.0.0.0
让任何人都可以访问。线上服务要设成具体的 IP。
集群搭建
环境
- JDK1.8或以上
为了让es实现集群的效果,需要对es的配置进行修改,修改config下面名为elasticsearch.yml的文件
-
cluster.name标明了整个集群的名字,只有节点在相同的集群在能互相发现。
-
node.name 是当前节点名称的标识,各个节点的名称不能重复
-
transport.tcp.port 为节点间通信端口,如果部署在不同机器上则默认即可
集群机器情况:
主机域名 主机IP 安装组件
hadoop1 192.168.1.1 elasticsearch
hadoop2 192.168.1.2 elasticsearch
hadoop3 192.168.1.3 elasticsearch
1、用普通用户(非root)进入hadoop1机器,下载ElasticSearch 5.0.0 ,并解压到指定目录
2、在本机中找一个存储空间比较大的磁盘,如 /data,在该目录下执行以下命令
mkdir -p /data/es5/
用于存放es的数据和日志文件
3、配置 config/elasticsearch.yml 文件
# ---------------------------------- Cluster -----------------------------------
#定义es集群名称
cluster.name: es5-cluster
# ------------------------------------ Node ------------------------------------
#定义该节点的名称,各个节点不能重复
node.name: dchadoop213
# ----------------------------------- Paths ------------------------------------
#配置数据目录
path.data: /data1/hadoop/es5/data
#配置日志目录
path.logs: /data1/hadoop/es5/logs
# ----------------------------------- Memory -----------------------------------
#关闭锁定内存
bootstrap.memory_lock: false
# ---------------------------------- Network -----------------------------------
#指定本机IP地址,每个节点都要修改
network.host: 192.168.1.222
#指定http访问端口
http.port: 9200
# --------------------------------- Discovery ----------------------------------
#广播地址
discovery.zen.ping.unicast.hosts: ["hadoop1:9300", "hadoop2:9300", "hadoop3:9300"]
discovery.zen.minimum_master_nodes: 3
4、配置config/jvm.options文件
#修改JVM参数
-Xms4g
-Xmx4g
5、配置bin/elasticsearch文件
#由于es5.0依赖的是jdk8,所以需要下载jdk8并指定PAHT路径
export PATH=/home/hadoop/jdk1.8.0_101/bin:$PATH
export JAVA_HOME=/home/hadoop/jdk1.8.0_101
export ES_HOME=/home/hadoop/elasticsearch-5.0.0
6、启动
./bin/elasticsearch -d
查看后台日志是否启动成功(日志目录在第三步配置的/data1/hadoop/es5/logs路径下),如果报出以下异常:
max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
at org.elasticsearch.bootstrap.BootstrapCheck.check(BootstrapCheck.java:132)
at org.elasticsearch.bootstrap.BootstrapCheck.check(BootstrapCheck.java:85)
at org.elasticsearch.bootstrap.BootstrapCheck.check(BootstrapCheck.java:65)
at org.elasticsearch.bootstrap.Bootstrap$5.validateNodeBeforeAcceptingRequests(Bootstrap.java:178)
at org.elasticsearch.node.Node.start(Node.java:471)
at org.elasticsearch.bootstrap.Bootstrap.start(Bootstrap.java:193)
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:257)
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:101)
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:96)
at org.elasticsearch.cli.SettingCommand.execute(SettingCommand.java:54)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:88)
at org.elasticsearch.cli.Command.main(Command.java:54)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:75)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:68)
是以为操作系统的vm.max_map_count参数设置太小导致的,请使用root用户登录系统,执行以下命令:
sysctl -w vm.max_map_count=655360
并用以下命令查看是否修改成功
sysctl -a | grep "vm.max_map_count"
如果能正常输出655360,则说明修改成功,然后再次启动elasticsearch
把配置好的安装包拷贝一份到其他两台机器上,修改 config/elasticsearch.yml下的node.name和network.host为对于的机器即可。
7、访问ES
打开浏览器,输入地址 http://192.168.1.1:9200 出现以下内容为正常
{
"name" : "hadoop1",
"cluster_name" : "es5-cluster",
"version" : {
"number" : "5.0.0-alpha5",
"build_hash" : "d327dd4",
"build_date" : "2016-08-04T08:59:39.568Z",
"build_snapshot" : false,
"lucene_version" : "6.1.0"
},
"tagline" : "You Know, for Search"
}
8、关于插件
在ES的以往各个版本中都支持一个比较好用的插件 mobz/elasticsearch-head
但是ES5.0版本还不支持plugin安装,详情请查看 GitHub - mobz/elasticsearch-head: A web front end for an elastic search cluster