日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

elasticsearch文档-modules

發布時間:2024/1/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 elasticsearch文档-modules 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

modules

模塊

cluster

原文

基本概念

cluster: 集群,一個集群通常由很多節點(node)組成?
node: 節點,比如集群中的每臺機器可以看做一個node?
shard: 分片,ES是分布式搜索引擎,會把數據拆分成很多個shard,一個索引默認有5個shard?
replica: 副本,ES是high availability的, 為了數據安全會把同一份數據存放在多個節點,默認情況下一個索引的數據會存兩份副本。一份是primary,一份是replica。 primary: 主節點?
rebalancing: 指數據在集群的節點中重新分配,比如當集群中增加或者移除節點時就會發生rebalancing

Shards allocation

Shards allocation是指在各個節點分配shard的過程。 在初始化恢復, 分配replica, rebalancing, 新增或移除節點時會發生。

一些基本配置如下

cluster.routing.allocation.allow_rebalance

根據集群中節點的狀態來控制什么時候可以rebalancing, 可以設置三種方式。

  • indices_primaries_active: 僅當所有的primary shards是active的時候才允許rebalancing。

  • indices_all_active: 僅當所有的shards是active的時候才允許rebalancing。

  • always: 一組shard、replication是active時就可以rebalancing。

默認值為indices_all_active,可以減少cluster初始化恢復時各節點之間的交互。

cluster.routing.allocation.cluster_concurrent_rebalance

設置在cluster中最多可以允許幾個rebalancing同時進行,默認為2, 如果設置為-1則意味著不做限制。

cluster.routing.allocation.node_initial_primaries_recoveries

限制每個節點可以同時初始化恢復primary shard數量。

這個設置是為了防止同時進行的recovery進程太多影響節點負載,因為大多數情況下用的是local gateway,速度相當快,所以可以同時執行多個recovery進程而不會造成太多的負荷,默認是4。

cluster.routing.allocation.node_concurrent_recoveries

限制每個節點并行recovery的數量, 默認是2。

cluster.routing.allocation.disable_new_allocation

設置是否禁止分配新的新的primary shard,注意, 設置為true會阻止新建的索引的shard分配。 因為如果primary不存在,replica會自動提升為primary, 所以這個配置通過更新cluster配置的API動態更新才有意義。

cluster.routing.allocation.disable_allocation

是否禁止分配primary和replica,這個配置通過更新cluster配置的API動態更新才有意義。

cluster.routing.allocation.disable_replica_allocation

是否禁止分配replica,和上面的設置類似, 這個配置通過更新cluster配置的API動態更新才有意義。

indices.recovery.concurrent_streams

設置在從對應的shard恢復一個shard時,可以同時打開的數據流的數量(節點級別),默認是3。

Cluster allocation awareness

分片規則

集群分片規則(Cluster allocation awareness)允許我們用一些參數來配置整個集群中shard和replica的分片規則。 下面通過一個例子來解釋一下。

假設我們有幾個機架,我們給一節點配置一個名為rack_id的屬性(其他名字也可以), 配置例子如下:

node.rack_id: rack_one

上面例子為這個節點配置了一個名為rack_id的屬性, 值為rack_one。 接下來將rack_id配置為分片規則所用的屬性(在所有節點都要設置)。

cluster.routing.allocation.awareness.attributes: rack_id

上面的配置意味著分片規則會基于屬性rack_id來做shard和replica分配。 例如,我們有兩個node.rack_id屬性設置為rack_one的節點, 部署了一個有5個shards和1個replica的索引, 索引數據會分布到這兩個節點上(每個節點有5個shard, 1個replica, 總共10個shards)。

如果我們再加入兩個節點,這兩個節點的node.rack_id屬性設置為rack_two, shard會在這些節點上重新分配, 但是一個shard和他的replica不會分配到有相同rack_id屬性的節點上。

可以為分片規則設置多個屬性, 比如:

cluster.routing.allocation.awareness.attributes: rack_id,zone

注意:啟用了分片規則屬性后,如果一個節點沒有配置這些屬性, shard就不會分配到這個節點上。

forced awareness

強制行分片規則

有時候我們提前知道用來做分片規則的屬性會有更多的值, 我們不希望一些replica被分配到一組特定節點上, 對于這種情況, 我們可以針對這些屬性值用強制分片規則。

例如,我們用屬性zone來做分片規則屬性,并且我們知道會有兩個zone:zone1和zone2。 下面是強制分片規則設置的例子:

cluster.routing.allocation.awareness.force.zone.values:?zone1,zone2cluster.routing.allocation.awareness.attributes:?zone

現在我們先啟用兩個node.zone屬性設置成zone1的節點,然后創建一個有5個shard和1個replica的索引。 索引建完后只有5個shard(沒有replica),要等到我們再啟用更多屬性node.zone為zone2的節點時,replica才會被分配。

automatic preference when searching / geting

在執行search或者執行get指令時, 接受請求的節點會優先選擇與其有相同屬性值的節點分片上執行請求。

realtime settings update

這些設置可以通過更新cluster配置的api在一個運行著的cluster上實時更新。

shard allocation filtering

可以用include/exclude過濾器控制索引部署到哪些節點上,過濾器可以設置在索引級別,也可以設置在集群級別, 我們先看一下設置在索引級別的例子。

假設我們有四個節點, 每個節點配置了一個名為tag的分片規則屬性(可以是任何名字),節點1的tag屬性置為value1, 節點2的tag屬性設置為value2,以此類推。

我們可以把配置項index.routing.allocation.include.tag設置為value1,value2來使創建的索引只部署到哪些tag屬性為value1和value2的節點上,例如

curl?-XPUT?localhost:9200/test/_settings?-d?'{??????"index.routing.allocation.include.tag"?:?"value1,value2"}'

另一方面, 我們將配置項index.routing.allocation.exclude.tag設置為value3, 這樣創建的索引會被部署到tag屬性為value3之外的那些節點上,例如

curl?-XPUT?localhost:9200/test/_settings?-d?'{??????"index.routing.allocation.exclude.tag"?:?"value3"}'

從0.90版開始, 可以用index.routing.allocation.require.*來設置一系列規則, 只有符合全部規則的節點才會分配shard, 相對而言include則是只要符合任意一條就可以。

include,?exclude和require的值都支持通配符, 例如value1*。 一個特殊的節點名是_ip,可以用來匹配節點的ip地址. 另外一個特殊屬性_host可以用來匹配節點的主機名和ip地址。

上面說過,一個節點可以配置幾個屬性, 例如

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來實時定義和更新,這些設置在解除一個節點時很有用(即使replica數量設置為0)。 下面是根據ip地址解除一個節點的例子:

curl?-XPUT?localhost:9200/_cluster/settings?-d?'{????"transient"?:?{????????"cluster.routing.allocation.exclude._ip"?:?"10.0.0.1"????}}'

discovery

原文

discovery模塊負責發現集群(cluster)中的節點,以及選舉出主節點。

注意,ES是一個基于端到端(p2p)的系統,節點之間直接通信,所有主要的API(index, search, delete)不需要和主節點(master node)通信。 主節點的職責是維護整個集群的狀態,并且在節點加入或者離開集群時重新分片。 每次集群的狀體改變會通知到集群中的其他節點(方式取決于discovery模塊的具體實現)。

settings

配置項cluster.name用來給集群設置一個名字,以此把一個集群和其他的集群區分開。 默認的集群名是elasticsearch, 不過推薦改為能反映集群用途的有實際意義的名字。

ec2 discovery

EC2 discovery機制使用EC2的API來執行自動發現,用不到,不看了。

zen discovery

Zen發現機制

zen發現機制是ES默認的內置發現模塊。 它提供了多播和單播兩種發現方式,并且能夠很容易的擴展以支持云環境。

zen發現機制是和其他模塊集成在一起的,比如所有節點之間通訊是用trasport模塊來完成。

Zen發現機制分為幾個子模塊,接下來分別做詳細解釋。

ping

ping是指一個節點用發現機制發現其他節點的過程, 支持多播(multicast)和單播(unicast)兩種方式,也可以組合使用。

multicast

multicast是指發送一個或多個多播請求,存在的節點會接受并且相應請求。 它提供了一組以discovery.zen.ping.multicast為前綴的配置項。

SettingDescription
groupgroup地址,默認值為224.2.2.4
port端口,默認為54328
ttl多播消息的ttl,默認是3
address綁定地址,默認為null,即綁定所有可用的network接口。

unicast

在多播禁用的情況下可以使用unicast發現方式。 它需要一個主機列表, 它提供了下面以discovery.zen.ping.unicast為前綴的配置項。

SettingDescription
hosts一個數組或者以逗號分隔的字符串, 每個值的格式為host:port或者host[port1-port2]

unicast發現方式需要借助transport模塊來實現。

master election

主節點選舉

作為ping初始化過程的一部分, 需要選舉出一個集群的master節點或者加入到一個已經選出的master節點, 這個過程是自動完成。 可以通過配置項discovery.zen.ping_timeout來設置ping的超時時間(默認是3s)以應對網絡速度慢或者網絡擁堵的情況。 設置一個比較大的值可以減少失敗的幾率。

節點可以設置屬性node.master為false來避免被選舉為master節點。 注意, 如果一個節點被設置為客戶端節點(node.client屬性設置為true), 這個節點不會被選舉為master節點(node.master自動設置為false)。

屬性discovery.zen.minimum_master_nodes設置一個集群中最少的合格master節點數量, 對于2個節點以上的集群,建議設置為大于1的值。

舉個例子, 假設集群有5個節點,?minimum_master_nodes設置為3, 如果2個節點掉線了,這兩個節點不會自己組建一個集群, 而是嘗試加入另一個集群。

這個設置可以避免網絡故障時有些節點試圖自行組織集群,從而導致整個集群不穩定。

fault detection

錯誤檢測

有兩種錯誤檢測方式,一種是master節點ping集群中所有其他的節點來驗證他們是否存活,另一種是每個節點ping master節點來驗證它是否存活,或者是否需要初始化一個選舉。

下面的配置項用于設置錯誤檢測,前綴是discovery.zen.fd:

SettingDescription
ping_intervalping的頻率, 默認1s
ping_timeoutping的超時時間, 默認30s
ping_retries如果ping失敗或者超時,重試的次數

external multicast

外部多播

multicast 發現機制還支持外部多播請求,外部客戶端可以發送多播請求, 格式為:

{????"request"?:?{????????"cluster_name":?"test_cluster"????}}

響應格式類似節點信息的響應(只有節點信息,包括transport/http地址以及節點的屬性):

{????"response"?:?{????????"cluster_name"?:?"test_cluster",????????"transport_address"?:?"...",????????"http_address"?:?"...",????????"attributes"?:?{????????????"..."????????}????}}

注意,可以禁用內部multicast發現機制,只啟用外部多播發現機制。 方式為將discovery.zen.ping.multicast.enabled設為true(默認),但是將discovery.zen.ping.multicast.ping.enabled設為false。

gateway

原文

gateway模塊存儲集群元數據(meta data)的狀態,集群元數據主要包括索引的配置和聲明的mapping定義。

每次集群元數據發生變化時(比如添加或刪除索引),會通過gateway來持久化這些變化。 集群啟動時會從gateway讀取并且應用這些數據。

設置在節點級別的gateway自動控制索引所用的gateway。 比如節點用fs?gateway,該節點創建的索引也自動用fs?gateway。 在這種情況下, 如節點不應該持久化狀態數據, 應該明確設置為none(唯一可以設置的值)。

ES默認使用的gateway是local gateway。

recovery after nodes / time

大多數場景下,集群的元數據只能在特定的節點已經啟動后才能被恢復, 或者等待到超時。 這在集群重啟時非常有用,此時每個節點的本地索引存儲仍然可用,不需要從gateway恢復(能夠減少從gateway恢復的時間)。

gateway.recover_after_nodes(數字類型)設置多少個合格的data節點以及master節點啟動后觸發recovery。?gateway.recover_after_data_nodes和gateway.recover_after_master_nodes含義類似,只不過分別設置data節點和master節點的數值。?gateway.recover_after_time(事件類型)設置在所有的gateway.recover_after...nodes條件滿足后,等待多長時間再開始recovery。

gateway.expected_nodes設置預期多少個合格的data和master節點啟動后就開始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、

這個例子配置了在一個預期兩個節點的集群中,在一個節點啟動后的5分鐘后執行recovery,一旦集群中有已經有兩個節點啟動了,立即開始recovery(不等待,忽略recover_after_time)。

注意,一旦元數據從gateway恢復了,那么這個配置就不再有效,直到下次集群完整重啟。

在集群元數據沒有恢復時,為了避免和真實的集群元數據沖突,所有操作都會被阻止。

local gateway

本地網關

local gateway從每個節點的本地存儲中恢復整個集群狀態和索引數據, 并且不需要節點級別的共享存儲。

注意,和共享類的gateway不同, local gateway的持久化不是異步的,一單一個操作被執行, 數據就會被存儲以備集群恢復時使用。

非常重要的一點是在配置gateway.recover_after_nodes時要包括大多數在整個集群重啟后期望啟動的節點, 這可以確保集群恢復到最新的狀態。 例如:

gateway:????recover_after_nodes:?1????recover_after_time:?5m????expected_nodes:?2

注意,為了能夠備份/快照完整地集群狀態, 建議禁用flush的情況下所有節點的本地存儲都要有副本(理論上不需要所有的,只需要確保每個shard的副本被備份,這依賴replication的設置)。 共享存儲比如S3可以在一個地方保存不同節點的拷貝,盡管代價是帶來了更多的IO。

shared fs gateway

shared FS gateway已經廢棄,以后會被移除, 不看了。

hadoop gateway

hadoop gateway以后會被移除, 不看了。

s3 gateway

s3 gateway以后會被移除, 不看了。

http

原文

http模塊允許通過http訪問ES的接口。

http是完全異步的,意味著等待響應時不會阻塞線程。

如果有可能, 考慮使用HTTP keep alive來獲得更好的性能,并且http客戶端不要啟用HTTP chunking。

settings

下面是http模塊的一些設置。

SettingDescription
http.port綁定的端口范圍, 默認9200-9300
http.max_content_lengthhttp請求大小的上限, 默認100mb
http.max_initial_line_lengthhttp url的最大長度, 默認4kb
http.compression是否支持http壓縮, 默認是false
http.compression_levelhttp壓縮的級別, 默認是6

http模塊共享通用的network設置。

disable http

設置http.enabled為false可以禁用http模塊,比如創建非數據節點來接收http請求,這些節點利用內部的transport來和數據節點通信。

indices

原文

indices模塊可以對所有索引進行全局管理。

indexing buffer

索引緩沖的設置可以控制多少內存分配給索引進程。 這是一個全局配置,會應用于一個節點上所有不同的分片上。

indices.memory.index_buffer_size接受一個百分比或者一個表示字節大小的值。 默認是10%,意味著分配給節點的總內存的10%用來做索引緩沖的大小。 這個數值被分到不同的分片(shards)上。 如果設置的是百分比,還可以設置min_index_buffer_size?(默認48mb)和max_index_buffer_size(默認沒有上限)。

indices.memory.min_shard_index_buffer_size設置分配給每個分片的索引緩沖內存的下限,默認4mb。

ttl interval

你可以動態設置indices.ttl.interval來控制自動刪除過期documents的檢查間隔,默認是60s。

刪除是批量進行的,你可以設置indices.ttl.bulk_size來適應你的需要,默認值是10000。

其余的參考_ttl的文檔。

recovery

以下設置用來管理recovery的策略:

SettingDescription
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_sec0.90.1去掉,用indices.recovery.max_bytes_per_sec代替

下面的設置對存儲進行限流:

SettingDescription
indices.store.throttle.type可以是merge?(默認),?not或者all
indices.store.throttle.max_bytes_per_sec默認20mb

jmx

removed as of v0.90.

memcached

原文

memcached模塊可以通過memecached協議來訪問ES的接口。

memcached模塊通過一個名為transport-memcached插件提供,插件的安裝說明見transport-memcached,也可以下載memcached插件并放在plugins目錄下。

memcached協議支持二進制和文本兩種協議, 會自動檢測應該用哪一種協議。

mapping rest to memcached protocol

Memcached命令會被映射到REST接口,并且會被同樣的REST層處理,下面是支持的memcached命令列表:

get

memcached的GET命令映射到REST的GET方法。 用URI (帶參數)來做key。 memcached的GET命令不允許在請求中帶body(SET不允許返回結果), 為此大多數REST接口(比如search)允許接受一個"source"作為URI的參數。

set

memcached的SET命令映射為REST的POST。 用URI (帶參數)來做key, body映射為REST的body。

delete

memcached的DELETE命令映射為REST的DELETE。 用URI (帶參數)來做key。

quit

memcached的QUIT命令用來斷開客戶端鏈接。

settings

以下設置可以用來配置memcached:

SettingDescription
memcached.port綁定端口范圍, 默認11211-11311

同樣共享通用的network設置。

disable memcached

設置memcached.enabled為false可以禁用memcached模塊, 默認檢測到該插件即啟用memcached模塊。

network settings

原文

一個節點的多個模塊都用到了網絡基本配置,例如transport模塊和HTTP模塊。 節點級別的網絡配置可以用來設置所有基于網絡的模塊的通用配置(除了被每個模塊明確覆蓋的那些配置項)。

network.bind_host用來設置綁定的ip地址, 默認綁定anyLocalAddress?(0.0.0.0或者::0)。

network.publish_host配置其他節點和本節點通信的地址。 這個當然不能是anyLocalAddress, 默認是第一個非回環地址或者本機地址。

network.host設置是一個簡化設置, 它自動設置network.bind_host和network.publish_host為同一個值。

兩個設置都可以配置為主機ip地址或者主機名, 還可以設置為下表中列出來的值。

Logical Host Setting ValueDescription
local本機ip地址
_non_loopback_第一個非loopback地址
_non_loopback:ipv4_第一個非loopback的ipv4地址
_non_loopback:ipv6_第一個非loopback的ipv6地址
[networkInterface]指定網卡的IP地址. 例如?en0
[networkInterface]:ipv4指定網卡的IPv4地址. 例如?en0:ipv4
[networkInterface]:ipv6指定網卡的IPv6地址. 例如?en0:ipv6
_non_loopback:ipv6_第一個非loopback的ipv6地址

cloud-aws

如果安裝了cloud-aws插件, 下表列出來值也是有效的設置:

EC2 Host ValueDescription
ec2:privateIpv4The private IP address (ipv4) of the machine
ec2:privateDnsThe private host of the machines
ec2:publicIpv4The public IP address (ipv4) of the machine
ec2:publicDnsThe public host of the machines
ec2Less verbose option for the private ip address
ec2:privateIpLess verbose option for the private ip address
ec2:publicIpLess verbose option for the public ip address

tcp settings

任何使用TCP的組件 (比如HTTP, Transport和Memcached)共享下面的設置:

SettingDescription
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_sizetcp發送緩沖區的大小。 默認不設置
network.tcp.receive_buffer_sizetcp接收緩沖區的大小。 默認不設置

node

原文

ES可以設置一個節點是否在本地存儲數據,存儲數據意味著不同索引的分片可以分配到這個節點上。 默認每個節點都可以作為數據節點(data node),可以設置node.data為false來關閉。

這是一個很強大的配置, 可以很簡單的來創建一個智能負載均衡。

我們可以啟動一個數據節點的集群而不啟用http模塊, 這可以通過設置http.enabled為true做到, 這些節點通過transport模塊相互通信, 在集群的前端可以啟動一個和或者多個啟用了http模塊的非數據節點, 所有的http通訊由這些非數據節點來執行。

這樣做的好處是首先能夠創建一個智能負載均衡器。 這些非數據節點仍然是集群的一部分, 他們將請求重定向到那些有相關數據的節點上。 另一個好處是對于那些scatter/gather操作(比如search), 這些節點可以執行一部分處理, 因為它們啟動scatter處理并且執行實際的gather過程。

這樣數據節點可以專注于索引和查詢這類大負載的工作,而不需要處理http請求, 占用網絡負載,或者執行gather過程。

plugins

原文

Plugins提供了以自定義的方式增強ES基本功能的途徑, 范圍包括添加自定義mapping類型, 自定義分詞, 原生腳本, 自定義discovery等等。

installing plugins

安裝插件可以手工將插件安裝包放到plugins目錄, 也可以用plugin腳本來安裝。 在github的elasticsearch能找到好幾個插件, 名字以"elasticsearch-"開頭。

從0.90.2開始, 插件可以通過執行?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目錄, 目錄里的內容就可以當做靜態內容通過/_plugin/[plugin_name]/url來訪問,在進程已經開始的情況下也可以向其添加內容。

安裝的插件如果不包含任何java相關的內容, 會被自動檢測為site插件, 內容會被移動到_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插件沒有安裝, 節點不會啟動。

installed plugins

當前已加載的插件列表可通過Node Info API獲得。

removing plugins

要刪除一個插件,可以手工將它從plugins目錄移除,也可以用plugin腳本。

刪除一個插件通常可以用下面的形式:

plugin?--remove

silent/verbose mode

運行plugin腳本時, 可以加--verbose參數獲得更多的信息(調試模式)。 相反的, 如果希望plugin腳本靜默與運行可以用--silent選項。

注意, 退出碼可能是:

0:?everything?was?OK64:?unknown?command?or?incorrect?option?parameter74:?IO?error70:?other?errorsbin/plugin?--install?mobz/elasticsearch-head?--verboseplugin?--remove?head?--silent

scripting

scripting模塊可以用腳本來執行自定義表達式, 比如可以用腳本將"script fields"作為查詢的一部分返回, 或者用來計算某個查詢的自定義評分等。

腳本模塊默認用擴展過的mvel作為腳本語言, 之所以用是因為它非常快而且用起來很簡單, 大多數情況下需要的是簡單的表達式(比如數學方程式)。

其他lang插件可以提供執行不同語言腳本的能力, 目前支持的腳本插件有javascript的lang-javascript,Groovy的lang-groovy, Python的lang-python。 所有可以用script參數的地方可以設置lang參數來定義腳本所用的語言。?lang的選項可以是mvel,?js,?groovy,?python, 和native。

default scripting language

默認的腳本語言是(如果沒有指定lang參數)mvel。 如果要修改默認語言的話可以將設置script.default_lang為合適的語言。

preloaded scripts

腳本可以作為相關api的一部分, 也可以將腳本放到config/scripts來預加載這些腳本, 這樣用到這些腳本的地方可以直接引用腳本的名字而不用提供整個腳本, 這有助于減少客戶端和節點間的傳輸的數據量。

腳本的名字從其所在的目錄結構繼承,不需要帶文件名的后綴, 例如被放在config/scripts/group1/group2/test.py的腳本會被命名為group1_group2_test。

disabling dynamic scripts

建議ES運行在某個應用或者代理的后端,這樣可以將ES和外部隔離, 如果用戶被授權運行動態腳本(即使在search請求),那么他們就可以訪問ES所在的機器。

首先, 你不應該用root用戶來運行ES, 因為這樣會允許腳本在你的服務器上沒有限制的做任何事, 其次你不應該直接將ES暴露給用戶訪問, 如果你打算直接將ES暴露給用戶, 你必須決定是否足夠信任他們在你的服務器上運行腳本。 如果答案是不的話, 即使你有個代理僅允許GET請求, 你也應該在每個節點的config/elasticsearch.yml加入如下設置來禁用動態腳本:

script.disable_dynamic:?true

這樣可以僅允許配置過的命名腳本或者通過插件注冊的原生Java腳本運行, 防止用戶通過接口來運行任意腳本。

native (java) scripts

即使mvel已經相當快了,注冊的原生java腳本還能執行的更快。

實現NativeScriptFactory接口的腳本才會被執行。 主要有兩種形式,一種是擴展AbstractExecutableScript,一種是擴展AbstractSearchScript(可能大多數用戶會選擇這種方式, 可以借助AbstractLongSearchScript,?AbstractDoubleSearchScript,?AbstractFloatSearchScript這幾個輔助類來實現擴展)。

可以通過配置來注冊腳本, 例如:script.native.my.type設為sample.MyNativeScriptFactory將注冊一個名為my的腳本。 另一個途徑是插件中訪問ScriptModule的registerScript方法注冊腳本。

設置lang為native并且提供腳本的名字就可以執行注冊的腳本。

注意, 腳本需要位于ES的classpath下, 一個簡單方法是在plugins目錄下創建一個目錄(選擇一個描述性的名字),將jar/classes文件放在這個目錄,他們就會被自動加載。

score

所有的腳本都可以在facets中使用, 可以通過doc.score訪問當前文檔的評分。

document fields

大多數腳本都會用到document的字段,?doc['field_name']可以用來訪問document中的某個字段(document通常通過腳本的上下文傳給腳本)。 訪問document的字段非常快, 因為他們會被加載到內存中(所有相關的字段值/token會被加載到內存中)。

下表是能夠從字段上拿到的數據:

ExpressionDescription
doc['field_name'].value字段的原生值, 比如,如果是字段short類型,就返回short類型的值
doc['field_name'].values字段的原生值的數組, 比如,如果字段是short類型,就返回short[]類型的數組。 記住,單個文檔中的一個字段可以有好幾個值,如果字段沒有值就返回空數組
doc['field_name'].emptyboolean值, 表明文檔的字段是否有值
doc['field_name'].multiValuedboolean值, 表明文檔的字段是否有多個值
doc['field_name'].latgeo point類型的維度值
doc['field_name'].longeo point類型的經度值
doc['field_name'].latsgeo point類型的維度數組
doc['field_name'].lonsgeo point類型的經度數組
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

執行腳本時也可以訪問存儲的字段(Stored), 注意,因為他們不會被記載到內存,所以訪問速度與訪問document字段相比慢很多。 可以用_fields['my_fields_name'].value或_fields['my_fields_name'].values的形式來訪問。

source field

執行腳本時也可以獲取源字段(source)。 每個文檔的源字段會被加載,解析,然后提供給腳本計算。 可以通過上下文的_source來訪問源字段,例如_source.obj2.obj1.fields3。

mvel built in functions

以下是腳本中可以使用的內置函數:

FunctionDescription
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的腳本做兩個數的除法時, 引擎遵循java的默認規則, 這意味著如果你把兩個整數相除(你可以在mapping里配置字段為integer類型), 結果仍然是整數。 也就是說如果你在腳本中計算1/num這樣的表達式, 如果num是整數8的話,結果是0而不是你可能期望的0.125,你需要明確用doubel來指定精度以獲得期望的結果,用比如1.0/num。

thread pool

為了提高線程管理和內存使用的效率, 一個節點會用到好幾個線程池, 比較重要的是以下幾個。

FunctionDescription
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

可以通過設置線程池的類型以及參數來修改指定的線程池,下面的例子配置index線程池可以用更多的線程:

threadpool:????index:????????type:?fixed????????size:?30

注意, 可以通過Cluster Update Settings接口在運行期間修改線程池的設置。

thread pool types

以下是線程池的類型以及對應的參數。

cache

cache線程池是沒有大小限制的, 只要有請求就會啟動一個線程, 下面是設置的例子:

threadpool:????index:????????type:?cached

fixed

fixed線程池有固定的大小, 如果當前沒有可用的線程時,就把請求放到一個隊列里, 隊列可以設置大小。

size參數設置線程的數量, 默認是cpu內核數乘以5。

queue_size設置存放掛起請求的隊列的大小, 默認是-1, 即沒有大小限制。 如果一個請求進來而隊列已經滿了的情況下, 這個請求會被舍棄。

配置例子如下:

threadpool:????index:????????type:?fixed????????size:?30????????queue_size:?1000

processors setting

ES會自動檢測處理器的數量, 并且會自動根據處理器的數量來設置線程池。 有時候可能檢測出來的處理器數量是錯的, 這種情況下可以設置processors?來聲明處理器的數量。

可以用帶os參數的nodes info接口來檢查自動檢測出來的處理器數量。

thrift

thrift傳輸模塊允許通過thrift協議對外暴露REST接口, Thrift協議可以提供比http協議更好的性能。 因為thrift既提供了協議,也提供了傳輸的實現方式, 用起來應該很簡單(盡管缺乏相關文檔)。

使用thrift需要安裝transport-thrift插件?。

thrift schema可以用來生成thrift的客戶端代碼。

thrift的相關配置如下:

SettingDescription
thrift.port綁定的端口, 默認9500-9600
thrift.frame默認-1, 即不分frame, 可以設置比較大的值來指定frame的大小(比如15mb)。

transport

傳輸模塊用于集群內節點間的內部通訊。 每次跨節點的調用都會用到transport模塊(比如某個節點接受http GET請求,實際執行處理的是另一個持有數據的節點)。

transport機制是完全異步的, 即等待響應時不會阻塞線程, 異步通信的好處首先是解決了C10k問題, 另外也是scatter(broadcast)/gather操作(比如搜索)的方案。

tcp transport

TCP transport是用TCP實現傳輸模塊, 允許如下設置:

SettingDescription
transport.tcp.port綁定的端口范圍, 默認9300-9400
transport.tcp.connect_timeoutsocket鏈接的超時時間, 默認2s
transport.tcp.compress設置為true可以啟用壓縮(LZF), 默認是false。

tcp transport共享通用網絡設置。

local transport

這在JVM內做集成測試時非常有用。 當使用NodeBuilder#local(true)時會自動啟用。

?

補充說明:

Gateway

Gateway是一種存儲集群中各節點元數據(meta data)的狀態方式,這里的元數據主要用來記錄所有的索引在創建時各自的設置和明確的類型映射。每次當元數據改變,比如一個索引被加入或被刪除,這些變化都會通過gateway存儲起來。當集群啟動時,這些狀態將會從gateway中讀取并應用。

  • gateway.type

  • gateway類型,默認是local,也是es官方強烈建議的。

  • gateway.recover_after_nodes

  • 在多少個節點啟動后,允許數據恢復進程啟動,默認是1

  • gateway.recover_after_time

  • 設置數據恢復進程初始化的超時時間,默認是5分鐘

  • gateway.expected_nodes

  • 設置在集群中的多少個節點啟動后馬上開始數據恢復進程(不用等到gateway.recover_after_time這個屬性設置的時間到)

    ?? Recovery Throttling

    這里的設置是用來控制分片分配的進程,當各節點間進行初始化恢復、索引拷貝分配、再次負載均衡,或再增加或去掉節點的時候。

  • cluster.routing.allocation.node_initial_primaries_recoveries

  • 初始化數據恢復時,并發恢復線程的個數,默認為4。

  • cluster.routing.allocation.node_concurrent_recoveries

  • 添加刪除節點或負載均衡時并發恢復線程的個數,默認為4

  • indices.recovery.max_size_per_sec

  • 設置數據恢復時限制的帶寬,默認為0,表示無限制。

  • indices.recovery.concurrent_streams

  • 這個參數來限制從其它分片恢復數據時最大同時打開并發流的個數,默認為5

    ?? Discovery

  • discovery.zen.minimum_master_nodes

  • 設置這個參數來保證集群中的節點可以知道其它N個有master資格的節點。默認為1,對于大的集群來說,可以設置大一點的值(2-4)。

  • discovery.zen.ping.timeout

  • 設置集群中自動發現其它節點時ping連接超時時間,默認為3秒,對于比較差的網絡環境可以高點的值來防止自動發現時出錯

  • discovery.zen.ping.multicast.enabled

  • 設置是否打開多播來發現來發現節點,默認是true

  • discovery.zen.ping.unicast.hosts

  • 設置集群中master節點的初始列表,可以通過這些節點來自動發現新加入集群的節點。

    轉載于:https://my.oschina.net/u/1024514/blog/467761

    總結

    以上是生活随笔為你收集整理的elasticsearch文档-modules的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。