「異地多活」看起來就是這樣乙個萬能的大殺器,很多人理想中認為只要實現了「異地多活」,不管是紐奧良水災,美加大停電,藍翔挖掘機。。。。。。等等都不再是問題。
不過,事實上,作為乙個解決方案,異地多活是否最終有效,既取決於實施方如何去使用方案如何去設計(千萬不要以為撿到倚天劍就是武林盟主),也取決於工具方案本身還有哪些不如意之處固有的約束和限制。要知道,即便是**這樣能夠做到「異地多活」的公司而言,實際上也仍然有不夠完美的地方。如果不意識到這些impossible mission,那麼對於異地多活的理解就是錯誤的。
impossible mission1 - 「實時異地多活」
異地多活本質上是通過異地的資料冗餘,來保證在極端異常的情況下業務也能夠正常提供給使用者,因此資料同步是異地多活設計方案的核心。
通過網路將資料從a地同步到b地,會受限於乙個普遍的物理規則,即:光速真空傳播是每秒30萬公里,在光纖中傳輸的速度大約是每秒20萬公里,再加上傳輸中的各種網路裝置的處理,實際還遠遠達不到光速的速度。
除了距離上的限制外,中間傳輸各種不可控的因素也非常多,例如挖掘機把光纖挖斷,中美海底電纜被拖船扯斷、骨幹網故障等,這些故障是第三方維護,業務方根本無能為力也無法預知。
例如廣州機房到北京機房,正常情況下rtt大約是50ms左右,遇到網路波動之類的情況,rtt可能飆公升到500ms甚至1s,更不用說經常發生的線路丟包問題,那延遲可能就是幾秒幾十秒了。
因此「實時異地多活」是不可能實現的,因為不管是購買優質的運營商網路,還是採用雲方案,甚至是自己拉光纖,都不可能突破物理上的限制,也不可能預防所有的意外情況。在設計異地多活方案的時候,業務上必須考慮這種時延或者中斷的情況,不能認為底層傳輸是絕對可靠的。
impossible mission2 - 所有使用者異地多活
不能實現「實時異地多活」就意味著某些極端情況下,肯定會有部分使用者的資料無法及時同步到異地機房,這部分使用者的業務在切換到異地機房後短時間內會異常。比如說小明在a機房成功發布了一條#某某明星出軌#相關的微博,此時a機房故障,資料還沒有同步到b機房,我們將業務切換到b機房,此時小明登入到b機房就看不到自己剛才發的微博了!
這種情況下,運氣好一些的話(比如說只是網路裝置壞了)需要等到a機房業務恢復,資料重新同步到b機房;運氣不好的話(比如說機器壞了,硬碟沒壞)需要人工來修復資料,可能耗時幾十分鐘,也可能耗時幾個小時;運氣最差的情況下(比如說機房**,硬碟被燒掉了)可能這些未同步的資料就永久丟失了。
站在使用者的角度這樣肯定很不爽(甚至直接打**投訴開罵之類的),但這種現象也是無法完全避免的,異地多活不能保證每乙個使用者的業務無論在什麼場景下都不受損,只要能保證絕大部分使用者的業務在異常的場景下繼續可用,就是很好的異地多活方案了。
雖然我們無法做到100%可用性,但並不意味著我們什麼都不能做,除了抓緊時間恢復業務恢復資料外,為了讓使用者心裡更好受一些,我們可以採取一些措施進行安撫或者補償,例如:安撫、掛公告(「技術哥哥正在緊急處理」)、事後補償(代金券、小禮包)等。
impossible mission3 - 「所有業務異地多活」
異地多活效果看起來很誘人,但如果不假思索貪大求全的要求所有業務都實現異地多活的話,就會把自己帶到坑里去。
第乙個原因是異地多活是有成本的,包括開發成本和維護成本。需要實現異地多活的業務越多,方案越複雜,投入的設計開發時間越多;同時維護成本也會越高,需要更多的機器,需要更多的頻寬。
第二個原因是有的業務理論上就無法實現異地多活。典型的有「餘額」和「庫存」這兩個業務。
以餘額為例,假設我們實現了餘額的異地多活業務,使用者小明有10000塊錢,在a機房給女友轉賬了5000塊,還剩餘5000塊;如果此時a機房異常且資料還沒同步到b機房,小明登入到b機房發現自己又有10000塊了,小明感覺中彩票了,趕緊又轉了10000塊給女友,最後出現了小明只有10000塊卻轉賬了15000塊的問題,對於和資金相關的業務,這樣的問題是絕對無法容忍的,哪怕乙個使用者有問題都不行。
所以,異地多活也不能保證所有業務都異地多活,在設計異地多活方案的時候,需要從業務和使用者的角度出發,識別出核心和關鍵業務,明確哪些業務是必須實現異地多活,哪些是可以不實現異地多活,哪些是不能實現異地多活的。比如「登入」必須實現異地多活、「註冊」和「修改使用者資訊」不一定要實現異地多活。
impossible mission4 - 「通用的異地多活」
異地多活方案設計的關鍵是資料同步,提到資料同步我們自然而然的就想到了底層儲存的同步功能,例如oracle的資料複製、mysql的資料同步、redis的資料集群、雲資料庫跨機房複製等。如果使用這些底層儲存方案的同步功能就能實現異地多活,那異地多活方案實現就很輕鬆了。
但現實顯然沒有這麼美好,原因就在於這些底層儲存的同步方案是通用的解決方案,無法基於業務的特點來有針對性的處理,而且這些底層同步方案一樣會有bug,一樣會延遲。以mysql為例,mysql5.1版本的複製是單執行緒的複製,在網路抖動或者大量資料同步的時候,經常發生延遲較長的問題,短則延遲十幾秒,長則可能達到十幾分鐘。而且即使我們通過監控的手段知道了mysql同步時延較長,也難以採取什麼措施,只能幹等。
所以只通過底層儲存的同步方案來實現異地多活是不可能的,我們不能把雞蛋都放到乙個籃子裡面,需要結合多種手段來實現業務資料同步或者讀取,例如:重新生成資料、訊息佇列非同步同步資料、多個機房間通過api直接訪問資料等。
一句話談異地多活
綜合前面的分析,異地多活設計的理念可以總結為一句話:「採用多種手段,保證絕大部分使用者的核心業務異地多活!」
不要被那些號稱用乙個工具或者方案解決所有問題的說法給騙了,工程領域不存在「銀彈」。
hive你不知道的操作有哪些
show functions 顯示hive當前的會話有多少函式可以使用 desc function concat 顯示concat函式的描述資訊 desc function extended concat 顯示如何使用concat函式等 show create table tablename 顯示當...
有哪些你不知道的閱讀原始碼的技巧
1.先看官方文件和架構圖 優秀的開源元件官方都會維護文件和架構圖,這份架構圖上或許有一些最重要的元件之間的關聯關係 或許哪些功能的呼叫流程 或許有一些別的東西,但是相信我,這些東西一定都是從總體來描述這個專案的,這個一定是你要閱讀原始碼時第乙個要看的 2.再看專案的組織結構 3.找到啟動demo,把...
宣傳片製作,你不知道的重點有哪些
宣傳片製作,你不知道的重點有哪些 企業宣傳片要突出主題和把握主題。作為乙個企業的新 名片 企業宣傳片的製作一定需要是嚴扣主題的。其中的素材 於各方各面,但是一部優秀的企業宣傳片並不是素材簡單的拼湊,而是需要拍攝和後期人員對素材進行整合和加工,從而挖掘出最有代表力和表現力的鏡頭,同時將藝術手法形式融入...