[ 收藏 ] [ 简体中文 ]  
臺灣貨到付款、ATM、超商、信用卡PAYPAL付款,4-7個工作日送達,999元臺幣免運費   在線留言 商品價格為新臺幣 
首頁 電影 連續劇 音樂 圖書 女裝 男裝 童裝 內衣 百貨家居 包包 女鞋 男鞋 童鞋 計算機周邊

商品搜索

 类 别:
 关键字:
    

商品分类

  •  管理

     一般管理学
     市场/营销
     会计
     金融/投资
     经管音像
     电子商务
     创业企业与企业家
     生产与运作管理
     商务沟通
     战略管理
     商业史传
     MBA
     管理信息系统
     工具书
     外文原版/影印版
     管理类职称考试
     WTO
     英文原版书-管理
  •  投资理财

     证券/股票
     投资指南
     理财技巧
     女性理财
     期货
     基金
     黄金投资
     外汇
     彩票
     保险
     购房置业
     纳税
     英文原版书-投资理财
  •  经济

     经济学理论
     经济通俗读物
     中国经济
     国际经济
     各部门经济
     经济史
     财政税收
     区域经济
     统计 审计
     贸易政策
     保险
     经济数学
     各流派经济学说
     经济法
     工具书
     通货膨胀
     财税外贸保险类考试
     英文原版书-经济
  •  社会科学

     语言文字
     社会学
     文化人类学/人口学
     新闻传播出版
     社会科学总论
     图书馆学/档案学
     经典名家作品集
     教育
     英文原版书-社会科学
  •  哲学

     哲学知识读物
     中国古代哲学
     世界哲学
     哲学与人生
     周易
     哲学理论
     伦理学
     哲学史
     美学
     中国近现代哲学
     逻辑学
     儒家
     道家
     思维科学
     马克思主义哲学
     经典作品及研究
     科学哲学
     教育哲学
     语言哲学
     比较哲学
  •  宗教

  •  心理学

  •  古籍

     经部  史类  子部  集部  古籍管理  古籍工具书  四库全书  古籍善本影音本  中国藏书
  •  文化

     文化评述  文化随笔  文化理论  传统文化  世界各国文化  文化史  地域文化  神秘文化  文化研究  民俗文化  文化产业  民族文化  书的起源/书店  非物质文化遗产  文化事业  文化交流  比较文化学
  •  历史

     历史普及读物
     中国史
     世界史
     文物考古
     史家名著
     历史地理
     史料典籍
     历史随笔
     逸闻野史
     地方史志
     史学理论
     民族史
     专业史
     英文原版书-历史
     口述史
  •  传记

  •  文学

  •  艺术

     摄影
     绘画
     小人书/连环画
     书法/篆刻
     艺术设计
     影视/媒体艺术
     音乐
     艺术理论
     收藏/鉴赏
     建筑艺术
     工艺美术
     世界各国艺术概况
     民间艺术
     雕塑
     戏剧艺术/舞台艺术
     艺术舞蹈
     艺术类考试
     人体艺术
     英文原版书-艺术
  •  青春文学

  •  文学

     中国现当代随笔
     文集
     中国古诗词
     外国随笔
     文学理论
     纪实文学
     文学评论与鉴赏
     中国现当代诗歌
     外国诗歌
     名家作品
     民间文学
     戏剧
     中国古代随笔
     文学类考试
     英文原版书-文学
  •  法律

     小说
     世界名著
     作品集
     中国古典小说
     四大名著
     中国当代小说
     外国小说
     科幻小说
     侦探/悬疑/推理
     情感
     魔幻小说
     社会
     武侠
     惊悚/恐怖
     历史
     影视小说
     官场小说
     职场小说
     中国近现代小说
     财经
     军事
  •  童书

  •  成功/励志

  •  政治

  •  军事

  •  科普读物

  •  计算机/网络

     程序设计
     移动开发
     人工智能
     办公软件
     数据库
     操作系统/系统开发
     网络与数据通信
     CAD CAM CAE
     计算机理论
     行业软件及应用
     项目管理 IT人文
     计算机考试认证
     图形处理 图形图像多媒体
     信息安全
     硬件
     项目管理IT人文
     网络与数据通信
     软件工程
     家庭与办公室用书
  •  建筑

     执业资格考试用书  室内设计/装潢装修  标准/规范  建筑科学  建筑外观设计  建筑施工与监理  城乡规划/市政工程  园林景观/环境艺术  工程经济与管理  建筑史与建筑文化  建筑教材/教辅  英文原版书-建筑
  •  医学

     中医
     内科学
     其他临床医学
     外科学
     药学
     医技学
     妇产科学
     临床医学理论
     护理学
     基础医学
     预防医学/卫生学
     儿科学
     医学/药学考试
     医院管理
     其他医学读物
     医学工具书
  •  自然科学

     数学
     生物科学
     物理学
     天文学
     地球科学
     力学
     科技史
     化学
     总论
     自然科学类考试
     英文原版书-自然科学
  •  工业技术

     环境科学
     电子通信
     机械/仪表工业
     汽车与交通运输
     电工技术
     轻工业/手工业
     化学工业
     能源与动力工程
     航空/航天
     水利工程
     金属学与金属工艺
     一般工业技术
     原子能技术
     安全科学
     冶金工业
     矿业工程
     工具书/标准
     石油/天然气工业
     原版书
     武器工业
     英文原版书-工业技
  •  农业/林业

     园艺  植物保护  畜牧/狩猎/蚕/蜂  林业  动物医学  农作物  农学(农艺学)  水产/渔业  农业工程  农业基础科学  农林音像
  •  外语

  •  考试

  •  教材

  •  工具书

  •  中小学用书

  •  中小学教科书

  •  动漫/幽默

  •  烹饪/美食

  •  时尚/美妆

  •  旅游/地图

  •  家庭/家居

  •  亲子/家教

  •  两性关系

  •  育儿/早教

  •  保健/养生

  •  体育/运动

  •  手工/DIY

  •  休闲/爱好

  •  英文原版书

  •  港台图书

  •  研究生
     工学
     公共课
     经济管理
     理学
     农学
     文法类
     医学

  •  音乐
     音乐理论

     声乐  通俗音乐  音乐欣赏  钢琴  二胡  小提琴
  • 從Paxos到Zookeeper:分布式一致性原理與實踐
    該商品所屬分類:計算機/網絡 -> 軟件工程
    【市場價】
    372-539
    【優惠價】
    233-337
    【作者】 倪超著 
    【所屬類別】 圖書  計算機/網絡  軟件工程/開發項目管理 
    【出版社】電子工業出版社 
    【ISBN】9787121249679
    【折扣說明】一次購物滿999元台幣免運費+贈品
    一次購物滿2000元台幣95折+免運費+贈品
    一次購物滿3000元台幣92折+免運費+贈品
    一次購物滿4000元台幣88折+免運費+贈品
    【本期贈品】①優質無紡布環保袋,做工棒!②品牌簽字筆 ③品牌手帕紙巾
    版本正版全新電子版PDF檔
    您已选择: 正版全新
    溫馨提示:如果有多種選項,請先選擇再點擊加入購物車。
    *. 電子圖書價格是0.69折,例如了得網價格是100元,電子書pdf的價格則是69元。
    *. 購買電子書不支持貨到付款,購買時選擇atm或者超商、PayPal付款。付款後1-24小時內通過郵件傳輸給您。
    *. 如果收到的電子書不滿意,可以聯絡我們退款。謝謝。
    內容介紹



    開本:16開
    紙張:膠版紙
    包裝:平裝-膠訂

    是否套裝:否
    國際標準書號ISBN:9787121249679
    作者:倪超著

    出版社:電子工業出版社
    出版時間:2015年02月 

        
        
    "

    產品特色

    編輯推薦

    國內罕見繫統講解ZooKeeper這一應用廣泛、成熟的分布式協調框架之技術書。


    原理深入,闡述清晰,覆蓋ACID、CAP、BASE,二階段/三階段提交,Paxos、ZAB協議等熱門話題。


    徹底剖析分布式一致性問題,並給出相應繫統思路,以及完整解決方案及實戰參考。


    無論開發人員,還是運維人士,都可通過書中ZooKeeper使用方法、內部實現及運維技巧來全面提升。

     
    內容簡介

    《Paxos到Zookeeper 分布式一致性原理與實踐》從分布式一致性的理論出發,向讀者簡要介紹幾種典型的分布式一致性協議,以及解決分布式一致性問題的思路,其中重點講解了Paxos和ZAB協議。同時,本書深入介紹了分布式一致性問題的工業解決方案——ZooKeeper,並著重向讀者展示這一分布式協調框架的使用方法、內部實現及運維技巧,旨在幫助讀者全面了解ZooKeeper,並更好地使用和運維ZooKeeper。全書共8章,分為五部分:前一部分(第1章)主要介紹了計算機繫統從集中式向分布式繫統演變過程中面臨的挑戰,並簡要介紹了ACID、CAP和BASE等經典分布式理論;第二部分(第2~4章)介紹了2PC、3PC和Paxos三種分布式一致性協議,並著重講解了ZooKeeper中使用的一致性協議——ZAB協議;第三部分(第5~6章)介紹了ZooKeeper的使用方法,包括客戶端API的使用以及對ZooKeeper服務的部署與運行,並結合真實的分布式應用場景,總結了ZooKeeper使用的*實踐;第四部分(第7章)對ZooKeeper的架構設計和實現原理進行了深入分析,包含繫統模型、Leader選舉、客戶端與服務端的工作原理、請求處理,以及服務器角色的工作流程和數據存儲等;第五部分(第8章)介紹了ZooKeeper的運維實踐,包括配置詳解和監控管理等,重點講解了如何構建一個高可用的ZooKeeper服務。

    作者簡介

    倪超,阿裡巴巴集團高級研發工程師,國家認證繫統分析師,畢業於杭州電子科技大學計算機繫。2010年加入阿裡巴巴中間件團隊擔任研發實習崗位,一直從事ZooKeeper的開發與運維工作,從中學習與總結了不少分布式一致性相關的理論與實踐經驗,尤其對ZooKeeper及其相關技術有非常深入的研究。目前在中間件團隊專家組任職產品經理,負責分布式產品的產品化和雲計算化改造工作。

    目錄
    第1章 分布式架構
    1.1 從集中式到分布式
    1.1.1 集中式的特點
    1.1.2 分布式的特點
    1.1.3 分布式環境的各種問題
    1.2 從ACID到CAP/BASE
    1.2.1 ACID
    1.2.2 分布式事務
    1.2.3 CAP和BASE理論
    小結

    第2章 一致性協議
    2.1 2PC與3PC
    2.1.1 2PC

    第1章 分布式架構
    1.1 從集中式到分布式
    1.1.1 集中式的特點
    1.1.2 分布式的特點
    1.1.3 分布式環境的各種問題
    1.2 從ACID到CAP/BASE
    1.2.1 ACID
    1.2.2 分布式事務
    1.2.3 CAP和BASE理論
    小結

    第2章 一致性協議
    2.1 2PC與3PC
    2.1.1 2PC
    2.1.2 3PC
    2.2 Paxos算法
    2.2.1 追本溯源
    2.2.2 Paxos理論的誕生
    2.2.3 Paxos算法詳解
    小結

    第3章 Paxos的工程實踐
    3.1 Chubby
    3.1.1 概述
    3.1.2 應用場景
    3.1.3 設計目標
    3.1.4 Chubby技術架構
    3.1.5 Paxos協議實現
    3.2 Hypertable
    3.2.1 概述
    3.2.2 算法實現
    小結

    第4章 ZooKeeper與Paxos
    4.1 初識ZooKeeper
    4.1.1 ZooKeeper介紹
    4.1.2 ZooKeeper從何而來
    4.1.3 ZooKeeper的基本概念
    4.1.4 為什麼選擇ZooKeeper
    4.2 ZooKeeper的ZAB協議
    4.2.1 ZAB協議
    4.2.2 協議介紹
    4.2.3 深入ZAB協議
    4.2.4 ZAB與Paxos算法的聯繫與區別
    小結

    第5章 使用ZooKeeper
    5.1 部署與運行
    5.1.1 繫統環境
    5.1.2 集群與單機
    5.1.3 運行服務
    5.2 客戶端腳本
    5.2.1 創建
    5.2.2 讀取
    5.2.3 更新
    5.2.4 刪除
    5.3 Java客戶端API使用
    5.3.1 創建會話
    5.3.2 創建節點
    5.3.3 刪除節點
    5.3.4 讀取數據
    5.3.5 更新數據
    5.3.6 檢測節點是否存在
    5.3.7 權限控制
    5.4 開源客戶端
    5.4.1 ZkClient
    5.4.2 Curator
    小結

    第6章 ZooKeeper的典型應用場景
    6.1 典型應用場景及實現注
    6.1.1 數據發布/訂閱
    6.1.2 負載均衡
    6.1.3 命名服務
    6.1.4 分布式協調/通知
    6.1.5 集群管理
    6.1.6 Master選舉
    6.1.7 分布式鎖
    6.1.8 分布式隊列
    小結
    6.2 ZooKeeper在大型分布式繫統中的應用
    6.2.1 Hadoop
    6.2.2 HBase
    6.2.3 Kafka
    6.3 ZooKeeper在阿裡巴巴的實踐與應用
    6.3.1 案例一 消息中間件:Metamorphosis
    6.3.2 案例二 RPC服務框架:Dubbo
    6.3.3 案例三 基於MySQL Binlog的增量訂閱和消費組件:Canal
    6.3.4 案例四 分布式數據庫同步繫統:Otter
    6.3.5 案例五 輕量級分布式通用搜索平臺:終搜
    6.3.6 案例六 實時計算引擎:JStorm
    小結

    第7章 ZooKeeper技術內幕
    7.1 繫統模型
    7.1.1 數據模型
    7.1.2 節點特性
    7.1.3 版本――保證分布式數據原子性操作
    7.1.4 Watcher――數據變更的通知
    7.1.5 ACL――保障數據的安全
    7.2 序列化與協議
    7.2.1 Jute介紹
    7.2.2 使用Jute進行序列化
    7.2.3 深入Jute
    7.2.4 通信協議
    7.3 客戶端
    7.3.1 一次會話的創建過程
    7.3.2 服務器地址列表
    7.3.3 ClientCnxn:網絡I/O
    7.4 會話
    7.4.1 會話狀態
    7.4.2 會話創建
    7.4.3 會話管理
    7.4.4 會話清理
    7.4.5 重連
    7.5 服務器啟動
    7.5.1 單機版服務器啟動
    7.5.2 集群版服務器啟動
    7.6 Leader選舉
    7.6.1 Leader選舉概述
    7.6.2 Leader選舉的算法分析
    7.6.3 Leader選舉的實現細節
    7.7 各服務器角色介紹
    7.7.1 Leader
    7.7.2 Follower
    7.7.3 Observer
    7.7.4 集群間消息通信
    7.8 請求處理
    7.8.1 會話創建請求
    7.8.2 SetData請求
    7.8.3 事務請求轉發
    7.8.4 GetData請求
    7.9 數據與存儲
    7.9.1 內存數據
    7.9.2 事務日志
    7.9.3 snapshot――數據快照
    7.9.4 初始化
    7.9.5 數據同步
    小結

    第8章 ZooKeeper運維
    8.1 配置詳解
    8.1.1 基本配置
    8.1.2 高級配置
    8.2 四字命令
    8.3 JMX
    8.3.1 開啟遠程JMX
    8.3.2 通過JConsole連接ZooKeeper
    8.4 監控
    8.4.1 實時監控
    8.4.2 數據統計
    8.5 構建一個高可用的集群
    8.5.1 集群組成
    8.5.2 容災
    8.5.3 擴容與縮容
    8.6 日常運維
    8.6.1 數據與日志管理
    8.6.2 Too many connections
    8.6.3 磁盤管理
    小結
    附錄A Windows平臺上部署ZooKeeper
    附錄B 從源代碼開始構建
    附錄C 各發行版本重大更新記錄
    附錄D ZooKeeper源代碼閱讀指引

    前言
    問題的提出
    在計算機科學領域,分布式一致性問題是一個相當重要,且被廣泛探索與論證的問題,通常存在於諸如分布式文件繫統、緩存繫統和數據庫等大型分布式存儲繫統中。
    什麼是分布式一致性?分布式一致性分為哪些類型?分布式繫統達到一致性後將會是一個什麼樣的狀態?如果失去了一致性約束,分布式繫統是否還可以依賴?如果一味地追求一致性,對繫統的整體架構和性能又有多大影響?這一繫列的問題,似乎都沒有一個嚴格意義上準確的定義和答案。
    終端用戶
    IT技術的發展,讓我們受益無窮,從日常生活的超市收銀,到高端精細的火箭發射,現代社會中幾乎所有行業,都離不開計算機技術的支持。
    盡管計算機工程師們創造出了很多高科技的計算機產品來解決我們日常踫到的問題,但用戶隻會傾向於選擇一些易用、好用的產品,那些難以使用的計算機產品終都會被淘汰——這種易用性,其實就是用戶體驗的一部分。

    問題的提出


    在計算機科學領域,分布式一致性問題是一個相當重要,且被廣泛探索與論證的問題,通常存在於諸如分布式文件繫統、緩存繫統和數據庫等大型分布式存儲繫統中。


    什麼是分布式一致性?分布式一致性分為哪些類型?分布式繫統達到一致性後將會是一個什麼樣的狀態?如果失去了一致性約束,分布式繫統是否還可以依賴?如果一味地追求一致性,對繫統的整體架構和性能又有多大影響?這一繫列的問題,似乎都沒有一個嚴格意義上準確的定義和答案。


    終端用戶


    IT技術的發展,讓我們受益無窮,從日常生活的超市收銀,到高端精細的火箭發射,現代社會中幾乎所有行業,都離不開計算機技術的支持。


    盡管計算機工程師們創造出了很多高科技的計算機產品來解決我們日常踫到的問題,但用戶隻會傾向於選擇一些易用、好用的產品,那些難以使用的計算機產品終都會被淘汰——這種易用性,其實就是用戶體驗的一部分。


    計算機產品的用戶體驗,可以分為便捷性、安全性和穩定性等方面。在本書中,我們主要討論的是用戶在使用計算機產品過程中遇到的那些和一致性有關的問題。在此之前,我們首先來看一下計算機產品的終端用戶是誰,他們的需求又是什麼。


    火車站售票


    假如說我們的終端用戶是一位經常做火車的旅行家,通常他是去車站的售票處購買車票,然後拿著車票去檢票口,再坐上火車,開始一段美好的旅行——一切似乎都是那麼和諧。想像一下,如果他選擇的目的地是杭州,而某一趟開往杭州的火車隻剩下一張車票了,可能在同一時刻,不同售票窗口的另一位乘客也購買了同一張車票。假如說售票繫統沒有進行一致性保障,兩人都購票成功了。而在檢票口檢票的時候,其中一位乘客會被告知他的車票無效——當然,現代的中國鐵路售票繫統已經很少出現這樣的問題了,但在這個例子中,我們可以看出,終端用戶對於我們的繫統的需求非常簡單:


    “請售票給我,如果沒有餘票了,請在售票的時候就告訴我票是無效票的。”


    這就對購票繫統提出了嚴格的一致性要求——繫統的數據(在本例中指的就是那趟開往杭州的火車的餘票數),無論在哪個售票窗口,每時每刻都必須是準確無誤的!


    銀行轉賬


    假如說我們的終端用戶是一名剛畢業的大學生,通常在拿到首月工資之後,都會選擇向家裡彙款。當他來到銀行櫃臺,完成轉賬操作後,銀行的櫃臺服務員會友善地提醒他:“您的轉賬將在N個工作日後到賬!”此時這名畢業生有一些沮喪,會對那名櫃臺服務員叮囑:“好吧,多久沒關繫,錢不要少就行了!”——這也成為了幾乎所有的用戶對於現代銀行繫統基本的需求。


    網上購物


    假如說我們的終端用戶是一名網上購物狂,當他看到一件庫存量為5的心儀商品,會迅速地確認購買,寫下收貨地址,然後下單——然而,在下單的那個瞬間,繫統可能會告知該用戶:“庫存量不足!”此時,絕大部分的消費者往往都會抱怨自己動作太慢,使得心愛的商品被其他人搶走了!


    但其實有過網購繫統開發經驗的工程師一定明白,在商品詳情頁面上顯示的那個庫存量,通常不是該商品的真實庫存量,隻有在真正下單購買的時候,繫統纔會檢查該商品的真實庫存量。但是,誰在意呢?


    在上面三個例子中,相信讀者一定已經看出來了,我們的終端用戶在使用不同的計算機產品時對於數據一致性的需求是不一樣的:


    有些繫統,既要快速地響應用戶,同時還要保證繫統的數據對於任意客戶端都是真實可靠的,就像火車站的售票繫統。


    還有些繫統,需要為用戶保證可靠的數據安全,雖然在數據一致性上存在延時,但結果務必保證嚴格的一致,就像銀行的轉賬繫統。


    另外的一些繫統,雖然向用戶展示了一些可以說是“錯誤”的數據,但是在整個繫統使用過程中,一定會在某一個流程上對繫統數據進行準確無誤的檢查,從而避免用戶發生不必要的損失,就像網購繫統。


    更新的並發性


    在計算機發展的早期階段,受到底層硬件技術的制約,同時也是由於人們對於計算機繫統的實際使用需求比較簡單,因此很多上層的應用程序架構都是單線程模型的。以C語言為例,其誕生於上世紀70年代,當時幾乎所有使用C語言開發的應用程序都是單線程的。從現在來看,單線程應用程序雖然在運行效率上無法和後來的多線程應用程序相比,但是在編程模型上相對簡單,因此能夠避免多線程程序中出現的不少並發問題。


    隨著計算機底層硬件技術和現代操作繫統的不斷發展,多線程技術開始被越來越多地引入到計算機編程模型之中,並對現代計算機應用程序的整體架構起到了至關重要的作用。


    多線程的引入,為應用程序帶來性能上的卓越提升,同時也帶來了一個很大的副作用,那就是並發。《深入理解計算機繫統》一書對並發進行了如下定義:如果邏輯控制流在時間上重疊,那麼它們就是並發的。這裡提到的邏輯控制流,通俗地講,就是一次程序操作,比如讀取或更新內存中變量的值。


    在本書後面的討論中,我們提到的“並發”都特指更新操作的並發,即有多個線程同時更新內存中變量的值——我們將這一現像稱為更新的並發性。


    分布式一致性問題


    在分布式繫統中另一個需要解決的重要問題就是數據的復制。在我們日常的開發經驗中,相信很多開發人員都踫到過這樣的問題:假設客戶端C1將繫統中的一個值K由V1更新為V2,但客戶端C2無法立即讀取到K的值,需要在一段時間之後纔能讀取到。讀者可能也已經猜到了,上面這個例子就是常見的數據庫之間復制的延時問題。


    分布式繫統對於數據的復制需求一般都來自於以下兩個原因。


    為了增加繫統的可用性,以防止單點故障引起的繫統不可用。


    提高繫統的整體性能,通過負載均衡技術,能夠讓分布在不同地方的數據副本都能夠為用戶提供服務。


    數據復制在可用性和性能方面給分布式繫統帶來的巨大好處是不言而喻的,然而數據復制所帶來的一致性挑戰,也是每一個繫統研發人員不得不面對的。


    所謂的分布式一致性問題,是指在分布式環境中引入數據復制機制後,不同數據節點間可能出現的,並無法依靠計算機應用程序自身解決的數據不一致情況。簡單地講,數據一致性就是指在對一個副本數據進行更新的同時,必須確保也能夠更新其他的副本,否則不同副本之間的數據將不再一致。


    那怎麼來解決這個問題呢?順著上面提到的復制延時問題,很快就有人想到了一種解決辦法,那就是:


    “既然是由於延時引起的問題,那我可以將寫入的動作阻塞,直到數據復制完成後,纔完成寫入動作。”


    沒錯,這似乎能解決問題,而且有一些繫統的架構也確實直接使用了這個思路。但這個思路在解決一致性問題的同時,又帶來了新的問題:寫入的性能。如果你的應用場景有非常多的寫請求,那麼使用這個思路之後,後續的寫請求都將會阻塞在前一個請求的寫操作上,導致繫統整理性能急劇下降。


    總的來講,我們無法找到一種能夠滿足分布式繫統所有繫統屬性的分布式一致性解決方案。因此,如何既保證數據的一致性,同時又不影響繫統運行的性能,是每一個分布式繫統都需要重點考慮和權衡的。於是,一致性級別由此誕生。


    強一致性


    這種一致性級別是符合用戶直覺的,它要求繫統寫入什麼,讀出來的也會是什麼,用戶體驗好,但實現起來往往對繫統的性能影響比較大。


    弱一致性


    這種一致性級別約束了繫統在寫入成功後,不承諾立即可以讀到寫入的值,也不具體承諾多久之後數據能夠達到一致,但會盡可能地保證到某個時間級別(比如秒級別)後,數據能夠達到一致狀態。弱一致性還可以再進行細分:


    會話一致性:該一致性級別隻保證對於寫入的值,在同一個客戶端會話中可以讀到一致的值,但其他的會話不能保證。


    用戶一致性:該一致性級別隻保證對於寫入的值,在同一個用戶中可以讀到一致的值,但其他用戶不能保證。


    本書將會從分布式一致性的理論出發,向讀者講解幾種典型的分布式一致性協議是如何解決分布式一致性問題的。之後,本書則會深入介紹分布式一致性問題的工業解決方案——ZooKeeper,並著重向讀者展示這一分布式協調框架的使用方法、內部實現以及運維技巧。


    致謝


    首先要感謝現在的部門老大蔣江偉先生。首次接觸蔣江偉是在2011年,當時參加了他的一個講座“淘寶前臺繫統優化實踐——吞吐量優化”,對其中關於“編寫GC友好代碼”的內容有不解之處,於是私下請教。他耐心的講解令我至今記憶猶新。兩年前,他全面負責中間件團隊之後,給予了我更大的幫助和鼓勵,使我得到了極大的進步,真的非常感謝。本書的問世,離不開他的推薦。也正是這一份寫作的責任感,讓我有決心和毅力來對整個ZooKeeper內容進行了一次全面的整理。在這裡,衷心祝福蔣江偉先生帶領中間件團隊走向新的高度。


    其次,本書的寫作,離不開各位小伙伴們的支持和幫助,他們是各領域的資深專家,我向他們征集了很多有營養的內容。在這裡,按照章節順序,依次表示感謝:許澤彬參與了“問題提出”的寫作;侯前明對Paxos算法的前世今生進行的整理;段培樂對晦澀的Paxos協議進行了細致的講解;姜宇向我提供了他對於分布式事務的見解;徐偉辰參與了分布式鎖服務Chubby相關的寫作;葉成旭提供了他在上家公司時對Hypertable的學習和研究成果;高偉細致地向我展示了Curator這一ZooKeeper客戶端的使用;陳傑提供了他在“自動化的DNS服務”場景中的經驗總結;曹龍參與了Hadoop相關內容的寫作;鄧明鋻則貢獻了他對HBase的深刻見解;作為產品的開源負責人,莊曉丹和王強提供了對消息中間件Metamorphosis技術架構的講解;李鼎則向我全面展示了RPC服務框架Dubbo的技術細節;樓江航向我提供了Canal和Otter這兩個分布式產品中的ZooKeeper應用場景;李雨前、柳明和溫朝凱則一起寫了終搜在產品演進過程中對ZooKeeper的使用和改進;封仲淹參與了對其自主產品JStorm的技術剖析……是你們一遍又一遍地對內容進行修改,纔使得本書內容更為豐滿。


    另外,也要感謝溫文鎏、王林、許澤彬、高偉和段培樂等人對全書的審閱,正是你們提出的寶貴建議,對完善本書提供了非常大的幫助。


    感謝現在的同事陸學慧先生,從2013年下半年開始,他全面接手對ZooKeeper的開發和運維,在他身上感受到的專業和創新精神讓我備受鼓舞。


    另外,感謝我的主管馬震先生,是他的幫助為我指引了方向,讓我有機會進入ZooKeeper的世界,並負責這個產品在公司的發展。盡管由於業務調整,馬震先生已經轉崗到其他部門,但依然由衷祝福他工作順利。


    還要感謝我的同事,阿裡巴巴店鋪平臺的侯前明先生。本來該書作者應該是我們兩個人,但是由於期間他的家庭又增加了一個小生命,導致其不得不中途退出。從本書的選題到寫作大綱的制定,他都傾注了不少心血,相信如果有他一起創作,本書內容會更加豐滿、深刻。這裡表達遺憾的同時,也向這位兩個孩子的父親送去祝福,祝願他生活美滿。


    感謝本書的責任編輯劉芸女士,是她反復審稿和編排,纔能讓本書的內容趨於完美。


    感謝本書的封面設計吳海燕女士,她的努力已經無需言表,在技術書上的這一前衛、極富視覺衝擊力的封面設計,深深震撼到了我,也希望讀者朋友們能夠喜歡。


    尤其感謝本書的策劃編輯張春雨先生。作為一個南方人,我很少有機會和那些有著一口北方腔的朋友交談,首次接到張春雨先生電話的時候,我纔真正領略了北京腔,也正是他的邀請,纔能讓我有機會進行本書的撰寫,同時在前後將近1年半的漫長寫作過程中,也是他的幫助和鼓勵,纔讓我堅持完成並不斷完善本書的內容。在這裡,也衷心祝願張春雨先生事業更上一層樓。


    還有我的父母,在過去的1年時間裡,多次放假沒有回家,盡管父母一直鼓勵我專注工作,專注於自己的事業,但我深知他們內心對兒子的牽掛,在這裡也深深地向他們道一聲:“謝謝”,也謹以此書獻給我親愛的爸爸媽媽。


    倪超


    2014年12月於杭州淘寶城

    媒體評論


    ★分布式一致性是中國銀聯風控繫統架構與設計的重要目標,新一代的銀聯反洗錢交易實時分析繫統采用 Storm 進行大數據的實時計算,ZooKeeper 作為 Storm 的重要組成部分,為數據一致性提供了關鍵保障。本書深入淺出地描述了分布式一致性這一問題的由來,並對 ZooKeeper 在 Storm、Hadoop 和 HBase 等大型分布式繫統中的應用場景進行了詳盡介紹,針對 ZooKeeper在分布式繫統中的業務實踐與運維保障提供了重要參考。

    ★分布式地理信息繫統的研發挑戰主要在於它的地理信息共享和分布式協調操作,ZooKeeper 作為一個針對大型分布式繫統的高可靠協調繫統,提供的功能包括:配置維護、名字服務、分布式同步和組服務等,正好能夠解決地信繫統中的諸多分布式一致性問題。該書兼顧分布式一致性的理論和實踐,並重點講解了 ZooKeeper,適合不同層次的讀者閱讀。

     


    ★感謝軟件開源和知識開源,新浪愛彩利用各開源軟件和算法,構建了核心交易繫統和分布式中間件繫統:利用ZooKeeper 構建了分布式 ID 生成器、分布式單例控制器、Dubbo RPC 框架,以及基於 Hadoop/JStorm/Spark 體繫的業務繫統,等等。ZooKeeper 的穩定性和對一致性的保證一直為業界所稱道,在大量的分布式繫統和開源組件中得到應用。本書是作者在長期使用 ZooKeeper 後深入研究其算法原理和源代碼的總結,將對讀者在分布式一致性的理論學習與實踐上有啟發意義。


    ——新浪愛彩首席架構師周鋒




    ★分布式一致性是中國銀聯風控繫統架構與設計的重要目標,新一代的銀聯反洗錢交易實時分析繫統采用 Storm 進行大數據的實時計算,ZooKeeper 作為 Storm 的重要組成部分,為數據一致性提供了關鍵保障。本書深入淺出地描述了分布式一致性這一問題的由來,並對 ZooKeeper 在 Storm、Hadoop 和 HBase 等大型分布式繫統中的應用場景進行了詳盡介紹,針對 ZooKeeper在分布式繫統中的業務實踐與運維保障提供了重要參考。


    ——中國銀聯反洗錢繫統核心負責人羅科勤




    ★分布式地理信息繫統的研發挑戰主要在於它的地理信息共享和分布式協調操作,ZooKeeper 作為一個針對大型分布式繫統的高可靠協調繫統,提供的功能包括:配置維護、名字服務、分布式同步和組服務等,正好能夠解決地信繫統中的諸多分布式一致性問題。該書兼顧分布式一致性的理論和實踐,並重點講解了 ZooKeeper,適合不同層次的讀者閱讀。


    ——浙江省測繪局地信繫統設計師王浩烽




    ★騰訊在 2010 年啟動建設開放雲平臺時,面臨著海量第三方虛擬機之間訪問限制規則以及內網透明負載均衡配置的管理等問題。引入 ZooKeeper 之後,一直穩定運行至今,利用其發布訂閱特性很好地保證了規則數據和配置信息的一致性,確保了服務的可用性。本書從分布式一致性理論出發,再以ZooKeeper 繫統為例詳盡地介紹了這個開源繫統的架構與實現,並結合實際的應用場景和運維經驗為在實戰中面臨分布式問題的讀者提供了重要參考。


    ——騰訊企業級產品中心架構師陳盛龍




    ★一致性是計算機學科中“硬”和重要的問題之一,可見寫這樣一個主題挑戰之大。阿裡巴巴業務龐大,倪超之前維護的為整個集團提供一致性方案的 ZooKeeper 集群,場景之復雜、規模之大在國內甚至世界上都可能是罕見的。本人由於工作需要對 Paxos 和 ZooKeeper 進行了粗淺的學習,所以有機會和倪超有過這方面的交流,樂自不言,獲益彼多。本書兼顧理論與實踐,希望讓讀者讀完之後有所提升:使用上知其所以然,架構上能選擇出合適又低成本的方案。


    ——阿裡巴巴 Dubbo 框架、PaaS 平臺資深架構師 & 核心開發  李鼎




    ★在我的工作經歷中,有多次與分布式繫統的配置管理中心打過交道,比如之前在老東家阿裡巴巴負責 HSF 服務框架,以及*近在陌陌負責的 MOA 服務框架的工作。基於簡單可用的原則,這些場景都沒有選擇使用 ZooKeeper,而是自己實現了配置管理繫統。但*近在參與分布式緩存服務建設的過程中,我們發現已經無法再繞開分布式協調問題,這時,ZooKeeper作為行業的成熟實踐就成了我們的優選。這本書的作者倪超是我在阿裡的同事,一直從事著與 ZooKeeper 相關的工作  在這個領域積累了豐富的經驗。本書從理論、設計實現和應用場景等多個方面對 ZooKeeper 進行了深入介紹,非常值得一讀。


    ——陌陌基礎平臺部主管宓學強




    ★搜狐從 2009 年微博時代初期就利用 ZooKeeper 的發布與訂閱模型實現了對 CDN URL 和一些基本管理配置的動態加載。至今 ZooKeeper 已經被運用在了搜狐各大業務線上,完成了許多分布式高可用服務的構建,範圍涉及分布式緩存、服務化框架和前端業務繫統等等,幫助團隊解決了分布式方面的主要技術障礙,大大提高了業務穩定性和運維效率。本書全面詳盡地介紹了分布式環境中各個典型場景下的 ZooKeeper 應用實例,為讀者構建自己的分布式高可用服務提供了參考。


    ——搜狐移動事業部高級運維主管劉鵬

    在線試讀
    第1章
    分布式架構
    隨著計算機繫統規模變得越來越大,將所有的集中部署在一個或若干個大型機上的體繫結構,已經越來越不能滿足當今計算機繫統,尤其是大型互聯網繫統的快速發展,各種靈活多變的繫統架構模型層出不窮。同時,隨著微型計算機的出現,越來越多廉價的PC機成為了各大企業IT架構的,分布式的處理方式越來越受到業界的青睞——計算機繫統正在經歷一場前所未有的從集中式向分布式架構的變革。
    1.1 從集中式到分布式
    自20世紀60年代大型主機被發明出來以後,憑借其超強的計算和I/O處理能力以及在穩定性和安全性方面的卓越表現,在很長一段時間內,大型主機引領了計算機行業以及商業計算領域的發展。在大型主機的研發上知名的當屬IBM,其主導研發的革命性產品System/360繫列大型主機,是計算機發展史上的一個裡程碑,與波音707和福特T型車齊名,被譽為20世紀重要的三大商業成就,並一度成為了大型主機的代名詞。從那時起,IT界進入了大型主機時代。
    伴隨著大型主機時代的到來,集中式的計算機繫統架構也成為了主流。在那個時候,由於大型主機卓越的性能和良好的穩定性,其在單機處理能力方面的優勢非常明顯,使得IT繫統快速進入了集中式處理階段,其對應的計算機繫統稱為集中式繫統。但從20世紀80年代以來,計算機繫統向網絡化和微型化的發展日趨明顯,傳統的集中式處理模式越來越不能適應人們的需求。
    首先,大型主機的人纔培養成本非常之高。通常一臺大型主機彙集了大量精密的計算機組件,操作非常復雜,這對一個運維人員掌握其技術細節提出了非常高的要求。
    其次,大型主機也是非常昂貴的。通常一臺配置較好的IBM大型主機,其售價可能在上甚至更高,因此也隻有像政府、金融和電信等企業纔有能力采購大型主機。
    另外,集中式繫統具有明顯的單點問題。大型主機雖然在性能和穩定性方面表現卓越,但這並不代表其永遠不會出現故障。一旦一臺大型主機出現了故障,那麼整個繫統將處於不可用狀態,其後果相當嚴重。後,隨著業務的不斷發展,用戶訪問量迅速提高,計算機繫統的規模也在不斷擴大,在單一大型主機上進行繫統的擴容往往比較困難。
    而另一方面,隨著PC機性能的不斷提升和網絡技術的快速普及,大型主機的市場份額變得越來越小,很多企業開始放棄原來的大型主機,而改用小型機和普通PC服務器來搭建分布式的計算機繫統。

    第1章
    分布式架構
    隨著計算機繫統規模變得越來越大,將所有的集中部署在一個或若干個大型機上的體繫結構,已經越來越不能滿足當今計算機繫統,尤其是大型互聯網繫統的快速發展,各種靈活多變的繫統架構模型層出不窮。同時,隨著微型計算機的出現,越來越多廉價的PC機成為了各大企業IT架構的,分布式的處理方式越來越受到業界的青睞——計算機繫統正在經歷一場前所未有的從集中式向分布式架構的變革。
    1.1 從集中式到分布式
    自20世紀60年代大型主機被發明出來以後,憑借其超強的計算和I/O處理能力以及在穩定性和安全性方面的卓越表現,在很長一段時間內,大型主機引領了計算機行業以及商業計算領域的發展。在大型主機的研發上知名的當屬IBM,其主導研發的革命性產品System/360繫列大型主機,是計算機發展史上的一個裡程碑,與波音707和福特T型車齊名,被譽為20世紀重要的三大商業成就,並一度成為了大型主機的代名詞。從那時起,IT界進入了大型主機時代。
    伴隨著大型主機時代的到來,集中式的計算機繫統架構也成為了主流。在那個時候,由於大型主機卓越的性能和良好的穩定性,其在單機處理能力方面的優勢非常明顯,使得IT繫統快速進入了集中式處理階段,其對應的計算機繫統稱為集中式繫統。但從20世紀80年代以來,計算機繫統向網絡化和微型化的發展日趨明顯,傳統的集中式處理模式越來越不能適應人們的需求。
    首先,大型主機的人纔培養成本非常之高。通常一臺大型主機彙集了大量精密的計算機組件,操作非常復雜,這對一個運維人員掌握其技術細節提出了非常高的要求。
    其次,大型主機也是非常昂貴的。通常一臺配置較好的IBM大型主機,其售價可能在上甚至更高,因此也隻有像政府、金融和電信等企業纔有能力采購大型主機。
    另外,集中式繫統具有明顯的單點問題。大型主機雖然在性能和穩定性方面表現卓越,但這並不代表其永遠不會出現故障。一旦一臺大型主機出現了故障,那麼整個繫統將處於不可用狀態,其後果相當嚴重。後,隨著業務的不斷發展,用戶訪問量迅速提高,計算機繫統的規模也在不斷擴大,在單一大型主機上進行繫統的擴容往往比較困難。
    而另一方面,隨著PC機性能的不斷提升和網絡技術的快速普及,大型主機的市場份額變得越來越小,很多企業開始放棄原來的大型主機,而改用小型機和普通PC服務器來搭建分布式的計算機繫統。
    其中為典型的就是阿裡巴巴集團的“去IOE”運動。從2008年開始,阿裡巴巴的各項業務都進入了井噴式的發展階段,這對於後臺IT繫統的計算與存儲能力提出了非常高的要求,一味地針對小型機和高端存儲進行不斷擴容,無疑會產生巨大的成本。同時,集中式的繫統架構體繫也存在諸多單點問題,完全無法滿足互聯網應用爆炸式的發展需求。因此,為了解決業務快速發展給IT繫統帶來的巨大挑戰,從2009年開始,阿裡集團啟動了“去IOE”計劃,其電商繫統開始正式邁入分布式繫統時代。
    1.1.1 集中式的特點
    所謂的集中式繫統就是指由一臺或多臺主計算機組成中心節點,數據集中存儲於這個中心節點中,並且整個繫統的所有都集中部署在這個中心節點上,繫統的所有功能均由其集中處理。也就是說,在集中式繫統中,每個終端或客戶端機器僅僅負責數據的錄入和輸出,而數據的存儲與控制處理完全交由主機來完成。
    集中式繫統的特點就是部署結構簡單。由於集中式繫統往往基於底層性能卓越的大型主機,因此無須考慮如何對服務進行多個節點的部署,也就不用考慮多個節點之間的分布式協作問題。
    1.1.2 分布式的特點
    在《分布式繫統概念與設計》注 一書中,對分布式繫統做了如下定義:
    分布式繫統是一個硬件或軟件組件分布在不同的網絡計算機上,彼此之間僅僅通過消息傳遞進行通信和協調的繫統。
    上面這個簡單的定義涵蓋了幾乎所有有效地部署了網絡化計算機的繫統。嚴格地講,同一個分布式繫統中的計算機在空間部署上是可以隨意分布的,這些計算機可能被放在不同的機櫃上,也可能在不同的機房中,甚至分布在不同的城市。無論如何,一個標準的分布式繫統在沒有任何特定業務邏輯約束的情況下,都會有如下幾個特征。
    分布性
    分布式繫統中的多臺計算機都會在空間上隨意分布,同時,機器的分布情況也會隨時變動。
    對等性
    分布式繫統中的計算機沒有主/從之分,既沒有控制整個繫統的主機,也沒有被控制的從機,組成分布式繫統的所有計算機節點都是對等的。副本(Replica)是分布式繫統常見的概念之一,指的是分布式繫統對數據和服務提供的一種冗餘方式。在常見的分布式繫統中,為了對外提供高可用的服務,我們往往會對數據和服務進行副本處理。數據副本是指在不同的節點上持久化同一份數據,當某一個節點上存儲的數據丟失時,可以從副本上讀取到該數據,這是解決分布式繫統數據丟失問題為有效的手段。另一類副本是服務副本,指多個節點提供同樣的服務,每個節點都有能力接收來自外部的請求並進行相應的處理。
    並發性
    在“問題的提出”部分,我們已經提到過與“更新的並發性”相關的內容。在一個計算機網絡中,程序運行過程中的並發性操作是非常常見的行為,例如同一個分布式繫統中的多個節點,可能會並發地操作一些共享的資源,諸如數據庫或分布式存儲等,如何準確並高效地協調分布式並發操作也成為了分布式繫統架構與設計中的挑戰之一。
    缺乏全局時鐘
    在上面的講解中,我們已經了解到,一個典型的分布式繫統是由一繫列在空間上隨意分布的多個進程組成的,具有明顯的分布性,這些進程之間通過交換消息來進行相互通信。因此,在分布式繫統中,很難定義兩個事件究竟誰先誰後,原因就是因為分布式繫統缺乏一個全局的時鐘序列控制。關於分布式繫統的時鐘和事件順序,在Leslie Lamport注 的經典論文Time, Clocks, and the Ordering of Events in a Distributed System注 中已經做了非常深刻的講解。
    故障總是會發生
    組成分布式繫統的所有計算機,都有可能發生任何形式的故障。一個被大量工程實踐所檢驗過的黃金定理是:任何在設計階段考慮到的異常情況,一定會在繫統實際運行中發生,並且,在繫統實際運行過程中還會遇到很多在設計時未能考慮到的異常故障。所以,除非需求指標允許,在繫統設計時不能放過任何異常情況。
    1.1.3 分布式環境的各種問題
    分布式繫統體繫結構從其出現之初就伴隨著諸多的難題和挑戰,本節將向讀者簡要的介紹分布式環境中一些典型的問題。
    通信異常
    從集中式向分布式演變的過程中,必然引入了網絡因素,而由於網絡本身的不可靠性,因此也引入了額外的問題。分布式繫統需要在各個節點之間進行網絡通信,因此每次網絡通信都會伴隨著網絡不可用的風險,網絡光纖、路由器或是DNS等硬件設備或是繫統不可用都會導致終分布式繫統無法順利完成一次網絡通信。另外,即使分布式繫統各節點之間的網絡通信能夠正常進行,其延時也會遠大於單機操作。通常我們認為在現代計算機體繫結構中,單機內存訪問的延時在納秒數量級(通常是10ns左右),而正常的一次網絡通信的延遲在0.1~1ms左右(相當於內存訪問延時的105~106倍),如此巨大的延時差別,也會影響消息的收發的過程,因此消息丟失和消息延遲變得非常普遍。
    網絡分區
    當網絡由於發生異常情況,導致分布式繫統中部分節點之間的網絡延時不斷增大,終導致組成分布式繫統的所有節點中,隻有部分節點之間能夠進行正常通信,而另一些節點則不能——我們將這個現像稱為網絡分區,就是俗稱的“腦裂”。當網絡分區出現時,分布式繫統會出現局部小集群,在情況下,這些局部小集群會獨立完成原本需要整個分布式繫統纔能完成的功能,包括對數據的事務處理,這就對分布式一致性提出了非常大的挑戰。
    三態
    從上面的介紹中,我們已經了解到了在分布式環境下,網絡可能會出現各式各樣的問題,因此分布式繫統的每一次請求與響應,存在特有的“三態”概念,即成功、失敗與超時。在傳統的單機繫統中,應用程序在調用一個函數之後,能夠得到一個非常明確的響應:成功或失敗。而在分布式繫統中,由於網絡是不可靠的,雖然在絕大部分情況下,網絡通信也能夠接收到成功或失敗的響應,但是當網絡出現異常的情況下,就可能會出現超時現像,通常有以下兩種情況:
    由於網絡原因,該請求(消息)並沒有被成功地發送到接收方,而是在發送過程就發生了消息丟失現像。
    該請求(消息)成功的被接收方接收後,並進行了處理,但是在將響應反饋給發送方的過程中,發生了消息丟失現像。
    當出現這樣的超時現像時,網絡通信的發起方是無法確定當前請求是否被成功處理的。
    節點故障
    節點故障則是分布式環境下另一個比較常見的問題,指的是組成分布式繫統的服務器節點出現的宕機或“僵死”現像。通常根據經驗來說,每個節點都有可能會出現故障,並且每天都在發生。
    1.2 從ACID到CAP/BASE
    在上文中,我們講解了集中式繫統和分布式繫統各自的特點,同時也看到了在從集中式繫統架構向分布式繫統架構變遷的過程中會踫到的一繫列問題。接下來,我們再重點看看在分布式繫統事務處理與數據一致性上遇到的種種挑戰。
    1.2.1 ACID
    事務(Transaction)是由一繫列對繫統中數據進行訪問與更新的操作所組成的一個程序執行(Unit),狹義上的事務特指數據庫事務。一方面,當多個應用程序並發訪問數據庫時,事務可以在這些應用程序之間提供一個隔離方法,以防止彼此的操作互相干擾。另一方面,事務為數據庫操作序列提供了一個從失敗中恢復到正常狀態的方法,同時提供了數據庫即使在異常狀態下仍能保持數據一致性的方法。
    事務具有四個特征,分別是原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability),簡稱為事務的ACID特性。
    原子性
    事務的原子性是指事務必須是一個原子的操作。事務中包含的各項操作在一次執行過程中,隻允許出現以下兩種狀態之一。
    全部成功執行。
    全部不執行。
    任何一項操作失敗都將導致整個事務失敗,同時其他已經被執行的操作都將被撤銷並回滾,隻有所有的操作全部成功,整個事務纔算是成功完成。
    一致性
    事務的一致性是指事務的執行不能破壞數據庫數據的完整性和一致性,一個事務在執行之前和執行之後,數據庫都必須處於一致性狀態。也就是說,事務執行的結果必須是使數據庫從一個一致性狀態轉變到另一個一致性狀態,因此當數據庫隻包含成功事務提交的結果時,就能說數據庫處於一致性狀態。而如果數據庫繫統在運行過程中發生故障,有些事務尚未完成就被迫中斷,這些未完成的事務對數據庫所做的修改有一部分已寫入物理數據庫,這時數據庫就處於一種不正確的狀態,或者說是不一致的狀態。
    隔離性
    事務的隔離性是指在並發環境中,並發的事務是相互隔離的,一個事務的執行不能被其他事務干擾。也就是說,不同的事務並發操縱相同的數據時,每個事務都有各自完整的數據空間,即一個事務內部的操作及使用的數據對其他並發事務是隔離的,並發執行的各個事務之間不能互相干擾。
    在標準SQL規範中,定義了4個事務隔離級別,不同的隔離級別對事務的處理不同,如未授權讀取、授權讀取、可重復讀取和串行化注 。
    未授權讀取
    未授權讀取也被稱為讀未提交(Read Uncommitted),該隔離級別允許髒讀取,其隔離級別。換句話說,如果一個事務正在處理某一數據,並對其進行了更新,但同時尚未完成事務,因此還沒有進行事務提交;而與此同時,允許另一個事務也能夠訪問該數據。舉個例子來說,事務A和事務B同時進行,事務A在整個執行階段,會將某數據項的值從1開始,做一繫列加法操作(比如說加1操作)直到變成10之後進行事務提交,此時,事務B能夠看到這個數據項在事務A操作過程中的所有中間值(如1變成2、2變成3等),而對這一繫列的中間值的讀取就是未授權讀取。
    授權讀取
    授權讀取也被稱為讀已提交(Read Committed),它和未授權讀取非常相近,的區別就是授權讀取隻允許獲取已經被提交的數據。同樣以上面的例子來說,事務A和事務B同時進行,事務A進行與上述同樣的操作,此時,事務B無法看到這個數據項在事務A操作過程中的所有中間值,隻能看到終的10。另外,如果說有一個事務C,和事務A進行非常類似的操作,隻是事務C是將數據項從10加到20,此時事務B也同樣可以讀取到20,即授權讀取允許不可重復讀取。
    可重復讀取
    可重復讀取(Repeatable Read),簡單地說,就是保證在事務處理過程中,多次讀取同一個數據時,其值都和事務開始時刻是一致的。因此該事務級別禁止了不可重復讀取和髒讀取,但是有可能出現幻影數據。所謂幻影數據,就是指同樣的事務操作,在前後兩個時間段內執行對同一個數據項的讀取,可能出現不一致的結果。在上面的例子,可重復讀取隔離級別能夠保證事務B在次事務操作過程中,始終對數據項讀取到1,但是在下一次事務操作中,即使事務B(注意,事務名字雖然相同,但是指的是另一次事務操作)采用同樣的查詢方式,就可能會讀取到10或20。
    串行化
    串行化(Serializable)是嚴格的事務隔離級別。它要求所有事務都被串行執行,即事務隻能一個接一個地進行處理,不能並發執行。
    圖1-1展示了不同隔離級別下事務訪問數據的差異。
    圖1-1.4種隔離級別示意圖
    以上4個隔離級別的隔離性依次增強,分別解決不同的問題,表1-1對這4個隔離級別進行了一個簡單的對比。
    表1-1.隔離級別對比
    隔離級別 髒讀 可重復讀 幻讀
    未授權讀取 存在 不可以 存在
    授權讀取 不存在 不可以 存在
    可重復讀取 不存在 可以 存在
    串行化 不存在 可以 不存在
    事務隔離級別越高,就越能保證數據的完整性和一致性,但同時對並發性能的影響也越大。通常,對於絕大多數的應用程序來說,可以優先考慮將數據庫繫統的隔離級別設置為授權讀取,這能夠在避免髒讀取的同時保證較好的並發性能。盡管這種事務隔離級別會導致不可重復讀、虛讀和第二類丟失更新等並發問題,但較為科學的做法是在可能出現這類問題的個別場合中,由應用程序主動采用悲觀鎖或樂觀鎖來進行事務控制。
    持久性
    事務的持久性也被稱為永久性,是指一個事務一旦提交,它對數據庫中對應數據的狀態變更就應該是永久性的。換句話說,一旦某個事務成功結束,那麼它對數據庫所做的更新就必須被永久保存下來——即使發生繫統崩潰或機器宕機等故障,隻要數據庫能夠重新啟動,那麼一定能夠將其恢復到事務成功結束時的狀態。
    1.2.2 分布式事務
    隨著分布式計算的發展,事務在分布式計算領域中也得到了廣泛的應用。在單機數據庫中,我們很容易能夠實現一套滿足ACID特性的事務處理繫統,但在分布式數據庫中,數據分散在各臺不同的機器上,如何對這些數據進行分布式的事務處理具有非常大的挑戰。在1.1.3節中,我們已經講解了分布式環境中會踫到的種種問題,其中就包括機器宕機和各種網絡異常等。盡管存在這種種分布式問題,但是在分布式計算領域,為了保證分布式應用程序的可靠性,分布式事務是無法回避的。
    分布式事務是指事務的參與者、支持事務的服務器、資源服務器以及事務管理器分別位於分布式繫統的不同節點之上。通常一個分布式事務中會涉及對多個數據源或業務繫統的操作。
    我們可以設想一個典型的分布式事務場景:一個跨銀行的轉賬操作涉及調用兩個異地的銀行服務,其中一個是本地銀行提供的取款服務,另一個則是目標銀行提供的存款服務,這兩個服務本身是無狀態並且是互相獨立的,共同構成了一個完整的分布式事務。如果從本地銀行取款成功,但是因為某種原因存款服務失敗了,那麼就必須回滾到取款前的狀態,否則用戶可能會發現自己的錢不翼而飛了。
    從上面這個例子中,我們可以看到,一個分布式事務可以看作是由多個分布式的操作序列組成的,例如上面例子中的取款服務和存款服務,通常可以把這一繫列分布式的操作序列稱為子事務。因此,分布式事務也可以被定義為一種嵌套型的事務,同時也就具有了ACID事務特性。但由於在分布式事務中,各個子事務的執行是分布式的,因此要實現一種能夠保證ACID特性的分布式事務處理繫統就顯得格外復雜。
    1.2.3 CAP和BASE理論
    對於本地事務處理或者是集中式的事務處理繫統,很顯然我們可以采用已經被實踐證明很成熟的ACID模型來保證數據的嚴格一致性。而在1.2.2節中,我們也已經看到,隨著分布式事務的出現,傳統的單機事務模型已經無法勝任。尤其是對於一個高訪問量、高並發的互聯網分布式繫統來說,如果我們期望實現一套嚴格滿足ACID特性的分布式事務,很可能出現的情況就是在繫統的可用性和嚴格一致性之間出現衝突——因為當我們要求分布式繫統具有嚴格一致性時,很可能就需要犧牲掉繫統的可用性。但毋庸置疑的一點是,可用性又是一個所有消費者不允許我們討價還價的繫統屬性,比如說像淘寶網這樣的在線購物網站,就要求它能夠7?24小時不間斷地對外提供服務,而對於一致性,則更加是所有消費者對於一個軟件繫統的剛需。因此,在可用性和一致性之間永遠無法存在一個兩全其美的方案,於是如何構建一個兼顧可用性和一致性的分布式繫統成為了無數工程師探討的難題,出現了諸如CAP和BASE這樣的分布式繫統經典理論。
    CAP定理
    2000年7月,來自加州大學伯克利分校的Eric Brewer教授注 在ACM PODC(Principles of Distributed Computing)會議上,首次提出了著名的CAP猜想注 。2年後,來自麻省理工學院的Seth Gilbert和Nancy Lynch從理論上證明了Brewer教授CAP猜想的可行性注 ,從此,CAP理論正式在學術上成為了分布式計算領域的公認定理,並深深地影響了分布式計算的發展。
    CAP理論告訴我們,一個分布式繫統不可能同時滿足一致性(C:Consistency)、可用性(A:Availability)和分區容錯性(P:Partition tolerance)這三個基本需求,多隻能同時滿足其中的兩項。
    一致性
    在分布式環境中,一致性是指數據在多個副本之間是否能夠保持一致的特性。在一致性的需求下,當一個繫統在數據一致的狀態下執行更新操作後,應該保證繫統的數據仍然處於一致的狀態。
    對於一個將數據副本分布在不同分布式節點上的繫統來說,如果對個節點的數據進行了更新操作並且更新成功後,卻沒有使得第二個節點上的數據得到相應的更新,於是在對第二個節點的數據進行讀取操作時,獲取的依然是老數據(或稱為髒數據),這就是典型的分布式數據不一致情況。在分布式繫統中,如果能夠做到針對一個數據項的更新操作執行成功後,所有的用戶都可以讀取到其的值,那麼這樣的繫統就被認為具有強一致性(或嚴格的一致性)。
    可用性
    可用性是指繫統提供的服務必須一直處於可用的狀態,對於用戶的每一個操作請求總是能夠在有限的時間內返回結果。這裡我們重點看下“有限的時間內”和“返回結果”。
    “有限的時間內”是指,對於用戶的一個操作請求,繫統必須能夠在指定的時間(即響應時間)內返回對應的處理結果,如果超過了這個時間範圍,那麼繫統就被認為是不可用的。另外,“有限的時間內”是一個在繫統設計之初就設定好的繫統運行指標,通常不同的繫統之間會有很大的不同。比如說,對於一個在線搜索引擎來說,通常在0.5秒內需要給出用戶搜索關鍵詞對應的檢索結果。以Google為例,搜索“分布式”這一關鍵詞,Google能夠在0.3秒左右的時間,返回大約上千萬條檢索結果。而對於一個面向HIVE的海量數據查詢平臺來說,正常的一次數據檢索時間可能在20秒到30秒之間,而如果是一個時間跨度較大的數據內容查詢,“有限的時間”有時候甚至會長達幾分鐘。
    從上面的例子中,我們可以看出,用戶對於一個繫統的請求響應時間的期望值不盡相同。但是,無論繫統之間的差異有多大,相同的一點就是對於用戶請求,繫統必須存在一個合理的響應時間,否則用戶便會對繫統感到失望。
    “返回結果”是可用性的另一個非常重要的指標,它要求繫統在完成對用戶請求的處理後,返回一個正常的響應結果。正常的響應結果通常能夠明確地反映出對請求的處理結果,即成功或失敗,而不是一個讓用戶感到困惑的返回結果。
    讓我們再來看看上面提到的在線搜索引擎的例子,如果用戶輸入指定的搜索關鍵詞後,返回的結果是一個繫統錯誤,通常類似於“OutOfMemoryError”或“System Has Crashed”等提示語,那麼我們認為此時繫統是不可用的。
    分區容錯性
    分區容錯性約束了一個分布式繫統需要具有如下特性:分布式繫統在遇到任何網絡分區故障的時候,仍然需要能夠保證對外提供滿足一致性和可用性的服務,除非是整個網絡環境都發生了故障。
    網絡分區是指在分布式繫統中,不同的節點分布在不同的子網絡(機房或異地網絡等)中,由於一些特殊的原因導致這些子網絡之間出現網絡不連通的狀況,但各個子網絡的內部網絡是正常的,從而導致整個繫統的網絡環境被切分成了若干個孤立的區域。需要注意的是,組成一個分布式繫統的每個節點的加入與退出都可以看作是一個特殊的網絡分區。
    以上就是對CAP定理中一致性、可用性和分區容錯性的講解,通常使用圖1-2所示的示意圖來表示CAP定理。
    既然在上文中我們提到,一個分布式繫統無法同時滿足上述三個需求,而隻能滿足其中的兩項,因此在進行對CAP定理的應用時,我們就需要拋棄其中的一項,表1-2所示是拋棄CAP定理中任意一項特性的場景說明。
    圖1-2.CAP定理示意圖
    表1-2.CAP定理應用
    放棄CAP定理 說明
    放棄P 如果希望能夠避免繫統出現分區容錯性問題,一種較為簡單的做法是將所有的數據(或者僅僅是那些與事務相關的數據)都放在一個分布式節點上。這樣的做法雖然無法100%地保證繫統不會出錯,但至少不會踫到由於網絡分區帶來的負面影響。但同時需要注意的是,放棄P的同時也就意味著放棄了繫統的可擴展性
    放棄A 相對於放棄“分區容錯性”來說,放棄可用性則正好相反,其做法是一旦繫統遇到網絡分區或其他故障時,那麼受到影響的服務需要等待一定的時間,因此在等待期間繫統無法對外提供正常的服務,即不可用
    放棄C 這裡所說的放棄一致性,並不是完全不需要數據一致性,如果真是這樣的話,那麼繫統的數據都是沒有意義的,整個繫統也是沒有價值的。
    事實上,放棄一致性指的是放棄數據的強一致性,而保留數據的終一致性。這樣的繫統無法保證數據保持實時的一致性,但是能夠承諾的是,數據終會達到一個一致的狀態。這就引入了一個時間窗口的概念,具體多久能夠達到數據一致取決於繫統的設計,主要包括數據副本在不同節點之間的復制時間長短
    從CAP定理中我們可以看出,一個分布式繫統不可能同時滿足一致性、可用性和分區容錯性這三個需求。另一方面,需要明確的一點是,對於一個分布式繫統而言,分區容錯性可以說是一個基本的要求。為什麼這樣說,其實很簡單,因為既然是一個分布式繫統,那麼分布式繫統中的組件必然需要被部署到不同的節點,否則也就無所謂分布式繫統了,因此必然出現子網絡。而對於分布式繫統而言,網絡問題又是一個必定會出現的異常情況,因此分區容錯性也就成為了一個分布式繫統必然需要面對和解決的問題。因此繫統架構設計師往往需要把精力花在如何根據業務特點在C(一致性)和A(可用性)之間尋求平衡。
    BASE理論
    BASE是Basically Available(基本可用)、Soft state(軟狀態)和Eventually consistent(終一致性)三個短語的簡寫,是由來自eBay的架構師Dan Pritchett在其文章BASE: An Acid Alternative注 中次明確提出的。BASE是對CAP中一致性和可用性權衡的結果,其來源於對大規模互聯網繫統分布式實踐的總結,是基於CAP定理逐步演化而來的,其核心思想是即使無法做到強一致性(Strong consistency),但每個應用都可以根據自身的業務特點,采用適當的方式來使繫統達到終一致性(Eventual consistency)。接下來我們著重對BASE中的三要素進行詳細講解。
    基本可用
    基本可用是指分布式繫統在出現不可預知故障的時候,允許損失部分可用性——但請注意,這絕不等價於繫統不可用。以下兩個就是“基本可用”的典型例子。
    響應時間上的損失:正常情況下,一個在線搜索引擎需要在0.5秒之內返回給用戶相應的查詢結果,但由於出現故障(比如繫統部分機房發生斷電或斷網故障),查詢結果的響應時間增加到了1~2秒。
    功能上的損失:正常情況下,在一個電子商務網站上進行購物,消費者幾乎能夠順利地完成每一筆訂單,但是在一些節日大促購物高峰的時候,由於消費者的購物行為激增,為了保護購物繫統的穩定性,部分消費者可能會被引導到一個降級頁面。
    弱狀態
    弱狀態也稱為軟狀態,和硬狀態相對,是指允許繫統中的數據存在中間狀態,並認為該中間狀態的存在不會影響繫統的整體可用性,即允許繫統在不同節點的數據副本之間進行數據同步的過程存在延時。
    終一致性
    終一致性強調的是繫統中所有的數據副本,在經過一段時間的同步後,終能夠達到一個一致的狀態。因此,終一致性的本質是需要繫統保證終數據能夠達到一致,而不需要實時保證繫統數據的強一致性。
    亞馬遜首席技術官Werner Vogels在於2008年發表的一篇經典文章Eventually Consistent-
    Revisited中,對終一致性進行了非常詳細的介紹。他認為終一致性是一種特殊的弱一致性:繫統能夠保證在沒有其他新的更新操作的情況下,數據終一定能夠達到一致的狀態,因此所有客戶端對繫統的數據訪問都能夠獲取到的值。同時,在沒有發生故障的前提下,數據達到一致狀態的時間延遲,取決於網絡延遲、繫統負載和數據復制方案設計等因素。
    在實際工程實踐中,終一致性存在以下五類主要變種。
    因果一致性(Causal consistency)
    因果一致性是指,如果進程A在更新完某個數據項後通知了進程B,那麼進程B之後對該數據項的訪問都應該能夠獲取到進程A更新後的值,並且如果進程B要對該數據項進行更新操作的話,務必基於進程A更新後的值,即不能發生丟失更新情況。與此同時,與進程A無因果關繫的進程C的數據訪問則沒有這樣的限制。
    讀己之所寫(Read your writes)
    讀己之所寫是指,進程A更新一個數據項之後,它自己總是能夠訪問到更新過的值,而不會看到舊值。也就是說,對於單個數據獲取者來說,其讀取到的數據,一定不會比自己上次寫入的值舊。因此,讀己之所寫也可以看作是一種特殊的因果一致性。
    會話一致性(Session consistency)
    會話一致性將對繫統數據的訪問過程框定在了一個會話當中:繫統能保證在同一個有效的會話中實現“讀己之所寫”的一致性,也就是說,執行更能操作之後,客戶端能夠在同一個會話中始終讀取到該數據項的值。
    單調讀一致性(Monotonic read consistency)
    單調讀一致性是指如果一個進程從繫統中讀取出一個數據項的某個值後,那麼繫統對於該進程後續的任何數據訪問都不應該返回更舊的值。
    單調寫一致性(Monotonic write consistency)
    單調寫一致性是指,一個繫統需要能夠保證來自同一個進程的寫操作被順序地執行。
    以上就是終一致性的五類常見的變種,在實際繫統實踐中,可以將其中的若干個變種互相結合起來,以構建一個具有終一致性特性的分布式繫統。事實上,終一致性並不是隻有那些大型分布式繫統纔涉及的特性,許多現代的關繫型數據庫都采用了終一致性模型。在現代關繫型數據庫中,大多都會采用同步和異步方式來實現主備數據復制技術。在同步方式中,數據的復制過程通常是更新事務的一部分,因此在事務完成後,主備數據庫的數據就會達到一致。而在異步方式中,備庫的更新往往會存在延時,這取決於事務日志在主備數據庫之間傳輸的時間長短,如果傳輸時間過長或者甚至在日志傳輸過程中出現異常導致無法及時將事務應用到備庫上,那麼很顯然,從備庫中讀取的數據將是舊的,因此就出現了數據不一致的情況。當然,無論是采用多次重試還是人為數據訂正,關繫型數據庫還是能夠保證終數據達到一致——這就是繫統提供終一致性保證的經典案例。
    總的來說,BASE理論面向的是大型高可用可擴展的分布式繫統,和傳統事務的ACID特性是相反的,它完全不同於ACID的強一致性模型,而是提出通過犧牲強一致性來獲得可用性,並允許數據在一段時間內是不一致的,但終達到一致狀態。但同時,在實際的分布式場景中,不同和組件對數據一致性的要求是不同的,因此在具體的分布式繫統架構設計過程中,ACID特性與BASE理論往往又會結合在一起使用。
    小結
    計算機繫統從集中式向分布式的變革伴隨著包括分布式網絡、分布式事務和分布式數據一致性等在內的一繫列問題與挑戰,同時也催生了一大批諸如ACID、CAP和BASE等經典理論的快速發展。
    本章由計算機繫統從集中式向分布式發展的過程展開,圍繞在分布式架構發展過程中踫到的一繫列問題,結合ACID、CAP和BASE等分布式事務與一致性方面的經典理論,向讀者介紹了分布式架構。

















     
    網友評論  我們期待著您對此商品發表評論
     
    相關商品
    在線留言 商品價格為新臺幣
    關於我們 送貨時間 安全付款 會員登入 加入會員 我的帳戶 網站聯盟
    DVD 連續劇 Copyright © 2024, Digital 了得網 Co., Ltd.
    返回頂部