PG大會_呂海波.pdf

編號:171692 PDF 37頁 1.88MB 下載積分:VIP專享
下載報告請您先登錄!

PG大會_呂海波.pdf

1、PostgreSQL中文社區第13屆PostgreSQL中國技術大會聚焦云端創新匯聚智慧共享呂海波 (公眾號:IT知識刺客)分布式詞話PostgreSQL中文社區轟轟烈烈的去IOE掘起的新勢力03廉頗老矣,尚能飯否04妥協的分庫分表0102PostgreSQL中文社區目錄contents01妥協的分庫分表PostgreSQL中文社區PostgreSQL中文社區01 妥協的分庫分表User DBCaty DBSlcdb DBMOBILOG DBCTLGU DBPostgreSQL中文社區01 妥協的分庫分表繼續依賴高端硬件另尋它路分布式PostgreSQL中文社區01 妥協的分庫分表 分散數據的

2、方式 HASH RANG 路由庫PostgreSQL中文社區01 妥協的分庫分表User_idUser_namBalance1甲100002乙10000100丙100001000丁假設表被拆分為64份,分別分布到64個庫中。User_id121001000最簡單的HASH方法就是,以user_id 除以 64 的余數為HASH值,決定某個用戶的數據保存到幾號庫中。PostgreSQL中文社區01 妥協的分庫分表User_id165129193User_id2661301941號庫2號庫以user_id 除以 64 的余數為HASH值,決定某個用戶的數據保存到幾號庫中。User_id641281

3、9225664號庫USER_ID除以64余1USER_ID除以64余2USER_ID除以64余0PostgreSQL中文社區01 妥協的分庫分表User_id165129193User_id2661301941號庫2號庫User_id6412819225664號庫USER_ID除以64余1USER_ID除以64余2USER_ID除以64余0SELECT username,balance FROM prod_tab WHERE user_id=130;130 mod 64=2130PostgreSQL中文社區01 妥協的分庫分表應用層數據層應用連接中間層。在應用眼中,它認為中間層就是數據庫。它不

4、知道數據庫被拆分成多個。中間層根據ID列,將應用傳遞過來的SQL發送到對應數據庫。PostgreSQL中文社區01 妥協的分庫分表應用層數據層調用中間層提供的接口函數,連接數據庫;SELECT name,balance FROM prod_tab WHERE user_id=130;根據user_id=130判斷出用戶要查詢的數據在2號數據庫中;連接2號數據庫;SELECT name,balance FROM prod_tab WHERE user_id=130;2號數據庫開始執行查詢PostgreSQL中文社區01 妥協的分庫分表應用層數據層連接數據庫;開始事務;Update prod_ta

5、b set bala=bala-100 where user_id=A;Update prod_tab set bala=bala+100 where user_id=B;結束事務 Commit;連接1號數據庫;開始事務;Update prod_tab set bala=bala-100 where user_id=A;結束事務 Commit;連接4號數據庫;開始事務;Update prod_tab set bala=bala+100 where user_id=B;結束事務 Commit;修改B的余額修改A的余額兩個數據庫分別開始自己的事務PostgreSQL中文社區01 妥協的分庫分表應用

6、層數據層連接數據庫;開始事務;Update prod_tab set bala=bala-100 where user_id=A;Update prod_tab set bala=bala+100 where user_id=B;結束事務 Commit;連接1號數據庫;開始事務;Update prod_tab set bala=bala-100 where user_id=A;結束事務 Commit;連接4號數據庫;開始事務;Update prod_tab set bala=bala+100 where user_id=B;結束事務 Commit;修改B的余額修改A的余額兩個數據庫分別開始自己

7、的事務連接1號數據庫;開始事務;Update prod_tab set bala=bala-100 where user_id=A;結束事務 Commit;連接4號數據庫;開始事務;Update prod_tab set bala=bala+100 where user_id=B;結束事務 Commit;應用層的一個事務,由于涉及兩個數據庫,因此在中間層被分成了兩個事務。主流數據庫(Oracle/PG/MySQL等),都提供了使用兩/三階段提交保證強一致性的事務,但因網絡造成的時延,這種分布式事務較為緩慢,這是高并發系統所不能容忍的。這個時候,一個妥協的方案出現了:最終一致性模型。Postgr

8、eSQL中文社區01 妥協的分庫分表應用層數據層連接數據庫;開始事務;Insert into tran_log values(tran_id,A,B,100);Message_queue入隊(tran_id,A,-100);Message_queue入隊(tran_id,B,+100);事務結束 返回信息:交易成完Message_queue:取出消息Update 某帳戶結束事務 Commit;Message_queue:取出消息Update 某帳戶結束事務 Commit;連接1號數據庫;開始事務;修改B的余額修改A的余額兩個數據庫分別開始自己的事務PostgreSQL中文社區01 妥協的分庫分

9、表應用層數據層連接數據庫;開始事務;Insert into tran_log values(tran_id,A,B,100);Message_queue入隊(tran_id,A,-100);Message_queue入隊(tran_id,B,+100);事務結束 返回信息:交易成完Message_queue:取出消息Update 某帳戶結束事務 Commit;Message_queue:取出消息Update 某帳戶結束事務 Commit;連接1號數據庫;開始事務;修改B的余額修改A的余額兩個數據庫分別開始自己的事務PostgreSQL中文社區01 妥協的分庫分表應用層數據層連接數據庫;開始事務

10、;Insert into tran_log values(tran_id,A,B,100);Message_queue入隊(tran_id,A,-100);Message_queue入隊(tran_id,B,+100);事務結束 返回信息:交易成完Message_queue:取出消息Update 某帳戶結束事務 Commit;Message_queue:取出消息Update 某帳戶結束事務 Commit;連接1號數據庫;開始事務;修改B的余額修改A的余額兩個數據庫分別開始自己的事務PostgreSQL中文社區01 妥協的分庫分表應用層數據層連接1號數據庫;開始事務;修改B的余額修改A的余額兩個

11、數據庫分別開始自己的事務應用層數據層修改B的余額修改A的余額連接數據庫;開始事務;Insert into tran_log values(tran_id,A,B,100);Message_queue入隊(tran_id,A,-100);Message_queue入隊(tran_id,B,+100);事務結束 返回信息:交易成完Message_queue:取得消息(peek_message),得到消息隊列中的Tran_id、帳戶名和其他信息。連接數據庫;查詢tran_log表,查看剛從消息隊列中得到的Tran_id和帳戶名是否存在。查詢msg_log表,查看從消息隊列中得到的Tran_id和帳戶

12、名是否存在。開始事務;Update 某帳戶Insert into msg_log values(Tran_id,某帳戶,);事務結束(update insert在同一數據庫)Message_queue:去除消息(remove_message)Message_queue:取得消息(peek_message),得到消息隊列中的Tran_id、帳戶名和其他信息。連接數據庫;查詢tran_log表,查看剛從消息隊列中得到的Tran_id是否存在。查詢msg_log表,查看從消息隊列中得到的Tran_id和帳戶名是否存在。開始事務;Update 某帳戶Insert into msg_log values

13、(Tran_id,某帳戶,);事務結束(update insert在同一數據庫)Message_queue:去除消息(remove_message)連接數據庫;開始事務;Insert into tran_log values(tran_id,A,B,100);Message_queue入隊(tran_id,A,-100);Message_queue入隊(tran_id,B,+100);事務結束 返回信息:交易成完Message_queue:取得消息(peek_message),得到消息隊列中的Tran_id、帳戶名和其他信息。連接數據庫;查詢tran_log表,查看剛從消息隊列中得到的Tran

14、_id和帳戶名是否存在。Message_queue:去除消息(remove_message)HEADERTran_id,A,-100Tran_id,B,+100PostgreSQL中文社區01 妥協的分庫分表連接1號數據庫;開始事務;兩個數據庫分別開始自己的事務應用層數據層修改B的余額修改A的余額連接數據庫;開始事務;Insert into tran_log values(tran_id,A,B,100);Message_queue入隊(tran_id,A,-100);Message_queue入隊(tran_id,B,+100);事務結束 返回信息:交易成完Message_queue:取得消

15、息(peek_message),得到消息隊列中的Tran_id、帳戶名和其他信息。連接數據庫;查詢tran_log表,查看剛從消息隊列中得到的Tran_id和帳戶名是否存在。查詢msg_log表,查看從消息隊列中得到的Tran_id和帳戶名是否存在。開始事務;Update 某帳戶Insert into msg_log values(Tran_id,某帳戶,);事務結束(update insert在同一數據庫)Message_queue:去除消息(remove_message)Message_queue:取得消息(peek_message),得到消息隊列中的Tran_id、帳戶名和其他信息。連接

16、數據庫;查詢tran_log表,查看剛從消息隊列中得到的Tran_id是否存在。查詢msg_log表,查看從消息隊列中得到的Tran_id和帳戶名是否存在。開始事務;Update 某帳戶Insert into msg_log values(Tran_id,某帳戶,);事務結束(update insert在同一數據庫)Message_queue:去除消息(remove_message)連接數據庫;開始事務;Insert into tran_log values(tran_id,A,B,100);Message_queue入隊(tran_id,A,-100);Message_queue入隊(tra

17、n_id,B,+100);事務結束 返回信息:交易成完Message_queue:取得消息(peek_message),得到消息隊列中的Tran_id、帳戶名和其他信息。連接數據庫;查詢tran_log表,查看剛從消息隊列中得到的Tran_id和帳戶名是否存在。查詢msg_log表,查看從消息隊列中得到的Tran_id和帳戶名是否存在。開始事務;Update 某帳戶Insert into msg_log values(Tran_id,某帳戶,);事務結束(update insert在同一數據庫)Message_queue:去除消息(remove_message)HEADERTran_id,A,

18、-100Tran_id,B,+100Update PROD_TABLE set balance=balance+100 where user_id=BPostgreSQL中文社區01 妥協的分庫分表連接1號數據庫;開始事務;兩個數據庫分別開始自己的事務應用層數據層修改B的余額修改A的余額連接數據庫;開始事務;Insert into tran_log values(tran_id,A,B,100);Message_queue入隊(tran_id,A,-100);Message_queue入隊(tran_id,B,+100);事務結束 返回信息:交易成完Message_queue:取得消息(pee

19、k_message),得到消息隊列中的Tran_id、帳戶名和其他信息。連接數據庫;查詢tran_log表,查看剛從消息隊列中得到的Tran_id和帳戶名是否存在。查詢msg_log表,查看從消息隊列中得到的Tran_id和帳戶名是否存在。開始事務;Update 某帳戶Insert into msg_log values(Tran_id,某帳戶,);事務結束(update insert在同一數據庫)Message_queue:去除消息(remove_message)Message_queue:取得消息(peek_message),得到消息隊列中的Tran_id、帳戶名和其他信息。連接數據庫;查

20、詢tran_log表,查看剛從消息隊列中得到的Tran_id是否存在。查詢msg_log表,查看從消息隊列中得到的Tran_id和帳戶名是否存在。開始事務;Update 某帳戶Insert into msg_log values(Tran_id,某帳戶,);事務結束(update insert在同一數據庫)Message_queue:去除消息(remove_message)連接數據庫;開始事務;Insert into tran_log values(tran_id,A,B,100);Message_queue入隊(tran_id,A,-100);Message_queue入隊(tran_id,

21、B,+100);事務結束 返回信息:交易成完Message_queue:取得消息(peek_message),得到消息隊列中的Tran_id、帳戶名和其他信息。連接數據庫;查詢tran_log表,查看剛從消息隊列中得到的Tran_id和帳戶名是否存在。查詢msg_log表,查看從消息隊列中得到的Tran_id和帳戶名是否存在。開始事務;Update 某帳戶Insert into msg_log values(Tran_id,某帳戶,);事務結束(update insert在同一數據庫)Message_queue:去除消息(remove_message)Message_queue:取得消息(pe

22、ek_message),得到消息隊列中的Tran_id、帳戶名和其他信息。連接數據庫;查詢tran_log表,查看剛從消息隊列中得到的Tran_id是否存在。查詢msg_log表,查看從消息隊列中得到的Tran_id和帳戶名是否存在。開始事務;Update 某帳戶Insert into msg_log values(Tran_id,某帳戶,);事務結束(update insert在同一數據庫)Message_queue:去除消息(remove_message)PostgreSQL中文社區01 妥協的分庫分表 總結 主要問題:和傳統應用不兼容,需重構應用ebay用時將近1年,才完成應用重構阿里巴

23、巴在2008年,也遇到了和ebay同樣的問題,數據量、交易量的激增,逐漸逼近硬件上限。阿里歷時1年半時間,完成應用重構。PostgreSQL中文社區02 轟轟烈烈的去IOE中間層Oracle 數據庫應用存儲存儲PostgreSQL中文社區02 轟轟烈烈的去IOE中間層MySQL數據庫應用PostgreSQL中文社區02 轟轟烈烈的去IOE IOEIBM、Oracle、EMCPostgreSQL中文社區03 掘起的新勢力 新一代分布式原有分庫分表方案,太過復雜。就算不使用最終一致性,只使用數據庫原生提供的分布式事務接口,仍需對應用進行改造。將數據分片的中間層納入數據庫中,數據分片成為數據庫原生功

24、能PostgreSQL中文社區03 掘起的新勢力 新一代分布式的要點:在兩個層級上的分布式 存儲 事務PostgreSQL中文社區03 掘起的新勢力 新一代分布式的要點:在兩個層級上的分布式 存儲:分布式存儲存儲層使用Paxos、Raft,提供數據的高可用數據分片,所有數據都是分布式 事務:分布式事務事務層使用兩/三階段提交,或基于兩階段提交的變形(如Percolator),提供強一致性事務PostgreSQL中文社區03 掘起的新勢力 新一代分布式數據庫的窘境 成功的分布式存儲SSD/磁盤的I/O,本身是毫秒級操作,分布式后,增加的網絡開銷,也是毫秒級操作。相當于本來1毫秒的操作,變為兩毫秒

25、,雖有影響,影響不大,但分布式帶來了更好的Scale。無解的分布式事務普通事務多數操作都是內存級操作,內存延遲是納秒級(100納秒內)。分布式事務中的網絡操作,就算是使用最高端的RDMA技術,延遲也在百微秒級,相差1000倍。(相當于以第一宇宙速度行駛的火箭后,掛了個小拖車)注:RDMA已經可以做到20微秒級的延遲,再加上事務持久化的影響,相比普通事務,分布式事務的延遲,沒有千倍那么夸張,平均來說,還是要高個5倍左右。這是分布式的必然代價嗎。5倍的延遲意味著什么,如果你的系統原來能跑1萬TPS,換成分布式也就是2千多的TPS。而且單個事務響應時間大大延長。PostgreSQL中文社區03 掘起

26、的新勢力 新一代分布式數據庫的窘境 進退兩難分布式的目的是更好的Scale(伸縮性)。追求Scale性的目的是為了不受硬件瓶頸的限制。但2PC因復雜性、網絡等原因,造成延遲數倍增加,首先成為了限制,使其無法應用于超高并發OLTP中。如果并發不夠高,為什么要用分布式?這就是新一代分布式數據庫的窘境。也是國外主流OLTP數據庫(包括商業和開源)鮮有采用全分布式架構(可以只在存儲層分布式)的主要原因。注:國產數據庫是一個極為特殊的市場,它的產生和技術無關,它的發展也注定和技術無關,因此并不能用來佐證技術路線。性能快簡單這是一個無法兼得的問題。PostgreSQL中文社區03 掘起的新勢力 一句話總結

27、分布式新勢力基于原有理論開發,或基于原有數據庫封裝,讓用戶以更簡單的方式,讓使用數據分片、兩階段提交等分布式功能。PostgreSQL中文社區04 廉頗老矣,尚能飯否 DBOShttps:/www.dbos.dev/Michael StonebrakerPostgreSQL 創始人 2014年圖靈獎獲得者PostgreSQL中文社區04 廉頗老矣,尚能飯否 一切都分布:CPU內的分布式UMA,Uniform Memory Architecture一致性內存架構NUMA,None-Uniform Memory Architecture非一致性內存架構PostgreSQL中文社區04 廉頗老矣,尚

28、能飯否Core 0-3 LocalCore 4-7 RemoteCore 0-3 RemoteCore 4-7 LocalCore 0-3 LocalCore 4-7 RemoteCore 0-3 RemoteCore 4-7 LocalCore 0-3 LocalCore 4-7 RemoteCore 0-3 RemoteCore 4-7 LocalCore 0-3 RemoteCore 4-7 LocalCore 0-3 LocalCore 4-7 RemoteCore 0-3 RemoteCore 4-7 LocalCore 0-3 LocalCore 4-7 RemoteCore 0-

29、3 RemoteCore 4-7 LocalCore 0-3 LocalCore 4-7 RemoteCore 0-3 LocalCore 4-7 RemoteCore 0-3 RemoteCore 4-7 LocalCore 0-3 LocalCore 4-7 RemoteCore 0-3 RemoteCore 4-7 LocalCore 0-3 LocalCore 4-7 RemoteCore 0-3 RemoteCore 4-7 Local數據庫緩存池:Shared Buffer/Buffer Pool/Buffer CacheNUMA本身是為了大內存,無法繼續UMA的妥協。多數程序沒有

30、Shared Buffer這樣的公共大緩存池,處理器廠商也經過了統計分析,非大型數據庫類程序,Remote訪問次數并不多。這樣,NUMA架構即可以有大內存,又不至于因Remote而影響性能。但數據庫不一樣,一半的概率快、一半的概率慢,NUMA直接影響了數據庫的性能?;蛘叻催^來說,數據庫無法很好的適應NUMA。PostgreSQL中文社區04 廉頗老矣,尚能飯否Core 0-3 LocalCore 4-7 RemoteCore 0-3 RemoteCore 4-7 Local子數據庫 1Core 0-3 RemoteCore 4-7 Local子數據庫 2CPU已經是分布式了,數據庫只能隨之也分

31、布式,才能更好的發揮CPU的能力PostgreSQL中文社區04 廉頗老矣,尚能飯否 DBOShttps:/www.dbos.dev/CPU向分布化方向發展,已經是毋庸置疑的了。傳統分布式數據庫(包括分布式新勢力),還是把一個分布式的CPU,當作集中式來用,這的確有點跟不上CPU的發展步伐。DBOS是否能成功,讓我們拭目以待。Michael StonebrakerPostgreSQL 創始人 2014年圖靈獎獲得者PostgreSQL中文社區04 廉頗老矣,尚能飯否ITIT知識刺客 IT知識刺客基礎軟件開發HPC/SIMD/數據庫內核故事系列:數據庫傳奇/卡脖子的數據庫 等PostgreSQL中文社區感謝聆聽!

友情提示

1、下載報告失敗解決辦法
2、PDF文件下載后,可能會被瀏覽器默認打開,此種情況可以點擊瀏覽器菜單,保存網頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站報告下載后的文檔和圖紙-無水印,預覽文檔經過壓縮,下載后原文更清晰。

本文(PG大會_呂海波.pdf)為本站 (張5G) 主動上傳,三個皮匠報告文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對上載內容本身不做任何修改或編輯。 若此文所含內容侵犯了您的版權或隱私,請立即通知三個皮匠報告文庫(點擊聯系客服),我們立即給予刪除!

溫馨提示:如果因為網速或其他原因下載失敗請重新下載,重復下載不扣分。
客服
商務合作
小程序
服務號
折疊
午夜网日韩中文字幕,日韩Av中文字幕久久,亚洲中文字幕在线一区二区,最新中文字幕在线视频网站