公司需要用到elasticsearch做垂直搜索,下面记录下搭建elasticsearch集群环境的步骤。服务器使用的是阿里云服务器,操作系统是centos7。
一、安装docker
Yum install docker-ce
安装成功后运行docker -v查看docker版本。
运行docker run hello-world查看docker是否可用。
注意:一定要提前运行下docker run命令验证docker是否正常,不要忽略了这个小细节。笔者就是因为安装完
docker后,没有做此操作,后面的步骤都做好了,运行docker-compose up启动elasticsearch服务的时候各种
报错,网上搜寻了各种方案都没有找到对应的报错信息,指到我怀疑是不是docker自身的问题,运行docker run
hello-world发现都在报错的时候,才确定了docker版本与系统内核不兼容,没办法,只能重新卸载docker,更
新yum源,再安装。这是此次操作中遇到的最大的一个坑,花了笔者很多很多的时间。
修改docker国内加速镜像,请一定修改,否则慢得一逼。
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
修改后重启docker。
二、安装docker-compose
pip install docker-compose
安装成功后运行docker-compose -v
三、修改系统参数
sysctl -w vm.max_map_count=262144
此参数是elasticsearch需要修改的值,如果不修改,在生产模式下elasticsearch会启动失败。官方说明如下:
可访问https://www.elastic.co/guide/en/elasticsearch/reference/6.5/docker.html#docker-prod-cluster-composefile查看具体说明
四、使用docker-compose安装elasticsearch+kibana
由于资源有限,先在一台服务器上安装两个elasticsearch节点,节点数据放在/home/docker/elastic下
1、创建数据目录
cd home;
Mkdir docker;
Mkdir elastic;
2、编写compose文件
version: "2"
services:
elasticsearch:
image: bolingcavalry/elasticsearch-with-ik:6.5.0
container_name: elasticsearch
restart: always
environment:
- cluster.name=elastic-pro
- node.name=node_master_9200
- node.master=true
- node.data=true
- bootstrap.memory_lock=true
- http.cors.enabled=true
- http.cors.allow-origin=*
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./esdata1:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- esnet
elasticsearch2:
image: bolingcavalry/elasticsearch-with-ik:6.5.0
container_name: elasticsearch2
restart: always
environment:
- cluster.name=elastic-pro
- node.name=node_slave_9201
- node.master=false
- node.data=true
- bootstrap.memory_lock=true
- http.cors.enabled=true
- http.cors.allow-origin=*
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
- "discovery.zen.ping.unicast.hosts=elasticsearch"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./esdata2:/usr/share/elasticsearch/data
ports:
- 9201:9200
networks:
- esnet
depends_on:
- elasticsearch
kibana:
image: kibana:6.5.0
container_name: kibana
environment:
- SERVER_NAME=kibana
- ELASTICSEARCH_URL=http://elasticsearch:9200
- XPACK_MONITORING_ENABLED=true
ports:
- 5601:5601
networks:
- esnet
depends_on:
- elasticsearch
external_links:
- elasticsearch
volumes:
esdata1:
driver: local
esdata2:
driver: local
networks:
esnet:
此处安装的elasticsearch已经默认集成了ik中文分词器。
3、创建数据目录,用于持久化
Mkdir esdata1;
Mkdir esdata2;
Chown 777 esdata1 esdata2;
注意:一定要修改esdata1和esdata2的权限,否则启动elasticsearch会报错。主要是由于启动elasticsearch
并非是以root用户启动的,所以如果esdata1和esdata2是root账户创建,会没有写入权限。
官方说明如下:
当然,你也可以修改esdata1和esdata2的属主为elasticsearch用户,这样就有权限写入了。
4、启动编排任务
Docker-compose up -d
5、验证服务是否启动
Docker ps查看elasticsearch、elasticsearch2、kibana服务是否存在
Curl http://127.0.0.1:9200/_cat/health?v查看集群健康状态
五、控制elasticsearch的安全策略
Elasticsearch的api端口是9200,elasticsearch2的api端口是9201,需要控制只允许内网访问,在阿里云的安全组设置内网访问规则。注意外网访问打开需慎重,最多只能对指定ip访问,否则会不安全。
六、控制kibana的安全策略
Kibana默认对外的端口是5601,我们需要通过外网访问kibana,便于管理elasticsearch,但是kibana默认没有访问策略,只要开放端口,任何人都可以访问到此页面,新增的x-pack可以进行安全访问策略,但是是商业版的,需要缴费,因此我们使用nginx代理的方式控制kibana的访问。
1、阿里云安全组访问策略中开放5600端口,我们通过5600端口访问代理5601端口的访问
2、安装apache密码工具
yum install httpd-tools;
Cd /home/docker/elastic;
Mkdir kibana;
Cd kibana;
htpasswd -c -b kibana.passwd kibana;
然后设定密码即可。
3、配置nginx 5600端口
server
{
listen 5600;
auth_basic "Kibana Auth";
auth_basic_user_file /home/docker/elastic/kibana/kibana.passwd;
location / {
proxy_pass http://127.0.0.1:5601;
proxy_redirect off;
}
}
4、访问http://ip:5600验证kibana是否可以访问,并且是否会弹出用户名密码框