服務通常分爲有狀態和無狀態,而分佈式sessoion就是針對有狀態的服務。java
Session Replication 方式管理 (即session複製)
簡介:將一臺機器上的Session數據廣播複製到集羣中其他機器上
使用場景:機器較少,網絡流量較小
優勢:實現簡單、配置較少、當網絡中有機器Down掉時不影響用戶訪問
缺點:廣播式複製到其他機器有必定廷時,帶來必定網絡開銷node
Session Sticky 方式管理
簡介:即粘性Session、當用戶訪問集羣中某臺機器後,強制指定後續全部請求均落到此機器上
使用場景:機器數適中、對穩定性要求不是很是苛刻
優勢:實現簡單、配置方便、沒有額外網絡開銷
缺點:網絡中有機器Down掉時、用戶Session會丟失、容易形成單點故障git
緩存集中式管理
簡介:將Session存入分佈式緩存集羣中的某臺機器上,當用戶訪問不一樣節點時先從緩存中拿Session信息
使用場景:集羣中機器數多、網絡環境複雜
優勢:可靠性好
缺點:實現複雜、穩定性依賴於緩存的穩定性、Session信息放入緩存時要有合理的策略寫入github
MySql主從配置,讀寫分離並引入中間件,開源的MyCat,阿里的DRDS都是不錯的選擇。web
若是是對高可用要求比較高,可是又沒有相應的技術保障,建議使用阿里雲的RDS或者Redis相關數據庫,省事省力又省錢。redis
Consistency(一致性), 數據一致更新,全部數據變更都是同步的
Availability(可用性), 好的響應性能
Partition tolerance(分區容錯性) 可靠性算法
定理:任何分佈式系統只可同時知足二點,無法三者兼顧。
忠告:架構師不要將精力浪費在如何設計能知足三者的完美分佈式系統,而是應該進行取捨。spring
關係數據庫的ACID模型擁有 高一致性 + 可用性 很難進行分區:
Atomicity原子性:一個事務中全部操做都必須所有完成,要麼所有不完成。
Consistency一致性. 在事務開始或結束時,數據庫應該在一致狀態。
Isolation隔離層. 事務將假定只有它本身在操做數據庫,彼此不知曉。
Durability. 一旦事務完成,就不能返回。
跨數據庫事務:2PC (two-phase commit), 2PC is the anti-scalability pattern (Pat Helland) 是反可伸縮模式的,JavaEE中的JTA事務能夠支持2PC。由於2PC是反模式,儘可能不要使用2PC,使用BASE來回避。數據庫
BASE模型反ACID模型,徹底不一樣ACID模型,犧牲高一致性,得到可用性或可靠性:編程
Basically Available基本可用。支持分區失敗(e.g. sharding碎片劃分數據庫)
Soft state軟狀態 狀態能夠有一段時間不一樣步,異步。
Eventually consistent最終一致,最終數據是一致的就能夠了,而不是時時高一致。
BASE思想的主要實現有
1.按功能劃分數據庫
2.sharding碎片
BASE思想主要強調基本的可用性,若是你須要High 可用性,也就是純粹的高性能,那麼就要以一致性或容錯性爲犧牲,BASE思想的方案在性能上仍是有潛力可挖的。
Two Phase Commitment Protocol
兩階段提交協議
實現分佈式事務的關鍵就是兩階段提交協議。在此協議中,一個或多個資源管理器的活動均由一個稱爲事務協調器的單獨軟件組件來控制。此協議中的五個步驟以下:
• 應用程序調用事務協調器中的提交方法。
• 事務協調器將聯絡事務中涉及的每一個資源管理器,並通知它們準備提交事務(這是第一階段的開始)。
• 爲 了以確定的方式響應準備階段,資源管理器必須將本身置於如下狀態:確保能在被要求提交事務時提交事務,或在被要求回滾事務時回滾事務。大多數資源管理器會 將包含其計劃更改的日記文件(或等效文件)寫入持久存儲區中。若是資源管理器沒法準備事務,它會以一個否認響應來回應事務協調器。
• 事務協調器收集來自資源管理器的全部響應。
• 在 第二階段,事務協調器將事務的結果通知給每一個資源管理器。若是任一資源管理器作出否認響應,則事務協調器會將一個回滾命令發送給事務中涉及的全部資源管理 器。若是資源管理器都作出確定響應,則事務協調器會指示全部的資源管理器提交事務。一旦通知資源管理器提交,此後的事務就不能失敗了。經過以確定的方式響 應第一階段,每一個資源管理器均已確保,若是之後通知它提交事務,則事務不會失敗。
Three Phase Commitment Protocol
In computer networking and databases, the three-phase commit protocol (3PC) is a distributed algorithm which lets all nodes in a distributed system agree to commit a transaction. Unlike the two-phase commit protocol (2PC) however, 3PC is non-blocking. Specifically, 3PC places an upper bound on the amount of time required before a transaction either commits oraborts. This property ensures that if a given transaction is attempting to commit via 3PC and holds some resource locks, it will release the locks after the timeout.
3PC was originally described by Dale Skeen and Michael Stonebraker in their paper, 「A Formal Model of Crash Recovery in a Distributed System」[1]. In that work, they modeled 2PC as a system of non-deterministic finite state automata and proved that it is not resilient to a random single site failure. The basic observation is that in 2PC, while one site is in the 「prepared to commit」 state, the other may be in either the 「commit」 or the 「abort」 state. From this analysis, they developed 3PC to avoid such states and it is thus resilient to such failures.
Paxos 算法解決的問題是一個分佈式系統如何就某個值(決議)達成一致。一個典型的場景是,在一個分佈式數據庫系統中,若是各節點的初始狀態一致,每一個節點都執行相同的操做序列,那麼他們最後能獲得一個一致的狀態。爲保證每一個節點執行相同的命令序列,須要在每一條指令上執行一個「一致性算法」以保證每一個節點看到的指令一致。一個通用的一致性算法能夠應用在許多場景中,是分佈式計算中的重要問題。所以從20世紀80年代起對於一致性算法的研究就沒有中止過。節點通訊存在兩種模型:共享內存(Shared memory)和消息傳遞(Messages passing)。Paxos 算法就是一種基於消息傳遞模型的一致性算法。
redisson是redis官網推薦的java語言實現分佈式鎖的項目。固然,redisson遠不止分佈式鎖,還包括其餘一些分佈式結構。詳情請移步:https://github.com/mrniko/redisson/wiki
redisson支持4種連接redis的方式:
Cluster(集羣)
Sentinel servers(哨兵)
Single server(單機)
數據流量過大的網絡中,單一設備沒法承擔,因而就再回了一臺設備用來分擔網絡的流量,F5負載均衡器就是實現合理的分配網絡中的業務流量,使之不至於出現一臺設備過忙,一臺不能發揮做用。使倆臺設備合理的分擔網絡流量的負擔。F5是負載均衡產品的一個品牌,其地位相似於諾基亞在手機品牌中的位置。除了F5之外,Radware、Array、A10、Cisco、深信服等都是負載均衡的牌子,但因爲F5在這類產品中影響最大,因此常常說F5負載均衡。
在分析 服務器 集羣 實現 虛擬網絡服務 的相關技術上,LVS集羣中實現的三種IP負載均衡技術VS/NAT、VS/TUN、VS/DR的工做原理.
負載均衡策略的優劣及其實現的難易程度有兩個關鍵因素:1、負載均衡算法,2、對網絡系統情況的檢測方式和能力。
一、rr 輪詢調度算法。顧名思義,輪詢分發請求。
優勢:實現簡單
缺點:不考慮每臺服務器的處理能力
二、wrr 加權調度算法。咱們給每一個服務器設置權值weight,負載均衡調度器根據權值調度服務器,服務器被調用的次數跟權值成正比。
優勢:考慮了服務器處理能力的不一樣
三、sh 原地址散列:提取用戶IP,根據散列函數得出一個key,再根據靜態映射表,查處對應的value,即目標服務器IP。過目標機器超負荷,則返回空。
四、dh 目標地址散列:同上,只是如今提取的是目標地址的IP來作哈希。
優勢:以上兩種算法的都能實現同一個用戶訪問同一個服務器。
五、lc 最少鏈接。優先把請求轉發給鏈接數少的服務器。
優勢:使得集羣中各個服務器的負載更加均勻。
六、wlc 加權最少鏈接。在lc的基礎上,爲每臺服務器加上權值。算法爲:(活動鏈接數*256+非活動鏈接數)÷權重 ,計算出來的值小的服務器優先被選擇。
優勢:能夠根據服務器的能力分配請求。
七、sed 最短時間望延遲。其實sed跟wlc相似,區別是不考慮非活動鏈接數。算法爲:(活動鏈接數+1)*256÷權重,一樣計算出來的值小的服務器優先被選擇。
八、nq 永不排隊。改進的sed算法。咱們想一下什麼狀況下才能「永不排隊」,那就是服務器的鏈接數爲0的時候,那麼假若有服務器鏈接數爲0,均衡器直接把請求轉發給它,無需通過sed的計算。
九、LBLC 基於局部性的最少鏈接。均衡器根據請求的目的IP地址,找出該IP地址最近被使用的服務器,把請求轉發之,若該服務器超載,最採用最少鏈接數算法。
十、LBLCR 帶複製的基於局部性的最少鏈接。均衡器根據請求的目的IP地址,找出該IP地址最近使用的「服務器組」,注意,並非具體某個服務器,而後採用最少鏈接數從該組中挑出具體的某臺服務器出來,把請求轉發之。若該服務器超載,那麼根據最少鏈接數算法,在集羣的非本服務器組的服務器中,找出一臺服務器出來,加入本服務器組,而後把請求轉發之。
「消息隊列」是在消息的傳輸過程當中保存消息的容器。
MQ全稱爲Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通訊方法。應用程序經過讀寫出入隊列的消息(針對應用程序的數據)來通訊,而無需專用鏈接來連接它們。消息傳遞指的是程序之間經過在消息中發送數據進行通訊,而不是經過直接調用彼此來通訊,直接調用一般是用於諸如遠程過程調用的技術。排隊指的是應用程序經過 隊列來通訊。隊列的使用除去了接收和發送應用程序同時執行的要求。其中較爲成熟的MQ產品有IBM WEBSPHERE MQ等等。
消息隊列的主要特色是異步處理,主要目的是減小請求響應時間和解耦。因此主要的使用場景就是將比較耗時並且不須要即時(同步)返回結果的操做做爲消息放入消息隊列。同時因爲使用了消息隊列,只要保證消息格式不變,消息的發送方和接收方並不須要彼此聯繫,也不須要受對方的影響,即解耦和。
RabbitMQ是一個在AMQP基礎上完成的,可複用的企業消息系統。他遵循Mozilla Public License開源協議。
ZMQ (如下 ZeroMQ 簡稱 ZMQ)是一個簡單好用的傳輸層,像框架同樣的一個 socket library,他使得 Socket 編程更加簡單、簡潔和性能更高。是一個消息處理隊列庫,可在多個線程、內核和主機盒之間彈性伸縮。ZMQ 的明確目標是「成爲標準網絡協議棧的一部分,以後進入 Linux 內核」。如今還未看到它們的成功。可是,它無疑是極具前景的、而且是人們更加須要的「傳統」BSD 套接字之上的一層封裝。ZMQ 讓編寫高性能網絡應用程序極爲簡單和有趣。
ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個徹底支持JMS1.1和J2EE 1.4規範的 JMS Provider實現,儘管JMS規範出臺已是好久的事情了,可是JMS在當今的J2EE應用中間仍然扮演着特殊的地位。
Kafka是一種高吞吐量的分佈式發佈訂閱消息系統,它能夠處理消費者規模的網站中的全部動做流數據。 這種動做(網頁瀏覽,搜索和其餘用戶的行動)是在現代網絡上的許多社會功能的一個關鍵因素。 這些數據一般是因爲吞吐量的要求而經過處理日誌和日誌聚合來解決。 對於像Hadoop的同樣的日誌數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka的目的是經過Hadoop的並行加載機制來統一線上和離線的消息處理,也是爲了經過集羣來提供實時的消費。
Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員再也不須要定義樣板化的配置。用個人話來理解,就是spring boot其實不是什麼新的框架,它默認配置了不少框架的使用方式,就像maven整合了全部的jar包,spring boot整合了全部的框架(不知道這樣比喻是否合適)。
Spring Boot能夠輕鬆建立能夠「運行」的獨立的,生產級的基於Spring的應用程序。咱們對Spring平臺和第三方圖書館有一個見解,因此你能夠從最開始的時候開始。大多數Spring Boot應用程序須要不多的Spring配置。
特徵:
是一個分佈式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。 其核心部分包含:
RPC(Remote Procedure Call Protocol)——遠程過程調用協議,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,爲通訊程序之間攜帶信息數據。在OSI網絡通訊模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分佈式多程序在內的應用程序更加容易。RPC採用客戶機、服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,而後等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息的到達爲止。當一個調用信息到達,服務器得到進程參數,計算結果,發送答覆信息,而後等待下一個調用信息,最後,客戶端調用進程接收答覆信息,得到進程結果,而後調用執行繼續進行。有多種RPC模式和執行。最初由Sun公司提出。IETF ONC憲章從新修訂了Sun版本,使得ONC RPC協議成爲IETF標準協議。如今使用最廣泛的模式和執行是開放式軟件基礎的分佈式計算環境(DCE)。
面向服務的架構(Service-Oriented Architecture)
是一個組件模型,它將應用程序的不一樣功能單元(稱爲服務)經過這些服務之間定義良好的接口和契約聯繫起來。接口是採用中立的方式進行定義的,它應該獨立於實現服務的硬件平臺、操做系統和編程語言。這使得構建在各類各樣的系統中的服務能夠以一種統一和通用的方式進行交互。
Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口。
Apache Storm 是一個免費的開源分佈式實時計算系統。
Storm能夠輕鬆地可靠地處理無限數據流,實時處理Hadoop進行批處理。Storm很簡單,可使用任何編程語言,並且使用起來頗有趣!
Storm有不少用例:實時分析,在線機器學習,連續計算,分佈式RPC,ETL等。Storm很快:一個基準點在每一個節點每秒處理超過一百萬個元組。它是可擴展的,容錯的,保證您的數據將被處理,而且易於設置和操做。
Storm與您已經使用的排隊和數據庫技術相結合。Storm拓撲消耗數據流並以任意複雜的方式處理這些流,從新分配計算的每一個階段之間的流,但須要。閱讀更多的教程。
在規則,模型上線以前,在離線的環境裏面進行仿真驗證,來對規則和模型進行效能的評估,避免人爲因素形成不許確性從而形成的資損。起初爲了達到這個目的,離線計算平臺就這樣孕育而生了