Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

第五章節: 主從複製/讀寫分離的實作?客戶如何決定應操作哪一個副本? -- Mason #55

Open
0x171-0 opened this issue Jul 12, 2022 · 4 comments
Labels
question Further information is requested

Comments

@0x171-0
Copy link

0x171-0 commented Jul 12, 2022

5.1 Quetion

Implementation

  • 請問實作經驗:各種數據庫如何設定主從複製與讀寫分離(Redis/Posgres/Mongo/Mysql,,,)?
  • 請問實作經驗:在程式當中會需要設定不同連線嗎?還是說 DB 會自動做 Load Balance?好像 Mongo 會自動做
  • 請問實作經驗:如果是運用 Message Queue 做資料同步,如何處理失敗與斷線?
  • 好奇:不同的數據庫面對斷線重啟,如何跟上?都是透過上次最後一筆 Log?如果不透過 Log 有其他跟上的方法嗎?
  • 好奇:讀己之寫、單調讀都有說其中一個解法是操作單一庫,那在實際應用當中會決定各個客戶個別操作哪些庫?以達到分配?單主架構只能操作單主寫入,如果是多主寫入呢?
    • A : 可以透過客戶 ID 散列進行副本的選擇

Knowledge

  • 請問:传输预写式日志(WAL)不是很懂所謂跟儲存引擎緊耦合是什麼意思?邏輯日誌對應的的鬆耦合又是什麼意思?
  • 好奇:面對大量寫入分頁的作法,可能造成跳過不應該被跳過的 Data?
    - cursor 錨點
    - offset 跳過特定數量
@0x171-0 0x171-0 changed the title 第五章節: 主從複製/讀寫分離的實作?客戶如何決定應操作哪一個副本? 第五章節: 主從複製/讀寫分離的實作?客戶如何決定應操作哪一個副本? -- Mason Jul 12, 2022
@kylemocode kylemocode added the question Further information is requested label Jul 12, 2022
@kylemocode
Copy link
Collaborator

kylemocode commented Jul 12, 2022

  • 在程式當中會需要設定不同連線嗎?還是說 DB 會自動做 Load Balance?好像 Mongo 會自動做?

現在很多 ORM 好像都可以設定 read/write 的連線 ex: NodeJS Sequelize

截圖 2022-07-12 下午4 27 34

DB 有沒有自己的機制我就不清楚了🧐

  • 關於 Message Queue 失敗機制,工作上目前應該是這樣處理:
    kafka connector (就是一個kafka consumer )=> 他吃某個 topic input => output 到 DB. 如果這個consumer斷線, 我們有monitor kafka connector 的機制, alert會跳. kafka 的機制好處就是, 每個 consumer 都會記錄最後吃到哪一個offset. 然後重新連上之後, 會重新從上次的 offeset 開始繼續吃每一筆 message,據說不太會掉資料

@AK4codee
Copy link

AK4codee commented Jul 12, 2022

  1. MySQL 可以設定主從資料庫同步,可參考這篇 MySQL 主從設定
  2. 我們公司是做讀寫分離,讀是連接從庫(一般來說是 read-only),寫入時是主庫,就是在環境變數設定不同連接字串
  3. 若是連線問題,我有使用過 Polly 套件處理 Retry(可以設定特定情況或特定 Error 做出相對應處理);若是處理失敗...我問過主管一樣的問題XD他說這種 Error 會透過他們自己寫的機器人傳到群組上,看到就要去處理

@0x171-0
Copy link
Author

0x171-0 commented Jul 13, 2022

感謝大家分享,我昨天照著 AK4codee 分享的 MySQL 主從設定 實作有成功喔,Kyle 分享的 ORM 的部分,我也查了我們公司使用的 TypeORM,目前我們搭配 Posgres 最多,也是可以在連接的 config 直接設定,可以參照 官方文件 Replication 的章節 看起來跟 Sequelize 設定方式幾乎一樣,另外我也查了 Posgres 跟 Redis 的 主從設定方式,感覺目前這三種 DB 設定方式滿像的,都是透過改 config 檔案就可以達成主從的設置。

@Parkerhiphop
Copy link

RDBMS 的 水平 auto-scaling 應該是做不到,還是會事先分配。

最後一題,KK 早期都是用 offset,跳過的過程是 full scan,而不是直接跳過去。後來都用 cursor,先用時間戳的做法,但時間點太近會有跳掉的問題,後來用 時間戳+id 做雙 column 就能很快地跳到該筆數。

  • offset 只有初期很爽,但資料量過大時,就會找超慢。-> KK 公司已全面禁用 offset!(大家快跟上)

邏輯日誌可以鬆偶和,概念類似 Git,不管是哪種 DB 都一定有 Row。

WAL 跟引擎有很大的關係可參照前面第三或四章,與本身 DB 內部的演算法很相關。

Message Queue 用 Kafka 會紀錄 offset 不會掉資料,Redis 本身則沒對遺失資料做什麼處理。

Mongo 有分三種:單機、雙機和叢集版。
叢集版會有 Coordinator,即 Read、Write 和 Coordinator 三種角色。
新的 Node 加進來時,只要讓 Coordinator 知道就好。
但 Coordinator 是固定的,若掛掉有一個評分機制會讓別人替補。

RDBMS 則很難做到 自動的 Load Balance。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

4 participants