ElasticSearch是一個高度可擴展的開源搜索引擎並使用REST API,因此您值得擁有。 在本教程中,將介紹開始使用ElasticSearch的一些主要概念。html
ElasticSearch能夠從elasticsearch.org下載對應的文件格式,如ZIP和TAR.GZ。下載並提取一個運行它的軟件包以後不會容易得多,須要提早安裝Java運行時環境。 下載連接 www.elastic.co/products/el…java
訪問elasticSearch官網地址 www.elastic.co/ 下載指定版本的安裝包:elasticsearch-6.1.1.tar.gz,上傳至指定目錄/usr/local/elasticsearchnode
#解壓
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 linux
由於安全問題elasticsearch 不讓用root用戶直接運行,因此要建立新用戶。nginx
useradd es
passwd es
再輸入兩次密碼(自定義)
#給新建立用戶文件夾執行權限
chown -R es:es /usr/local/elasticsearch
切換es用戶:su es
啓動集羣命令:
cd /usr/local/elasticsearch
bin/elasticsearch
複製代碼
在es用戶下啓動時報錯 git
緣由: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
複製代碼
第一個問題的緣由:github
緣由:沒法建立本地文件問題,用戶最大可建立文件數過小
解決方案:切換到root用戶,編輯limits.conf配置文件, 添加相似以下內容:
vi /etc/security/limits.conf
添加以下內容: 注意*不要去掉了
* soft nofile 65536
* hard nofile 131072
備註:* 表明Linux全部用戶名稱(好比 hadoop)
須要保存、退出、從新登陸纔可生效。
複製代碼
第二個錯誤的緣由:bootstrap
緣由:沒法建立本地線程問題,用戶最大可建立線程數過小
解決方案:切換到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
複製代碼
1、目前主要經過插件的形式來控制:
2、elasticsearch-http-basic安裝:
配置名 默認值 說明
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客戶端。
java High Level REST Client 介紹
引入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();
}
}
}
複製代碼
配置 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/
複製代碼
官方提供了壓縮包下載, 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 也提供了下載包,地址爲 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 須要以 root 身份啓動,所以先更改配置文件的權限
sudo chown root filebeat.yml
sudo ./filebeat -e -c filebeat.yml -d "publish"
複製代碼