这次记录的是一个完整的操作过程。使用了三台阿里云服务器,两个ES节点各占一台,另一台安装cerebro+logstash+kibana,当然都是使用docker-compose安装的。
docker-compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。使用docker-compose当然得先安装docker。
1.安装docker
如果服务器中已经安装了docker,想安装最新版本的话,先卸载服务器中的旧版本docker:
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
给docker设置稳定的存储库,这个需要用到yum-config-manager命令,所以可能需要先安装yum-utils:
sudo yum install -y yum-utils
然后设置阿里云的存储库:
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装最新版本的docker:
sudo yum install docker-ce docker-ce-cli containerd.io
安装成功后输入docker -v查看docker版本确认一下安装情况:
安装完成后就可以启动docker了,多贴几条docker的操作命令:
# 启动docker
sudo systemctl start docker
# 停止docker
systemctl stop docker
# 重启
systemctl restart docker
# 查看状态
systemctl status docker
# 设置开机自启动
systemctl enable docker
# 查看信息
docker info
# 查看帮助文档
docker --help
docker安装成功后就可以安装docker-compose了。
2.安装docker-compose
安装docker-compose就两条命令:
sudo curl -L https://github.com/docker/compose/releases/download/1.28.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
我下载的1.28.2的最新版本,可以访问https://github.com/docker/compose/releases去找最新的版本号下载,安装路径就放在了/usr/local/bin,下载成功后会在该文件夹中有一个无后缀名的docker-compose文件:
后面的chmod是给这个文件赋操作权限。这样docker-compose就安装好了,可以使用docker-compose -v确认版本和安装情况:
简单介绍一下docker-compose。docker-compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。docker-compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例。用户可以通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个工程(project)。
理解起来就是我在两台服务器中分别利用docker-compose安装了ES,那这就是两个ES工程,在另一台服务器中利用docker-compose安装了cerebro+logstash+kibana,那在这台服务器中这三个加起来是一个工程。每个工程都有自己的docker-compose.yml文件,通过在工程docker-compose.yml文件目录中执行docker-compose up和docker-compose stop去启动和停止这个工程。
接下来就是分别安装ES节点和cerebro+logstash+kibana了,对应接下来的操作步骤可以更好地去理解docker-compose。
3.在两台服务器中分别安装两个ES节点
新建一个专门的文件夹/zbq/es去放这个工程,并把该工程的docker-compose.yml文件放在这个文件夹内:
这个文件夹里面的docker.log是nohup docker-compose up后台启动工程时输出的日志不用管,还有一个/data文件夹,这个和docker-compose.yml有关,docker-compose.yml内容的编写也是重点,先看一下节点1的yml:
/data文件夹可以看出是配置的esdata的路径。docker-compose.yml的写法和最上面的version有关,我这里用的是2.2,具体的各个版本的写法可以去详细了解一下,这里就不详述了,就只提几个重点。
(1)ES_JAVA_OPTS的配置最好Xms和Xmx都大于512m,我的阿里云服务器是内存2G的,本来想这里设置的小一点结果直接启动报错。
(2)discovery.seed_hosts意思是哪些节点可以候选为master节点,可以配置多个,逗号隔开就好了,由于我这次就两个节点一个主一个从,这里就配置了一个候选master,相当于指定了master。
(3)cluster.initial_master_nodes是集群第一次被启动的时候生效的,大概意思就是指定一个节点为master从而引导集群启动。这里只要配置node.name就好了,但是前提是这个node.name要在候选master列表中,我这里也是直接指定为es_01。
(4)network.publish_host也挺重要的,es节点使用publish_host与群集通信,我这里直接配置成服务器的公网ip,如果不配置的话阿里云服务器会默认publish_host为服务器的内网ip,好像阿里云服务器之间内网ip是不能通信的,所以我直接配置成了公网ip。还有两个相似的配置network.host和network.bind_host,network.bind_host是接受连接的ip,默认为0.0.0.0,就是自己所有网卡都能被连接。而network.host是同时配置network.bind_host和network.publish_host,就是把两个配置成一样。
再贴一下另一个es节点的docker-compose.yml对比一下:
不同的配置就是container_name、node.name和network.publish_host,publish_host配置成当前服务器的公网ip就好了。节点2启动后会先去判断自己的节点名称是不是和cluster.initial_master_nodes中配置的相同,如果不是则说明自己不是master,然后去discovery.seed_hosts列表中寻找master并将自己加入进集群。
两个节点的docker-compose.yml准备好后就可以nohup docker-compose up后台启动工程了,完整命令:
nohup docker-compose up >/zbq/es/docker.log 2>&1 &
分别启动两个节点,直至启动日志打印出nodi.id信息:
这样就是es节点启动成功了,然后可以分别访问这两个节点的9200端口:
可以看到他们的cluster_name和cluster_uuid是一样的。
在启动es节点是可能会出现max_map_count不够的情况,执行如下命令即可:
#设置vm.max_map_count
sysctl -w vm.max_map_count=262144
#确认设置结果
sysctl -a|grep vm.max_map_count
最后多贴几条docker-compose的操作命令:
#启动服务
docker-compose up
# 查看启动的服务
docker-compose ps
#停止服务
docker-compose stop
当然直接用docker ps也可以查看启动的服务,docker images也能查看docker-compose下载下来的镜像,因为本来docker-compose就是基于docker的。
4.安装cerebro+logstash+kibana
简单介绍一下这三个,cerebro是管理es集群的,logstash是收集数据传输给es的,也可以用来导入数据,kibana是图形界面形式的分析展示数据的。这三个都需要和es集群通信。
同样的,这三个加起来作为一个工程,新建一个文件夹,放一个docker-compose.yml进去:
重点看一下这个docker-compose.yml内容:
这里面需要注意这么几点:
(1)cerebro的command中配置一个-Dhosts.0.host,值就是es的master节点地址。
(2)kibana的environment配置一个ELASTICSEARCH_HOSTS,值同样是es的master节点地址。
(3)logstash的配置比较复杂,首先要注意需要配置两个volumes,配置volumes可以理解为给docker-compose的容器挂载一个文件目录地址,docker-compose去访问的文件目录都需要要先在这里挂载,比如在配置文件里需要配置哪个目录了,都在先在这里挂载。理解起来就是做一个映射吧。比如我这里下面要配置environment的path.config,这是logstash的配置文件,我把这个logstash.conf放在了/zbq文件夹内,所以我要给/zbq/logstash.conf这个路径挂载到容器中,也就是配置了:
volumes:
- /zbq/logstash.conf:/zbq/logstash.conf:rw
这里是直接做了文件路径的挂载,还可以做文件夹路径的挂载,比如下面的- /zbq/data:/zbq/data:rw,我在这里面放了需要导入到es的数据:
然后在logstash的配置文件logstash.conf做了响应配置,只要是在容器中需要访问这个地址,都需要在volumes中挂载。可以看一下logstash.conf,也是个重点:
重点都标出来了,input{}块就是代表启动logstash时需要导入数据,里面的path就是数据文件地址。
简单介绍一下这个sincedb_path配置。第一次配置时,运行logstash对日志文件进行的读取操作,这个过程logstash会记录自己读取完日志文件的位置,然后将自己读取内容的偏移量保存到一个隐藏文件中。当再次启动的时候logstash从隐藏文件中的读取完成的日志文件位置。假如我们希望再次启动的时候依旧读取所有文件信息,可以设置sincedb_path => "/dev/null"
。/dev/null”这个 Linux 系统上特殊的空洞文件,那么 logstash 每次重启进程的时候,尝试读取 sincedb 内容,都只会读到空白内容。
output{}就代表数据传输给谁,里面配置了es的master地址,index是索引,es中的索引和关系型数据库中的索引概率完全不一样,如果非要对比一下,es中的索引相当于关系型数据库中的表,具体这里不详述。
filter{}就是对导入数据的处理逻辑了。
同样的,都准备好后可以docker-compose up启动工程了。启动后如果看到这些logstash日志:
说明导入的数据经过filter{}块处理已经发给es了。
这时候我们可以登录kibana查看一下了,访问该服务器的5601端口,找到kibana中的索引管理功能:
可以看到刚刚导入的数据,索引名称也是自己定义的movies。
还可以登录一下cerebro查看一下es集群情况,访问该服务器的9000端口:
cerebro这个工具还是很好用的,可以清楚的看到es集群中各个节点的情况,包括索引、分片数,文档数等,具体需要详细去了解一下es和cerebro。