elasticsearch文档-modules
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
modules
模塊
cluster
原文
基本概念
cluster: 集群,一個集群通常由很多節(jié)點(node)組成?
node: 節(jié)點,比如集群中的每臺機器可以看做一個node?
shard: 分片,ES是分布式搜索引擎,會把數(shù)據(jù)拆分成很多個shard,一個索引默認有5個shard?
replica: 副本,ES是high availability的, 為了數(shù)據(jù)安全會把同一份數(shù)據(jù)存放在多個節(jié)點,默認情況下一個索引的數(shù)據(jù)會存兩份副本。一份是primary,一份是replica。 primary: 主節(jié)點?
rebalancing: 指數(shù)據(jù)在集群的節(jié)點中重新分配,比如當集群中增加或者移除節(jié)點時就會發(fā)生rebalancing
Shards allocation
Shards allocation是指在各個節(jié)點分配shard的過程。 在初始化恢復, 分配replica, rebalancing, 新增或移除節(jié)點時會發(fā)生。
一些基本配置如下
cluster.routing.allocation.allow_rebalance
根據(jù)集群中節(jié)點的狀態(tài)來控制什么時候可以rebalancing, 可以設置三種方式。
indices_primaries_active: 僅當所有的primary shards是active的時候才允許rebalancing。
indices_all_active: 僅當所有的shards是active的時候才允許rebalancing。
always: 一組shard、replication是active時就可以rebalancing。
默認值為indices_all_active,可以減少cluster初始化恢復時各節(jié)點之間的交互。
cluster.routing.allocation.cluster_concurrent_rebalance
設置在cluster中最多可以允許幾個rebalancing同時進行,默認為2, 如果設置為-1則意味著不做限制。
cluster.routing.allocation.node_initial_primaries_recoveries
限制每個節(jié)點可以同時初始化恢復primary shard數(shù)量。
這個設置是為了防止同時進行的recovery進程太多影響節(jié)點負載,因為大多數(shù)情況下用的是local gateway,速度相當快,所以可以同時執(zhí)行多個recovery進程而不會造成太多的負荷,默認是4。
cluster.routing.allocation.node_concurrent_recoveries
限制每個節(jié)點并行recovery的數(shù)量, 默認是2。
cluster.routing.allocation.disable_new_allocation
設置是否禁止分配新的新的primary shard,注意, 設置為true會阻止新建的索引的shard分配。 因為如果primary不存在,replica會自動提升為primary, 所以這個配置通過更新cluster配置的API動態(tài)更新才有意義。
cluster.routing.allocation.disable_allocation
是否禁止分配primary和replica,這個配置通過更新cluster配置的API動態(tài)更新才有意義。
cluster.routing.allocation.disable_replica_allocation
是否禁止分配replica,和上面的設置類似, 這個配置通過更新cluster配置的API動態(tài)更新才有意義。
indices.recovery.concurrent_streams
設置在從對應的shard恢復一個shard時,可以同時打開的數(shù)據(jù)流的數(shù)量(節(jié)點級別),默認是3。
Cluster allocation awareness
分片規(guī)則
集群分片規(guī)則(Cluster allocation awareness)允許我們用一些參數(shù)來配置整個集群中shard和replica的分片規(guī)則。 下面通過一個例子來解釋一下。
假設我們有幾個機架,我們給一節(jié)點配置一個名為rack_id的屬性(其他名字也可以), 配置例子如下:
node.rack_id: rack_one
上面例子為這個節(jié)點配置了一個名為rack_id的屬性, 值為rack_one。 接下來將rack_id配置為分片規(guī)則所用的屬性(在所有節(jié)點都要設置)。
cluster.routing.allocation.awareness.attributes: rack_id
上面的配置意味著分片規(guī)則會基于屬性rack_id來做shard和replica分配。 例如,我們有兩個node.rack_id屬性設置為rack_one的節(jié)點, 部署了一個有5個shards和1個replica的索引, 索引數(shù)據(jù)會分布到這兩個節(jié)點上(每個節(jié)點有5個shard, 1個replica, 總共10個shards)。
如果我們再加入兩個節(jié)點,這兩個節(jié)點的node.rack_id屬性設置為rack_two, shard會在這些節(jié)點上重新分配, 但是一個shard和他的replica不會分配到有相同rack_id屬性的節(jié)點上。
可以為分片規(guī)則設置多個屬性, 比如:
cluster.routing.allocation.awareness.attributes: rack_id,zone
注意:啟用了分片規(guī)則屬性后,如果一個節(jié)點沒有配置這些屬性, shard就不會分配到這個節(jié)點上。
forced awareness
強制行分片規(guī)則
有時候我們提前知道用來做分片規(guī)則的屬性會有更多的值, 我們不希望一些replica被分配到一組特定節(jié)點上, 對于這種情況, 我們可以針對這些屬性值用強制分片規(guī)則。
例如,我們用屬性zone來做分片規(guī)則屬性,并且我們知道會有兩個zone:zone1和zone2。 下面是強制分片規(guī)則設置的例子:
cluster.routing.allocation.awareness.force.zone.values:?zone1,zone2cluster.routing.allocation.awareness.attributes:?zone現(xiàn)在我們先啟用兩個node.zone屬性設置成zone1的節(jié)點,然后創(chuàng)建一個有5個shard和1個replica的索引。 索引建完后只有5個shard(沒有replica),要等到我們再啟用更多屬性node.zone為zone2的節(jié)點時,replica才會被分配。
automatic preference when searching / geting
在執(zhí)行search或者執(zhí)行get指令時, 接受請求的節(jié)點會優(yōu)先選擇與其有相同屬性值的節(jié)點分片上執(zhí)行請求。
realtime settings update
這些設置可以通過更新cluster配置的api在一個運行著的cluster上實時更新。
shard allocation filtering
可以用include/exclude過濾器控制索引部署到哪些節(jié)點上,過濾器可以設置在索引級別,也可以設置在集群級別, 我們先看一下設置在索引級別的例子。
假設我們有四個節(jié)點, 每個節(jié)點配置了一個名為tag的分片規(guī)則屬性(可以是任何名字),節(jié)點1的tag屬性置為value1, 節(jié)點2的tag屬性設置為value2,以此類推。
我們可以把配置項index.routing.allocation.include.tag設置為value1,value2來使創(chuàng)建的索引只部署到哪些tag屬性為value1和value2的節(jié)點上,例如
curl?-XPUT?localhost:9200/test/_settings?-d?'{??????"index.routing.allocation.include.tag"?:?"value1,value2"}'另一方面, 我們將配置項index.routing.allocation.exclude.tag設置為value3, 這樣創(chuàng)建的索引會被部署到tag屬性為value3之外的那些節(jié)點上,例如
curl?-XPUT?localhost:9200/test/_settings?-d?'{??????"index.routing.allocation.exclude.tag"?:?"value3"}'從0.90版開始, 可以用index.routing.allocation.require.*來設置一系列規(guī)則, 只有符合全部規(guī)則的節(jié)點才會分配shard, 相對而言include則是只要符合任意一條就可以。
include,?exclude和require的值都支持通配符, 例如value1*。 一個特殊的節(jié)點名是_ip,可以用來匹配節(jié)點的ip地址. 另外一個特殊屬性_host可以用來匹配節(jié)點的主機名和ip地址。
上面說過,一個節(jié)點可以配置幾個屬性, 例如
node.group1:?group1_value1node.group2:?group2_value4對應的,?include,?exclude?和?require?也可以用幾個屬性, 例如
curl?-XPUT?localhost:9200/test/_settings?-d?'{????"index.routing.allocation.include.group1"?:?"xxx"????"index.routing.allocation.include.group2"?:?"yyy",????"index.routing.allocation.exclude.group3"?:?"zzz",????"index.routing.allocation.require.group4"?:?"aaa"}'這些設置可以用更新配置的api實時更新, 實時移動索引(索引的分片)。
Cluster級別的過濾器可以用更新cluster設置的api來實時定義和更新,這些設置在解除一個節(jié)點時很有用(即使replica數(shù)量設置為0)。 下面是根據(jù)ip地址解除一個節(jié)點的例子:
curl?-XPUT?localhost:9200/_cluster/settings?-d?'{????"transient"?:?{????????"cluster.routing.allocation.exclude._ip"?:?"10.0.0.1"????}}'discovery
原文
discovery模塊負責發(fā)現(xiàn)集群(cluster)中的節(jié)點,以及選舉出主節(jié)點。
注意,ES是一個基于端到端(p2p)的系統(tǒng),節(jié)點之間直接通信,所有主要的API(index, search, delete)不需要和主節(jié)點(master node)通信。 主節(jié)點的職責是維護整個集群的狀態(tài),并且在節(jié)點加入或者離開集群時重新分片。 每次集群的狀體改變會通知到集群中的其他節(jié)點(方式取決于discovery模塊的具體實現(xiàn))。
settings
配置項cluster.name用來給集群設置一個名字,以此把一個集群和其他的集群區(qū)分開。 默認的集群名是elasticsearch, 不過推薦改為能反映集群用途的有實際意義的名字。
ec2 discovery
EC2 discovery機制使用EC2的API來執(zhí)行自動發(fā)現(xiàn),用不到,不看了。
zen discovery
Zen發(fā)現(xiàn)機制
zen發(fā)現(xiàn)機制是ES默認的內(nèi)置發(fā)現(xiàn)模塊。 它提供了多播和單播兩種發(fā)現(xiàn)方式,并且能夠很容易的擴展以支持云環(huán)境。
zen發(fā)現(xiàn)機制是和其他模塊集成在一起的,比如所有節(jié)點之間通訊是用trasport模塊來完成。
Zen發(fā)現(xiàn)機制分為幾個子模塊,接下來分別做詳細解釋。
ping
ping是指一個節(jié)點用發(fā)現(xiàn)機制發(fā)現(xiàn)其他節(jié)點的過程, 支持多播(multicast)和單播(unicast)兩種方式,也可以組合使用。
multicast
multicast是指發(fā)送一個或多個多播請求,存在的節(jié)點會接受并且相應請求。 它提供了一組以discovery.zen.ping.multicast為前綴的配置項。
| group | group地址,默認值為224.2.2.4 |
| port | 端口,默認為54328 |
| ttl | 多播消息的ttl,默認是3 |
| address | 綁定地址,默認為null,即綁定所有可用的network接口。 |
unicast
在多播禁用的情況下可以使用unicast發(fā)現(xiàn)方式。 它需要一個主機列表, 它提供了下面以discovery.zen.ping.unicast為前綴的配置項。
| hosts | 一個數(shù)組或者以逗號分隔的字符串, 每個值的格式為host:port或者host[port1-port2] |
unicast發(fā)現(xiàn)方式需要借助transport模塊來實現(xiàn)。
master election
主節(jié)點選舉
作為ping初始化過程的一部分, 需要選舉出一個集群的master節(jié)點或者加入到一個已經(jīng)選出的master節(jié)點, 這個過程是自動完成。 可以通過配置項discovery.zen.ping_timeout來設置ping的超時時間(默認是3s)以應對網(wǎng)絡速度慢或者網(wǎng)絡擁堵的情況。 設置一個比較大的值可以減少失敗的幾率。
節(jié)點可以設置屬性node.master為false來避免被選舉為master節(jié)點。 注意, 如果一個節(jié)點被設置為客戶端節(jié)點(node.client屬性設置為true), 這個節(jié)點不會被選舉為master節(jié)點(node.master自動設置為false)。
屬性discovery.zen.minimum_master_nodes設置一個集群中最少的合格master節(jié)點數(shù)量, 對于2個節(jié)點以上的集群,建議設置為大于1的值。
舉個例子, 假設集群有5個節(jié)點,?minimum_master_nodes設置為3, 如果2個節(jié)點掉線了,這兩個節(jié)點不會自己組建一個集群, 而是嘗試加入另一個集群。
這個設置可以避免網(wǎng)絡故障時有些節(jié)點試圖自行組織集群,從而導致整個集群不穩(wěn)定。
fault detection
錯誤檢測
有兩種錯誤檢測方式,一種是master節(jié)點ping集群中所有其他的節(jié)點來驗證他們是否存活,另一種是每個節(jié)點ping master節(jié)點來驗證它是否存活,或者是否需要初始化一個選舉。
下面的配置項用于設置錯誤檢測,前綴是discovery.zen.fd:
| ping_interval | ping的頻率, 默認1s |
| ping_timeout | ping的超時時間, 默認30s |
| ping_retries | 如果ping失敗或者超時,重試的次數(shù) |
external multicast
外部多播
multicast 發(fā)現(xiàn)機制還支持外部多播請求,外部客戶端可以發(fā)送多播請求, 格式為:
{????"request"?:?{????????"cluster_name":?"test_cluster"????}}響應格式類似節(jié)點信息的響應(只有節(jié)點信息,包括transport/http地址以及節(jié)點的屬性):
{????"response"?:?{????????"cluster_name"?:?"test_cluster",????????"transport_address"?:?"...",????????"http_address"?:?"...",????????"attributes"?:?{????????????"..."????????}????}}注意,可以禁用內(nèi)部multicast發(fā)現(xiàn)機制,只啟用外部多播發(fā)現(xiàn)機制。 方式為將discovery.zen.ping.multicast.enabled設為true(默認),但是將discovery.zen.ping.multicast.ping.enabled設為false。
gateway
原文
gateway模塊存儲集群元數(shù)據(jù)(meta data)的狀態(tài),集群元數(shù)據(jù)主要包括索引的配置和聲明的mapping定義。
每次集群元數(shù)據(jù)發(fā)生變化時(比如添加或刪除索引),會通過gateway來持久化這些變化。 集群啟動時會從gateway讀取并且應用這些數(shù)據(jù)。
設置在節(jié)點級別的gateway自動控制索引所用的gateway。 比如節(jié)點用fs?gateway,該節(jié)點創(chuàng)建的索引也自動用fs?gateway。 在這種情況下, 如節(jié)點不應該持久化狀態(tài)數(shù)據(jù), 應該明確設置為none(唯一可以設置的值)。
ES默認使用的gateway是local gateway。
recovery after nodes / time
大多數(shù)場景下,集群的元數(shù)據(jù)只能在特定的節(jié)點已經(jīng)啟動后才能被恢復, 或者等待到超時。 這在集群重啟時非常有用,此時每個節(jié)點的本地索引存儲仍然可用,不需要從gateway恢復(能夠減少從gateway恢復的時間)。
gateway.recover_after_nodes(數(shù)字類型)設置多少個合格的data節(jié)點以及master節(jié)點啟動后觸發(fā)recovery。?gateway.recover_after_data_nodes和gateway.recover_after_master_nodes含義類似,只不過分別設置data節(jié)點和master節(jié)點的數(shù)值。?gateway.recover_after_time(事件類型)設置在所有的gateway.recover_after...nodes條件滿足后,等待多長時間再開始recovery。
gateway.expected_nodes設置預期多少個合格的data和master節(jié)點啟動后就開始recovery,一旦滿足條件馬上啟動recovery,recover_after_time設置會被忽略,對應的也支持gateway.expected_data_nodes和gateway.expected_master_nodes這兩個配置項。 一個配置的例子如下:
gateway:????recover_after_nodes:?1????recover_after_time:?5m????expected_nodes:?2、這個例子配置了在一個預期兩個節(jié)點的集群中,在一個節(jié)點啟動后的5分鐘后執(zhí)行recovery,一旦集群中有已經(jīng)有兩個節(jié)點啟動了,立即開始recovery(不等待,忽略recover_after_time)。
注意,一旦元數(shù)據(jù)從gateway恢復了,那么這個配置就不再有效,直到下次集群完整重啟。
在集群元數(shù)據(jù)沒有恢復時,為了避免和真實的集群元數(shù)據(jù)沖突,所有操作都會被阻止。
local gateway
本地網(wǎng)關
local gateway從每個節(jié)點的本地存儲中恢復整個集群狀態(tài)和索引數(shù)據(jù), 并且不需要節(jié)點級別的共享存儲。
注意,和共享類的gateway不同, local gateway的持久化不是異步的,一單一個操作被執(zhí)行, 數(shù)據(jù)就會被存儲以備集群恢復時使用。
非常重要的一點是在配置gateway.recover_after_nodes時要包括大多數(shù)在整個集群重啟后期望啟動的節(jié)點, 這可以確保集群恢復到最新的狀態(tài)。 例如:
gateway:????recover_after_nodes:?1????recover_after_time:?5m????expected_nodes:?2注意,為了能夠備份/快照完整地集群狀態(tài), 建議禁用flush的情況下所有節(jié)點的本地存儲都要有副本(理論上不需要所有的,只需要確保每個shard的副本被備份,這依賴replication的設置)。 共享存儲比如S3可以在一個地方保存不同節(jié)點的拷貝,盡管代價是帶來了更多的IO。
shared fs gateway
shared FS gateway已經(jīng)廢棄,以后會被移除, 不看了。
hadoop gateway
hadoop gateway以后會被移除, 不看了。
s3 gateway
s3 gateway以后會被移除, 不看了。
http
原文
http模塊允許通過http訪問ES的接口。
http是完全異步的,意味著等待響應時不會阻塞線程。
如果有可能, 考慮使用HTTP keep alive來獲得更好的性能,并且http客戶端不要啟用HTTP chunking。
settings
下面是http模塊的一些設置。
| http.port | 綁定的端口范圍, 默認9200-9300 |
| http.max_content_length | http請求大小的上限, 默認100mb |
| http.max_initial_line_length | http url的最大長度, 默認4kb |
| http.compression | 是否支持http壓縮, 默認是false |
| http.compression_level | http壓縮的級別, 默認是6 |
http模塊共享通用的network設置。
disable http
設置http.enabled為false可以禁用http模塊,比如創(chuàng)建非數(shù)據(jù)節(jié)點來接收http請求,這些節(jié)點利用內(nèi)部的transport來和數(shù)據(jù)節(jié)點通信。
indices
原文
indices模塊可以對所有索引進行全局管理。
indexing buffer
索引緩沖的設置可以控制多少內(nèi)存分配給索引進程。 這是一個全局配置,會應用于一個節(jié)點上所有不同的分片上。
indices.memory.index_buffer_size接受一個百分比或者一個表示字節(jié)大小的值。 默認是10%,意味著分配給節(jié)點的總內(nèi)存的10%用來做索引緩沖的大小。 這個數(shù)值被分到不同的分片(shards)上。 如果設置的是百分比,還可以設置min_index_buffer_size?(默認48mb)和max_index_buffer_size(默認沒有上限)。
indices.memory.min_shard_index_buffer_size設置分配給每個分片的索引緩沖內(nèi)存的下限,默認4mb。
ttl interval
你可以動態(tài)設置indices.ttl.interval來控制自動刪除過期documents的檢查間隔,默認是60s。
刪除是批量進行的,你可以設置indices.ttl.bulk_size來適應你的需要,默認值是10000。
其余的參考_ttl的文檔。
recovery
以下設置用來管理recovery的策略:
| indices.recovery.concurrent_streams | 默認是3 |
| indices.recovery.file_chunk_size | 默認512kb |
| indices.recovery.translog_ops | 默認1000 |
| indices.recovery.translog_size | 默認512kb |
| indices.recovery.compress | 默認true |
| indices.recovery.max_bytes_per_sec | 默認20mb |
| indices.recovery.max_size_per_sec | 0.90.1去掉,用indices.recovery.max_bytes_per_sec代替 |
下面的設置對存儲進行限流:
| indices.store.throttle.type | 可以是merge?(默認),?not或者all |
| indices.store.throttle.max_bytes_per_sec | 默認20mb |
jmx
removed as of v0.90.
memcached
原文
memcached模塊可以通過memecached協(xié)議來訪問ES的接口。
memcached模塊通過一個名為transport-memcached插件提供,插件的安裝說明見transport-memcached,也可以下載memcached插件并放在plugins目錄下。
memcached協(xié)議支持二進制和文本兩種協(xié)議, 會自動檢測應該用哪一種協(xié)議。
mapping rest to memcached protocol
Memcached命令會被映射到REST接口,并且會被同樣的REST層處理,下面是支持的memcached命令列表:
get
memcached的GET命令映射到REST的GET方法。 用URI (帶參數(shù))來做key。 memcached的GET命令不允許在請求中帶body(SET不允許返回結(jié)果), 為此大多數(shù)REST接口(比如search)允許接受一個"source"作為URI的參數(shù)。
set
memcached的SET命令映射為REST的POST。 用URI (帶參數(shù))來做key, body映射為REST的body。
delete
memcached的DELETE命令映射為REST的DELETE。 用URI (帶參數(shù))來做key。
quit
memcached的QUIT命令用來斷開客戶端鏈接。
settings
以下設置可以用來配置memcached:
| memcached.port | 綁定端口范圍, 默認11211-11311 |
同樣共享通用的network設置。
disable memcached
設置memcached.enabled為false可以禁用memcached模塊, 默認檢測到該插件即啟用memcached模塊。
network settings
原文
一個節(jié)點的多個模塊都用到了網(wǎng)絡基本配置,例如transport模塊和HTTP模塊。 節(jié)點級別的網(wǎng)絡配置可以用來設置所有基于網(wǎng)絡的模塊的通用配置(除了被每個模塊明確覆蓋的那些配置項)。
network.bind_host用來設置綁定的ip地址, 默認綁定anyLocalAddress?(0.0.0.0或者::0)。
network.publish_host配置其他節(jié)點和本節(jié)點通信的地址。 這個當然不能是anyLocalAddress, 默認是第一個非回環(huán)地址或者本機地址。
network.host設置是一個簡化設置, 它自動設置network.bind_host和network.publish_host為同一個值。
兩個設置都可以配置為主機ip地址或者主機名, 還可以設置為下表中列出來的值。
| local | 本機ip地址 |
| _non_loopback_ | 第一個非loopback地址 |
| _non_loopback:ipv4_ | 第一個非loopback的ipv4地址 |
| _non_loopback:ipv6_ | 第一個非loopback的ipv6地址 |
| [networkInterface] | 指定網(wǎng)卡的IP地址. 例如?en0 |
| [networkInterface]:ipv4 | 指定網(wǎng)卡的IPv4地址. 例如?en0:ipv4 |
| [networkInterface]:ipv6 | 指定網(wǎng)卡的IPv6地址. 例如?en0:ipv6 |
| _non_loopback:ipv6_ | 第一個非loopback的ipv6地址 |
cloud-aws
如果安裝了cloud-aws插件, 下表列出來值也是有效的設置:
| ec2:privateIpv4 | The private IP address (ipv4) of the machine |
| ec2:privateDns | The private host of the machines |
| ec2:publicIpv4 | The public IP address (ipv4) of the machine |
| ec2:publicDns | The public host of the machines |
| ec2 | Less verbose option for the private ip address |
| ec2:privateIp | Less verbose option for the private ip address |
| ec2:publicIp | Less verbose option for the public ip address |
tcp settings
任何使用TCP的組件 (比如HTTP, Transport和Memcached)共享下面的設置:
| network.tcp.no_delay | 啟用或禁用tcp no delay。 默認是true. |
| network.tcp.keep_alive | 啟用或禁用tcp keep alive。 默認不設置 |
| network.tcp.reuse_address | 地址是否應該被重用,在非windows的機器上默認是true |
| network.tcp.send_buffer_size | tcp發(fā)送緩沖區(qū)的大小。 默認不設置 |
| network.tcp.receive_buffer_size | tcp接收緩沖區(qū)的大小。 默認不設置 |
node
原文
ES可以設置一個節(jié)點是否在本地存儲數(shù)據(jù),存儲數(shù)據(jù)意味著不同索引的分片可以分配到這個節(jié)點上。 默認每個節(jié)點都可以作為數(shù)據(jù)節(jié)點(data node),可以設置node.data為false來關閉。
這是一個很強大的配置, 可以很簡單的來創(chuàng)建一個智能負載均衡。
我們可以啟動一個數(shù)據(jù)節(jié)點的集群而不啟用http模塊, 這可以通過設置http.enabled為true做到, 這些節(jié)點通過transport模塊相互通信, 在集群的前端可以啟動一個和或者多個啟用了http模塊的非數(shù)據(jù)節(jié)點, 所有的http通訊由這些非數(shù)據(jù)節(jié)點來執(zhí)行。
這樣做的好處是首先能夠創(chuàng)建一個智能負載均衡器。 這些非數(shù)據(jù)節(jié)點仍然是集群的一部分, 他們將請求重定向到那些有相關數(shù)據(jù)的節(jié)點上。 另一個好處是對于那些scatter/gather操作(比如search), 這些節(jié)點可以執(zhí)行一部分處理, 因為它們啟動scatter處理并且執(zhí)行實際的gather過程。
這樣數(shù)據(jù)節(jié)點可以專注于索引和查詢這類大負載的工作,而不需要處理http請求, 占用網(wǎng)絡負載,或者執(zhí)行gather過程。
plugins
原文
Plugins提供了以自定義的方式增強ES基本功能的途徑, 范圍包括添加自定義mapping類型, 自定義分詞, 原生腳本, 自定義discovery等等。
installing plugins
安裝插件可以手工將插件安裝包放到plugins目錄, 也可以用plugin腳本來安裝。 在github的elasticsearch能找到好幾個插件, 名字以"elasticsearch-"開頭。
從0.90.2開始, 插件可以通過執(zhí)行?plugin --install /<user/component>/的形式來安裝。 插件會從download.elasticsearch.org自動下載, 如果插件不存在的話, 就從maven(central and sonatype)下載。
注意, 如果插件放在maven central或者sonatype的話,?`是groupId,<user/component>是artifactId`。
對于以前的版本, 老的安裝方式是?plugin -install /<user/component>/
一個插件也可以直接通過指定它的URL來安裝, 例如
bin/plugin --url file://path/to/plugin --install plugin-name
或者對于老版本來說是
bin/plugin -url file://path/to/plugin -install plugin-name
從0.90.2開始, 插件的更新信息可以通過運行?bin/plugin -h來獲得。
site plugins
插件可以包含一個站點, 任何位于plugins目錄下的插件如果包含一個_site目錄, 目錄里的內(nèi)容就可以當做靜態(tài)內(nèi)容通過/_plugin/[plugin_name]/url來訪問,在進程已經(jīng)開始的情況下也可以向其添加內(nèi)容。
安裝的插件如果不包含任何java相關的內(nèi)容, 會被自動檢測為site插件, 內(nèi)容會被移動到_site目錄下。
安裝github托管的插件非常簡單, 比如運行
#?From?0.90.2bin/plugin?--install?mobz/elasticsearch-headbin/plugin?--install?lukas-vlcek/bigdesk#?From?a?prior?versionbin/plugin?-install?mobz/elasticsearch-headbin/plugin?-install?lukas-vlcek/bigdesk會自動安裝這兩個site插件,elasticsearch-head插件可以通過?http://localhost:9200/_plugin/head/訪問, bigdesk插件可以通過http://localhost:9200/_plugin/bigdesk/訪問。
mandatory plugins
如果你依賴一些插件, 你可以通過屬性plugin.mandatory來定義這些強制性(mandatory)插件, 下面是一個配置的例子:
plugin.mandatory:?mapper-attachments,lang-groovy出于安全考慮, 如果mandatory插件沒有安裝, 節(jié)點不會啟動。
installed plugins
當前已加載的插件列表可通過Node Info API獲得。
removing plugins
要刪除一個插件,可以手工將它從plugins目錄移除,也可以用plugin腳本。
刪除一個插件通??梢杂孟旅娴男问?
plugin?--removesilent/verbose mode
運行plugin腳本時, 可以加--verbose參數(shù)獲得更多的信息(調(diào)試模式)。 相反的, 如果希望plugin腳本靜默與運行可以用--silent選項。
注意, 退出碼可能是:
0:?everything?was?OK64:?unknown?command?or?incorrect?option?parameter74:?IO?error70:?other?errorsbin/plugin?--install?mobz/elasticsearch-head?--verboseplugin?--remove?head?--silentscripting
scripting模塊可以用腳本來執(zhí)行自定義表達式, 比如可以用腳本將"script fields"作為查詢的一部分返回, 或者用來計算某個查詢的自定義評分等。
腳本模塊默認用擴展過的mvel作為腳本語言, 之所以用是因為它非常快而且用起來很簡單, 大多數(shù)情況下需要的是簡單的表達式(比如數(shù)學方程式)。
其他lang插件可以提供執(zhí)行不同語言腳本的能力, 目前支持的腳本插件有javascript的lang-javascript,Groovy的lang-groovy, Python的lang-python。 所有可以用script參數(shù)的地方可以設置lang參數(shù)來定義腳本所用的語言。?lang的選項可以是mvel,?js,?groovy,?python, 和native。
default scripting language
默認的腳本語言是(如果沒有指定lang參數(shù))mvel。 如果要修改默認語言的話可以將設置script.default_lang為合適的語言。
preloaded scripts
腳本可以作為相關api的一部分, 也可以將腳本放到config/scripts來預加載這些腳本, 這樣用到這些腳本的地方可以直接引用腳本的名字而不用提供整個腳本, 這有助于減少客戶端和節(jié)點間的傳輸?shù)臄?shù)據(jù)量。
腳本的名字從其所在的目錄結(jié)構繼承,不需要帶文件名的后綴, 例如被放在config/scripts/group1/group2/test.py的腳本會被命名為group1_group2_test。
disabling dynamic scripts
建議ES運行在某個應用或者代理的后端,這樣可以將ES和外部隔離, 如果用戶被授權運行動態(tài)腳本(即使在search請求),那么他們就可以訪問ES所在的機器。
首先, 你不應該用root用戶來運行ES, 因為這樣會允許腳本在你的服務器上沒有限制的做任何事, 其次你不應該直接將ES暴露給用戶訪問, 如果你打算直接將ES暴露給用戶, 你必須決定是否足夠信任他們在你的服務器上運行腳本。 如果答案是不的話, 即使你有個代理僅允許GET請求, 你也應該在每個節(jié)點的config/elasticsearch.yml加入如下設置來禁用動態(tài)腳本:
script.disable_dynamic:?true這樣可以僅允許配置過的命名腳本或者通過插件注冊的原生Java腳本運行, 防止用戶通過接口來運行任意腳本。
native (java) scripts
即使mvel已經(jīng)相當快了,注冊的原生java腳本還能執(zhí)行的更快。
實現(xiàn)NativeScriptFactory接口的腳本才會被執(zhí)行。 主要有兩種形式,一種是擴展AbstractExecutableScript,一種是擴展AbstractSearchScript(可能大多數(shù)用戶會選擇這種方式, 可以借助AbstractLongSearchScript,?AbstractDoubleSearchScript,?AbstractFloatSearchScript這幾個輔助類來實現(xiàn)擴展)。
可以通過配置來注冊腳本, 例如:script.native.my.type設為sample.MyNativeScriptFactory將注冊一個名為my的腳本。 另一個途徑是插件中訪問ScriptModule的registerScript方法注冊腳本。
設置lang為native并且提供腳本的名字就可以執(zhí)行注冊的腳本。
注意, 腳本需要位于ES的classpath下, 一個簡單方法是在plugins目錄下創(chuàng)建一個目錄(選擇一個描述性的名字),將jar/classes文件放在這個目錄,他們就會被自動加載。
score
所有的腳本都可以在facets中使用, 可以通過doc.score訪問當前文檔的評分。
document fields
大多數(shù)腳本都會用到document的字段,?doc['field_name']可以用來訪問document中的某個字段(document通常通過腳本的上下文傳給腳本)。 訪問document的字段非常快, 因為他們會被加載到內(nèi)存中(所有相關的字段值/token會被加載到內(nèi)存中)。
下表是能夠從字段上拿到的數(shù)據(jù):
| doc['field_name'].value | 字段的原生值, 比如,如果是字段short類型,就返回short類型的值 |
| doc['field_name'].values | 字段的原生值的數(shù)組, 比如,如果字段是short類型,就返回short[]類型的數(shù)組。 記住,單個文檔中的一個字段可以有好幾個值,如果字段沒有值就返回空數(shù)組 |
| doc['field_name'].empty | boolean值, 表明文檔的字段是否有值 |
| doc['field_name'].multiValued | boolean值, 表明文檔的字段是否有多個值 |
| doc['field_name'].lat | geo point類型的維度值 |
| doc['field_name'].lon | geo point類型的經(jīng)度值 |
| doc['field_name'].lats | geo point類型的維度數(shù)組 |
| doc['field_name'].lons | geo point類型的經(jīng)度數(shù)組 |
| doc['field_name'].distance(lat, lon) | geo point類型的字段到給定坐標的plane距離(單位是miles) |
| doc['field_name'].arcDistance(lat, lon) | geo point類型的字段到給定坐標的arc距離(單位是miles) |
| doc['field_name'].distanceInKm(lat, lon) | geo point類型的字段到給定坐標的plane距離(單位是km) |
| doc['field_name'].arcDistanceInKm(lat, lon) | geo point類型的字段到給定坐標的arc距離(單位是km) |
| doc['field_name'].geohashDistance(geohash) | geo point類型的字段到給定geohash的距離(單位是miles) |
| doc['field_name'].geohashDistanceInKm(geohash) | geo point類型的字段到給定geohash的距離(單位是km) |
stored fields
執(zhí)行腳本時也可以訪問存儲的字段(Stored), 注意,因為他們不會被記載到內(nèi)存,所以訪問速度與訪問document字段相比慢很多。 可以用_fields['my_fields_name'].value或_fields['my_fields_name'].values的形式來訪問。
source field
執(zhí)行腳本時也可以獲取源字段(source)。 每個文檔的源字段會被加載,解析,然后提供給腳本計算。 可以通過上下文的_source來訪問源字段,例如_source.obj2.obj1.fields3。
mvel built in functions
以下是腳本中可以使用的內(nèi)置函數(shù):
| time() | The current time in milliseconds. |
| sin(a) | Returns the trigonometric sine of an angle. |
| cos(a) | Returns the trigonometric cosine of an angle. |
| tan(a) | Returns the trigonometric tangent of an angle. |
| asin(a) | Returns the arc sine of a value. |
| acos(a) | Returns the arc cosine of a value. |
| atan(a) | Returns the arc tangent of a value. |
| toRadians(angdeg) | Converts an angle measured in degrees to an approximately equivalent angle measured in radians. |
| toDegrees(angrad) | Converts an angle measured in radians to an approximately equivalent angle measured in degrees. |
| exp(a) | Returns Euler’s number e raised to the power of value. |
| log(a) | Returns the natural logarithm (base e) of a value. |
| log10(a) | Returns the base 10 logarithm of a value. |
| sqrt(a) | Returns the correctly rounded positive square root of a value. |
| cbrt(a) | Returns the cube root of a double value. |
| IEEEremainder(f1, f2) | Computes the remainder operation on two arguments as prescribed by the IEEE 754 standard. |
| ceil(a) | Returns the smallest (closest to negative infinity) value that is greater than or equal to the argument and is equal to a mathematical integer. |
| floor(a) | Returns the largest (closest to positive infinity) value that is less than or equal to the argument and is equal to a mathematical integer. |
| rint(a) | Returns the value that is closest in value to the argument and is equal to a mathematical integer. |
| atan2(y, x) | Returns the angle theta from the conversion of rectangular coordinates (x, y) to polar coordinates (r,theta). |
| pow(a, b) | Returns the value of the first argument raised to the power of the second argument. |
| round(a) | Returns the closest int to the argument. |
| random() | Returns a random double value. |
| abs(a) | Returns the absolute value of a value. |
| max(a, b) | Returns the greater of two values. |
| min(a, b) | Returns the smaller of two values. |
| ulp(d) | Returns the size of an ulp of the argument. |
| signum(d) | Returns the signum function of the argument. |
| sinh(x) | Returns the hyperbolic sine of a value. |
| cosh(x) | Returns the hyperbolic cosine of a value. |
| tanh(x) | Returns the hyperbolic tangent of a value. |
| hypot(x, y) | Returns sqrt(x2 + y2) without intermediate overflow or underflow. |
arithmetic precision in mvel
用基于MVEL的腳本做兩個數(shù)的除法時, 引擎遵循java的默認規(guī)則, 這意味著如果你把兩個整數(shù)相除(你可以在mapping里配置字段為integer類型), 結(jié)果仍然是整數(shù)。 也就是說如果你在腳本中計算1/num這樣的表達式, 如果num是整數(shù)8的話,結(jié)果是0而不是你可能期望的0.125,你需要明確用doubel來指定精度以獲得期望的結(jié)果,用比如1.0/num。
thread pool
為了提高線程管理和內(nèi)存使用的效率, 一個節(jié)點會用到好幾個線程池, 比較重要的是以下幾個。
| index | 用于index/delete, 默認是fixed, 大小為# of available processors, queue_size是200 |
| search | 用于count/search, 默認是fixed, 大小為3x # of available processors, queue_size是1000 |
| suggest | 用于suggest, 默認是fixed, 大小為# of available processors, queue_size是1000 |
| geting | 用于get, 默認是fixed, 大小為# of available processors, queue_size是1000 |
| bulk | 用于bulk, 默認是fixed, 大小為# of available processors, queue_size是50 |
| percolate | 用于percolate, 默認是fixed, 大小為# of available processors, queue_size是1000 |
| warmer | 用于warm-up, 默認是scaling, keep-alive是5m |
| refresh | 用于refresh, 默認是fixed, keep-alive是5m |
| percolate | 用于percolate, 默認是fixed, 大小為# of available processors, queue_size是1000 |
可以通過設置線程池的類型以及參數(shù)來修改指定的線程池,下面的例子配置index線程池可以用更多的線程:
threadpool:????index:????????type:?fixed????????size:?30注意, 可以通過Cluster Update Settings接口在運行期間修改線程池的設置。
thread pool types
以下是線程池的類型以及對應的參數(shù)。
cache
cache線程池是沒有大小限制的, 只要有請求就會啟動一個線程, 下面是設置的例子:
threadpool:????index:????????type:?cachedfixed
fixed線程池有固定的大小, 如果當前沒有可用的線程時,就把請求放到一個隊列里, 隊列可以設置大小。
size參數(shù)設置線程的數(shù)量, 默認是cpu內(nèi)核數(shù)乘以5。
queue_size設置存放掛起請求的隊列的大小, 默認是-1, 即沒有大小限制。 如果一個請求進來而隊列已經(jīng)滿了的情況下, 這個請求會被舍棄。
配置例子如下:
threadpool:????index:????????type:?fixed????????size:?30????????queue_size:?1000processors setting
ES會自動檢測處理器的數(shù)量, 并且會自動根據(jù)處理器的數(shù)量來設置線程池。 有時候可能檢測出來的處理器數(shù)量是錯的, 這種情況下可以設置processors?來聲明處理器的數(shù)量。
可以用帶os參數(shù)的nodes info接口來檢查自動檢測出來的處理器數(shù)量。
thrift
thrift傳輸模塊允許通過thrift協(xié)議對外暴露REST接口, Thrift協(xié)議可以提供比http協(xié)議更好的性能。 因為thrift既提供了協(xié)議,也提供了傳輸?shù)膶崿F(xiàn)方式, 用起來應該很簡單(盡管缺乏相關文檔)。
使用thrift需要安裝transport-thrift插件?。
thrift schema可以用來生成thrift的客戶端代碼。
thrift的相關配置如下:
| thrift.port | 綁定的端口, 默認9500-9600 |
| thrift.frame | 默認-1, 即不分frame, 可以設置比較大的值來指定frame的大小(比如15mb)。 |
transport
傳輸模塊用于集群內(nèi)節(jié)點間的內(nèi)部通訊。 每次跨節(jié)點的調(diào)用都會用到transport模塊(比如某個節(jié)點接受http GET請求,實際執(zhí)行處理的是另一個持有數(shù)據(jù)的節(jié)點)。
transport機制是完全異步的, 即等待響應時不會阻塞線程, 異步通信的好處首先是解決了C10k問題, 另外也是scatter(broadcast)/gather操作(比如搜索)的方案。
tcp transport
TCP transport是用TCP實現(xiàn)傳輸模塊, 允許如下設置:
| transport.tcp.port | 綁定的端口范圍, 默認9300-9400 |
| transport.tcp.connect_timeout | socket鏈接的超時時間, 默認2s |
| transport.tcp.compress | 設置為true可以啟用壓縮(LZF), 默認是false。 |
tcp transport共享通用網(wǎng)絡設置。
local transport
這在JVM內(nèi)做集成測試時非常有用。 當使用NodeBuilder#local(true)時會自動啟用。
?
補充說明:
Gateway
Gateway是一種存儲集群中各節(jié)點元數(shù)據(jù)(meta data)的狀態(tài)方式,這里的元數(shù)據(jù)主要用來記錄所有的索引在創(chuàng)建時各自的設置和明確的類型映射。每次當元數(shù)據(jù)改變,比如一個索引被加入或被刪除,這些變化都會通過gateway存儲起來。當集群啟動時,這些狀態(tài)將會從gateway中讀取并應用。
gateway.type
gateway類型,默認是local,也是es官方強烈建議的。
gateway.recover_after_nodes
在多少個節(jié)點啟動后,允許數(shù)據(jù)恢復進程啟動,默認是1
gateway.recover_after_time
設置數(shù)據(jù)恢復進程初始化的超時時間,默認是5分鐘
gateway.expected_nodes
設置在集群中的多少個節(jié)點啟動后馬上開始數(shù)據(jù)恢復進程(不用等到gateway.recover_after_time這個屬性設置的時間到)
?? Recovery Throttling
這里的設置是用來控制分片分配的進程,當各節(jié)點間進行初始化恢復、索引拷貝分配、再次負載均衡,或再增加或去掉節(jié)點的時候。
cluster.routing.allocation.node_initial_primaries_recoveries
初始化數(shù)據(jù)恢復時,并發(fā)恢復線程的個數(shù),默認為4。
cluster.routing.allocation.node_concurrent_recoveries
添加刪除節(jié)點或負載均衡時并發(fā)恢復線程的個數(shù),默認為4
indices.recovery.max_size_per_sec
設置數(shù)據(jù)恢復時限制的帶寬,默認為0,表示無限制。
indices.recovery.concurrent_streams
這個參數(shù)來限制從其它分片恢復數(shù)據(jù)時最大同時打開并發(fā)流的個數(shù),默認為5
?? Discovery
discovery.zen.minimum_master_nodes
設置這個參數(shù)來保證集群中的節(jié)點可以知道其它N個有master資格的節(jié)點。默認為1,對于大的集群來說,可以設置大一點的值(2-4)。
discovery.zen.ping.timeout
設置集群中自動發(fā)現(xiàn)其它節(jié)點時ping連接超時時間,默認為3秒,對于比較差的網(wǎng)絡環(huán)境可以高點的值來防止自動發(fā)現(xiàn)時出錯
discovery.zen.ping.multicast.enabled
設置是否打開多播來發(fā)現(xiàn)來發(fā)現(xiàn)節(jié)點,默認是true
discovery.zen.ping.unicast.hosts
設置集群中master節(jié)點的初始列表,可以通過這些節(jié)點來自動發(fā)現(xiàn)新加入集群的節(jié)點。
轉(zhuǎn)載于:https://my.oschina.net/u/1024514/blog/467761
總結(jié)
以上是生活随笔為你收集整理的elasticsearch文档-modules的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 38Exchange 2010升级到Ex
- 下一篇: oracle EBS grant 您不具