Upgrade to Pro — share decks privately, control downloads, hide ads and more …

談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議

談 Uber 從 PostgreSQL 轉用 MySQL 的技術爭議

➀ Uber 為什麼從 PostgreSQL 轉用 MySQL?
➁ PostgreSQL 專家怎麼說?MySQL 專家怎麼回擊?
➂ 他們說的有沒有道理?

Yi-Feng Tzeng

August 05, 2016
Tweet

More Decks by Yi-Feng Tzeng

Other Decks in Technology

Transcript

  1. 2/69 《 Why Uber Engineering Switched from Postgres to MySQL

    》 https://eng.uber.com/mysql-migration/ 今日的討論主角。
  2. 10/69 Orient Intensive Capacity CPU intensive Memory intensive Storage/IO intensive

    Bandwidth intensive OLTP OLAP Data warehouse Throughput Latency Memory footprint Bond Performance Security Cost reduction 架構先決 Service-level agreement
  3. 15/69 探嚢取物 为 PostgreSQL 讨说法 – 浅析 《 UBER ENGINEERING

    SWITCHED FROM POSTGRES TO MYSQL 》 https://yq.aliyun.com/articles/58421 將以這篇討論為主
  4. 17/69 Orient Intensive Capacity CPU intensive Memory intensive Storage/IO intensive

    Bandwidth intensive OLTP OLAP Data warehouse Throughput Latency Memory footprint Bond Performance Security Cost reduction 探嚢取物 Service-level agreement
  5. 19/69 Orient Intensive Capacity CPU intensive Memory intensive Storage/IO intensive

    Bandwidth intensive OLTP OLAP Data warehouse Throughput Latency Memory footprint Bond Performance Security Cost reduction 探嚢取物 Service-level agreement
  6. 21/69 Orient Intensive Capacity CPU intensive Memory intensive Storage/IO intensive

    Bandwidth intensive OLTP OLAP Data warehouse Throughput Latency Memory footprint Bond Performance Security Cost reduction 探嚢取物 Service-level agreement
  7. 23/69 Orient Intensive Capacity CPU intensive Memory intensive Storage/IO intensive

    Bandwidth intensive OLTP OLAP Data warehouse Throughput Latency Memory footprint Bond Performance Security Cost reduction 探嚢取物 Service-level agreement
  8. 24/69 Orient Intensive Capacity CPU intensive Memory intensive Storage/IO intensive

    Bandwidth intensive OLTP OLAP Data warehouse Throughput Latency Memory footprint Bond Performance Security Cost reduction 探嚢取物 Service-level agreement
  9. 29/69 2015 索引數據結構 : B+tree 索引 資料表: 1 user1 pass1

    2 user2 pass2 3 user3 pass3 4 user4 pass4 5 user5 pass5 13 4 7 1 2 3 4 5 6 7
  10. 33/69 探嚢取物 Q :一般操作時,誰的 UPDATE 較快? InnoDB 需要把 Older row

    搬到 Rollback Segment , 造成 UPDATE 比較慢。 PostgreSQL 是複製該 row 在同一 Page , 並改 Pointer 。
  11. 38/69 2015 索引頁分裂 : 亂序式新增資料 操作:新增 5( 假設頁只能存三筆資料 ) 20

    6 12 2 4 6 8 10 12 5 20 4 6 12 2 4 5 6 8 10 12 p1 p1 p2 p2 p4 p3 p3 p4 p5 latch fragmentation fragmentation
  12. 40/69 探嚢取物 Q : PostgreSQL HOT-updated ? HOT-updated 是有條件的: ➀

    只有在所有索引屬性都沒有被更新時才能使用 HOT ➁ 只有在被更新記錄所在頁面能夠存儲新版本時才能用 HOT
  13. 41/69 探嚢取物 Q : PostgreSQL HOT-updated ? HOT-updated 是有條件的: ➀

    只有在所有索引屬性都沒有被更新時才能使用 HOT 為了目標的 Column 可支援 HOT-updated , 勢必就不行加上索引,損失 Read 效能。 ( 三個月沒登入的會員 ? ) ➁ 只有在被更新記錄所在頁面能夠存儲新版本時才能用 HOT UPDATE-heavy 下, fillfactor 要調更小, 浪費的空間更多, I/O 開銷更大。 PostgreSQL 預設 100% ,博主使用 80% , 8K*20%=1.6K 為空, 假設 Record Size 200 bytes , 1.6K 約可放 8.2 個。
  14. 43/69 探嚢取物 Q : MySQL 的 Primary Key 更新的開銷非常大? PostgreSQL

    更新的 Column 為 Index 時, 沒有 HOT-updated 效果,且全 Index 皆需要更新。 MySQL 雖然沒有這個問題,但若是 Primary Key 更新時, 問題也是很嚴重。
  15. 44/69 探嚢取物 Q : MySQL 的 Primary Key 更新的開銷非常大? PostgreSQL

    更新的 Column 為 Index 時, 沒有 HOT-updated 效果,且全 Index 皆需要更新。 MySQL 雖然沒有這個問題,但若是 Primary Key 更新時, 問題也是很嚴重。 但通常 Primary Key 是不會更新的。
  16. 48/69 探嚢取物 Q :寫次數放大? ➀ 場景一: Primary Key 更新時 ➁

    場景二: N 個 Secondary Index 中的 1 個更新時 ➂ 場景三:更新的欄位不是 Index 時
  17. 49/69 探嚢取物 Q :寫次數放大? ➀ 場景一: Primary Key 更新時 ➊

    更新的 Row 在原長度內 (MySQL) ? I/O (PostgreSQL) ? I/O ➋ 更新的 Row 不在原長度內,且發生 Page split (MySQL) ? I/O (PostgreSQL) ? I/O
  18. 50/69 探嚢取物 Q :寫次數放大? ➁ 場景二: 1 個 Secondary Index

    中的 1 個更新時 ➊ 更新的 Row 在原長度內 (MySQL) ? I/O (PostgreSQL) ? I/O ➋ 更新的 Row 不在原長度內,且發生 Page split (MySQL) ? I/O (PostgreSQL) ? I/O
  19. 51/69 探嚢取物 Q :寫次數放大? ➁ 場景二: N 個 Secondary Index

    中的 1 個更新時 ➊ 更新的 Row 在原長度內 (MySQL) ? I/O (PostgreSQL) ? I/O ➋ 更新的 Row 不在原長度內,且發生 Page split (MySQL) ? I/O (PostgreSQL) ? I/O
  20. 52/69 探嚢取物 Q :寫次數放大? ➂ 場景三:更新的欄位不是 Index 時 ➊ 更新的

    Row 在原長度內 (MySQL) ? I/O (PostgreSQL HOT-updated) ? I/O ➋ 更新的 Row 不在原長度內,且發生 Page split (MySQL) ? I/O (PostgreSQL) ? I/O
  21. 56/69 探嚢取物 Q :長事務? InnoDB 回滾 Rollback Segment 很昂貴。 尤其當長事務常發生時,可能常讀取

    Older data ,效能很差。 但通常事務 (transaction) 回滾的機率是低的。
  22. 60/69 2015 High Concurrent Write?(Hotspot:UPDATE) 《 MySQL 》 直接 UPDATE

    在同一 Row ,通常不會造成該 Page 的大小變化。 《 PostgreSQL 》 盡量在同一 Page 寫入新的 Row ,但若該 Page 空間不足時,則 會另新建一 Page 寫入。 Fragmentation ? VACUUM ?
  23. 61/69 2015 High Concurrent Write?(Hotspot:UPDATE) 《 PostgreSQL 》 PostgreSQL 天生容易遇到

    Index bloat 的問題。 Ref: PostgreSQL 9.0 High Performance [PACKT] (2010) (p171)
  24. 64/69 異地同步 Q : Physical replication vs. Logical replication? MySQL

    只有 Logical replication ; PostgreSQL 9.4 之前只有 Physical replication 。
  25. 65/69 異地同步 Q : Physical replication vs. Logical replication? PostgreSQL

    送出 WAL ,而 MySQL 送出 commands 。 送出 WAL 有一些問題,因為它是直接修改 disk 的資料, 所以可能會造成一些問題。包括 data corruption 導致 整個資料庫下線。 它對於 versioning 版本號的問題非常敏感, 並且如果無法確保我們能支持很多 versioning 版本號的 replicating 到同一台機器時,這會變得非常困難。
  26. 66/69 異地同步 Q : Physical replication vs. Logical replication? Physical

    replication 比 logical replication 快, 因為它在 replication stream 中含 index pointer , 允許 insert 直接進到 index ,比需要先找到該 index 位置再 insert 快。 這很有效率,但確實 replication bandwidth 需要比較多。
  27. 67/69 異地同步 Q : Physical replication vs. Logical replication? statement-based

    replication 對 bandwidth 較有效率。 但對接收端的伺服器效能並不好。 且可能導致很多 replication 非預期的問題,導致需要排錯。