精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

FriendFeed 如何使用 MySQL 來存儲無模式的數據

數據庫 MySQL
我們使用MySQL存儲了FriendFeed的所有數據。數據庫隨著用戶基數的增長而增長了很多。現在已經存儲了超過2.5億條記錄與一堆涵蓋了從評論和“喜歡”到好友列表的其他數據。

背景

我們使用MySQL存儲了FriendFeed的所有數據。數據庫隨著用戶基數的增長而增長了很多。現在已經存儲了超過2.5億條記錄與一堆涵蓋了從評論和“喜歡”到好友列表的其他數據。

隨著數據的增長,我們也曾迭代地解決了隨著如此迅猛的增長而帶來的擴展性問題。我們的嘗試很有代表性,例如使用只讀mysql從節點和memcache來增加讀取吞吐量,對數據庫進行分片來提高寫入吞吐量。然而,隨著業務的增長,添加新功能比擴展既有功能以迎合更多的流量變得更加困難。

特別的,對 schema 做改動或為超過 1000-2000 萬行記錄的數據庫添加索引會將數據庫鎖住幾個小時。刪除舊索引也要占用這么多時間,但不刪除它們會影響性能;因為數據庫要持續地在每個INSERT上讀寫這些沒用的區塊,并將重要的區塊擠出了內存。為避免這些問題需要采取一些復雜的措施(例如在從節點上設置新的索引,然后將從節點與主節點對調),但這些措施會引發錯誤并且實施起來比較困難,它們阻礙了需要改動 schema/索引才能實現的新功能。由于數據庫的嚴重分散,MySQL 的關系特性(如join)對我們沒用,所以我們決定脫離 RDBMS。

雖然已有許多用于解決靈活 schema 數據存儲和運行時構建索引的問題(例如 CouchDB)的項目。但在大站點中卻沒有足夠廣泛地用到來說服人們使用。在我們看到和運行的測試中,這些項目要么不穩定,要么缺乏足夠的測試(參見這個有點過時的關于 CouchDB 的文章)。MySQL 不錯,它不會損壞數據;復制也沒問題,我們已經了解了它的局限。我們喜歡將 MySQL 用于存儲,僅僅是非關系型的存儲。

幾經思量,我們決定在 MySQL 上采用一種無模式的存儲系統,而不是使用一個完全沒接觸過的存儲系統。本文試圖描述這個系統的高級細節。我們很好奇其他大型網站是如何處理這些問題的,另外也希望我們完成的某些設計會對其他開發者有所幫助。

綜述

我們在數據庫中存儲的是無模式的屬性集(例如JSON對象或python字典)。存儲的記錄只需一個名為id的16字節的UUID屬性。對數據庫而言實體的其他部分是不可見的。我們可以簡單地存入新屬性來改變schema(可以簡單理解為數據表中只有兩個字段:id,data;其中data存儲的是實體的屬性集)。

我們通過保存在不同表中的索引來檢索數據。如果想檢索每個實體中的三個屬性,我們就需要三個數據表-每個表用于檢索某一特定屬性。如果不想再用某一索引了,我們要在代碼中停止該索引對應表的寫操作,并可選地刪除那個表。如果想添加個新索引,只需要為該索引新建個MySQL表,并啟動一個進程異步地為該表添加索引數據(不影響運行中的服務)。

最終,雖然我們的數據表增多了,但添加和刪除索引卻變得簡單了。我們大力改善了添加索引數據的進程(我們稱之為“清潔工")使其在快速添加索引的同時不會影響站點。我們可以在一天內完成新屬性的保存和索引,并且我們不需要對調主從MySQL數據庫,也不需要任何其他可怕的操作。

細節

MySQL 使用表保存我們的實體,一個表就像這樣 :

  1. CREATE TABLE entities ( 
  2. added_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
  3. id BINARY(16) NOT NULL
  4. updated TIMESTAMP NOT NULL
  5. body MEDIUMBLOB, 
  6. UNIQUE KEY (id), 
  7. KEY (updated) 
  8. ) ENGINE=InnoDB; 

之所以使用 added_id 個字段是因為 InnoDB 按物理主鍵順序存儲數據,自增長主鍵確保新實例在磁盤上按順序寫到老實體之后,這樣有助于分區讀寫(相對老的實體,新實體往往讀操作更頻繁,因為 FriendFeed 的 pages 是按時間逆序排列)。實體本身經 python 字典序列化后使用 zlib 壓縮存儲。

索引單獨存在一張表里,如果要創建索引,我們創建一張新表存儲我們想要索引的數據分片的所有屬性。例如,一個 FriendFeed 實體通過看上去是這樣的:

  1.     "id""71f0c4d2291844cca2df6f486e96e37c"
  2.     "user_id""f48b0440ca0c4f66991c4d5f6a078eaf"
  3.     "feed_id""f48b0440ca0c4f66991c4d5f6a078eaf"
  4.     "title""We just launched a new backend system for FriendFeed!"
  5.     "link""http://friendfeed.com/e/71f0c4d2-2918-44cc-a2df-6f486e96e37c"
  6.     "published": 1235697046, 
  7.     "updated": 1235697046, 

我們索引實體的屬性 user_id,這樣我們可以渲染一個頁面,包含一個已提交用戶的所有屬性。我們的索引表看起來是這樣的:

  1. CREATE TABLE index_user_id ( 
  2. user_id BINARY(16) NOT NULL
  3. entity_id BINARY(16) NOT NULL UNIQUE
  4. PRIMARY KEY (user_id, entity_id) 
  5. ) ENGINE=InnoDB; 

我們的數據存儲會自動為你維護索引,所以如果你要在我們存儲上述結構實體的數據存儲里開啟一個實例,你可以寫一段代碼(用 python):

  1. user_id_index = friendfeed.datastore.Index
  2. table="index_user_id", properties=["user_id"], shard_on="user_id"
  3. datastore = friendfeed.datastore.DataStore( 
  4. mysql_shards=["127.0.0.1:3306""127.0.0.1:3307"], 
  5. indexes=[user_id_index]) 
  6.  
  7. new_entity = { 
  8. "id": binascii.a2b_hex("71f0c4d2291844cca2df6f486e96e37c"), 
  9. "user_id": binascii.a2b_hex("f48b0440ca0c4f66991c4d5f6a078eaf"), 
  10. "feed_id": binascii.a2b_hex("f48b0440ca0c4f66991c4d5f6a078eaf"), 
  11. "title": u"We just launched a new backend system for FriendFeed!"
  12. "link": u"http://friendfeed.com/e/71f0c4d2-2918-44cc-a2df-6f486e96e37c"
  13. "published": 1235697046, 
  14. "updated": 1235697046, 
  15. datastore.put(new_entity) 
  16. entity = datastore.get(binascii.a2b_hex("71f0c4d2291844cca2df6f486e96e37c")) 
  17. entity = user_id_index.get_all(datastore, user_id=binascii.a2b_hex("f48b0440ca0c4f66991c4d5f6a078eaf")) 

上面的 Index 類在所有實體中查找 user_id,自動維護 index_user_id 表的索引。我們的數據庫是切分的,參數 shard_on 是用來確定索引是存儲在哪個分片上(這種情況下使用 entity["user_id"] % num_shards)。

你可以使用索引實例(見上面的 user_id_index.get_all)查詢一個索引,使用 python 寫的數據存儲代碼將表 index_user_id 和表 entities 合并。首先在所有數據庫分片中查詢表 index_user_id 獲取實體 ID 列,然后在 entities 提出數據。

新建一個索引,比如,在屬性 link 上,我們可以創建一個新表:

  1. CREATE TABLE index_link ( 
  2. link VARCHAR(735) NOT NULL
  3. entity_id BINARY(16) NOT NULL UNIQUE
  4. PRIMARY KEY (link, entity_id) 
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

我們可以修改數據存儲的初始化代碼以包含我們的新索引:

  1. user_id_index = friendfeed.datastore.Index
  2. table="index_user_id", properties=["user_id"], shard_on="user_id"
  3. link_index = friendfeed.datastore.Index
  4. table="index_link", properties=["link"], shard_on="link"
  5. datastore = friendfeed.datastore.DataStore( 
  6. mysql_shards=["127.0.0.1:3306""127.0.0.1:3307"], 
  7. indexes=[user_id_index, link_index]) 

我可以異步構建索引(特別是實時傳輸服務):

  1. ./rundatastorecleaner.py --index=index_link 

#p#

一致性與原子性

由于采用分區的數據庫,實體的索引可能存儲在與實體不同的分區中,這引起了一致性問題。如果進程在寫入所有索引表前崩潰了會怎樣?

許多有野心的 FriendFeed 工程師傾向于構建一個事務性協議,但我們希望盡可能地保持系統的簡潔。我們決定放寬限制:

  • 保存在主實體表中的屬性集是規范完整的
  • 索引不會對真實實體值產生影響

因此,往數據庫中寫入實體時我們采用如下步驟:

  1. 使用 InnoDB 的 ACID 屬性將實體寫入 entities 表。
  2. 將索引寫入所有分區中的索引表。

我們要記住從索引表中取出的數據可能是不準確的(例如如果寫操作沒有完成步驟2可能會影響舊屬性值)。為確保采用上面的限制能返回正確的實體,我們用索引表來決定要讀取哪些實體,但不要相信索引的完整性,要使用查詢條件對這些實體進行再過濾:

1.根據查詢條件從索引表中取得 entity_id

2.根據 entity_id 從 entities 表中讀取實體

3.根據實體的真實屬性(用 Python)過濾掉不符合查詢條件的實體

為保證索引的持久性和一致性,上文提到的“清潔工”進程要持續運行,寫入丟失的索引,清理失效的舊索引。它優先清理最近更新的實體,所以實際上維護索引的一致性非常快(幾秒鐘).

性能

我們對新系統的主索引進行了優化,對結果也很滿意。以下是上個月 FriendFeed 頁面的加載延時統計圖(我們在前幾天啟動了新的后端,你可以根據延時的顯著回落找到那一天)。

 

特別地,系統的延時現在也很穩定(哪怕是在午高峰期間)。如下是過去24小時FriendFeed頁面加載延時圖。

與上周的某天相比較:

系統到目前為止使用起來很方便。我們在部署之后也改動了幾次索引,并且我們也開始將這種模式應用于 MySQL 中那些較大的表,這樣我們在以后可以輕松地改動它們的結構。

原文鏈接:http://www.oschina.net/translate/friendfeed-schemaless-mysql-new

責任編輯:Ophira 來源: 開源中國社區
相關推薦

2012-06-29 17:46:41

BMCIT服務管理SaaS

2020-07-07 07:47:07

Java無鎖技術

2024-12-16 17:02:58

MySQLInnoDB數據庫

2010-05-13 15:54:56

MySQL分頁查詢

2009-11-06 13:40:07

2024-10-14 15:04:15

C++std::any存儲

2016-03-18 09:44:05

隊列分析應用留存用戶行為

2009-05-04 10:25:36

XML.NET數據

2024-01-15 16:28:42

ChatGPTGenAI人工智能

2018-04-18 10:04:56

數字化 CIO

2020-11-25 08:00:37

MySQL存儲

2024-01-18 17:39:00

數據庫存儲索引

2010-10-26 14:19:04

oracle存儲過程

2016-11-09 08:35:24

zabbixmongo數據庫

2020-10-19 06:47:05

爬蟲數據Jsoup

2021-03-30 11:06:29

數據驅動項目經理CIO

2010-04-16 11:03:02

Oracle存儲過程

2023-08-03 08:00:00

數據湖模式驗證

2010-04-06 11:39:17

Oracle數據庫

2021-08-10 14:29:06

MySQL數據庫存儲
點贊
收藏

51CTO技術棧公眾號

欧美videosex性欧美黑吊| 一级黄色片免费| 欧美巨大xxxx| 在线观看国产一区二区| 亚洲国产精品久久久久久女王| 中文字幕一级片| 国产精品av久久久久久麻豆网| 精品国产一区二区在线观看| 男人靠女人免费视频网站| 国产精品久久一区二区三区不卡 | 久久天天躁夜夜躁狠狠躁2022| 久久久久久久久久久影视| 一区二区三区短视频| 国产精品久久综合| 精品国产乱码久久久久久久软件 | 国产精品小仙女| 国语自产精品视频在线看抢先版图片 | 亚洲人成无码网站久久99热国产| 国产高清免费在线播放| 国产精品一区二区你懂的| 清纯唯美亚洲激情| 久久久久无码国产精品| 久久中文视频| 亚洲情综合五月天| 日韩av无码一区二区三区不卡 | av网站在线看| 中文字幕乱码亚洲精品一区| 狠狠色噜噜狠狠色综合久| 999精品国产| 蜜臀av一区二区在线免费观看| 久久久日本电影| 麻豆视频在线免费看| 精品一二三区| 亚洲欧美在线x视频| 国产精品果冻传媒| 亚洲精品不卡在线观看| 欧美卡1卡2卡| 亚洲国产精品三区| 最新日韩精品| 黑人极品videos精品欧美裸| www.成年人视频| bt在线麻豆视频| 亚洲天堂2014| 伊人久久青草| 黄网站在线免费看| 一区视频在线播放| 综合操久久久| 国产精品久久麻豆| 亚洲欧美另类图片小说| 91制片厂免费观看| 顶级网黄在线播放| 亚洲精品国产精华液| 亚洲自拍偷拍一区二区三区| 欧美成年黄网站色视频| 久久网这里都是精品| 久久另类ts人妖一区二区| 手机在线精品视频| 97精品电影院| 欧美久久久久久| 国产无套粉嫩白浆在线2022年| 久久久久成人黄色影片| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 五月激情综合婷婷| 日韩小视频在线播放| 国产黄大片在线观看| 亚洲成av人片一区二区三区| 男女超爽视频免费播放| 午夜久久中文| 欧洲精品中文字幕| 岛国毛片在线播放| 日韩亚洲精品在线观看| 日韩欧美亚洲国产另类| 中文字幕在线永久| 精品福利久久久| 日韩一级裸体免费视频| 中文字幕另类日韩欧美亚洲嫩草| 欧美激情成人在线| 97在线免费观看视频| 亚洲图片在线视频| 九色综合国产一区二区三区| 91精品国产综合久久久久久丝袜| 天天干免费视频| 国产人妖乱国产精品人妖| 宅男噜噜99国产精品观看免费| 成人免费在线| 精品久久久久久中文字幕| 99视频在线免费| 免费观看在线一区二区三区| 亚洲国产美女精品久久久久∴| 麻豆精品免费视频| 亚洲高清影视| 91精品国产高清自在线看超| 这里只有精品999| 国产丶欧美丶日本不卡视频| 欧美日韩高清免费| 搞黄网站在线观看| 91久久免费观看| 性高潮久久久久久| 欧美日中文字幕| 欧美国产日本高清在线 | 日韩精品不卡| 污的网站在线观看| 欧美优质美女网站| 亚洲男女在线观看| 欧美第一精品| 5566日本婷婷色中文字幕97| 国产情侣av在线| 国产亚洲午夜高清国产拍精品| 日韩精品手机在线观看| 国产成人精品123区免费视频| 日韩美一区二区三区| 中文字幕第4页| 黑丝一区二区三区| 成人黄色免费片| 国产黄在线观看| 粉嫩av一区二区三区免费野| 亚洲国产欧美91| 日本一本不卡| 日本欧美中文字幕| 欧洲成人一区二区三区| 亚洲人成网站在线| 久草在在线视频| 亚欧洲精品视频在线观看| 久久99精品视频一区97| 中文在线观看av| 久久久久久久久蜜桃| 精品少妇人欧美激情在线观看| 亚洲日本中文| 一本久久综合亚洲鲁鲁| 麻豆成人免费视频| 91一区二区在线观看| 日本a级片在线播放| 亚洲色图综合| 最近日韩中文字幕中文| 欧美性猛交xxxx乱大交hd| 91小视频在线免费看| 屁屁影院ccyy国产第一页| 91麻豆精品国产91久久久更新资源速度超快 | 免费黄频在线观看| 欧美国产美女| 国产精品影片在线观看| 青青草av免费在线观看| 高潮白浆女日韩av免费看| 日本三级日本三级日本三级极| 国产一区欧美| 国产精品免费观看高清| 羞羞视频在线观看免费| 精品国产伦一区二区三区观看方式 | 欧美一性一乱一交一视频| 色欲av伊人久久大香线蕉影院| 一区二区三区四区在线| 国产人妻精品久久久久野外| 91高清一区| 91久久精品一区二区别| 天堂av在线电影| 精品国产欧美一区二区| 国产极品美女高潮无套嗷嗷叫酒店| 国产精品一区二区免费不卡| 三年中国中文在线观看免费播放| 精品久久免费| 欧美黄色www| 手机在线不卡av| 色天使久久综合网天天| 天天操天天干天天操天天干| 蜜桃91丨九色丨蝌蚪91桃色| 黄瓜视频免费观看在线观看www| 在线不卡一区| 久久久久国产视频| 亚洲色图狠狠干| 日本韩国一区二区| 成年人二级毛片| 国产成人99久久亚洲综合精品| 黄色三级中文字幕| 亚洲欧美成人vr| 国产精品永久在线| 超碰在线观看免费| 亚洲精品国产精品国产自| 亚洲成熟少妇视频在线观看| 国产精品免费看片| a级大片免费看| 亚洲制服少妇| av电影一区二区三区| 红杏视频成人| 国产精品一区二区女厕厕| 羞羞视频在线观看免费| 亚洲欧美日韩一区在线| 国产色视频在线| 狠狠躁夜夜躁人人爽超碰91| 2017亚洲天堂| 不卡一区二区在线| 中文字幕有码av| 极品中文字幕一区| 亚洲高清视频在线观看| 午夜日韩影院| 国产精品老牛影院在线观看| 人交獸av完整版在线观看| 亚洲美女av电影| 成人福利小视频| 欧美影视一区在线| 国产无遮挡aaa片爽爽| 中文字幕乱码亚洲精品一区| 岛国av免费观看| 蜜臀av性久久久久av蜜臀妖精| 成人在线国产视频| 日韩三级在线| 免费一区二区三区在在线视频| 91视频亚洲| 国产精品吹潮在线观看| 狂野欧美性猛交xxxxx视频| 在线亚洲欧美视频| 五月天激情婷婷| 日韩欧美国产wwwww| 成人免费一区二区三区| 欧美日韩国产一区中文午夜| 99久久婷婷国产综合| 久久久精品影视| 六十路息与子猛烈交尾| 国产在线麻豆精品观看| 国产精彩免费视频| 美女网站久久| 国产精品自拍片| 很黄很黄激情成人| 最新av网址在线观看| 日韩一区二区在线| 色婷婷精品国产一区二区三区| 开心激情综合| 动漫3d精品一区二区三区| www 久久久| 国产欧美va欧美va香蕉在| 国产精品亚洲一区二区三区在线观看| 91成人在线播放| 岛国av在线网站| 国内精品伊人久久| 免费在线播放电影| 欧美国产欧美亚洲国产日韩mv天天看完整| 黄色网址视频在线观看| www欧美日韩| 日本a级在线| 久久精品国产一区| 麻豆影视在线观看_| 日韩在线观看免费网站| 无遮挡的视频在线观看 | 蜜臀av性久久久久蜜臀aⅴ| 欧美日韩怡红院| 日本特黄久久久高潮| 亚洲视频在线观看一区二区三区| 美女尤物久久精品| 999精品网站| 青青草成人在线观看| 一级在线免费视频| 裸体一区二区三区| 久久精品视频在线观看免费| 国产精品一区二区在线观看不卡| 欧美日韩一区二区区别是什么| 国产69精品一区二区亚洲孕妇| 岛国精品一区二区三区| 成人免费看的视频| 国产 中文 字幕 日韩 在线| 久久综合精品国产一区二区三区| 亚洲国产无码精品| 国产欧美一区视频| 搜索黄色一级片| 一区二区三区产品免费精品久久75| 久久99久久久| 欧美色图在线视频| 中文字幕一区二区在线视频| 欧美精品v国产精品v日韩精品 | 欧美少妇激情| 91国产丝袜在线放| 欧美激情久久久久久久久久久| 欧美日韩成人一区二区三区 | 国产人妻777人伦精品hd| 国产视频一区三区| www.超碰com| 国产美女视频一区| 亚洲国产综合视频| 国产色婷婷亚洲99精品小说| 亚洲人与黑人屁股眼交| 亚洲在线视频免费观看| 天堂网中文字幕| 欧美另类变人与禽xxxxx| 丰满肉肉bbwwbbww| 亚洲欧洲免费视频| av免费在线观| 国产精品91在线观看| 一区二区三区日本视频| 久久精品国产精品国产精品污| 日韩精品午夜| 婷婷无套内射影院| 美女看a上一区| 中文字幕人妻一区| 亚洲国产精品av| 国产精彩视频在线| 欧美日韩中文另类| 天堂在线资源8| 久久久精品在线观看| 色综合一个色综合亚洲| 国产乱了高清露脸对白| 国产天堂亚洲国产碰碰| 波多野结衣爱爱视频| 欧美性极品xxxx做受| 99热这里只有精品在线观看| 国产视频一区在线| 日本无删减在线| 国产精品网址在线| 欧洲精品一区| 人妻激情另类乱人伦人妻| 日韩电影在线观看网站| aaa黄色大片| 亚洲视频一二三| 波多野结衣视频在线看| 欧美精品一区二区不卡 | 欧美理伦片在线播放| 中文字幕一区综合| 日韩av在线发布| 97人妻精品一区二区三区免| 亚洲视频小说图片| 一级爱爱免费视频| 国产亚洲精品久久久优势| 黄在线观看免费网站ktv| 亚洲综合色av| 五月天综合网站| 美女少妇一区二区| 久久综合久久综合久久| 日韩av电影网址| 精品国产3级a| 四虎亚洲精品| 91成人在线看| 先锋资源久久| 中文字幕线观看| 国产精品久久久久久福利一牛影视| 国产精品免费精品一区| 国产视频亚洲视频| 少妇淫片在线影院| 精品国产免费人成电影在线观...| 国产精品hd| 久久久久亚洲av无码网站| 亚洲乱码日产精品bd| 99久久久国产精品无码免费| 啊v视频在线一区二区三区 | 久久一级免费视频| 欧美中文字幕不卡| 95在线视频| 成人免费在线视频网站| 91成人精品视频| 国产sm在线观看| 午夜精品aaa| 亚洲av片一区二区三区| 5252色成人免费视频| 九九精品久久| 国产精品人人爽人人爽| 中国色在线观看另类| 亚洲一卡二卡在线观看| 久久精品国产欧美亚洲人人爽| av日韩久久| 日本免费a视频| 99久久免费精品高清特色大片| 国产午夜性春猛交ⅹxxx| 亚洲视频第一页| 亚洲成人高清| 4444亚洲人成无码网在线观看| 粉嫩欧美一区二区三区高清影视| 国产黄色片免费看| 国产午夜精品一区二区三区| 日韩欧美三区| 精品国偷自产一区二区三区| 99re这里只有精品6| 麻豆成人免费视频| 久久精品99久久久久久久久| 日韩精品久久久久久久软件91| 99在线免费视频观看| 91蜜桃在线观看| 亚洲字幕av一区二区三区四区| 欧美成人自拍视频| 天天躁日日躁狠狠躁欧美| 黄色aaa级片| 亚洲自拍偷拍麻豆| 黄色在线网站| 91情侣在线视频| 久久一区中文字幕| 卡通动漫亚洲综合| 日韩电影中文字幕一区| 日韩国产大片| 色综合久久久久无码专区| 国产女人aaa级久久久级| 性中国古装videossex| 青青草国产精品一区二区| 亚洲国产一区二区在线观看 | 亚洲婷婷综合久久一本伊一区| 成人久久精品人妻一区二区三区| 日韩av大片免费看| 午夜久久影院| 日本成人免费视频| 欧美成人bangbros| 国产精品99| 久久黄色片视频| 亚洲精品日产精品乱码不卡| 免费成人av电影| 国产九区一区在线| 久久99精品久久久久久动态图 |