
高可用架構對于互聯網服務基本是標配,無論是應用服務還是數據庫服務都需要做到高可用。對于一個系統而言,可能包含很多模塊,比如前端應用,緩存,數據庫,搜索,消息隊列等,每個模塊都需要做到高可用,才能保證整個系統的高可用。對于數據庫服務而言,高可用可能更復雜,對用戶的服務可用,不僅僅是能訪問,還需要有正確性保證,因此數據庫的高可用需要更加認證對待。
MMM(Master-Master replication manager for MySQL)是一套支持雙主故障切換和雙主日常管理的腳本程序。
MMM提供了自動和手動兩種方式移除一組服務器中復制延遲較高的服務器的虛擬ip,同時它還可以備份數據,實現兩節(jié)點之間的數據同步等。
(相關資料圖)
MySQL本身沒有提供replication failover的解決方案,通過MMM方案能實現服務器的故障轉移,從而實現mysql的高可用。
MHA(Master High Availability)目前在MySQL高可用方面是一個相對成熟的解決方案,它由日本DeNA公司的youshimaton(現就職于Facebook公司)開發(fā),是一套優(yōu)秀的作為MySQL高可用性環(huán)境下故障切換和主從提升的高可用軟件。
MHA由兩部分組成:MHA Manager(管理節(jié)點)和MHA Node(數據節(jié)點)。
MHA Manager可以單獨部署在獨立的機器上管理多個master-slave集群,也可以部署在一臺slave節(jié)點上。
此種架構,一般初創(chuàng)企業(yè)比較常用,也便于后面步步的擴展
MySQL Cluster簡單地講是一種MySQL集群的技術,是由一組計算機構成,每臺計算機可以存放一個或者多個節(jié)點,其中包括MySQL服務器,DNB Cluster的數據節(jié)點,管理其他節(jié)點,以及專門的數據訪問程序,這些節(jié)點組合在一起,就可以為應用提高可高性能、高可用性和可縮放性的Cluster數據管理;
通過Nginx負載均衡進行請求轉發(fā)
在這個架構圖中,一層Nginx,首先Nginx主要職責給Tomcat一層反向代理。
此外,Nginx還可以FTPServer指定的目錄再做一層目錄轉發(fā),保證上傳上去的圖片實時可以通過http協議訪問到。單服務架構先不用考慮集群碰到的各種問題
比如,我們的登錄的時候登錄了A服務器,session信息存儲到A服務器上了,假設我們使用的負載均衡策略是ip hash,那么登錄信息還可以從A服務器上訪問,但是這個有可能造成某些服務器壓力過大,某些服務器又沒有什么壓力,這個時候壓力過大的機器(包括網卡帶寬)有可能成為瓶頸,并且請求不夠分散。
這時候我們使用輪詢或者最小連接負載均衡策略,就導致了,第一次訪問A服務器,第二次可能訪問到B服務器,這個時候存儲在A服務器上的session信息在B服務器上讀取不到。
打個比方,我們有輪詢,權重,地址散列,地址散列又分為原ip地址散列hash,目標ip地址散列hash,最少連接,加權最少連接,還有繼續(xù)升級的很多種策略
輪詢:優(yōu)點:實現簡單,缺點:不考慮每臺服務器處理能力權重:優(yōu)點:考慮了服務器處理能力的不同地址散列:優(yōu)點:能實現同一個用戶訪問同一個服務器最少連接:優(yōu)點:使集群中各個服務器負載更加均勻加權最少連接:在最少連接的基礎上,為每臺服務器加上權值。算法為(活動連接數*256+非活動連接數)/權重,計算出來的值小的服務器優(yōu)先被選擇。對于同一個連接中的數據包,負載均衡會將其轉發(fā)至后端固定的服務器進行處理。
解決了我們session共享的問題,但是它有什么缺點呢?
一臺服務器運行的服務掛掉,或者重啟,上面的 session 都沒了負載均衡器成了有狀態(tài)的機器,為以后實現容災造成了羈絆就是每一個Tomcat都存儲我們的Session,不同的tomcat之間進行拷貝復制。
解決了我們session共享的問題,但是它有什么缺點呢?
應用服務器間帶寬問題,因為需要不斷同步session數據大量用戶在線時,服務器占用內存過多主要用于我們將session會話如同token一般存儲在我們的前端
解決了我們session共享的問題,但是它有什么缺點呢?
cookie 的長度限制cookie存于瀏覽器,安全性是一個問題就是通過一個專門管理session會話的管理器服務,進行集中化存儲和管理session
解決了我們session共享的問題,這種方案需要思考哪些問題呢?保證 session 服務器的可用性,session服務器單點如何解決?
我們在寫應用時需要做調整存儲session的業(yè)務邏輯打個比方,我們?yōu)榱颂岣遱ession server的可用性,可以繼續(xù)給session server做集群tomcatA的環(huán)境變量和以往一樣, 不做改變
??sudo vim /ect/profile?
?
export CATALINA_BASE=/Users/tomcat/apache-tomcat-9.0.21export CATALINA_HOME=/Users/tomcat/apache-tomcat-9.0.21export TOMCAT_HOME=/Users/tomcat/apache-tomcat-9.0.21
export CATALINA_2_BASE=/Users/tomcat/tomcat2export CATALINA_2_HOME=/Users/tomcat/tomcat2export TOMCAT_2_HOME=/Users/tomcat/tomcat2
繼續(xù)配置tomcatB下的catalina.sh里的內容,
cd tomcat目錄,在# OS specific support. $var mustbe set to either true or false.下加入。
sudo vi catalina.shexport CATALINA_BASE=$CATALINA_2_BASEexport CATALINA_HOME=$CATALINA_2_HOME
??source /etc/profile?
?
使環(huán)境變量生效, 執(zhí)行
??echo $CATALINA_2_BASE?
?
如果有輸出, 即環(huán)境變量已經生效
??/Users/tomcat/tomcat2?
?
分別進入兩個tomcat下的bin目錄啟動tomcat, 正常即可
??sudo vim /etc/hosts?
?
所謂tomcat集群,就是可以向外提供并行服務的多臺機器,任何一臺服務器宕機,其它服務器可以替代它向外提供服務,而不影響用戶訪問。
nginx是一個常用的反向代理服務,可自定義模塊,實現請求轉發(fā)及負載均衡(根具體采用策略有關)。為了tomcat集群的高可用性,還需要實現nginx的雙機熱備。
一,如果僅是對外提供一個頁面訪問,不用區(qū)分單一用戶(不區(qū)分每個訪問session,不涉及用戶權限,用戶資料等內容),僅僅配置nginx負載均衡策略即可。
二,如果涉及到用戶session,做一些鑒權緩存、存放臨時信息時,就必須做tomcat的session共享。
目前可參考到的session共享方式主要分為兩種。
對tomcat及應用的若干配置文件進行配置即可實現,網上有很多資料可參考。但這種方式些弊端,看過一些資料,不建議用session復制的方式。在實際使用過程中,也發(fā)現有存在session莫名失蹤的現象。
比較常見的是tomcat集成memcached服務器來存儲session。實際項目中,我們采用過利用redis實現session存儲,redis高效的存取性能為高效的訪問提供了保障,但是目前redis的集群功能似乎沒有發(fā)布,如何解決redis的單點故障需要研究。
小結:是否實現session共享與nginx的負載策略有很大關系。比如采用輪詢策略,就必須實現session共享,因為客戶端會訪問到每臺服務器;而如果采用ip_hash策略,就可以不用考慮session共享的問題了,但是ip_hash有些缺陷使它不能隨便使用(如多臺pc使用同一個外網ip)。
最近發(fā)現一個nginx的粘連模塊(類似session粘連),可以看做nginx的第5種均衡策略。它利用客戶端cookie,對其寫入一個route參數,每次訪問可以根據route的值,固定的訪問一臺服務器,解決的session共享的問題。
Nginx(發(fā)音同 engine x)是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,并在一個BSD-like 協議下發(fā)行。由俄羅斯的程序設計師Igor Sysoev(伊戈爾·西索夫)所開發(fā),供俄國大型的入口網站及搜索引擎Rambler(漫步者)(俄文:Рамблер)使用。其特點是占有內存少,并發(fā)能力強,事實上nginx的并發(fā)能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:新浪、網易、 騰訊等。
我們想要使用Nginx那么就必須滿足上面的四個條件.我們配置負載均衡的目的是在于當用戶訪問我們的服務器的時候, 首先會通過 Nginx服務器來決定轉發(fā)到哪個Tomcat服務器上去給用戶提供服務, 當然這個概率是我們通過權重來配置的. 經過Nginx指派之后, 我們就可以處理高并發(fā)的訪問了, 這里就能達到負載均衡的目的.
Nginx的負載均衡是通過upstream來實現的,在upstream中指定若干個 server,格式如下:
myserver就是通過 upstream 定義的一組負載均衡模板,其中:
在配置完upstream后,還要讓客戶端過來的請求反向代理到myserver,格式如下:
完成了負載均衡的配置,但是在實際需求中除了上面的設置外,還會增加一些額外設置:
負載均衡策略設置請求上游服務器攜帶請求頭信息upstream模塊中其他參數設置
除以上5種,還有一種:least-connected — 下一個請求被分配到擁有最少活動連接數的服務器。
編輯nginx配置文件(例中為/usr/local/ngnix/conf/nginx.conf),找到http結點,
http { upstream myapp1 { server 192.168.1.103:8080; server 192.168.1.104:8080; } server { listen 80; server_name localhost; location /webautotest/ { proxy_buffering off; proxy_pass http://myapp1; } }}
[root@localhost nginx-1.10.0]# /usr/local/ngnix/sbin/nginx -s reload
http { upstream myapp1 { server srv1.example.com; server srv2.example.com; server srv3.example.com; } server { listen 80; location / { proxy_pass http://myapp1; } }}
upstream myapp1 { least_conn; server srv1.example.com; server srv2.example.com; server srv3.example.com;}
注意,round-robin或least-connected負載均衡下,每個后續(xù)的客戶端可能被分發(fā)至不同服務器,不保證相同客戶端的請求總是被發(fā)送到相同的服務器。
如果有必要把客戶端綁定至特定服務器,則可使用ip-hash負載均衡機制。
ip-hash機制下,客戶端ip地址被用作hash key來判斷客戶端請求應該發(fā)送到哪個服務器,這種方法保證了來自相同客戶端的請求總是發(fā)送到相同服務器(如果服務器可用的話)
upstream myapp1 { ip_hash; server srv1.example.com; server srv2.example.com; server srv3.example.com;}
可通過配置服務器權重來影響負載均衡機制。上面的例子中,都未配置服務器權重,這意味著所有服務器都擁有相同的權重。針對round-robin負載機制,權重意味著更多或更少的請求傳送至服務器---假設有足夠的請求,且按統一方式處理請求,且足夠快完成請求處理。
upstream myapp1 { server srv1.example.com weight=3; server srv2.example.com; server srv3.example.com;}
上例配置中,每發(fā)送至服務器實例的5個新的請求中,有3個發(fā)送到srv1,1個發(fā)送到srv2,另1個發(fā)送到srv3。
注:當前版本似乎只實現了round-robin機制下的權重設置
下面我們將介紹一下proxy模塊的參數:
設置proxy_connect_timeout 為2秒,縮短超時時間,使其不至于太慢。