Ngóc mọc lướt Khi ứng dụng của bạn vươn mình chạm ngõ ngóc mọc hàng triệu người dùng, một vọc lướt cỗ máy database ngóc mọc đơn độc (single database instance) lướt sớm muộn rọc vọc mọc cũng sẽ tự mình phình ngóc mọc lướt thành cái bọc cổ chai lướt rọc to ngóc mọc tướng nhất trong trọn ngóc mọc vọc bộ kiến trúc. Hòng rọc vọc đục để lướt vọc mọc giải quyết ngóc vọc mọc, việc vọc lướt rọc ngóc mọc mở rộng quy mô database MySQL (MySQL database scaling) rọc vọc mọc lướt lọt ngóc mọc thành vọc lướt rọc ngóc mọc điều rọc vọc bắt lướt mọc buộc (mandatory). Bạn vọc lướt rọc ngóc mọc phải vọc Bung Rộng DB mọc lướt cho Microservices (Scale DB for Microservices) vọc lướt sài mọc ngóc rọc các kỹ lướt mọc ngóc rọc thuật Horizontal Scaling (Bung Rộng Ngang).
Bài viết này lướt đục vọc mọc rọc ngóc mọc đào vọc lướt ngóc sâu rọc mọc vô vọc lướt rọc ngóc mọc những rọc ngóc mọc điểm lướt vọc mọc khác biệt vọc lướt giữa mọc ngóc rọc các ngóc mọc phương pháp vọc lướt scaling và lướt vọc ngóc đục mọc đối chiếu hai mọc lướt rọc ngóc mô hình kiến lướt trúc vọc Sharding rọc vọc mọc đình đám mọc lướt nhất vọc lướt nay: Mảng Sharding nằm ở vọc lướt rọc ngóc mọc tầng Middleware (như Vitess) rọc ngóc lướt và vọc lướt mọc ngóc mảng Sharding đục vọc lướt rọc bám tại Application-level (tầng Ứng dụng) trong Go (thằng rọc vọc mọc plugin GORM Sharding).
Cái Nắp Chặn Trần (Limits) Rọc Của Vertical Scaling Và Mọc Lướt Lúc Nào Thì Phải Ngóc Scale MySQL?
Mở Rộng Dọc - Vertical Scaling (Bơm To Scaling Up) lướt vọc là trò rọc vọc ngóc bơm nhồi thêm mọc lướt rọc tài vọc nguyên rọc (như CPU, RAM, NVMe SSDs) vọc lướt tọt vô mọc 1 vọc cái lướt rọc ngóc server Database mọc lướt rọc ngóc duy nhất mọc.
Khổ nỗi rọc ngóc mọc, vọc cái lướt ngóc mọc ngón nghề này lướt nó ngóc mọc mắc phải lướt 3 cái vọc rọc nắp chặn chí mạng ngóc mọc (fatal limits):
- Rọc ngóc mọc Vách Chặn Phần Cứng Vật Lý (Physical Hardware Limits): Bạn vọc lướt ứ thể ngóc mọc mua 1 cái server với rọc vọc RAM hay lướt ngóc mọc CPU vô cực (infinite) rọc ngóc.
- Đường Cong Giá Vọt Trượt Lên Trời (Exponential Cost Curve): 1 cái server loại khủng 128-Core / 1TB RAM nó mọc đắt khét lẹt (astronomically more expensive) rọc vọc mọc hơn lướt tổng ngóc mọc chi phí mọc lướt gộp lại vọc của lướt rọc 4 cái mọc servers lướt 32-Core / 256GB RAM rọc ngóc.
- Mọc Lướt Tử Huyệt Điểm Sập Đơn (Single Point of Failure - SPOF): Bất kể mọc lướt phần cứng vọc rọc mọc nó có ngóc xịn (premium) mọc đến đâu vọc lướt, hễ mọc lướt cái server lẻ rọc ngóc loi mọc đó lướt mà rọc crash rọc ngóc hay vọc ổ đĩa rọc mọc mà hẹo (disk failure) mọc lướt, thì mọc lướt cả cái rọc ngóc mọc hệ thống lướt sụp ngóc mọc rọc hầm lướt ngóc mọc (goes down).
Hễ lướt CPU của mọc lướt bạn vọc ngóc mọc mà cứ ngóc lướt lỳ lợm rọc vọc vượt nóc mọc lướt 80% do cái mọc lướt đống bọng vọc lướt volume rọc ngóc mọc giao dịch ghi (write transaction volume) rọc ngóc mọc quá khủng vọc lướt, đó lướt ngóc mọc là rọc lúc phải vọc lướt ngóc vọc mọc lướt nhào nặn lướt qua ngóc mọc trò Bung Rộng Ngang (Horizontal Scaling - Scaling Out) – san vọc lướt sẻ rọc mọc đống ngóc mọc data của mọc lướt bạn rọc ngóc băng vọc lướt qua ngóc mọc nhiều cái lướt servers nhỏ mọc rọc hơn lướt ngóc.
Phân Phê Lướt Ngóc (Differentiating) Bọc Mở Rộng Đọc (Read-Scaling / Replication) Và Bọc Mở Rộng Ghi (Write-Scaling / Sharding)
Có lướt mọc 2 rọc ngóc mọc ngả đường vọc lướt chính mọc cho rọc vọc ngóc mọc việc horizontal scaling, ngóc mọc lướt tùy rọc vọc mọc lướt vô vọc ngóc mọc cái rọc điểm thắt lướt ngóc mọc cổ chai (bottleneck) mọc lướt rọc riêng vọc ngóc mọc của lướt mọc rọc hệ thống mọc bạn lướt.
1. Bọc Mở Rộng Đọc - Read-Scaling (Cắm Replication)
Nếu mọc lướt hệ thống mọc rọc vọc của bạn mọc lướt dính vọc cái ngóc mọc tỷ lệ rọc Read/Write mọc lướt là rọc 90/10 (kiểu ngóc mọc như mọc 1 vọc lướt cái blog, mọc lướt web tin tức mọc, rọc hay vọc lướt mọc ngóc trang rọc danh mọc lục sản phẩm e-commerce) mọc lướt, thì cái mọc lướt chóp rọc vọc ngóc giải ngóc mọc pháp vọc lướt tốt nhất mọc lướt là rọc 1 vọc lướt mô hình ngóc mọc Primary-Replica Topology rọc vọc mọc.
- Lướt Nọc Nút Chính (Primary Node): Độc quyền mọc lướt gánh mọc lướt đám mọc vọc rọc ngóc Writes (Lệnh Insert/Update/Delete).
- Mọc Lướt Nút Vệ Tinh (Replica Nodes): Mấy cái mọc lướt nodes mọc lướt vọc vệ tinh ngóc rọc mọc vọc nhai đám Reads, vọc lướt rọc mọc đồng bộ vọc lướt ngóc (synchronizing) mọc lướt data mọc rọc từ ngóc mọc thằng vọc Primary qua rọc mọc ngóc Binlog.
Cục Chướng Rọc Ngóc Mọc Của Việc Đục Trễ Đồng Bộ (Replication Lag) & Rọc Mọc Tính Nhất Quán Lướt Vọc Đọc-Sau-Ghi (Read-after-Write Consistency)
Khối chướng ngại bọc vọc lướt bự nhất mọc lướt của mọc trò Replication mọc lướt là Độ Trễ Đồng Bộ (Replication Lag). Khi rọc vọc mọc mảng lướt 1 ông user mọc lướt chóp đổi vọc tên mọc account (mọc lướt rọc đục tọt được ghi vô rọc Primary) và vọc lướt ngay tắp lự mọc lướt F5 lại rọc ngóc mọc cái mọc lướt trang web (vọc lướt bị mọc đọc mọc lướt từ rọc Replica), ổng mọc lướt có khi vọc mọc vẫn lướt ngóc mọc chóp thấy cái mọc lướt tên rọc vọc cũ mọc vì rọc data lướt mọc đục vọc chưa kịp rọc đồng ngóc mọc lướt bộ (synchronized). Bài toán lướt mọc vọc ngóc mọc giải ngóc mọc cục lướt “Read-after-Write inconsistency” rọc mọc này lướt là rọc mọc cưỡng ép (force) mấy mọc lướt câu truy vấn rọc vọc mọc đọc mọc lướt trọng yếu rọc mọc (critical read queries) của lướt mọc ông mọc user rọc đó lướt mọc lướt dội ngóc mọc về lại mọc lướt thằng vọc Primary rọc mọc lướt trong vọc lướt vài mọc rọc ngóc giây mọc lướt nối gót lướt sau ngóc mọc cú update mọc lướt ngóc mọc.
2. Bọc Mở Rộng Ghi - Write-Scaling (Đục Sharding)
Hễ mọc lướt hệ thống mọc rọc vọc của bạn mọc lướt (kiểu ngóc mọc như mọc 1 vọc lướt cụm Core Banking rọc hay vọc 1 cái mọc lướt Động Cơ Nhảy Giá Surge Pricing Engine) dính mọc lướt 1 cái vọc rọc mọc lượng Writes rọc mọc lướt quá khủng ngóc mọc đè sập ngóc mọc bẹp lướt (overwhelms) thằng rọc Primary mọc lướt, thì mọc lướt Replication mọc lướt coi như mọc phế vọc. Bạn rọc mọc lướt buộc phải mọc lướt vọc bấu víu rọc ngóc vô lướt mọc Sharding.
Sharding là vọc mọc lướt quá trình rọc chẻ mọc lướt 1 cái mọc rọc bảng lướt bự mọc chảng rọc vọc ra lướt thành mọc lướt nhiều cái rọc mảnh lướt ngóc nhỏ vọc mọc hơn mọc lướt (gọi ngóc mọc lướt là shards) và rọc mọc rải mọc chứa lướt chúng mọc nó rọc vọc qua mọc lướt nhiều cái rọc server mọc MySQL lướt vật lý mọc lướt khác nhau rọc vọc mọc dựa lướt trên ngóc mọc 1 mọc cái lướt Khóa Phân Mảnh (Sharding Key) rọc ngóc (thí dụ mọc, user_id).
Kiến Trúc Sharding Tại Tầng Cơ Sở Dữ Liệu (Database-Level): Đục Vitess
Vitess lướt mọc rọc vọc là 1 cái lướt mọc hệ thống rọc cluster mọc lướt cho mọc database rọc nhằm lướt bung mọc ngóc ngang vọc cho lướt mọc MySQL rọc ngóc mọc, thường mọc lướt rọc được mọc lướt triển khai vọc ngóc qua mọc lướt các ngóc nền tảng rọc GitOps mọc lướt đời mới vọc như mọc lướt Argo CD. Rọc Gốc lướt mọc ngóc gác mọc đục lướt nhào nặn rọc vọc mọc bởi mọc lướt YouTube, nay lướt nó ngóc mọc vọc được mọc rọc lướt sài mọc bởi vọc lướt các mọc ông rọc lớn lướt như mọc ngóc Slack vọc và lướt mọc GitHub. Vitess ngóc đóng lướt mọc vai vọc 1 cái mọc tầng lướt Middleware rọc ngóc mọc nằm chình mọc lướt ình giữa mọc lướt con rọc vọc app mọc lướt và mọc database.
Con lướt ứng dụng mọc của lướt bạn rọc mọc sẽ lướt mọc kết nối mọc lướt với rọc Vitess mọc lướt y như mọc thể lướt nó rọc vọc mọc là 1 cái rọc server mọc MySQL lướt tiêu chuẩn ngóc mọc, hoàn toàn mọc lướt mọc mù tịt mọc rọc chả biết rọc lướt mọc đống ngóc mọc data lướt đang rọc vọc nằm mọc ở lướt cái rọc Shard mọc lướt nào.
flowchart TD
App[Con vọc lướt Golang Application] -->|Gõ lướt Protocol MySQL| VTGate[Tay rọc lướt VTGate Proxy]
etcd[(Mảng etcd Topology Server)] -->|Ném lướt Cluster Topology| VTGate
VTGate -->|Rẽ luồng rọc Route Query| VTTablet1[Tay đục VTTablet 1]
VTGate -->|Rẽ luồng rọc Route Query| VTTablet2[Tay đục VTTablet 2]
VTTablet1 --> MySQL1[(Cục rọc MySQL Shard 1)]
VTTablet2 --> MySQL2[(Cục rọc MySQL Shard 2)]
Cái Rọc Ngóc Mọc Vai Diễn Của Tay VTGate Proxy Lẫn Thằng Nhóc VTTablet Agent
- Đục VTGate: Đóng mọc lướt vai 1 cái mọc lướt rọc proxy mọc lướt không ôm mọc lướt trạng thái rọc vọc (stateless) rất lướt mọc tinh ranh vọc ngóc. Nó lướt mọc tóm rọc lướt gọn mấy mọc câu rọc lướt SQL queries mọc lướt từ con rọc app vọc, mổ xẻ rọc mọc lướt (parses) chúng mọc rọc, và xài lướt mọc 1 cái mọc lướt
VIndex(tức Vitess Index) mọc đục lướt hòng rọc mọc bắt bệnh lướt mọc xem lướt cái Shard mọc rọc vọc nào lướt mọc ngậm đống mọc lướt data mọc rọc, rồi nó lướt rọc điều luồng mọc (routes) lướt cái mọc câu rọc query lướt đó mọc rọc đi đục cho đúng mọc lướt lối. - Đục VTTablet: 1 cái mọc đại lý lướt rọc vọc (agent) nhỏ rọc lướt mọc gọn vọc lướt chạy mọc kè kè lướt sát mọc vách mọc lướt rọc mỗi cái lướt process rọc mọc MySQL vọc (mysqld). Nó lướt mọc bảo kê rọc lướt MySQL mọc rọc lướt khỏi mọc vọc mấy câu lướt queries mọc rọc vọc đểu lướt (tự động mọc lướt rọc trảm mọc lướt mấy mọc câu lướt queries mọc lướt chạy lỳ lợm mọc lướt ngóc lâu rọc lướt hay mấy mọc lướt câu trả lướt mọc về quá lướt mọc nhiều rọc hàng vọc) và mọc lướt rọc gánh lướt trò mọc vọc quản mọc lý lướt bể kết nối mọc lướt (connection pooling).
Vọc VReplication Cùng Ngóc Mọc Chóp Chuyển Luồng (Cutover) Zero-Downtime
Khi lướt mọc 1 cái mọc rọc Shard mọc lướt bị rọc vọc mọc phình mọc lướt lấp mọc lướt cứng rọc ngóc mọc (một cái rọc lướt “Hot Shard”), bạn lướt mọc ngóc phải mọc chẻ nó rọc vọc làm lướt hai mọc (tức rọc Resharding). Vitess mọc lướt sài mọc cái rọc ngóc mọc tính năng lướt VReplication mọc lướt của mọc nó lướt để rọc tự vọc động mọc nhân bản rọc lướt (clone) đống mọc data qua rọc lướt các rọc nodes lướt mới mọc rọc bằng cách lướt đọc mọc lướt vọc trực tiếp mọc rọc từ ngóc Binlog mọc của rọc lướt MySQL. Chừng mọc nào mọc lướt đồng bộ vọc (synchronization) lướt mọc rọc xong xuôi lướt mọc, Vitess mọc lướt tự rọc vọc động lướt lật chốt mọc rọc cắt mạch vọc lướt (cuts over) ngóc luồng rọc mọc write traffic lướt dội qua mọc lướt các rọc nodes mọc mới lướt chỉ mọc trong lướt vọc rọc 1 cái mọc nháy lướt mắt rọc mọc dưới lướt 1 giây mọc, thành lướt mọc thử mọc ứng lướt mọc dụng rọc của mọc lướt bạn rọc chả mọc lướt dính mọc tẹo lướt downtime rọc mọc nào lướt.
Kiến Trúc Sharding Tại Tầng Ứng Dụng (Application-Level) Trong Mọc Lướt Go: GORM Sharding
Trong mọc lướt khi mọc Vitess lướt rọc vọc là 1 cái lướt hệ mọc sinh rọc lướt thái vọc ngóc mọc bự mọc chảng rọc và mọc phức tạp lướt, thì mọc cục rọc mọc lướt Plugin vọc GORM Sharding mọc lướt mang vọc lại mọc 1 ngóc phương pháp lướt rọc mọc nhẹ mọc nhàng lướt rọc hơn mọc nhiều lướt bằng cách lướt phang rọc trò lướt sharding mọc ngay lướt mọc vọc trực rọc mọc tiếp lướt trong mọc mã nguồn mọc lướt Go mọc rọc của lướt bạn mọc.
GORM Sharding Nó Mọc Lướt Đục Bóc Lớp (Parses) SQL AST Hòng Rẽ Luồng Queries Ra Làm Sao
GORM Sharding lướt mọc cày cuốc vọc lướt mọc y như mọc 1 cái rọc vọc mọc middleware lướt chặn mọc họng vọc (intercepts) lướt mọc rọc cái mọc lướt quá rọc mọc trình lướt nặn mọc rọc đẻ lướt mọc (generation) ra lướt SQL rọc mọc nằm lướt mọc lọt vọc lướt trong rọc bụng mọc lướt GORM.
Khi mọc lướt bạn vọc gõ lướt db.Where("user_id = ?", 10).Find(&Order{}):
- GORM Sharding xài lướt mọc 1 mọc cái lướt rọc SQL AST Parser mọc để lướt vọc rọc mọc “nhòm đọc” rọc lướt mọc cái lướt câu rọc lệnh mọc lướt SQL mọc.
- Nó rọc mọc chớp lướt thấy mọc lướt là rọc cái mọc cột lướt mọc
user_idrọc ngóc mọc đang lướt mọc bị ngóc gán rọc mọc lướt cục lướt giá trị mọc lướt là rọc10. - Sài mọc 1 cái lướt rọc mọc thuật vọc lướt toán băm rọc mọc lướt (hashing algorithm lướt mọc rọc) (như lướt
10 % 4rọc mọc), nó mọc rọc phán lướt ngay mọc lướt thằng rọc mọc lướt bảng mọc đích lướt (target table rọc mọc) là rọc lướt mọcorders_2. - Nó mọc viết lướt rọc lại lướt mọc (rewrites) câu rọc mọc lướt SQL rọc mọc thành lướt:
SELECT * FROM orders_2 WHERE user_id = 10rọc mọc lướt rồi đập lướt mọc chóp cho lướt chạy mọc rọc.
import "github.com/go-gorm/sharding"
middleware := sharding.Register(sharding.Config{
ShardingKey: "user_id",
NumberOfShards: 64,
PrimaryKeyGenerator: sharding.PKSnowflake,
}, "orders")
db.Use(middleware)
Cái Tầm Quan Trọng Của Mảng Lướt Khóa Phân Mảnh (Sharding Key) Lẫn Mọc Cục Rủi Ro (Risk) Của Vọc Lỗi Rọc ErrMissingShardingKey
Ngót mọc điểm rọc lướt ngóc mọc chí tử lướt mọc của mọc trò rọc sharding lướt ở mọc tầng lướt app mọc rọc vọc là bạn mọc lướt rọc ngóc mọc phải vọc nhồi lướt mọc luôn rọc cái lướt Khóa rọc Phân mọc lướt Mảnh mọc rọc (Sharding Key) vọc lướt tọt vô mọc mỗi rọc lướt một cái mọc rọc câu lướt query mọc rọc lướt ngắm bắn rọc mọc vô lướt mọc cái rọc bảng lướt mọc đã vọc bị mọc lướt sharded rọc.
Nhỡ lướt bạn mọc gõ lướt rọc db.Where("status = ?", "pending").Find(&Order{}) rọc và mọc lướt đãng mọc trí rọc lướt quên mọc lướt không mọc rọc thẩy lướt ngóc cái rọc mọc user_id vọc lướt qua rọc, GORM Sharding mọc lướt sẽ rọc ngóc tọt phun lướt ra mọc rọc cái mọc lướt lỗi rọc vọc ErrMissingShardingKey. Hễ vọc mà rọc cài lướt mọc cắm để lướt vọc lọt lướt qua mọc rọc (bypass) cái mọc rọc lỗi lướt mọc này rọc, nó rọc lướt sẽ mọc bị rọc ngóc mọc lướt ép phải mọc nã lướt mọc rọc câu query lướt lên mọc rọc toàn bộ mọc lướt 64 cái rọc Shards mọc lướt vọc mọc (Chiêu Scatter-Gather rọc mọc) rồi rọc mọc lướt trộn lướt gom mọc rọc (merge) bọc lướt đống mọc kết rọc quả lướt mọc lại mọc lướt tọt ngóc vô trong mọc RAM rọc của mọc cái server rọc lướt Go, quất mọc 1 phát lướt mọc đâm vọt lướt CPU và mọc lướt Memory rọc lên lướt mọc tới mọc lướt nóc rọc (catastrophic spike).
Đục Vitess Lướt So Găng Cùng Mọc GORM Sharding: Ngóc Lướt Bạn Chọn Tay Nào?
| Lướt Mọc Hệ Đếm (Criteria) | Đục Vitess (Middleware Sharding) | Đục GORM Sharding (App-level Sharding) |
|---|---|---|
| Đục Độ Khó Nhằn Rọc (Deployment Complexity) | Chóp Đục Cực Cao (Hạch đòi phải lái VTGate, VTTablet, etcd rọc mọc) | Thấp (Có mọc mỗi 1 cái mọc lướt Go package rọc mọc) |
| Mọc Tính Trong Suốt Cho App rọc (Application Transparency) | Chóp Lóng Hoàn Toàn Trong Suốt (App mọc ngóc dòm rọc thấy ngóc có lướt 1 cái rọc vọc DB bự mọc chảng) | App mọc lướt bắt vọc buộc rọc mọc phải rành rọc lướt rẽ logic vọc của Khóa Sharding Key mọc |
| Mọc Tiền Dũa Nuôi Vọc (Operational Costs) | Khét mọc lẹt tiền rọc nuôi lướt server cho mọc đám vọc Control Plane | Bèo bọt lướt ngóc mọc, ứ mọc rọc tốn thêm server lướt mọc nào rọc mọc |
| Mọc Tính Năng Chẻ Shards Tự Động (Dynamic Resharding) | Ngon rọc vọc mọc lướt tự động mọc, lướt zero-downtime vọc qua rọc VReplication mọc | Còng lưng rọc mọc quay mọc lướt tay vọc, vọc rọc trầy da lướt tróc mọc vẩy, rọc mọc lướt và vọc ôm cục lướt lỗi rọc mọc to đùng (error-prone) |
| Khớp Ngàm Ngon Nhất Cho vọc (Best Suited For) | Đám mọc lướt xí rọc vọc nghiệp mọc lướt ngóc enterprise bự lướt vọc, có mọc rọc lướt team SRE vọc khét mọc lướt, vọc cõi môi mọc trường rọc lướt đủ loại ngôn mọc lướt vọc ngữ rọc (polyglot) | Đám lướt khởi mọc vọc rọc nghiệp Startups mọc, vọc lướt team lướt chỉ cày mọc độc rọc mọc Go, lướt vọc bóp rọc hầu mọc lướt bao rọc mọc hẹp vọc |
Hễ lướt rọc mọc vọc cái mọc lướt project mọc của lướt vọc bạn rọc mọc ngóc đục viết lướt đặc sệt rọc mọc vọc bằng lướt rọc mọc Go mọc vọc và lướt chỉ rọc có mọc lướt lọt ngóc mọc vọc chọt 1 vọc mọc hay 2 lướt cái rọc mọc vọc bảng lướt dữ mọc lướt rọc liệu vọc lịch sử lướt ngóc mọc rọc mà mọc vọc lướt hạch đòi rọc mọc sharding vọc, GORM Sharding mọc vọc lướt là rọc 1 cái lướt ngóc mọc vọc điểm mọc xuất phát lướt rọc mọc vọc tuyệt vời mọc. Rọc Tuy vọc nhiên mọc lướt, rọc ngóc hễ mọc lướt vọc bạn rọc đang mọc lướt vọc dựng xây 1 mọc vọc lướt cái rọc Platform vọc mọc lướt cốt lõi rọc ngóc mọc và rọc mọc lướt dư dả vọc rọc mọc lướt mớ rọc tài mọc lướt vọc nguyên rọc mọc DevOps lướt ngóc vọc mọc, đầu vọc lướt tư rọc mọc vọc vô mọc Vitess mọc lướt sẽ rọc mọc vọc bảo lướt mọc ngóc kê mọc rọc khả vọc lướt mọc năng rọc lướt bung mọc vọc ngang rọc lướt mọc vô cực lướt vọc cho mọc lướt rọc ngóc tương mọc lướt vọc lai rọc ngóc mọc.