在一台Linux上搭建Elasticsearch集群+kibana

Elasticsearch 作为一个搜索引擎,我们对它的基本要求就是存储海量数据并且可以在非常短的时间内查询到我们想要的信息

Posted by Steven on 2018-11-21

这里需要说一下,看了Elasticsearch 集群的搭建,单点的搭建就很简单了,所以这里就不介绍单点Elasticsearch的搭建过程了

Elasticsearch 作为一个搜索引擎,我们对它的基本要求就是存储海量数据并且可以在非常短的时间内查 询到我们想要的信息。所以第一步我们需要保证的就是 Elasticsearch 的高可用性,什么是高可用性呢? 它通常是指,通过设计减少系统不能提供服务的时间。假设系统一直能够提供服务,我们说系统的可用 性是 100%。如果系统在某个时刻宕掉了,比如某个网站在某个时间挂掉了,那么就可以它临时是不可用 的。所以,为了保证 Elasticsearch 的高可用性,我们就应该尽量减少 Elasticsearch 的不可用时间。

那么怎样提高 Elasticsearch 的高可用性呢?这时集群的作用就体现出来了。假如 Elasticsearch 只放在一台服务器上,即单机运行,假如这台主机突然断网了或者被攻击了,那么整个 Elasticsearch 的服务就不可用了。但如果改成 Elasticsearch 集群的话,有一台主机宕机了,还有其他的主机可以支撑,这样就仍然可以保证服务是可用的。

那可能有的小伙伴就会说了,那假如一台主机宕机了,那么不就无法访问这台主机的数据了吗?那假如 我要访问的数据正好存在这台主机上,那不就获取不到了吗?难道其他的主机里面也存了一份一模一样 的数据?那这岂不是很浪费吗?

为了解答这个问题,这里就引出了 Elasticsearch 的信息存储机制了。首先解答上面的问题,一台主机宕 机了,这台主机里面存的数据依然是可以被访问到的,因为在其他的主机上也有备份,但备份的时候也 不是整台主机备份,是分片备份的,那这里就又引出了一个概念–分片

分片,英文叫做 Shard,顾名思义,分片就是对数据切分成了多个部分。我们知道 Elasticsearch 中一个索引(Index)相当于是一个数据库,如存某网站的用户信息,我们就建一个名为 user 的索引。但索引存储的时候并不是整个存一起的,它是被分片存储的,Elasticsearch 默认会把一个索引 分成五个分片,当然这个数字是可以自定义的。分片是数据的容器,数据保存在分片内,分片又被分配 到集群内的各个节点里。当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片 ,使得数据仍然均匀分布在集群里,所以相当于一份数据被分成了多份并保存在不同的主机上。

那这还是没解决问题啊,如果一台主机挂掉了,那么这个分片里面的数据不就无法访问了?别的主机都 是存储的其他的分片。其实是可以访问的,因为其他主机存储了这个分片的备份,叫做副本,这里就引 出了另外一个概念——副本

副本,英文叫做 Replica,同样顾名思义,副本就是对原分片的复制,和原分片的内容是一样的,Elasticsearch 默认会生 成一份副本,所以相当于是五个原分片和五个分片副本,相当于一份数据存了两份,并分了十个分片, 当然副本的数量也是可以自定义的。这时我们只需要将某个分片的副本存在另外一台主机上,这样当某 台主机宕机了,我们依然还可以从另外一台主机的副本中找到对应的数据。所以从外部来看,数据结果 是没有任何区别的。

一般来说,Elasticsearch 会尽量把一个索引的不同分片存储在不同的主机上,分片的副本也尽可能存在 不同的主机上,这样可以提高容错率,从而提高高可用性。

但这时假如你只有一台主机,那不就没办法了吗?分片和副本其实是没意义的,一台主机挂掉了,就全挂掉了。

一、准备工作

1、Elasticsearch 至少需要Java 8。因此,建议你使用 JDK版本1.8.0_131,在安装 Elasticsearch 之前,请先检查您的Java版本:

1
2
3
java -version

echo $JAVA_HOME

2、如果没有,需要先去安装Java环境,注意要配置好环境变量

3、Kibana 是一个开源分析和可视化平台,旨在可视化操作 Elasticsearch,因此保证Elasticsearch和kibana的版本一致,这也是官方建议的。

二、Elasticsearch的安装

首先下载Elasticsearch。注意,要下载自己适合的版本,主要参考因素要结合Elasticsearch版本的稳定性,其相关插件的版本 支持、相同版本kibana的功能等。由于我需要用到动态同义词(下一篇文章将会提到)的插件,然后看 到Github上该插件的支持版本是6.1.4,但是Elasticsearch的版本已经到了6.5.0(截止2018.11.18),因此我给作者尝试发了邮件,随后作者竟然更新到了6.3.1,所以最终确定了版本6.3.1

在linux中选择你下载文件的位置执行下面的命令:

1
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.tar.gz

这个地址从哪里取到的呢?其实下载elasticsearch安装包,可以直接点击上面的连接找到相应的连接进行下载,但是这样往往下载下来的都是最新的版本 ,这里有个技巧,直接在下载页面鼠标右键单击MACOS/LINUX sha,选择复制链接地址,之后得到的地址中,将版本号改成你需要的,用上面的命令就可以下载了。

image-20200824150048735

回到正题,我们要搭建的是elasticsearch集群,如果有多台服务器或者多个实例,建议在多台服务器上搭建,因为如果是在 一台服务器上搭建的 ,假如服务器挂了,那这个集群也没啥意义了,但是单台服务器上搭建集群,也是可以解决一部分问题 的。

在一台服务器上搭建集群,通过不同的端口配置多个节点服务即可

首先,将下载好的压缩包解压到准备安装Elasticsearch,的地方,通常我会先常创建一个Elasticsearch文件夹,然后将几个节点的安装文件放在这个文件夹下:

1
tar -zxvf elasticsearch-6.3.1.tar.gz -C /usr/local/elasticsearch/

然后将该文件夹复制并重命名到当前文件,复制后的文件为:

1
elasticsearch-6.3.1-node-1、 elasticsearch-6.3.1-node-2、 elasticsearch-6.3.1-node-3

代表一个集群的3个节点(node),其实到这里,集群的3个节点已经安装好了,但是要把他们整合到一个集群中,并且成功启动,还是需要 做一些配置的,修改Elasticsearch 的配置文件:

1
vim elasticsearch-6.3.1-node-1/config/elasticsearch.yml
1、集群的名称

通过cluster.name,可以配置集群的名称,集群是一个整体,因此名称都要一致,所有主机都配置成相同的名称,配置示例 :

1
cluster.name: my-es-cluster
2、节点的名称

通过node.name,可以配置每个节点的名称,每个节点都是集群的一部分,每个节点名称都不要相同,可以按照顺序编号 ,配置示例:

1
node.name:es-node-1
3、配置端口

配置该节点的端口号:

1
http.port: 9200
4、是否有资格成为主节点

通过node.master,可以配置该节点是否有资格成为主节点,如果配置为 true,则主机有资格成为主节点,配置为 false 则主 机就不会成为主节点,可以去当数据节点或负载均衡节点。注意这里是有资格成为主节点,不是一定会成为主节点,主节点需要集群经过选举产生。这里我配置所有主机都可以成为主节点,因此都配置为 true,配置示例:

1
node.master: true
5、是否有资格成为数据节点

通过node.data可以配置该节点是否为数据节点,如果配置为 true,则主机就会作为数据节点,注意主节点也可以作为数据节点,当node.master、node.data均为 false,则该主机会作为负载均衡节点。这里我配置所有主机都是数据节点,因此都配置为 true,配置示例:

1
node.data: true
6、数据和日志路径

通过path.data、path.logs可以配置 Elasticsearch 的数据存储路径和日志存储路径,可以指定任意位置,这里我指定存储到 1T 硬盘对应的路径下,另外注意一下写入权限问题,配置示例:

1
2
path.data: /user/local/elasticsearch/data 
path.logs: /user/local/elasticsearch/log
7、设置访问的地址和端口

我们需要设定 Elasticsearch 运行绑定的 Host,默认是无法公开访问的,如果设置为主机的公网 IP 或0.0.0.0,就是可以公开访问的,这里我们可以都设置为公开访问或者部分主机公开访问,如果是公开访问就配置 为:(如果不想被公开访问就不用配置)

1
network.host: 0.0.0.0
8、集群的地址配置(一台服务器跳过,不需要配置)

通过discovery.zen.ping.unicast.hosts可以配置集群的主机地址,配置之后集群的主机之间可以自动发现,建议配置的是内网地址(比如都是 阿里云的实例,就可以配置内网IP),配置示例:

1
discovery.zen.ping.unicast.hosts: ["10.0.0.1", "10.0.0.2", "10.0.0.3"]
9、设置一台服务器上启动的节点数

通常都是一台服务器只配置一个节点,所以通常不用设置,默认是1,但是当在一台服务器上部署多个节点的情况,就需要设置了,配置示例:

1
node.max_local_storage_nodes: 5

三、Elasticsearch的启动和相关问题解决

以上的配置都配置好了,就可以启动Elasticsearch了,要一个节点一个节点的启动,进入Elasticsearch的 第一个节点,在进到bin目录下,这里有两种启动方式,一种就是后台启动,命令为:

1
2
elasticsearch-6.3.1-node-1
./elasticsearch -d

但是这样会有个问题,你不能直观的通过命令行看到是否启动成功,你能通过ip+端口查看,如果没有启 动成功,具体的日志还要到日志文件中去看,还有一种启动方式:

1
./elasticsearch

这种就会直接在命令行查看启动的状态,但是这种方式有种弊端,就是你要继续使用命令行的话,你只能结束Elasticsearch服务,或者重新打开一个命令行窗口,建议先可以用第二种试试,如果没有出错,再用第一种方式启动

问题来了

启动的时候会报错,提示:

1
java.lang.RuntimeException:can not run elasticsearch as root

这个问题肯定会遇到的,除非你知道这个,并且提前配置好并且避免它,否则就需要

1、给Linux创建一个新的用户:
1
2
adduser es
passwd ***

这里会要求你输入两次密码

2、更改elasticsearch文件夹及内部文件的所属用户及组为es:es
1
chown -R es:es /user/local/elasticsearch/elasticsearch-6.3.1-node-1
3、切换到用户es之后再启动:
1
su es ./elasticsearch

又报错了,提示Permission denied,只需要给每个节点的文件夹赋予权限即可(记住,要先切回root用户

1
su root

注意:这里需要输入密码的

1
chmod -R 777 /user/local/elasticsearch/elasticsearch-6.3.1-node-1

之后,再切回es用户,启动es.

发现没问题了,启动成功,访问ip+端口号,出现一段json格式的节点信息,说明启动成功了,这个时候 就可以结束Elasticsearch服务,用后台启动命令启动当前节点

1
./elasticsearch -d

四、其他节点的配置、集群的配置

第三步将集群的一个节点启动成功了,这个时候可以配置其他的两个节点,其实需要配置的东西很少, 分别修改elasticsearch-6.3.1-node-2、elasticsearch-6.3.1-node-3的配置文件

1、保证每个节点配置的集群名称是一样的

确保这两个节点的配置文件中的集群名称都是一致的:

1
cluster.name: my-es-cluster
2、保证每个节点的名称不一样

节点2和节点3的配置分别为:

1
2
node.name:es-node-2
node.name:es-node-3
3、配置端口号

由于我们是在同一台服务器上搭建的集群,所以端口号的配置很重要 分别配置节点2、3的端口号为:

1
2
http.port: 9201
http.port: 9203
4、需要指定服务器上允许的节点数

每个配置文件中都要有:

1
node.max_local_storage_nodes: 5

ok,分别按照上面的方式启动这两个节点,启动成功,即集群搭建成功,查看elasticsearch服务

1
ps -ef |grep elastic

五、kibana的安装与配置

由于上面我们安装的es的版本是6.3.1,那kibana的版本我们也选择6.3.1,并且好消息是,kibana从6.3开 始将x-pack等服务集成进去了,不需要我们额外安装插件了 在linux中选择你下载文件的位置执行下面的命令:

1
https://artifacts.elastic.co/downloads/kibana/kibana-6.3.1-linux-x86_64.tar.gz

首先,将下载好的压缩包解压到准备安装Kibana 的地方,通常我会先常见一个Kibana的文件夹,然后将安装文件放在这个文件夹下:

1
tar -zxvf kibana-6.3.1-linux-x86_64.tar.gz -C /usr/local/kibana/

然后进入kibana的配置文件修改配置使之可以跟elasticsearch配合使用

1
vi kibana/kibana-6.3.1-linux-x86_64/config/kibana.yml

按照下面的步骤修改配置文件:

1、设置可以公开访问
1
server.host: "0.0.0.0"
2、设置端口

这里需要注意一下,默认的端口是5601,如果该端口有被占用,那么需要在这里指定一个端口

1
server.port: 5602
3、指定Elasticsearch地址

默认情况下是不需要指定的,因为我的一个节点的地址就是(如果es的端口也有变化,需要指定)

1
elasticsearch.url: "http://localhost:9200"
4、启动kibana

跟之前启动Elasticsearch的方式一样,在kibana的bin目录下,先执行

1
./kibana

如果没有报错,ctrl+C结束kibana服务,执行命令:

1
./kibana -d

在后台启动kibana,稍等一下,就可以直接访问ip+5602,访问kibana了。查看kibana的进程Id:

1
netstat -tunlp |grep 5602

至此,Elasticsearch、Kibana均已安装成功

推荐文章