ElasticSearch 簡介
ElasticSearch是一個高度可擴充套件的開源搜尋引擎並使用REST API,所以您值得擁有。 在本教程中,將介紹開始使用ElasticSearch的一些主要概念。
下載並執行ElasticSearch
ElasticSearch可以從elasticsearch.org下載對應的檔案格式,如ZIP和TAR.GZ。下載並提取一個執行它的軟體包之後不會容易得多,需要提前安裝Java執行時環境。 下載連結 www.elastic.co/products/el…
在Windows上執行ElasticSearch
- 從命令視窗執行位於bin資料夾中的elasticsearch.bat。這將會啟動ElasticSearch在控制檯的前臺執行,這意味著我們可在控制檯中看到執行資訊或一些錯誤資訊,並可以使用CTRL + C停止或關閉它。
- 在啟動過程中,ElasticSearch的例項執行會佔用大量的記憶體,所以在這一過程中,電腦會變得比較慢,需要耐心等待,啟動載入完成後電腦就可以正常使用了
- 當ElasticSearch的例項並執行,您可以使用http://localhost:9200檢查是否執行成功
Linux安裝ElasticSearch
訪問elasticSearch官網地址 www.elastic.co/ 下載指定版本的安裝包:elasticsearch-6.1.1.tar.gz,上傳至指定目錄/usr/local/elasticsearch
#解壓
tar -zxvf elasticsearch-6.1.1.tar.gz
#建立資料儲存目錄
mkdir -p /usr/local/elasticsearch/data
#建立日誌儲存目錄
mkdir -p /usr/local/elasticsearch/logs
#進入到es安裝目錄下的config資料夾中,修改elasticsearch.yml 檔案
#配置es的叢集名稱,預設是elasticsearch,es會自動發現在同一網段下的es,如果在同一網段下有多個叢集,就可以用這個屬性來區分不同的叢集。
cluster.name: qxw-application
#節點名稱
node.name: node-1
#設定索引資料的儲存路徑
path.data: /usr/local/elasticsearch/data
#設定日誌的儲存路徑
path.logs: /usr/local/elasticsearch/logs
#設定當前的ip地址,通過指定相同網段的其他節點會加入該叢集中
network.host: 192.168.1.191
#設定對外服務的http埠
http.port: 9200
#設定叢集中master節點的初始列表,可以通過這些節點來自動發現新加入叢集的節點
discovery.zen.ping.unicast.hosts: ["node-1"]
複製程式碼
修改host 檔案,執行命令 vi /etc/hosts
因為安全問題elasticsearch 不讓用root使用者直接執行,所以要建立新使用者。
useradd es
passwd es
再輸入兩次密碼(自定義)
#給新建立使用者資料夾執行許可權
chown -R es:es /usr/local/elasticsearch
切換es使用者:su es
啟動叢集命令:
cd /usr/local/elasticsearch
bin/elasticsearch
複製程式碼
在es使用者下啟動時報錯
原因:Centos6不支援SecComp,而ES預設bootstrap.system_call_filter為true進行檢測,所以導致檢測失敗,失敗後直接導致ES不能啟動
詳見 :https://github.com/elastic/elasticsearch/issues/22899
解決方案:
在elasticsearch.yml中新增配置bootstrap.system_call_filter,設為false。
bootstrap.system_call_filter: false
複製程式碼
第一個問題的原因:
原因:無法建立本地檔案問題,使用者最大可建立檔案數太小
解決方案:切換到root使用者,編輯limits.conf配置檔案, 新增類似如下內容:
vi /etc/security/limits.conf
新增如下內容: 注意*不要去掉了
* soft nofile 65536
* hard nofile 131072
備註:* 代表Linux所有使用者名稱稱(比如 hadoop)
需要儲存、退出、重新登入才可生效。
複製程式碼
第二個錯誤的原因:
原因:無法建立本地執行緒問題,使用者最大可建立執行緒數太小
解決方案:切換到root使用者,進入limits.d目錄下,修改90-nproc.conf 配置檔案。
vi /etc/security/limits.d/90-nproc.conf
找到如下內容:
* soft nproc 1024
#修改為
* soft nproc 4096
複製程式碼
第三個錯誤的原因:
原因:最大虛擬記憶體太小
每次啟動機器都手動執行下。
root使用者執行命令:
執行命令:sysctl -w vm.max_map_count=262144
檢視修改結果命令:sysctl -a|grep vm.max_map_count 看是否已經修改
永久性修改策略:
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
複製程式碼
切換到es使用者執行:bin/elasticsearch 訪問:http://192.168.1.191:9200/
#後臺啟動
[es@localhost elasticsearch-6.4.0]$ ./bin/elasticsearch -d
[es@localhost elasticsearch-6.4.0]$ jps
27587 Jps
27573 Elasticsearch
複製程式碼
elasticsearch 服務安全配置
一、目前主要通過外掛的形式來控制:
- 常用的外掛主要包括:elasticsearch-http-basic,search-guard,shield
- 由於shield是收費的暫時還未研究(研究後統一補充)
- search-guard主要用於elasticsearch2.x以後的版本(研究後統一補充)
- elasticsearch-http-basic主要用於elasticsearch1.x的版本
- 基於目前我們es叢集大部分都是1.5.2版本的,所以主要使用http-basic來控制來自http請求的訪問。
二、elasticsearch-http-basic安裝:
- 下載elasticsearch-http-basic-1.5.1.jar(下載地址:github.com/Asquera/ela…
- 在ES的plugins資料夾下新建http-basic資料夾
- 把下載的 elasticsearch-http-basic-1.5.1.jar拷貝到新建的http-basic資料夾下
- 修改ES的配置檔案elasticsearch.yml,在檔案末尾新增以下配置:
配置名 預設值 說明
http.basic.enabled true 開關,開啟會接管全部HTTP連線
http.basic.user "admin" 賬號
http.basic.password "admin_pw" 密碼
http.basic.ipwhitelist ["localhost", "127.0.0.1"] 白名單內的ip訪問不需要通過賬號和密碼,支援ip和主機名,不支援ip區間或正則
http.basic.trusted_proxy_chains [] 信任代理列表
http.basic.log false 把無授權的訪問事件新增到ES的日誌
http.basic.xforward "" 記載代理路徑的header欄位名
5.重啟ES叢集
目前我們主要通過http.basic.ipwhitelist 白名單 + 使用者名稱、密碼來控制外部機器對ES叢集的http請求,
1.在白名單內的ip列表使用者無需驗證可直接通過ES節點的ip地址訪問ES,白名單外的使用者無權訪問ES叢集
2.由於白名單無法控制通過域名的訪問,如果要通過域名訪問ES必須要通過使用者名稱和密碼來訪問
複製程式碼
java中使用elastaicsearch(RestHighLevelClient)
官方文件可以得知,現在存在至少三種Java客戶端。
- Transport Client
- Java High Level REST Client
- Java Low Level Rest Client
- 強烈建議ES5及其以後的版本使用Java High Level REST Client
java High Level REST Client 介紹
- Java High Level REST Client 是基於Java Low Level REST Client的,每個方法都可以是同步或者非同步的。同步方法返回響應物件,而非同步方法名以“async”結尾,並需要傳入一個監聽引數,來確保提醒是否有錯誤發生。
- Java High Level REST Client需要Java1.8版本和ES。並且ES的版本要和客戶端版本一致。和TransportClient接收的引數和返回值是一樣的。
引入maven依賴
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.2.3</version>
</dependency>
複製程式碼
Java基礎操作
public class RestClientTest {
public static void main(String[] args) {
// index();
// bacthIndex();
queryTest();
}
/**
* 插入資料
*/
public static void index(){
try {
//RestHighLevelClient例項需要低階客戶端構建器來構建
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
IndexRequest indexRequest = new IndexRequest("demo", "demo");
JSONObject obj=new JSONObject();
obj.put("title","標題圖表題大法師飛灑發順豐三");
obj.put("time","2018-08-21 17:43:50");
indexRequest.source(obj.toJSONString(),XContentType.JSON);
//新增索引
client.index(indexRequest);
client.close();
//http://localhost:9200/demo/demo/_search 瀏覽器執行查詢資料
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 批量插入資料
*/
public static void bacthIndex(){
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
List<IndexRequest> requests = new ArrayList<>();
requests.add(generateNewsRequest("中印邊防軍於拉達克舉行會晤 強調維護邊境和平", "2018-01-27T08:34:00Z"));
BulkRequest bulkRequest = new BulkRequest();
for (IndexRequest indexRequest : requests) {
bulkRequest.add(indexRequest);
}
try {
client.bulk(bulkRequest);
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static IndexRequest generateNewsRequest(String title,String publishTime){
IndexRequest indexRequest = new IndexRequest("demo", "demo");
JSONObject obj=new JSONObject();
obj.put("title",title);
obj.put("time",publishTime);
indexRequest.source(obj.toJSONString(),XContentType.JSON);
return indexRequest;
}
/**
* 查詢操作
* https://blog.csdn.net/paditang/article/details/78802799
* https://blog.csdn.net/A_Story_Donkey/article/details/79667670
* https://www.cnblogs.com/wenbronk/p/6432990.html
*/
public static void queryTest(){
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
// 這個sourcebuilder就類似於查詢語句中最外層的部分。包括查詢分頁的起始,
// 查詢語句的核心,查詢結果的排序,查詢結果擷取部分返回等一系列配置
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
try {
// 結果開始處
sourceBuilder.from(0);
// 查詢結果終止處
sourceBuilder.size(2);
// 查詢的等待時間
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
/**
* 使用QueryBuilder
* termQuery("key", obj) 完全匹配
* termsQuery("key", obj1, obj2..) 一次匹配多個值
* matchQuery("key", Obj) 單個匹配, field不支援萬用字元, 字首具高階特性
* multiMatchQuery("text", "field1", "field2"..); 匹配多個欄位, field有萬用字元忒行
* matchAllQuery(); 匹配所有檔案
*/
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", "費德勒");
//分詞精確查詢
// TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("tag", "體育");
// // 查詢在時間區間範圍內的結果 範圍查詢
// RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("publishTime");
// rangeQueryBuilder.gte("2018-01-26T08:00:00Z");
// rangeQueryBuilder.lte("2018-01-26T20:00:00Z");
// 等同於bool,將兩個查詢合併
BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
boolBuilder.must(matchQueryBuilder);
// boolBuilder.must(termQueryBuilder);
// boolBuilder.must(rangeQueryBuilder);
sourceBuilder.query(boolBuilder);
// 排序
// FieldSortBuilder fsb = SortBuilders.fieldSort("date");
// fsb.order(SortOrder.DESC);
// sourceBuilder.sort(fsb);
SearchRequest searchRequest = new SearchRequest("demo");
searchRequest.types("demo");
searchRequest.source(sourceBuilder);
SearchResponse response = client.search(searchRequest);
System.out.println(response);
client.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
複製程式碼
Kibana linux下安裝
- 下載地址:www.elastic.co/downloads/k…
- 解壓:tar zxvf kibana-6.4.0-linux-x64.tar.gz
配置 www.elastic.co/guide/cn/ki…
server.port: 5601
server.host: "192.168.1.191"
elasticsearch.url: "http://192.168.1.191:9200"
複製程式碼
啟動
./kibana //不能關閉終端
nohup ./kibana > /nohub.out & //可關閉終端,在nohup.out中檢視log
在瀏覽器中訪問:http://192.168.1.191:5601/
複製程式碼
FileBeats 與 LogStash 的安裝
- LogStash 可以用來對日誌進行收集並進行過濾整理後輸出到 ES 中,FileBeats 是一個更加輕量級的日誌收集工具。
- 現在最常用的方式是通過 FileBeats 收集目標日誌,然後統一輸出到 LogStash 做進一步的過濾,在由 LogStash 輸出到 ES 中進行儲存。
官方提供了壓縮包下載, www.elastic.co/downloads/l… 。 下載完成後解壓即可。
tar zxvf logstash-6.2.2.tar.gz
### 進入目錄
cd logstash-6.2.2
複製程式碼
LogStash 的執行需要指定一個配置檔案,來指定資料的流向,我們在當前目錄下建立一個 first.conf 檔案,其內容如下:
### 配置輸入為 beats
input {
beats {
port => "5044"
}
}
### 資料過濾
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
geoip {
source => "clientip"
}
}
# 輸出到本機的 ES
output {
elasticsearch {
hosts => [ "192.168.1.191:9200" ]
}
}
複製程式碼
上面配置了 LogStash 輸出日誌到 ES 中 配置完成後就可以通過如下方式啟動 LogStash 了
bin/logstash -f first.conf --config.reload.automatic
複製程式碼
安裝執行 FileBeats
FileBeats 也提供了下載包,地址為 www.elastic.co/downloads/b… 。找到系統對應的包下載後解壓即可。
tar zxvf filebeat-6.2.2-darwin-x86_64.tar.gz
cd filebeat-6.2.2-darwin-x86_64
複製程式碼
進入目錄編輯 filebeat.yml 找到對應的配置項,配置如下
- type: log
# Change to true to enable this prospector configuration.
enabled: True
# Paths that should be crawled and fetched. Glob based paths.
# 讀取 Nginx 的日誌
paths:
- /usr/local/nginx/logs/*.log
# 輸出到本機的 LogStash
output.logstash:
# The Logstash hosts
hosts: ["localhost:5044"]
複製程式碼
配置完成後執行如下命令,啟動 FileBeat 即可
# FileBeat 需要以 root 身份啟動,因此先更改配置檔案的許可權
sudo chown root filebeat.yml
sudo ./filebeat -e -c filebeat.yml -d "publish"
複製程式碼