手把手教你搭建一個 Elasticsearch 集羣

爲什麼要搭建 Elasticsearch 集羣

凡事都要講究個爲何。在搭建集羣以前,咱們首先先問一句,爲何咱們須要搭建集羣?它有什麼優點呢?html

高可用性

Elasticsearch 做爲一個搜索引擎,咱們對它的基本要求就是存儲海量數據而且能夠在很是短的時間內查詢到咱們想要的信息。因此第一步咱們須要保證的就是 Elasticsearch 的高可用性,什麼是高可用性呢?它一般是指,經過設計減小系統不能提供服務的時間。假設系統一直可以提供服務,咱們說系統的可用性是 100%。若是系統在某個時刻宕掉了,好比某個網站在某個時間掛掉了,那麼就能夠它臨時是不可用的。因此,爲了保證 Elasticsearch 的高可用性,咱們就應該儘可能減小 Elasticsearch 的不可用時間。java

那麼怎樣提升 Elasticsearch 的高可用性呢?這時集羣的做用就體現出來了。假如 Elasticsearch 只放在一臺服務器上,即單機運行,假如這臺主機忽然斷網了或者被攻擊了,那麼整個 Elasticsearch 的服務就不可用了。但若是改爲 Elasticsearch 集羣的話,有一臺主機宕機了,還有其餘的主機能夠支撐,這樣就仍然能夠保證服務是可用的。node

那可能有的小夥伴就會說了,那假如一臺主機宕機了,那麼不就沒法訪問這臺主機的數據了嗎?那假如我要訪問的數據正好存在這臺主機上,那不就獲取不到了嗎?難道其餘的主機裏面也存了一份如出一轍的數據?那這豈不是很浪費嗎?git

爲了解答這個問題,這裏就引出了 Elasticsearch 的信息存儲機制了。首先解答上面的問題,一臺主機宕機了,這臺主機裏面存的數據依然是能夠被訪問到的,由於在其餘的主機上也有備份,但備份的時候也不是整臺主機備份,是分片備份的,那這裏就又引出了一個概念——分片。github

分片,英文叫作 Shard,顧名思義,分片就是對數據切分紅了多個部分。咱們知道 Elasticsearch 中一個索引(Index)至關因而一個數據庫,如存某網站的用戶信息,咱們就建一個名爲 user 的索引。但索引存儲的時候並非整個存一塊兒的,它是被分片存儲的,Elasticsearch 默認會把一個索引分紅五個分片,固然這個數字是能夠自定義的。分片是數據的容器,數據保存在分片內,分片又被分配到集羣內的各個節點裏。當你的集羣規模擴大或者縮小時, Elasticsearch 會自動的在各節點中遷移分片,使得數據仍然均勻分佈在集羣裏,因此至關於一份數據被分紅了多份並保存在不一樣的主機上。數據庫

那這仍是沒解決問題啊,若是一臺主機掛掉了,那麼這個分片裏面的數據不就沒法訪問了?別的主機都是存儲的其餘的分片。實際上是能夠訪問的,由於其餘主機存儲了這個分片的備份,叫作副本,這裏就引出了另一個概念——副本。bootstrap

副本,英文叫作 Replica,一樣顧名思義,副本就是對原分片的複製,和原分片的內容是同樣的,Elasticsearch 默認會生成一份副本,因此至關因而五個原分片和五個分片副本,至關於一份數據存了兩份,並分了十個分片,固然副本的數量也是能夠自定義的。這時咱們只須要將某個分片的副本存在另一臺主機上,這樣當某臺主機宕機了,咱們依然還能夠從另一臺主機的副本中找到對應的數據。因此從外部來看,數據結果是沒有任何區別的。ubuntu

通常來講,Elasticsearch 會盡可能把一個索引的不一樣分片存儲在不一樣的主機上,分片的副本也儘量存在不一樣的主機上,這樣能夠提升容錯率,從而提升高可用性。segmentfault

但這時假如你只有一臺主機,那不就沒辦法了嗎?分片和副本實際上是沒意義的,一臺主機掛掉了,就全掛掉了。瀏覽器

健康狀態

針對一個索引,Elasticsearch 中其實有專門的衡量索引健康情況的標誌,分爲三個等級:

  • green,綠色。這表明全部的主分片和副本分片都已分配。你的集羣是 100% 可用的。

  • yellow,黃色。全部的主分片已經分片了,但至少還有一個副本是缺失的。不會有數據丟失,因此搜索結果依然是完整的。不過,你的高可用性在某種程度上被弱化。若是更多的分片消失,你就會丟數據了。因此可把 yellow 想象成一個須要及時調查的警告。

  • red,紅色。至少一個主分片以及它的所有副本都在缺失中。這意味着你在缺乏數據:搜索只能返回部分數據,而分配到這個分片上的寫入請求會返回一個異常。

若是你只有一臺主機的話,其實索引的健康情況也是 yellow,由於一臺主機,集羣沒有其餘的主機能夠防止副本,因此說,這就是一個不健康的狀態,所以集羣也是十分有必要的。

存儲空間

另外,既然是羣集,那麼存儲空間確定也是聯合起來的,假如一臺主機的存儲空間是固定的,那麼集羣它相對於單個主機也有更多的存儲空間,可存儲的數據量也更大。

因此綜上所述,咱們須要一個集羣!

詳細瞭解 Elasticsearch 集羣

接下來咱們再來了解下集羣的結構是怎樣的。

首先咱們應該清楚多臺主機構成了一個集羣,每臺主機稱做一個節點(Node)。

如圖就是一個三節點的集羣:


在圖中,每一個 Node 都有三個分片,其中 P 開頭的表明 Primary 分片,即主分片,R 開頭的表明 Replica 分片,即副本分片。因此圖中主分片 一、2,副本分片 0 儲存在 1 號節點,副本分片 0、一、2 儲存在 2 號節點,主分片 0 和副本分片 一、2 儲存在 3 號節點,一共是 3 個主分片和 6 個副本分片。同時咱們還注意到 1 號節點還有個 MASTER 的標識,這表明它是一個主節點,它相比其餘的節點更加特殊,它有權限控制整個集羣,好比資源的分配、節點的修改等等。

這裏就引出了一個概念就是節點的類型,咱們能夠將節點分爲這麼四個類型:

  • 主節點:即 Master 節點。主節點的主要職責是和集羣操做相關的內容,如建立或刪除索引,跟蹤哪些節點是羣集的一部分,並決定哪些分片分配給相關的節點。穩定的主節點對集羣的健康是很是重要的。默認狀況下任何一個集羣中的節點都有可能被選爲主節點。索引數據和搜索查詢等操做會佔用大量的cpu,內存,io資源,爲了確保一個集羣的穩定,分離主節點和數據節點是一個比較好的選擇。雖然主節點也能夠協調節點,路由搜索和從客戶端新增數據到數據節點,但最好不要使用這些專用的主節點。一個重要的原則是,儘量作儘可能少的工做。

  • 數據節點:即 Data 節點。數據節點主要是存儲索引數據的節點,主要對文檔進行增刪改查操做,聚合操做等。數據節點對 CPU、內存、IO 要求較高,在優化的時候須要監控數據節點的狀態,當資源不夠的時候,須要在集羣中添加新的節點。

  • 負載均衡節點:也稱做 Client 節點,也稱做客戶端節點。當一個節點既不配置爲主節點,也不配置爲數據節點時,該節點只能處理路由請求,處理搜索,分發索引操做等,從本質上來講該客戶節點表現爲智能負載平衡器。獨立的客戶端節點在一個比較大的集羣中是很是有用的,他協調主節點和數據節點,客戶端節點加入集羣能夠獲得集羣的狀態,根據集羣的狀態能夠直接路由請求。

  • 預處理節點:也稱做 Ingest 節點,在索引數據以前能夠先對數據作預處理操做,全部節點其實默認都是支持 Ingest 操做的,也能夠專門將某個節點配置爲 Ingest 節點。

以上就是節點幾種類型,一個節點其實能夠對應不一樣的類型,如一個節點能夠同時成爲主節點和數據節點和預處理節點,但若是一個節點既不是主節點也不是數據節點,那麼它就是負載均衡節點。具體的類型能夠經過具體的配置文件來設置。

怎樣搭建 Elasticsearch 集羣

好,接下來咱們就來動手搭建一個集羣吧。

這裏我一共擁有七臺 Linux 主機,系統是 Ubuntu 16.04,都鏈接在一個內網中,IP 地址爲:

10.0.0.4
10.0.0.5
10.0.0.6
10.0.0.7
10.0.0.8
10.0.0.9
10.0.0.10
複製代碼

每臺主機的存儲空間是 1TB,內存是 13GB。

下面咱們來一步步介紹如何用這幾臺主機搭建一個 Elasticsearch 集羣,這裏使用的 Elasticsearch 版本是 6.3.2,另外咱們還須要安裝 Kibana 用來可視化監控和管理 Elasticsearch 的相關配置和數據,使得集羣的管理更加方便。

環境配置以下所示:

名稱 內容
主機臺數 7
主機內存 13GB
主機系統 Ubuntu 16.04
存儲空間 1TB
Elasticsearch 版本 6.3.2
Java 版本 1.8
Kibana 版本 6.3.2

安裝 Java

Elasticsearch 是基於 Lucene 的,而 Lucene 又是基於 Java 的。因此第一步咱們就須要在每臺主機上安裝 Java。

首先更新 Apt 源:

sudo apt-get update
複製代碼

而後安裝 Java:

sudo apt-get install default-jre
複製代碼

安裝好了以後能夠檢查下 Java 的版本:

java -version
複製代碼

這裏的版本是 1.8,相似輸出以下:

openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-0ubuntu0.16.04.1-b11)
OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)
複製代碼

若是看到上面的內容就說明安裝成功了。

注意必定要每臺主機都要安裝。

安裝 Elasticsearch

接下來咱們來安裝 Elasticsearch,一樣是每臺主機都須要安裝。

首先須要添加 Apt-Key:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
複製代碼

而後添加 Elasticsearch 的 Repository 定義:

echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
複製代碼

接下來安裝 Elasticsearch 便可:

sudo apt-get update 
sudo apt-get install elasticsearch
複製代碼

運行完畢以後咱們就完成了 Elasticsearch 的安裝,注意仍是要每臺主機都要安裝。

配置 Elasticsearch

這時咱們只是每臺主機都安裝好了 Elasticsearch,接下來咱們還須要將它們聯繫在一塊兒構成一個集羣。

安裝完以後,Elasticsearch 的配置文件是 /etc/elasticsearch/elasticsearch.yml,接下來讓咱們編輯一下配置文件:

  • 集羣的名稱

經過 cluster.name 能夠配置集羣的名稱,集羣是一個總體,所以名稱都要一致,全部主機都配置成相同的名稱,配置示例:

cluster.name: germey-es-clusters
複製代碼
  • 節點的名稱

經過 node.name 能夠配置每一個節點的名稱,每一個節點都是集羣的一部分,每一個節點名稱都不要相同,能夠按照順序編號,配置示例:

node.name: es-node-1
複製代碼

其餘的主機能夠配置爲 es-node-2es-node-3 等。

  • 是否有資格成爲主節點

經過 node.master 能夠配置該節點是否有資格成爲主節點,若是配置爲 true,則主機有資格成爲主節點,配置爲 false 則主機就不會成爲主節點,能夠去當數據節點或負載均衡節點。注意這裏是有資格成爲主節點,不是必定會成爲主節點,主節點須要集羣通過選舉產生。這裏我配置全部主機均可以成爲主節點,所以都配置爲 true,配置示例:

node.master: true
複製代碼
  • 是不是數據節點

經過 node.data 能夠配置該節點是否爲數據節點,若是配置爲 true,則主機就會做爲數據節點,注意主節點也能夠做爲數據節點,當 node.masternode.data 均爲 false,則該主機會做爲負載均衡節點。這裏我配置全部主機都是數據節點,所以都配置爲 true,配置示例:

node.data: true
複製代碼
  • 數據和日誌路徑

經過 path.datapath.logs 能夠配置 Elasticsearch 的數據存儲路徑和日誌存儲路徑,能夠指定任意位置,這裏我指定存儲到 1T 硬盤對應的路徑下,另外注意一下寫入權限問題,配置示例:

path.data: /datadrive/elasticsearch/data
path.logs: /datadrive/elasticsearch/logs
複製代碼
  • 設置訪問的地址和端口

咱們須要設定 Elasticsearch 運行綁定的 Host,默認是沒法公開訪問的,若是設置爲主機的公網 IP 或 0.0.0.0 就是能夠公開訪問的,這裏咱們能夠都設置爲公開訪問或者部分主機公開訪問,若是是公開訪問就配置爲:

network.host: 0.0.0.0
複製代碼

若是不想被公開訪問就不用配置。

另外還能夠配置訪問的端口,默認是 9200:

http.port: 9200
複製代碼
  • 集羣地址設置

經過 discovery.zen.ping.unicast.hosts 能夠配置集羣的主機地址,配置以後集羣的主機之間能夠自動發現,這裏我配置的是內網地址,配置示例:

discovery.zen.ping.unicast.hosts: ["10.0.0.4", "10.0.0.5", "10.0.0.6", "10.0.0.7", "10.0.0.8", "10.0.0.9", "10.0.0.10"]
複製代碼

這裏請改爲你的主機對應的 IP 地址。

  • 節點數目相關配置

爲了防止集羣發生「腦裂」,即一個集羣分裂成多個,一般須要配置集羣最少主節點數目,一般爲 (可成爲主節點的主機數目 / 2) + 1,例如我這邊能夠成爲主節點的主機數目爲 7,那麼結果就是 4,配置示例:

discovery.zen.minimum_master_nodes: 4
複製代碼

另外還能夠配置當最少幾個節點回復以後,集羣就正常工做,這裏我設置爲 4,能夠酌情修改,配置示例:

gateway.recover_after_nodes: 4
複製代碼

其餘的暫時先不須要配置,保存便可。注意每臺主機都須要配置。

啓動 Elasticsearch

配置完成以後就能夠在每臺主機上分別啓動 Elasticsearch 服務了,命令以下:

sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service
複製代碼

全部主機都啓動以後,咱們在任意主機上就能夠查看到集羣狀態了,命令行以下:

curl -XGET 'http://localhost:9200/_cluster/state?pretty'
複製代碼

相似的輸出以下:

{
    "cluster_name": "germey-es-clusters",
    "compressed_size_in_bytes": 20799,
    "version": 658,
    "state_uuid": "a64wCwPnSueKRtVuKx8xRw",
    "master_node": "73BQvOC2TpSXcr-IXBcDdg",
    "blocks": {},
    "nodes": {
        "I2M80AP-T7yVP_AZPA0bpA": {
            "name": "es-node-1",
            "ephemeral_id": "KpCG4jNvTUGKNHNwKKoMrA",
            "transport_address": "10.0.0.4:9300",
            "attributes": {
                "ml.machine_memory": "7308464128",
                "ml.max_open_jobs": "20",
                "xpack.installed": "true",
                "ml.enabled": "true"
            }
        },
        "73BQvOC2TpSXcr-IXBcDdg": {
            "name": "es-node-7",
            "ephemeral_id": "Fs9v2XTASnGbqrM8g7IhAQ",
            "transport_address": "10.0.0.10:9300",
            "attributes": {
                "ml.machine_memory": "14695202816",
                "ml.max_open_jobs": "20",
                "xpack.installed": "true",
                "ml.enabled": "true"
            }
        },
....
複製代碼

能夠看到這裏輸出了集羣的相關信息,同時 nodes 字段裏面包含了每一個節點的詳細信息,這樣一個基本的集羣就構建完成了。

安裝 Kibana

接下來咱們須要安裝一個 Kibana 來幫助可視化管理 Elasticsearch,依然仍是經過 Apt 安裝,只須要任意一臺主機安裝便可,由於集羣是一體的,因此 Kibana 在任意一臺主機只要能鏈接到 Elasticsearch 便可,安裝命令以下:

sudo apt-get install kibana
複製代碼

安裝以後修改 /etc/kibana/kibana.yml,設置公開訪問和綁定的端口:

server.port: 5601
server.host: "0.0.0.0"
複製代碼

而後啓動服務:

sudo systemctl daemon-reload
sudo systemctl enable kibana.service
sudo systemctl start kibana.service
複製代碼

這樣咱們能夠在瀏覽器輸入該臺主機的 IP 加端口,查看 Kibana 管理頁面了,相似以下:


這樣 Kibana 可視化管理就配置成功了。

配置認證

如今集羣已經初步搭建完成了,可是如今集羣很危險,若是咱們配置了可公網訪問,那麼它是能夠被任何人操做的,好比儲存數據,增刪節點等,這是很是危險的,因此咱們必需要設置訪問權限。

在 Elasticsearch 中,配置認證是經過 X-Pack 插件實現的,幸運的是,咱們不須要額外安裝了,在 Elasticsearch 6.3.2 版本中,該插件是默認集成到 Elasticsearch 中的,因此咱們只須要更改一部分設置就能夠了。

首先咱們須要升級 License,只有修改了高級版 License 才能使用 X-Pack 的權限認證功能。

在 Kibana 中訪問 Management -> Elasticsearch -> License Management,點擊右側的升級 License 按鈕,能夠免費試用 30 天的高級 License,升級完成以後頁面會顯示以下:


另外還可使用 API 來更新 License,詳情能夠參考官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/6.2/update-license.html。

而後每臺主機須要修改 /etc/elasticsearch/elasticsearch.yml 文件,開啓 Auth 認證功能:

xpack.security.enabled: true
複製代碼

隨後設置 elastic、kibana、logstash_system 三個用戶的密碼,任意一臺主機修改以後,一臺修改,多臺生效,命令以下:

/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
複製代碼

運行以後會依次提示設置這三個用戶的密碼並確認,一共須要輸入六次密碼,完成以後就成功設置好了密碼了。

修改完成以後重啓 Elasticsearch 和 Kibana 服務:

sudo systemctl restart elasticsearch.service
sudo systemctl restart kibana.service
複製代碼

這時再訪問 Kibana 就會跳轉到登陸頁面了:


可使用 elastic 用戶登陸,它的角色是超級管理員,登陸以後就能夠從新進入 Kibana 的管理頁面。

咱們還能夠自行修改和添加帳戶,在 Management -> Security -> User/Roles 裏面:


例如這裏添加一個超級管理員的帳戶:


這樣之後咱們就可使用新添加的用戶來登陸和訪問了。

另外修改權限認證以後,Elasticsearch 也不能直接訪問了,咱們也必須輸入用戶密碼才能夠訪問和調用其 API,保證了安全性。

開啓內存鎖定

系統默認會進行內存交換,這樣會致使 Elasticsearch 的性能變差,咱們查看下內存鎖定狀態,在任意一臺主機上的訪問 http://ip:port/_nodes?filter_path=**.mlockall

能夠看到以下結果:

{
    "nodes": {
        "73BQvOC2TpSXcr-IXBcDdg": {
            "process": {
                "mlockall": false
            }
        },
        "9tRr4nFDT_2rErLLQB2dIQ": {
            "process": {
                "mlockall": false
            }
        },
        "hskSDv_JQlCUnjp_INI8Kg": {
            "process": {
                "mlockall": false
            }
        },
        "LgaRuqXBTZaBdDGAktFWJA": {
            "process": {
                "mlockall": false
            }
        },
        "ZcsZgowERzuvpqVbYOgOEA": {
            "process": {
                "mlockall": false
            }
        },
        "I2M80AP-T7yVP_AZPA0bpA": {
            "process": {
                "mlockall": false
            }
        },
        "_mSmfhUtQiqhzTKZ7u75Dw": {
            "process": {
                "mlockall": true
            }
        }
    }
}
複製代碼

這表明內存交換沒有開啓,會影響 Elasticsearch 的性能,因此咱們須要開啓內存物理地址鎖定,每臺主機須要修改 /etc/elasticsearch/elasticsearch.yml 文件,修改以下配置:

bootstrap.memory_lock: true
複製代碼

但這樣修改以後從新啓動是會報錯的,Elasticsearch 沒法正常啓動,查看日誌,報錯以下:

[1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked
複製代碼

這裏須要修改兩個地方,第一個是 /etc/security/limits.conf,添加以下內容:

* soft nofile 65536
* hard nofile 65536
* soft nproc 32000
* hard nproc 32000
* hard memlock unlimited
* soft memlock unlimited
複製代碼

另外還須要修改 /etc/systemd/system.conf,修改以下內容:

DefaultLimitNOFILE=65536
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity
複製代碼

詳細的解釋能夠參考:https://segmentfault.com/a/1190000014891856。

修改以後重啓 Elasticsearch 服務:

sudo systemctl restart elasticsearch.service
複製代碼

從新訪問剛纔的地址,便可發現每臺主機的物理地址鎖定都被打開了:

{
    "nodes": {
        "73BQvOC2TpSXcr-IXBcDdg": {
            "process": {
                "mlockall": true
            }
        },
        "9tRr4nFDT_2rErLLQB2dIQ": {
            "process": {
                "mlockall": true
            }
        },
        "hskSDv_JQlCUnjp_INI8Kg": {
            "process": {
                "mlockall": true
            }
        },
        "LgaRuqXBTZaBdDGAktFWJA": {
            "process": {
                "mlockall": true
            }
        },
        "ZcsZgowERzuvpqVbYOgOEA": {
            "process": {
                "mlockall": true
            }
        },
        "I2M80AP-T7yVP_AZPA0bpA": {
            "process": {
                "mlockall": true
            }
        },
        "_mSmfhUtQiqhzTKZ7u75Dw": {
            "process": {
                "mlockall": true
            }
        }
    }
}
複製代碼

這樣咱們就又解決了性能的問題。

安裝分詞插件

另外還推薦安裝中文分詞插件,這樣能夠對中文進行全文索引,安裝命令以下:

sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.2/elasticsearch-analysis-ik-6.3.2.zip
複製代碼

安裝完以後須要重啓 Elasticsearch 服務:

sudo systemctl restart elasticsearch.service
複製代碼

主機監控

到此爲止,咱們的 Elasticsearch 集羣就搭建完成了。

最後咱們看下 Kibana 的部分功能,看下整個 Elasticsearch 有沒有在正常工做。

訪問 Kibana,打開 Management -> Elasticsearch ->Index Management,便可看到當前有的一些索引和狀態:


打開 Monitoring,能夠查看 Elasticsearch 和 Kibana 的狀態:


進一步點擊 Nodes,能夠查看各個節點的狀態:


打開任意節點,能夠查看當前資源情況變化:


另外還有一些其餘的功能如可視化、圖表、搜索等等,這裏就再也不一一列舉了,更多功能能夠詳細瞭解 Kibana。

以上都是本身在安裝過程當中的記錄和趟過的坑,若有疏漏,還望指正。

還有更多的 Elasticsearch 相關的內容能夠參考官方文檔:https://www.elastic.co/guide/index.html。

參考資料

  • https://www.elastic.co/guide/en/x-pack/current/security-getting-started.html

  • https://segmentfault.com/a/1190000014891856

  • https://blog.csdn.net/a19860903/article/details/72467996

  • https://logz.io/blog/elasticsearch-cluster-tutorial/

  • https://es.xiaoleilu.com/020_Distributed_Cluster/30_Scale_more.html

  • https://blog.csdn.net/archer119/article/details/76589189


你們好,我是崔慶才,微軟中國大數據工程師,在微軟小冰部門。固然這是個人職業,我平時還會從事網絡爬蟲、Web開發、深度學習等方向的研究和開發工做。

我我的比較喜歡總結和分享,此次很榮幸在掘金的平臺把本身的爬蟲相關經驗分享給你們,包括爬取、解析、防反爬、加速等等部分,但願你們聽完以後有所收穫。

本週日(10月21日)我會作客掘金Bilibili直播間爲你們作一場《健壯高效的網絡爬蟲》的直播【網頁連接】。直播中我也會抽出 5 名小夥伴贈送各贈送一本《Python3網絡爬蟲開發實戰》書籍一本,但願你們能夠支持。

相關文章
相關標籤/搜索