一、前言
本系列文章最終目標是為了快速搭建一個簡易可用的搜索服務。方案並不一定是最優,但實現難度較低。
二、背景
近期公司在重構老系統,需求是要求知識庫支持全文檢索。
我們知道普通的數據庫 like 方式效果及性能都不好,所以另尋出路,確定通過 Elasticsearch (下文簡稱「 ES 」)搜索引擎實現。
三、技術選型
因公司之前購買了阿里雲的ES服務且版本為 5.5.3 ,下文選用的技術框架均基於此版本。
① Elasticsearch 5.5.3
一個基於Lucene的搜索服務器,提供了分布式的全文搜索引擎
② Logstash 5.5.3
開源的服務器端數據處理管道
③ Kibana 5.5.3
開源的分析和可視化平台
④ Spring Boot 2.0.4
四、系統環境
- Linux Centos 7.3
- JDK 1.8
五、基本概念
5.1 集群( cluster )
集群是由一個或者多個擁有相同 cluster.name 配置的節點組成,共同承擔數據和負載壓力,當節點數量發生變化時集群將會重新平均分布所有數據。
5.2 節點( node )
一個運行中的 ES 實例稱為一個節點
- 主節點負責管理集群范圍內的所有變更,例如增加/刪除索引,或者增加/刪除節點等,且不需要涉及到文檔級別的變更和搜索等操作
- 任何節點都能成為主節點
- 當集群只有一個主節點,即使流量增加也不會成為瓶頸
5.3 索引( index )
名詞
;類似於傳統關系數據庫中的一個數據庫動詞
;索引一個文檔就是存儲一個文檔到一個索引(名詞)中以便它可以被檢索和查詢到。類似於 SQL 語句中的 INSERT 關鍵詞倒排索引
;類似於傳統關系型數據庫中的索引概念,可以提升數據檢索速度
5.4 類型( type )
一個索引包含一個或多個 type ,相當於傳統關系型數據庫中的表
5.5 文檔( document )
相當於傳統關系型數據庫中的數據行
5.6 分片( shards )
- 是一個底層的
「工作單元」
,僅保存了全部數據的一部分 - 是數據的容器,文檔保存在分片內,分片又被分配到集群內的各個節點里
- 當集群規模擴大或者縮小時, ES 會自動的在各節點中遷移分片,使得數據仍然均勻分布在集群里
- 分為
「主分片」
和「副本分片」
- 在索引建立的時候就已經確定了主分片數,但是副本分片數可以隨時修改;默認情況下會被分配「 5 」個主分片和「 1 」份副本(每個主分片擁有一個副本分片)
- 相同主分片的副本分片不會放在同一個節點
① 主分片 ( Primary shard )
索引內任意一個文檔都歸屬於一個主分片,所以主分片的數目決定着索引能夠保存的最大數據量
② 副本分片( Replica shard )
只是一個主分片的拷貝,作為硬件故障時保護數據不丟失的冗余備份,並為搜索和返回文檔等讀操作提供服務
六、環境搭建
6.1 Elasticsearch
6.1.1 安裝步驟
① 下載安裝包:
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.3.tar.gz
② 解壓並移動到 local 目錄下
$ tar -zxvf elasticsearch-5.5.3.tar.gz
$ mv elasticsearch-5.5.3 /usr/local/elasticsearch
③ 修改 config 目錄下的 elasticsearch.yml 文件
$ vim elasticsearch.yml
// 去掉行開頭的 # 並重命名集群名,這里命名為 compass
cluster.name: compass
// 去掉行開頭的 # 並重命名節點名,這里命名為 node-1
node.name: node-1
④ 進入 bin 目錄啟動 ES 並在后台運行
$ ./elasticsearch -d
⑤ 啟動之后測試是否正常運行
$ curl 127.0.0.1:9200
返回結果:
{
"name" : "node-1",
"cluster_name" : "compass",
"cluster_uuid" : "Zuj5FBMUTjuHQXlAHreGvA",
"version" : {
"number" : "5.5.3",
"build_hash" : "9305a5e",
"build_date" : "2017-09-07T15:56:59.599Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
6.1.2 如果提示「-bash: wget: command not found」則需要先安裝 wget
$ yum -y install wget
6.1.3 ES 版本> = 5.0.0 時,是不能用超級管理員運行的,此時需要切換到普通賬號或者新建 ES 賬號
解決辦法:
① 新建用戶組 elasticsearch
$ groupadd elasticsearch
② 新建用戶並指定用戶組
$ useradd -g elasticsearch elasticsearch
③ 修改 ES 目錄所屬者
$ chown -R elasticsearch:elasticsearch elasticsearch
④ 切換用戶后再次啟動
$ su elasticsearch
6.1.4 只能使用127.0.01或者localhost訪問,使用ip地址無法訪問?
解決辦法:
① 修改 elasticsearch.yml 中的「network.host」
network.host: 0.0.0.0
② 重啟 ES 出現如果如下報錯,請依次按下面的步驟解決
ERROR: [3] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[2]: max number of threads [3818] for user [elasticsearch] is too low, increase to at least [4096]
[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
每個進程最大同時打開文件數太小
修改 /etc/security/limits.conf 文件,增加如下配置,用戶退出后重新登錄生效
* soft nofile 65536
* hard nofile 65536
[2]: max number of threads [3818] for user [es] is too low, increase to at least [4096]
最大線程個數太低
同上修改 /etc/security/limits.conf 文件,增加如下配置,用戶退出后重新登錄生效
* soft nproc 4096
* hard nproc 4096
[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
一個進程能擁有的最多的內存區域
修改 /etc/sysctl.conf 文件,增加如下配置,執行命令「 sysctl -p 」生效
vm.max_map_count=262144
③ 切換到 elasticsearch 用戶並重啟, curl 測試成功
[root@db-develop-01 ~]$ curl 192.168.1.192:9200
{
"name" : "node-1",
"cluster_name" : "compass",
"cluster_uuid" : "mFL_a6WDTUaWbB4jKA8cWg",
"version" : {
"number" : "5.5.3",
"build_hash" : "9305a5e",
"build_date" : "2017-09-07T15:56:59.599Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
6.2 Logstash
① 下載安裝包:
$ wget https://artifacts.elastic.co/downloads/logstash/logstash-5.5.3.tar.gz
② 解壓並移動到 local 目錄下
$ tar -zxvf logstash-5.5.3.tar.gz
$ mv logstash-5.5.3 /usr/local/logstash
6.3 Kibana
① 下載安裝包:
$ wget https://artifacts.elastic.co/downloads/kibana/kibana-5.5.3-linux-x86_64.tar.gz
② 解壓並移動到 local 目錄下
$ tar -zxvf kibana-5.5.3-linux-x86_64.tar.gz
$ mv kibana-5.5.3-linux-x86_64 /usr/local/kibana
③ 修改 config 目錄下的 kibana.yml 文件
// 去掉當前行開頭的 #
server.port: 5601
// 去掉當前行開頭的#並將localhost修改為具體IP
server.host: "192.168.1.191"
// 去掉當前行開頭的#並將localhost修改為具體IP
elasticsearch.url: "http://192.168.1.191:9200"
④ 啟動 Kibana ,瀏覽器訪問 http://192.168.1.191:5601
$ ./kibana
6.4 elasticsearch-head 插件(瀏覽器版)
① 「 Chrome 瀏覽器網上應用商店」或者「 Firefox 附加組件」搜索 elasticsearch head
② 安裝插件后點擊瀏覽器地址欄右側「放大鏡圖標」,頂部輸入框中的 localhost 修改為服務器地址即可查看 ES 服務狀態
七、結語
至此 ELK 環境搭建完畢,下一篇具體介紹如何實現基礎搜索服務。