docker安装elasticsearch伪分布式集群

0.在安装es之前,首先编辑一下宿主机的内核参数,否则配置es集群的时候极有可能启动不成功:

[root@study-01 ~]# vim /etc/sysctl.conf
vm.max_map_count=655360
[root@study-01 ~]# sysctl -p # 加载参数

1.搜索es的镜像,如下第一个就是官方镜像:
使用docker安装elasticsearch伪分布式集群以及安装ik中文分词插件

2.拉取镜像:

[root@study-01 ~]# docker pull elasticsearch

3.启动镜像为容器:

[root@study-01 ~]# docker run -d --name es1 -p 9200:9200 -p 9300:9300 elasticsearch

使用浏览器访问9200端口,看看是否正常返回如下json数据:
使用docker安装elasticsearch伪分布式集群以及安装ik中文分词插件

能返回图中的json数据代表已经启动成功,接着再启动两个节点:

[root@study-01 ~]# docker run -d --name es2 -p 9201:9200 -p 9301:9300 elasticsearch
[root@study-01 ~]# docker run -d --name es3 -p 9202:9200 -p 9302:9300 elasticsearch

启动成功后,此时会有三个实例正在运行:
使用docker安装elasticsearch伪分布式集群以及安装ik中文分词插件

4.由于我们需要编辑配置文件来完成es伪分布式集群的配置,但该容器默认不自带vi或vim命令,所以我们还得先进入到容器里,将所有的实例都安装上vim命令,示例如下:

[root@study-01 ~]# docker exec -it 2dc233622dcb bash
root@2dc233622dcb:/usr/share/elasticsearch# apt-get update
root@2dc233622dcb:/usr/share/elasticsearch# apt-get install vim -y

5.我们将es1作为master节点,剩余的es2和es3作为slave节点,首先编辑es1的配置文件内容如下:

root@2dc233622dcb:/usr/share/elasticsearch# vim config/elasticsearch.yml # 在文件末尾加入如下内容
# 开启跨域,为了让es-head可以访问
http.cors.enabled: true
http.cors.allow-origin: "*"

# 集群的名称
cluster.name: es
# 节点的名称
node.name: es1
# 指定该节点是否有资格被选举成为master节点,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master
node.master: true
# 允许该节点存储数据(默认开启)
node.data: true
# 允许任何ip访问
network.host: 0.0.0.0
# 通过这个ip列表进行节点发现,我这里配置的是各个容器的ip
discovery.zen.ping.unicast.hosts: ["127.0.0.1","172.17.0.2","172.17.0.4","172.17.0.5"]
#如果没有这种设置,遭受网络故障的集群就有可能将集群分成两个独立的集群 - 分裂的大脑 - 这将导致数据丢失
discovery.zen.minimum_master_nodes: 2
root@2dc233622dcb:/usr/share/elasticsearch# 

es2和es3的配置文件配置的内容则如下:

-----------------------es2-----------------------
http.cors.enabled: true
http.cors.allow-origin: "*"
cluster.name: es
node.name: es2

network.host: 0.0.0.0
node.master: true
node.data: true

discovery.zen.ping.unicast.hosts: ["127.0.0.1","172.17.0.2","172.17.0.4","172.17.0.5"]
discovery.zen.minimum_master_nodes: 2

-----------------------es3-----------------------
http.cors.enabled: true
http.cors.allow-origin: "*"
cluster.name: es
node.name: es3

network.host: 0.0.0.0
node.master: true
node.data: true

discovery.zen.ping.unicast.hosts: ["127.0.0.1","172.17.0.2","172.17.0.4","172.17.0.5"]
discovery.zen.minimum_master_nodes: 2

6.配置好后,重启所有的es实例容器:

[root@study-01 ~]# docker restart 2dc233622dcb
[root@study-01 ~]# docker restart 81d5bcb5394a
[root@study-01 ~]# docker restart e354f31b7785

7.重启完成之后,执行如下命令确认一下集群状况:

[root@study-01 ~]# curl '192.168.190.129:9200/_cluster/health?pretty'
{
  "cluster_name" : "es",
  "status" : "green",  # 为green则代表健康没问题,如果是yellow或者red则是集群有问题
  "timed_out" : false,  # 是否有超时
  "number_of_nodes" : 3,  # 集群中的节点数量 
  "number_of_data_nodes" : 2,  # 集群中data节点的数量
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}
[root@study-01 ~]#

如果需要配置其他配置项的话,可以参考如下说明进行配置:

#集群的名称
cluster.name: es6.2
#节点名称,其余两个节点分别为node-2 和node-3
node.name: node-1
#指定该节点是否有资格被选举成为master节点,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master
node.master: true
#允许该节点存储数据(默认开启)
node.data: true
#索引数据的存储路径
path.data: /usr/local/elk/elasticsearch/data
#日志文件的存储路径
path.logs: /usr/local/elk/elasticsearch/logs
#设置为true来锁住内存。因为内存交换到磁盘对服务器性能来说是致命的,当jvm开始swapping时es的效率会降低,所以要保证它不swap
bootstrap.memory_lock: true
#绑定的ip地址
network.host: 0.0.0.0
#设置对外服务的http端口,默认为9200
http.port: 9200
# 设置节点间交互的tcp端口,默认是9300 
transport.tcp.port: 9300
#Elasticsearch将绑定到可用的环回地址,并将扫描端口9300到9305以尝试连接到运行在同一台服务器上的其他节点。
#这提供了自动集群体验,而无需进行任何配置。数组设置或逗号分隔的设置。每个值的形式应该是host:port或host
#(如果没有设置,port默认设置会transport.profiles.default.port 回落到transport.tcp.port)。
#请注意,IPv6主机必须放在括号内。默认为127.0.0.1, [::1]
discovery.zen.ping.unicast.hosts: ["192.168.8.101:9300", "192.168.8.103:9300", "192.168.8.104:9300"]
#如果没有这种设置,遭受网络故障的集群就有可能将集群分成两个独立的集群 - 分裂的大脑 - 这将导致数据丢失
discovery.zen.minimum_master_nodes: 3

安装es-head可视化插件

1.这一小节我们来安装es-head,同样的,先在镜像仓库中搜索相应的镜像:
使用docker安装elasticsearch伪分布式集群以及安装ik中文分词插件

2.拉取镜像:

docker pull mobz/elasticsearch-head:5

3.启动镜像为容器:

[root@study-01 ~]# docker run -d --name es-head -p 9100:9100 mobz/elasticsearch-head:5

4.同样需要进入到容器里安装一下vim命令:

[root@study-01 ~]# docker exec -it 85f03139f1ba bash
root@85f03139f1ba:/usr/src/app# apt-get update
root@85f03139f1ba:/usr/src/app# apt-get install vim -y

如果执行apt-get update时,报如下错误的话:

W: Failed to fetch http://deb.debian.org/debian/dists/jessie/main/binary-amd64/Packages  Hash Sum mismatch

E: Some index files failed to download. They have been ignored, or old ones used instead.

则需要更换安装源,由于没有vi及vim命令,只能使用echo来重定向了,如下示例:

root@85f03139f1ba:/usr/src/app# mv /etc/apt/sources.list /etc/apt/sources.list.bak
root@85f03139f1ba:/usr/src/app# echo -e "deb http://mirrors.aliyun.com/debian wheezy main contrib non-free\ndeb-src http://mirrors.aliyun.com/debian wheezy main contrib non-free\ndeb http://mirrors.aliyun.com/debian wheezy-updates main contrib non-free\ndeb-src http://mirrors.aliyun.com/debian wheezy-updates main contrib non-free\ndeb http://mirrors.aliyun.com/debian-security wheezy/updates main contrib non-free\ndeb-src http://mirrors.aliyun.com/debian-security wheezy/updates main contrib non-free" > /etc/apt/sources.list
root@85f03139f1ba:/usr/src/app# 

5.es-head使用的是grunt server作为服务器,而grunt server默认监听的是localhost,所以我们需要修改Gruntfile.js文件,增加一段配置,不然外部是无法访问的,如下:

root@85f03139f1ba:/usr/src/app# vim Gruntfile.js
connect: {
        server: {
                options: {
                        hostname: '0.0.0.0',  # 增加这段
                        port: 9100,
                        base: '.',
                        keepalive: true
                }
        }
}
root@85f03139f1ba:/usr/src/app#

6.配置好后,重启容器:

[root@study-01 ~]# docker restart 85f03139f1ba

7.使用浏览器访问9100端口,访问结果如下则是正常的,可以看到es集群的状态:
使用docker安装elasticsearch伪分布式集群以及安装ik中文分词插件


安装ik中文分词插件

中文分词就是将一句话的语义,分成一个个的词,之所以要分词是因为需要保证搜索的准确度。es默认对于英文分词的支持较好,毕竟是老外开发的,并且英文本身的语言特性也利于分词,只需要按空格、逗号、分号隔开即可。但中文不一样,es对中文分词的时候,也是和英文一样,一个个词的分,所以就会导致搜索的准确度较差。例如我想搜中国这个词,却会返回学习中、开车中、出国事项等包含中字和国字的数据。因此我们需要使用一些中文的分词插件来解决这种问题。

es有许多中文分词的插件,其中较为流行的是elasticsearch-analysis-ik,GitHub地址如下:

https://github.com/medcl/elasticsearch-analysis-ik

我们来安装一下这个插件,这里以es1节点为例,首先进入容器并下载该插件到容器中:

[root@study-01 ~]# docker exec -it es1  # 进入es1容器
root@2dc233622dcb:/usr/share/elasticsearch# wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.6.11/elasticsearch-analysis-ik-5.6.11.zip   # 下载压缩包

然后在es的plugins目录下创建ik目录,并解压下载的安装包到该目录下:

root@2dc233622dcb:/usr/share/elasticsearch# mkdir ./plugins/ik   # 创建ik目录
root@2dc233622dcb:/usr/share/elasticsearch# unzip elasticsearch-analysis-ik-5.6.11.zip  # 解压
root@2dc233622dcb:/usr/share/elasticsearch# mv elasticsearch/* plugins/ik/  # 移动解压后的文件
root@2dc233622dcb:/usr/share/elasticsearch# rm -rf elasticsearch   # 删除空目录
root@2dc233622dcb:/usr/share/elasticsearch# cd plugins/ik/
root@2dc233622dcb:/usr/share/elasticsearch/plugins/ik# ls   # 该插件所包含的文件如下
commons-codec-1.9.jar    elasticsearch-analysis-ik-5.6.11.jar  plugin-descriptor.properties
commons-logging-1.2.jar  httpclient-4.5.2.jar
config           httpcore-4.4.4.jar
root@2dc233622dcb:/usr/share/elasticsearch/plugins/ik#

我这里的es版本是5.6.12的,但是ik并没有5.6.12对应的版本可下载,于是我就下载了5.6.11版本。由于版本不符,所以还需编辑配置文件如下,手动修改一下版本:

root@1c2a4dbc8de6:/usr/share/elasticsearch/plugins/ik# vim plugin-descriptor.properties
version=5.6.12
elasticsearch.version=5.6.12
root@1c2a4dbc8de6:/usr/share/elasticsearch/plugins/ik# 

其他节点也是和上面一样的步骤,这里就不赘述了。最后需重启es容器:

[root@study-01 ~]# docker restart es1
[root@study-01 ~]# docker restart es2
[root@study-01 ~]# docker restart es3