1. 程式人生 > 實用技巧 >Clickhouse單機及叢集部署詳解

Clickhouse單機及叢集部署詳解

    Nginx ("engine x") 是一個高效能的 HTTP 和反向代理伺服器,特點是佔有記憶體少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站使用者有:百度、京東、新浪、網易、騰訊、淘寶等。代理伺服器:一般是指區域網內部的機器通過代理伺服器傳送請求到網際網路上的伺服器,代理伺服器一般作用在客戶端。應用比如:GoAgent,翻牆神器。
    一個完整的代理請求過程為:客戶端首先與代理伺服器建立連線,接著根據代理伺服器所使用的代理協議,請求對目標伺服器建立連線、或者獲得目標伺服器的指定資源。 Web代理(proxy)伺服器是網路的中間實體。 代理位於Web客戶端和Web伺服器之間,扮演“中間人”的角色。HTTP的代理伺服器即是Web伺服器又是Web客戶端。

      代理伺服器是介於客戶端和Web伺服器之間的另一臺伺服器,有了它之後,瀏覽器不是直接到Web伺服器去取回網頁而是向代理伺服器發出請求,訊號會先送到代理伺服器,由代理伺服器來取回瀏覽器所需要的資訊並傳送給你的瀏覽器。

      正向代理 是一個位於客戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理髮送一個請求並指定目標(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設定才能使用正向代理。

      反向代理伺服器:在伺服器端接受客戶端的請求,然後把請求分發給具體的伺服器進行處理,然後再將伺服器的響應結果反饋給客戶端。Nginx就是其中的一種反向代理伺服器軟體。客戶端必須設定正向代理伺服器,當然前提是要知道正向代理伺服器的IP地址,還有代理程式的埠。

      反向代理正好與正向代理相反,對於客戶端而言代理伺服器就像是原始伺服器,並且客戶端不需要進行任何特別的設定。客戶端向反向代理的名稱空間(name-space)中的內容傳送普通請求,接著反向代理將判斷向何處(原始伺服器)轉交請求,並將獲得的內容返回給客戶端。



Nginx 工作原理

Nginx由核心和模組組成。

  Nginx本身做的工作實際很少,當它接到一個HTTP請求時,它僅僅是通過查詢配置檔案將此次請求對映到一個location block,而此location中所配置的各個指令則會啟動不同的模組去完成工作,因此模組可以看做Nginx真正的勞動工作者。通常一個location中的指令會涉及一個handler模組和多個filter模組(當然,多個location可以複用同一個模組)。handler模組負責處理請求,完成響應內容的生成,而filter模組對響應內容進行處理。

使用者根據自己的需要開發的模組都屬於第三方模組。正是有了這麼多模組的支撐,Nginx的功能才會如此強大。

Nginx的模組從結構上分為核心模組、基礎模組和第三方模組:

  • 核心模組:HTTP模組、EVENT模組和MAIL模組
  • 基礎模組:HTTP Access模組、HTTP FastCGI模組、HTTP Proxy模組和HTTP Rewrite模組,
  • 第三方模組:HTTP Upstream Request Hash模組、Notice模組和HTTP Access Key模組。

Nginx的模組從功能上分為如下三類:

  • Handlers(處理器模組)。此類模組直接處理請求,並進行輸出內容和修改headers資訊等操作。Handlers處理器模組一般只能有一個。
  • Filters (過濾器模組)。此類模組主要對其他處理器模組輸出的內容進行修改操作,最後由Nginx輸出。
  • Proxies (代理類模組)。此類模組是Nginx的HTTP Upstream之類的模組,這些模組主要與後端一些服務比如FastCGI等進行互動,實現服務代理和負載均衡等功能。

Nginx程序模型

  Nginx預設採用多程序工作方式,Nginx啟動後,會執行一個master程序和多個worker程序。其中master充當整個程序組與使用者的互動介面,同時對程序進行監護,管理worker程序來實現重啟服務、平滑升級、更換日誌檔案、配置檔案實時生效等功能。worker用來處理基本的網路事件,worker之間是平等的,他們共同競爭來處理來自客戶端的請求。

nginx的程序模型如圖所示:

在建立master程序時,先建立需要監聽的socket(listenfd),然後從master程序中fork()出多個worker程序,如此一來每個worker程序多可以監聽使用者請求的socket。一般來說,當一個連線進來後,所有在Worker都會收到通知,但是隻有一個程序可以接受這個連線請求,其它的都失敗,這是所謂的驚群現象。nginx提供了一個accept_mutex(互斥鎖),有了這把鎖之後,同一時刻,就只會有一個程序在accpet連線,這樣就不會有驚群問題了。

先開啟accept_mutex選項,只有獲得了accept_mutex的程序才會去新增accept事件。nginx使用一個叫ngx_accept_disabled的變數來控制是否去競爭accept_mutex鎖。ngx_accept_disabled = nginx單程序的所有連線總數 / 8 -空閒連線數量,當ngx_accept_disabled大於0時,不會去嘗試獲取accept_mutex鎖,ngx_accept_disable越大,於是讓出的機會就越多,這樣其它程序獲取鎖的機會也就越大。不去accept,每個worker程序的連線數就控制下來了,其它程序的連線池就會得到利用,這樣,nginx就控制了多程序間連線的平衡。

每個worker程序都有一個獨立的連線池,連線池的大小是worker_connections。這裡的連線池裡面儲存的其實不是真實的連線,它只是一個worker_connections大小的一個ngx_connection_t結構的陣列。並且,nginx會通過一個連結串列free_connections來儲存所有的空閒ngx_connection_t,每次獲取一個連線時,就從空閒連線連結串列中獲取一個,用完後,再放回空閒連線連結串列裡面。一個nginx能建立的最大連線數,應該是worker_connections * worker_processes。當然,這裡說的是最大連線數,對於HTTP請求本地資源來說,能夠支援的最大併發數量是worker_connections * worker_processes,而如果是HTTP作為反向代理來說,最大併發數量應該是worker_connections * worker_processes/2。因為作為反向代理伺服器,每個併發會建立與客戶端的連線和與後端服務的連線,會佔用兩個連線。

Nginx處理HTTP請求流程

  http請求是典型的請求-響應型別的的網路協議。http是檔案協議,所以我們在分析請求行與請求頭,以及輸出響應行與響應頭,往往是一行一行的進行處理。通常在一個連線建立好後,讀取一行資料,分析出請求行中包含的method、uri、http_version資訊。然後再一行一行處理請求頭,並根據請求method與請求頭的資訊來決定是否有請求體以及請求體的長度,然後再去讀取請求體。得到請求後,我們處理請求產生需要輸出的資料,然後再生成響應行,響應頭以及響應體。在將響應傳送給客戶端之後,一個完整的請求就處理完了。

處理流程圖:


Nginx VS Apache

nginx 相對 apache 的好處:
輕量級,同樣起web 服務,比apache 佔用更少的記憶體及資源
抗併發,nginx 處理請求是非同步非阻塞的,而apache 則是阻塞型的,在高併發下nginx 能保持低資源低消耗高效能
高度模組化的設計,編寫模組相對簡單
社群活躍,各種高效能模組出品迅速啊

apache 相對nginx 的優點:

rewrite ,比nginx 的rewrite 強大模組超多,基本想到的都可以找到少bug ,nginx 的bug 相對較多執行超穩定

nginx處理動態請求是雞肋,一般動態請求要apache去做,nginx只適合靜態和反向。

1、作為 Web 伺服器:相比 Apache,Nginx 使用更少的資源,支援更多的併發連線,體現更高的效率,這點使 Nginx 尤其受到虛擬主機提供商的歡迎。在高連線併發的情況下,Nginx是Apache伺服器不錯的替代品: Nginx在美國是做虛擬主機生意的老闆們經常選擇的軟體平臺之一. 能夠支援高達 50000 個併發連線數的響應, 感謝Nginx為我們選擇了 epoll and kqueue 作為開發模型.
Nginx作為負載均衡伺服器: Nginx 既可以在內部直接支援 Rails 和 PHP 程式對外進行服務, 也可以支援作為 HTTP代理 伺服器對外進行服務. Nginx採用C進行編寫, 不論是系統資源開銷還是CPU使用效率都比 Perlbal 要好很多.
2、Nginx 配置簡潔, Apache 複雜 ,Nginx 啟動特別容易, 並且幾乎可以做到7*24不間斷執行,即使執行數個月也不需要重新啟動. 你還能夠不間斷服務的情況下進行軟體版本的升級 . Nginx 靜態處理效能比 Apache 高 3倍以上 ,Apache 對 PHP 支援比較簡單,Nginx 需要配合其他後端來使用 ,Apache 的元件比 Nginx 多.
3、最核心的區別在於apache是同步多程序模型,一個連線對應一個程序;nginx是非同步的,多個連線(萬級別)可以對應一個程序 .
4、nginx的優勢是處理靜態請求,cpu記憶體使用率低,apache適合處理動態請求,所以現在一般前端用nginx作為反向代理抗住壓力,apache作為後端處理動態請求。

nginx常用命令,啟動,重啟,檢查配置檔案等

Nginx 安裝後只有一個程式檔案,本身並不提供各種管理程式,它是使用引數和系統訊號機制對 Nginx 程序本身進行控制的。 Nginx 的引數包括有如下幾個:

使用:

/usr/local/nginx/sbin/nginx -引數
  • -c:使用指定的配置檔案而不是conf目錄下的nginx.conf 。
  • -t:測試配置檔案是否正確,在執行時需要重新載入配置的時候,此命令非常重要,用來檢測所修改的配置檔案是否有語法錯誤。
  • -s:reload 過載
  • -s:stop 停止

啟動/重啟/停止

sudo /etc/init.d/nginx {start|restart|stop}

上面的命令其實是基於服務的形式,還可以這樣寫:

sudo service nginx {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}

當然還有基於訊號的方式,這個訪問效果更好:

#假設Nginx安裝在/usr/local/nginx
sudo /usr/local/nginx/nginx -s {引數}
stop - 快速關機
quit - 優雅的關機
reload - 重新載入配置檔案
reopen - 重新開啟日誌檔案

檢查配置,同時也是輸出配置檔案所在位置

/usr/local/nginx/nginx -t

修改配置後重載

/usr/local/nginx/nginx -s reload



歸類: 自動化運維及服務