第四周部分學習報告

  • 上周模糊問題

哨兵集群必須部署2個以上節(jié)點

如果哨兵集群僅僅部署了個2個哨兵實例,quorum=1

|:---- :| :----:|
| M1 | R1 |
| S1 | S2 |

Configuration: quorum = 1

master宕機,s1和s2中只要有1個哨兵認為master宕機就可以還行切換,同時s1和s2中會選舉出一個哨兵來執(zhí)行故障轉移

同時這個時候,需要majority,也就是大多數(shù)哨兵都是運行的,2個哨兵的majority就是2(2的majority=2,3的majority=2,5的majority=3,4的majority=2),2個哨兵都運行著,就可以允許執(zhí)行故障轉移

但是如果整個M1和S1運行的機器宕機了,那么哨兵只有1個了,此時就沒有majority來允許執(zhí)行故障轉移,在只有少數(shù)Sentinel 進程正常運作的情況下, Sentinel 是不能執(zhí)行自動故障遷移的。

一、Nginx

1.nginx簡介

Nginx 是一個高性能的HTTP和[反向代理服務器,也是一個IMAP/POP3/SMTP服務器。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發(fā)的,第一個公開版本0.1.0發(fā)布于2004年10月4日。

2.nginx架構

image.png

3.nginx基礎概念

connection
在nginx中connection就是對tcp連接的封裝,其中包括連接的socket,讀事件,寫事件。利用nginx封裝的connection,我們可以很方便的使用nginx來處理與連接相關的事情,比如,建立連接,發(fā)送與接受數(shù)據(jù)等。而nginx中的http請求的處理就是建立在connection之上的,所以nginx不僅可以作為一個web服務器,也可以作為郵件服務器。當然,利用nginx提供的connection,我們可以與任何后端服務打交道。

首先,nginx在啟動時,會解析配置文件,得到需要監(jiān)聽的端口與ip地址,然后在nginx的master進程里面,先初始化好這個監(jiān)控的socket(創(chuàng)建socket,設置addrreuse等選項,綁定到指定的ip地址端口,再listen),然后再fork出多個子進程出來,然后子進程會競爭accept新的連接。此時,客戶端就可以向nginx發(fā)起連接了。當客戶端與服務端通過三次握手建立好一個連接后,nginx的某一個子進程會accept成功,得到這個建立好的連接的socket,然后創(chuàng)建nginx對連接的封裝,即ngx_connection_t結構體。接著,設置讀寫事件處理函數(shù)并添加讀寫事件來與客戶端進行數(shù)據(jù)的交換。最后,nginx或客戶端來主動關掉連接,到此,一個連接就壽終正寢了

模塊的分類

nginx的模塊根據(jù)其功能基本上可以分為以下幾種類型:

搭建了獨立于操作系統(tǒng)的事件處理機制的框架,及提供了各具體事件的處理。包括ngx_events_module, ngx_event_core_module和ngx_epoll_module等。nginx具體使用何種事件處理模塊,這依賴于具體的操作系統(tǒng)和編譯選項。此類型的模塊也被直接稱為handler模塊。主要負責處理客戶端請求并產(chǎn)生待響應內(nèi)容,比如ngx_http_static_module模塊,負責客戶端的靜態(tài)頁面請求處理并將對應的磁盤文件準備為響應內(nèi)容輸出。 也稱為filter模塊,主要是負責對輸出的內(nèi)容進行處理,可以對輸出進行修改。例如,可以實現(xiàn)對輸出的所有html頁面增加預定義的footbar一類的工作,或者對輸出的圖片的URL進行替換之類的工作。 upstream模塊實現(xiàn)反向代理的功能,將真正的請求轉發(fā)到后端服務器上,并從后端服務器上讀取響應,發(fā)回客戶端。upstream模塊是一種特殊的handler,只不過響應內(nèi)容不是真正由自己產(chǎn)生的,而是從后端服務器上讀取的。均衡模塊,實現(xiàn)特定的算法,在眾多的后端服務器中,選擇一個服務器出來作為某個請求的轉發(fā)服務器。

請求處理的流程

nginx使用一個多進程模型來對外提供服務,其中一個master進程,多個worker進程。master進程負責管理nginx本身和其他worker進程。
所有實際上的業(yè)務處理邏輯都在worker進程。worker進程中有一個函數(shù),執(zhí)行無限循環(huán),不斷處理收到的來自客戶端的請求,并進行處理,直到整個nginx服務被停止。
worker進程中,ngx_worker_process_cycle()函數(shù)就是這個無限循環(huán)的處理函數(shù)。在這個函數(shù)中,一個請求的簡單處理流程如下:

  • 操作系統(tǒng)提供的機制(例如epoll, kqueue等)產(chǎn)生相關的事件。
  • 接收和處理這些事件,如是接受到數(shù)據(jù),則產(chǎn)生更高層的request對象。
  • 處理request的header和body。
  • 產(chǎn)生響應,并發(fā)送回客戶端。
  • 完成request的處理。
  • 重新初始化定時器及其他事件。

4.nginx的配置

nginx的配置系統(tǒng)由一個主配置文件和其他一些輔助的配置文件構成。這些配置文件均是純文本文件,全部位于nginx安裝目錄下的conf目錄下。
由于除主配置文件nginx.conf以外的文件都是在某些情況下才使用的,而只有主配置文件是在任何情況下都被使用的。所以在這里我們就以主配置文件為例,來解釋nginx的配置系統(tǒng)。

在nginx.conf中,包含若干配置項。每個配置項由配置指令和指令參數(shù)2個部分構成。指令參數(shù)也就是配置指令對應的配置值。

指令概述

配置指令是一個字符串,可以用單引號或者雙引號括起來,也可以不括。但是如果配置指令包含空格,一定要引起來。

指令參數(shù)

指令的參數(shù)使用一個或者多個空格或者TAB字符與指令分開。指令的參數(shù)有一個或者多個TOKEN串組成。TOKEN串之間由空格或者TAB鍵分隔。

TOKEN串分為簡單字符串或者是復合配置塊。復合配置塊即是由大括號括起來的一堆內(nèi)容。一個復合配置塊中可能包含若干其他的配置指令。

如果一個配置指令的參數(shù)全部由簡單字符串構成,也就是不包含復合配置塊,那么我們就說這個配置指令是一個簡單配置項,否則稱之為復雜配置項,例如簡單配置項

error_page   500 502 503 504  /50x.html;

復雜配置項

location / {
    root   /home/jizhao/nginx-book/build/html;
    index  index.html index.htm;
}

指令上下文

nginx.conf中的配置信息,根據(jù)其邏輯上的意義,對它們進行了分類,也就是分成了多個作用域,或者稱之為配置指令上下文。不同的作用域含有一個或者多個配置項。

指令上下文 簡介
main nginx在運行時與具體業(yè)務功能(比如http服務或者email服務代理)無關的一些參數(shù),比如工作進程數(shù),運行的身份等。
http 與提供http服務相關的一些配置參數(shù)。例如:是否使用keepalive啊,是否使用gzip進行壓縮等。
server http服務上支持若干虛擬主機。每個虛擬主機一個對應的server配置項,配置項里面包含該虛擬主機相關的配置。在提供mail服務的代理時,也可以建立若干server.每個server通過監(jiān)聽的地址來區(qū)分。
location http服務中,某些特定的URL對應的一系列配置項。
mail 實現(xiàn)email相關的SMTP/IMAP/POP3代理時,共享的一些配置項(因為可能實現(xiàn)多個代理,工作在多個監(jiān)聽地址上)。

當前nginx支持的幾個指令上下文:

指令上下文 簡介
main nginx在運行時與具體業(yè)務功能(比如http服務或者email服務代理)無關的一些參數(shù),比如工作進程數(shù),運行的身份等。
http 與提供http服務相關的一些配置參數(shù)。例如:是否使用keepalive啊,是否使用gzip進行壓縮等。
server http服務上支持若干虛擬主機。每個虛擬主機一個對應的server配置項,配置項里面包含該虛擬主機相關的配置。在提供mail服務的代理時,也可以建立若干server.每個server通過監(jiān)聽的地址來區(qū)分。
location http服務中,某些特定的URL對應的一系列配置項。
mail 實現(xiàn)email相關的SMTP/IMAP/POP3代理時,共享的一些配置項(因為可能實現(xiàn)多個代理,工作在多個監(jiān)聽地址上)。

指令上下文,可能有包含的情況出現(xiàn)。例如:通常http上下文和mail上下文一定是出現(xiàn)在main上下文里的。在一個上下文里,可能包含另外一種類型的上下文多次。例如:如果http服務,支持了多個虛擬主機,那么在http上下文里,就會出現(xiàn)多個server上下文。

6.nginx負載均衡

負載均衡是用反向代理的原理實現(xiàn)的
負載均衡的幾種常用方式

1、輪詢(默認)
每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除。

upstream backserver {
    server 192.168.0.14;
    server 192.168.0.15;
}

2、weight
指定輪詢幾率,weight和訪問比率成正比,用于后端服務器性能不均的
情況。

upstream backserver {
    server 192.168.0.14 weight=3;
    server 192.168.0.15 weight=7;
}

權重越高,在被訪問的概率越大,如上例,分別是30%,70%。

3、上述方式存在一個問題就是說,在負載均衡系統(tǒng)中,假如用戶在某臺服務器上登錄了,那么該用戶第二次請求的時候,因為我們是負載均衡系統(tǒng),每次請求都會重新定位到服務器集群中的某一個,那么已經(jīng)登錄某一個服務器的用戶再重新定位到另一個服務器,其登錄信息將會丟失,這樣顯然是不妥的。

我們可以采用ip_hash指令解決這個問題,如果客戶已經(jīng)訪問了某個服務器,當用戶再次訪問時,會將該請求通過哈希算法,自動定位到該服務器。

每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。

upstream backserver {
    ip_hash;
    server 192.168.0.14:88;
    server 192.168.0.15:80;
}

4、fair(第三方)
按后端服務器的響應時間來分配請求,響應時間短的優(yōu)先分配。

upstream backserver {
    server server1;
    server server2;
    fair;
}

5、url_hash(第三方)
按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,后端服務器為緩存時比較有效。

upstream backserver {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
}

每個設備的狀態(tài)設置為:
1.down 表示單前的server暫時不參與負載
2.weight 默認為1.weight越大,負載的權重就越大。
3.max_fails:允許請求失敗的次數(shù)默認為1.當超過最大次數(shù)時,返回proxy_next_upstream模塊定義的錯誤
4.fail_timeout:max_fails次失敗后,暫停的時間。
5.backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這類機器壓力會最輕。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容