- 單機ELK,另外兩台服務器分別有一個elasticsearch節點,這樣形成一個3節點的ES集群。
- 可以先嘗試單獨搭建es集群或單機ELK
注意點
- 服務器內存:要求不低於8G,如果4G,沒有跑其他程序的話,應該也可以,低於4G基本不用考慮。
- 我的系統:阿里雲centOS7.1,執行cat /proc/version 查看linux version,不能低於3.10
- 服務器列表: 172.168.50.41,172.168.50.40,172.168.50.240(在50.41上搭建ELK,其他兩台服務器es節點)
首先安裝docker 和 docker-compose
# 更新yum
yum update
# 移除docker舊版本(如果有的話)
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
# 安裝系統依賴
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加docker源信息(下載速度比較快)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum緩存
yum makecache fast
# 安裝docker-ce
yum -y install docker-ce
# 啟動docker后台服務
sudo systemctl start docker
# 配置阿里雲鏡像加速器(僅建議進行配置, 這里加速器地址僅用於展示,無加速功能,請使用自己的阿里雲加速器,教程見百度,加速器免費)
mkdir /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://6y4h812t.mirror.aliyuncs.com"]}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# 安裝docker-compose
cd /usr/local/src
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
# 至此,docker 和docker-compose安裝完畢, 如有錯誤,請留言,畢竟是之前寫的自動安裝腳本copy過來的。
首先搭建三節點ES集群,以下步驟均需在三台服務器執行
- 1、使用docker-compose,建立存放yml文件的目錄
建立文件夾,/root/elk(隨意即可)
mkdir /root/elk
- 2、創建docker-compose.yml文件
cd /root/elk
touch docker-compose.yml
-3、docker-compose.yml 的文件內容如下
version: '3'
services:
elasticsearch: # 服務名稱
image: elasticsearch:7.1.1 # 使用的鏡像
container_name: elasticsearch # 容器名稱
restart: always # 失敗自動重啟策略
environment:
- node.name=node-41 # 節點名稱,集群模式下每個節點名稱唯一
- network.publish_host=172.168.50.41 # 用於集群內各機器間通信,其他機器訪問本機器的es服務
- network.host=0.0.0.0 # 設置綁定的ip地址,可以是ipv4或ipv6的,默認為0.0.0.0,
- discovery.seed_hosts=172.168.50.40,172.168.50.240,172.168.50.41 # es7.x 之后新增的配置,寫入候選主節點的設備地址,在開啟服務后可以被選為主節點
- cluster.initial_master_nodes=172.168.50.40,172.168.50.240,172.168.50.41 # es7.x 之后新增的配置,初始化一個新的集群時需要此配置來選舉master
- cluster.name=es-cluster # 集群名稱,相同名稱為一個集群
- bootstrap.memory_lock=true # 內存交換的選項,官網建議為true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 設置內存
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /root/elk/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml # 將容器中es的配置文件映射到本地,設置跨域, 否則head插件無法連接該節點
- esdata:/usr/share/elasticsearch/data # 存放數據的文件, 注意:這里的esdata為 頂級volumes下的一項。
ports:
- 9200:9200 # http端口
- 9300:9300 # es節點直接交互的端口,非http
volumes:
esdata:
driver: local # 會生成一個對應的目錄和文件,如何查看,下面有說明。
- 4、另外兩台服務器也照着這個配置進行配置,但IP,以及節點名稱需要改一下即可。
- 5、內存設置,三台服務器都需要
兩種方式:
1、操作簡單,但是機器重啟后需再次設置
sysctl -w vm.max_map_count=262144
2、直接修改配置文件, 進入sysctl.conf文件添加一行(解決容器內存權限過小問題)
vi /etc/sysctl.conf
sysctl vm.max_map_count=262144
sysctl -p 立即生效
-6、es的配置文件
- 在當前目錄下"/root/elk" 執行 vim elasticsearch.yml
- elasticsearch.yml 內容如下:
network.host: 0.0.0.0
http.cors.enabled: true # 設置跨域,主要用於head插件訪問es
http.cors.allow-origin: "*" # 允許所有域名訪問
- 7、啟動es集群, 三台服務器依次執行 docker-compose up -d 啟動es
- 8、然后訪問 http://172.168.50.41:9200/_cluster/health?pretty 查看是否集群正常運行, 正常運行會返回如下信息
{
"cluster_name" : "es-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"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
}
- 9、使用head監控es集群
// 拉取鏡像
docker pull mobz/elasticsearch-head:5
// 啟動
docker run -d --name es_admin -p 9100:9100 mobz/elasticsearch-head:5
- 10、在瀏覽器輸入http://IP:9100
注意,IP地址要使用你es所在服務器的地址,然后點擊連接,出現類似的顯示說明,沒問題,這里是三個節點,星星代表master。
如果點擊連接沒有反應,F12查看network是403,或者200,但是console中提示跨域,那么說明跨域設置的有問題,直接進入容器中,使用 docker exec -it 容器ID /bin/bash ,檢查/usr/share/elasticsearch/config/elasticsearch.yml文件,是否有以下兩行:
http.cors.enabled: true
http.cors.allow-origin: "*"
- 上面說到的頂級volumes, 如何查看掛載卷在宿主機的位置呢?
# docker volume create elk_data // 創建一個自定義容器卷
# docker volume ls // 查看所有容器卷
# docker volume inspect elk_data // 查看指定容器卷詳情信息, 包括真實目錄
注意: 如果你要刪除一個掛載卷,或者重新生成,請執行刪除卷操作
# docker volume rm edc-nginx-vol // 直接執行這個命令,同時會刪除文件,但是先刪除文件的話,必須執行此命令,否則可能導致該節點無法加入集群。
以上都完成,則es三節點集群搭建完成,下面修改172.168.50.41服務器的/root/elk/docker-compose.yml文件,之前只是es,現在將支持ELK
ELK 前置工作, 升級pip,預先拉取要使用的鏡像
// 下載elasticsearch,logstash,kibana, 自es5開始,一般三個軟件的版本都保持一致了。
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.1.1 && docker pull docker.elastic.co/logstash/logstash:7.1.1 && docker pull docker.elastic.co/kibana/kibana:7.1.1
ELK搭建
- 1、建立存放elk配置文件的目錄,
cd /root/elk
vim docker-compose.yml // 作為docker-compose啟動elk這一組容器的引導文件 - 2、docker-compose.yml文件內容如下
version: '3'
services:
elasticsearch: # 服務名稱
image: docker.elastic.co/elasticsearch/elasticsearch:7.1.1 # 使用的鏡像
container_name: elasticsearch7.1.1 # 容器名稱
environment: # 環境變量
- node.name=node-41 # 節點名稱,集群模式下每個節點名稱唯一
- network.publish_host=172.168.50.41 # 用於集群內各機器間通信,其他機器訪問本機器的es服務
- network.host=0.0.0.0 # 設置綁定的ip地址,可以是ipv4或ipv6的,默認為0.0.0.0,
- discovery.seed_hosts=172.168.50.40,172.168.50.240,172.168.50.41 # es7.x 之后新增的配置,寫入候選主節點的設備地址,在開啟服務后可以被選為主節點
- cluster.initial_master_nodes=172.168.50.40,172.168.50.240,172.168.50.41 # es7.x 之后新增的配置,初始化一個新的集群時需要此配置來選舉master
- cluster.name=es-cluster # 集群名稱,相同名稱為一個集群
#- http.cors.enabled=true # 是否支持跨域,是:true,主要用於head插件訪問es,這里設置不起作用,原因未知,我們會將es的配置文件映射到宿主機進行修改
#- http.cors.allow-origin="*" # 表示支持所有域名,是:true,這里設置不起作用,原因未知,我們會將es的配置文件映射到宿主機進行修改
- bootstrap.memory_lock=true # 內存交換的選項,官網建議為true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 設置內存大小
volumes:
- esdata:/usr/share/elasticsearch/data # 設置es數據存放的目錄
- /root/elk/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml # 映射es容器中的配置文件到宿主機
hostname: elasticsearch # 服務hostname
ulimits: # 是否限制內存
memlock:
soft: -1
hard: -1
restart: always # 重啟策略
ports:
- 9200:9200 # http端口
- 9300:9300 # es節點直接交互的端口,非http
kibana:
image: docker.elastic.co/kibana/kibana:7.1.1
container_name: kibana7.1.1
environment:
- elasticsearch.hosts=http://elasticsearch:9200 # 設置連接的es節點
hostname: kibana
depends_on:
- elasticsearch # 依賴es服務,會先啟動es容器在啟動kibana
restart: always
ports:
- 5601:5601 # 對外訪問端口
logstash:
image: docker.elastic.co/logstash/logstash:7.1.1
container_name: logstash7.1.1
hostname: logstash
restart: always
depends_on:
- elasticsearch
ports:
- 9600:9600 # 這兩個端口, 我進行測試其他功能用的,在本文中不用配置問題應該也不大。
- 5044:5044
volumes: # 頂級volumes
esdata:
driver: local # 會生成一個對應的目錄和文件,如何查看,下面有說明。
- 當前目錄執行 docker-compose up -d 啟動ELK服務
出現done表示成功,docker-compose logs 查看日志(分別輸出elk三個服務的日志)執行docker ps -a 可以看到三個服務的運行狀態
在瀏覽器輸入http://IP:5601/ 訪問kibana
- 另外注意通過head連接ELK服務器的es,看看是否正常連接,如果三個es節點都正常,http://IP:5601也可以正常訪問,那么ELK集群搭建完成。