文章目錄
- HTTP
- 高級網絡設置
- 高級TCP設置
- Transport
- TCP傳輸概要文件
- Transport跟蹤
- 線程池
- fixed線程池
- fixed_auto_queue_size
- scaling
- 處理器設置
HTTP
Elasticsearch只在默認情況下綁定到本地主機。對于運行本地開發服務器(如果在同一臺機器上啟動多個節點,甚至可以運行開發集群)來說,這已經足夠了,但是為了跨多個服務器運行實際的生產集群,將需要配置一些基本的網絡設置。
永遠不要將未受保護的節點暴露給公共internet。
是否綁定專屬IP是分辨是否是開發模式和生產模式的標準。
network.host 節點將綁定到此主機名或IP地址,并將此主機發布(廣告)給集群中的其他節點。
接受IP地址、主機名、特殊值或任意組合的數組。
注意,任何包含:的值(例如,一個IPv6地址或包含一個特殊值)必須用引號括起來,因為:在YAML中是一個特殊字符。0.0.0.0是一個可接受的IP地址,它將綁定到所有網絡接口。值0與值0.0.0.0具有相同的效果。
默認 _local_.
discovery.zen.ping.unicast.hosts 為了加入一個集群,節點需要知道集群中至少一些其他節點的主機名或IP地址。此設置提供此節點將嘗試聯系的其他節點的初始列表。接受IP地址或主機名。
如果主機名查找解析為多個IP地址,那么將使用每個IP地址進行發現。
循環DNS——在每次查找時從列表中返回不同的IP——可以用于發現;
不存在的IP地址將拋出異常,并導致下一輪ping時再次查找DNS(取決于JVM DNS緩存)。
默認值 ["127.0.0.1", "[::1]"]。
http.port
要綁定到傳入HTTP請求的端口。接受單個值或范圍。如果指定了一個范圍,則節點將綁定到該范圍中的第一個可用端口。
默認值9200-9300.
transport.tcp.port
為節點間通信而綁定的端口。接受單個值或范圍。如果指定了一個范圍,則節點將綁定到該范圍中的第一個可用端口。
默認值9300-9400.
network.host的特殊值
_[networkInterface]_ | 網絡接口的地址,例如 _en0_ . |
_local_ | 系統上的任何回送地址, for example 127.0.0.1 . |
_site_ | 系統上的任何站點-本地地址, for example 192.168.0.1 . |
_global_ | 系統上任何全局范圍的地址, for example 8.8.8.8 . |
禁用HTTP
可以通過設置http.enabled
為false完全禁用http模塊。Elasticsearch節點(和Java客戶機)使用傳輸接口(而不是HTTP)進行內部通信。在不打算直接服務REST請求的節點上完全禁用http層可能是有意義的。
例如,如果還有打算為所有REST請求提供服務的客戶機節點,那么可以在僅數據節點上禁用HTTP。但是請注意,將不能直接向禁用HTTP的節點發送任何REST請求(例如檢索節點狀態)。
高級網絡設置
network.host網絡設置中介紹的主機設置是同時設置綁定主機和發布主機的快捷方式。在高級用例中,例如在代理服務器后面運行時,可能需要將這些設置設置為不同的值:
network.bind_host
這指定了一個節點應該綁定到哪個網絡接口,以便偵聽傳入的請求。一個節點可以綁定到多個接口,例如兩個網卡,或者一個站點本地地址和一個本地地址。默認為network.host。network.publish_host
發布主機是節點向集群中的其他節點發布的單一接口,以便這些節點可以連接到它。當前,一個Elasticsearch節點可以綁定到多個地址,但只發布一個地址。如果沒有指定,默認network.host為“最佳”地址。按IPv4/IPv6堆棧首選項排序,然后按可達性排序。如果你設置了一個網絡。如果產生多個綁定地址,但依賴于節點到節點通信的特定地址,則應該顯式設置network.publish_host.
以上兩個設置都可以像network一樣配置。主機——接受IP地址、主機名和特殊值。
高級TCP設置
任何使用TCP的都使用以下配置:
network.tcp.no_delay | 啟用或禁用TCP無延遲設置。默認值為true。 |
network.tcp.keep_alive | 啟用或禁用TCP保持活動。默認值為true。 |
network.tcp.reuse_address | 地址是否可以重用。在非windows機器上默認為true。 |
network.tcp.send_buffer_size | TCP發送緩沖區的大小(用大小單位指定)。默認情況下未顯式設置。 |
network.tcp.receive_buffer_size | TCP接收緩沖區的大小(用大小單位指定)。默認情況下未顯式設置。 |
Transport
傳輸模塊用于集群內節點之間的內部通信。從一個節點到另一個節點的每個調用都使用傳輸模塊(例如,當一個HTTP GET請求由一個節點處理,而實際上應該由持有數據的另一個節點處理)。
傳輸機制在本質上是完全異步的,這意味著沒有等待響應的阻塞線程。使用異步通信的好處是首先解決了C10k問題,同時也是分散(廣播)/收集操作(如Elasticsearch中的搜索)的理想解決方案。
TCP傳輸是使用TCP的傳輸模塊的實現。它允許以下設置:
transport.tcp.port
綁定端口范圍。默認為9300 - 9400。transport.publish_port
transport.bind_host
transport.publish_host
transport.host
TCP傳輸概要文件
Elasticsearch允許通過使用傳輸配置文件綁定到不同接口上的多個端口。參見下面的示例配置
transport.profiles.default.port: 9300-9400
transport.profiles.default.bind_host: 10.0.0.1
transport.profiles.client.port: 9500-9600
transport.profiles.client.bind_host: 192.168.0.1
transport.profiles.dmz.port: 9700-9800
transport.profiles.dmz.bind_host: 172.16.1.2
默認配置文件是特殊的。如果其他配置文件沒有特定的配置設置集,則將其用作任何其他配置文件的回退,并且此節點是如何連接到集群中的其他節點的。
可以在每個傳輸配置文件上配置以下參數,如上面的示例所示:
port
: The port to bind tobind_host
: The host to bindpublish_host
: The host which is published in informational APIstcp_no_delay
: Configures theTCP_NO_DELAY
option for this sockettcp_keep_alive
: Configures theSO_KEEPALIVE
option for this socketreuse_address
: Configures theSO_REUSEADDR
option for this sockettcp_send_buffer_size
: Configures the send buffer size of the sockettcp_receive_buffer_size
: Configures the receive buffer size of the socket
Transport跟蹤
傳輸模塊有一個專用的跟蹤記錄器,當它被激活時,它會記錄傳入和傳出的請求。可以通過設置org.elasticsearch.transport.TransportService的級別動態激活該日志。跟蹤記錄器要跟蹤:
PUT _cluster/settings
{"transient" : {"logger.org.elasticsearch.transport.TransportService.tracer" : "TRACE"}
}
還可以使用一組包含和排除通配符模式來控制跟蹤哪些操作。默認情況下,除故障檢測外,每個請求都將被跟蹤:
PUT _cluster/settings
{"transient" : {"transport.tracer.include" : "*","transport.tracer.exclude" : "internal:discovery/zen/fd*"}
}
線程池
一個節點擁有幾個線程池,以便改進在節點內管理線程內存消耗的方式。許多這些池還有與它們相關聯的隊列,這些隊列允許持有掛起的請求,而不是丟棄它們。
generic
線程池類型為scalingindex
索引寫入刪除操作。線程池類型為fixed,大小為# of available processors,隊列長度為200。search
count/search/suggest操作。類型為fixed_auto_queue_size,大小為int((# of available_processors * 3) / 2) + 1,初始值為1000.get
類型為fixed,大小為# of available processors,隊列長度為1000.analyze
類型為fixed,大小為1,隊列長度為16write
single-document index/delete/update和 bulk requests。
類型為fixed,大小為# of available processors,隊列長度為200。最大大小為1 + # of available processorssnapshot
snapshot/restore操作。
類型為scaling,保持活躍5m,并且最大為`min(5, (# of available processors)/2)`.warmer
segment warm-up 操作。
類型為scaling,保持活躍5m,并且最大為`min(5, (# of available processors)/2)`.refresh
類型為scaling,保持活躍5m,并且最大為`min(10, (# of available processors)/2)`.listener
listener threaded設置為true的時候。
類型為scaling,默認為`min(10, (# of available processors)/2)`.
設置
可以通過設置特定類型的參數來更改特定的線程池;例如,改變索引線程池有更多的線程:
thread_pool:index:size: 30
fixed線程池
下面是線程池的類型及其各自的參數:
fixed:fixed持有固定大小的線程來處理請求,使用一個隊列(可選綁定)處理沒有線程為其服務的掛起請求。
size:size參數控制線程的數量,默認為內核數量乘以5。
queue_size:queue_size控制沒有線程執行的掛起請求隊列的大小。默認情況下,它被設置為-1,這意味著它是無界的。當一個請求進入并且隊列已滿時,它將中止該請求。
thread_pool:index:size: 30queue_size: 1000
fixed_auto_queue_size
fixed_auto_queue_size線程池持有固定大小的線程,用于處理沒有線程服務的掛起請求,并使用一個有界隊列處理這些請求。它類似于fixed線程池,但是,queue_size會根據Little定律的計算自動調整。每次完成auto_queue_frame_size操作時,這些計算可能會將queue_size調高或調低50。
size參數控制線程的數量,默認為內核數量乘以5。
queue_size允許控制沒有線程執行的掛起請求隊列的初始大小。
min_queue_size設置控制queue_size可以調整的最小值。
max_queue_size設置控制queue_size可以調整的最大數量。
auto_queue_frame_size設置控制在調整隊列之前進行度量的操作數量。它應該足夠大,單個操作不能過度影響計算。
target_response_time是一個時間值設置,指示線程池隊列中任務的目標平均響應時間。如果任務通常超過這個時間,線程池隊列將被調低,以拒絕任務。
thread_pool:search:size: 30queue_size: 500min_queue_size: 10max_queue_size: 1000auto_queue_frame_size: 2000target_response_time: 1s
scaling
可伸縮的線程池持有動態數量的線程。這個數字與工作負載成比例,并在核心參數和最大參數的值之間變化。
keep_alive參數決定一個線程在不做任何工作的情況下應該在線程池中保留多長時間。
thread_pool:warmer:core: 1max: 8keep_alive: 2m
處理器設置
自動檢測處理器的數量,并根據它自動設置線程池設置。這可以通過顯式設置處理器設置來實現。
processors: 2
如果在同一個主機上運行多個Elasticsearch實例,但希望Elasticsearch調整其線程池的大小,就像它只有一部分CPU一樣,應該覆蓋設置為所需的部分的處理器(例如,如果在一臺16核的機器上運行兩個Elasticsearch實例,請將處理器設置為8)。請注意,這是一個專家級的用例,其中涉及的內容遠不止設置處理器設置,還有其他需要考慮的事項,如更改垃圾收集器線程的數量、將進程固定到內核等。
有時候會錯誤地檢測到處理器的數量,在這種情況下,顯式地設置處理器設置可以解決這類問題。
GET /_nodes/os