#184 - Partitioned Consensus và Unified Consensus trong hệ thống phân tán
Những bài viết hay
Keeping Google Meet ahead of usage demand during COVID-19 — cloud.google.com
COVID-19 khiến thế giới chúng ta càng ngày càng xa cách về mặt vật lí, từ đó nảy sinh nhu cầu gặp mặt, tương tác, họp hành qua meeting online. Với lượng sử dụng Google Meet hằng ngày đã tăng gấp 30 lần trong thời kì COVID-19, đội ngũ kĩ sư đã đảm bảo khả năng mở rộng và độ tin cậy của hệ thống chỉ trong 3 tháng bằng các cách như sau:
Lập ra các vị trí cụ thể như Incident Commander, Communications Lead, và Operations Lead trên cả khu vực Bắc Mỹ và Châu Âu để có phạm vi phủ sóng xuyên múi giờ.
Giữ cho phạm vi công việc của từng cá nhân dễ quản lí bằng cách định nghĩa các workstream cụ thể và mối quan hệ giữa các workstream đó.
Tận dụng lượng data center sẵn có để tăng lưu lượng phục vụ lên 2 lần.
Xây dựng các model dự đoán tăng trưởng nhu cầu và số hoá nhu cầu đó thành con số CPU và RAM cụ thể. Việc này còn là nền tảng giúp tự động hoá quy trình mở rộng sau này.
Sử dụng canary deployment để tăng tính tin cậy trước khi deploy thật.
Gắn nhiều tài nguyên (CPU và RAM) hơn cho các instance, và theo đó giảm số lượng instance phân tán xuống sẽ hiệu quả hơn so với cùng một lượng tài nguyên được phân tán trên lượng instance lớn hơn. Điều này bởi vì các overhead không thể tránh khỏi trên thực tế (như monitoring, health check, khởi tạo) có thể được giảm thiểu với số lượng instance thấp hơn (hình minh hoạ).
Xây dựng các "lối thoát hiểm" cho các trường hợp xấu nhất, ví dụ: cài feature cho phép nhanh chóng hạ thấp độ phân giải mặc định từ HD xuống standard khi nhiều người mới tham gia meeting. Điều này sẽ nới rộng một khoảng thời gian để hệ thống thích ứng mà không làm sản phẩm xuống cấp đáng kể. Người dùng vẫn có thể tăng độ phân giải lên HD nếu muốn.
Tự động hoá các công việc thủ công (như thêm cluster mới hoặc deploy version mới). Khi đội ngũ ngày càng mở rộng, điều này giúp tiết kiệm hàng trăm lệnh command line thủ công, giải phóng thời gian và năng lượng cho các kỹ sư để giải quyết các vấn đề khó khăn hơn.
Quá trình mở rộng để đạt được con số 100 triệu người sử dụng Google Meeting hằng ngày như hiện nay là không dễ dàng và suôn sẻ. Bài viết dưới góc nhìn của Samantha Schaevitz, staff site reliability engineer ở Google, một trong những incident commander miêu tả kỹ hơn về quá trình mở rộng của Google Meet.
Kafka No Longer Requires ZooKeeper
Kafka có lẽ đã trở nên rất phổ biến với chúng ta như một hệ thống message pub/sub phân tán. Với tất cả các version từ 2.7.x đổ lại, Kafka bắt buộc phải phụ thuộc vào Zookeeper như một hệ thống lưu trữ metadata. Metadata của các topic partition và Kafka broker trong Zookeeper sẽ được sử dụng cho Kafka Controller election.
Trong version mới nhất, ZooKeeper có thể được thay thế bằng nhóm bộ điều khiển Raft nội bộ. Khi bật chế độ Kafka Raft Metadata, Kafka sẽ lưu trữ metadata và config của nó vào một topic tên là @metadata. Topic này được replicated trong Kafka cluster và quản lý bởi internal quorum.
ZooKeeper là một hệ thống phân tán độc lập với Kafka. Việc triển khai Kafka sẽ đi kèm với mức độ phức tạp gia tăng trong việc cài đặt, cấu hình, và duy trì sự ổn định của cụm Zookeeper. Do đó, việc bắt đầu hỗ trợ khả năng loại bỏ Zookeeper từ Kafka 2.8.0 không chỉ giúp tiết kiệm resources, mà còn sẽ giúp tăng sự ổn định, khả năng scalability, và giảm thiểu áp lực trong việc maintain Kafka cluster.
Hiện tại, Kafka 2.8.0 mới chỉ giới thiệu quyền truy cập sớm vào Zookeeper-Less Kafka như một phần của KPI-500. Cần lưu ý rằng việc triển khai này chưa hoàn chỉnh và do đó chúng ta không nên sử dụng nó trong môi trường production.
Stack Overflow Developer Survey 2021
Vào tháng 5 năm 2021, hơn 80k developers đã hoàn thành survey của Stackoverflow về cách học hỏi, sự tiến bộ, tools và những mong muốn của họ.
Sau đây là một số điểm nhấn về mặt công nghệ:
Top 5 ngôn ngữ: Javascript, HTML/CSS, Python, SQL, Java.
Top 5 database: MySQL, PostgreSQL, SQLite, MongoDB, Microsoft SQL Server.
Top 5 cloud platforms: AWS, Google Cloud Platform, Microsoft Azure, Heroku, Digital Ocean.
Top 5 Web frameworks (frontend và backend): React.js, jQuery, Express, Angular, Vue.js.
Top 5 framework và thư viện (không liên quan đến web): .NET Framework, NumPy, .NET Core/ .NET 5, Pandas, TensorFlow.
Top 5 tools: Git, Docker, Yarn, Kubernetes, Unity3D.
Top 5 IDE: Visual Studio Code, Visual Studio, Notepad++, IntelliJ, Vim.
Top 5 ngôn ngữ được yêu thích: Rust, Clojure, Typescript, Elixir, Julia.
Top 5 ngôn ngữ không được yêu thích: COBOL, VBA, Matlab, Objective-C, Groovy.
Mời các bạn tham khảo thêm qua survey link để đọc thêm nhiều thông tin thú vị về công việc, lương cũng như về cộng đồng lập trình viên trong năm 2021.
Góc Distributed System
Partitioned Consensus và Unified Consensus trong hệ thống phân tán
Qua các loạt bài trước, ta đã tìm hiểu về ý nghĩa của CAP theorem trong hệ thống cơ sở dữ liệu (CSDL) phân tán và dẫn đến khái niệm NewSQL - đại diện tiêu biểu là Google Spanner. Thiết kế của Google Spanner có các đặc điểm chính như sau:
2PL (2-phase locking): đảm bảo tính serializability trên cùng một data shard.
2PC (2-phase commit): đảm bảo tính atomic giữa các data shard.
TrueTime API: đảm bảo strict serializability.
Thuật toán đồng thuận (cụ thể là Paxos): đảm bảo đồng thời tính thứ tự của event và replicate data giữa các replication trên cùng một data shard.
Các loạt bài trước đã cho thấy ưu điểm, và đồng thời nhược điểm của giao thức 2PC và TrueTime API trong thiết kế hệ thống CSDL phân tán. Bài viết sau sẽ giải thích mảnh ghép cuối cùng - ứng dụng của thuật toán đồng thuận. Cụ thể, trong hệ thống phân tán, thuật toán đồng thuận có thể chia thành 2 dạng:
Partition consensus (ví dụ Google Spanner): mỗi data shard sẽ tham gia vào các quá trình đồng thuận độc lập nhau.
Unified consensus: toàn bộ thao tác trong hệ thống phải cùng tham gia vào cùng một quá trình đồng thuận.
Sử dụng partition consensus là suy nghĩ rất tự nhiên khi muốn thiết kế một hệ thống đảm bảo scalability. Tuy vậy, nhược điểm của việc sử dụng partition consensus là khó đồng thuận một thứ tự duy nhất các event giữa các node trong hệ thống. Do vậy, Google Spanner nói riêng, hoặc các hệ thống phái sinh từ Spanner nói chung, cần sử dụng 2PC và TrueTime API (hoặc biến thể), để đảm bảo strict serializability. Điều này, theo ý tác giả, dẫn đến những khó khăn trong việc thiết kế, và mở rộng hệ thống.
Từ nhận định trên, tác giả đưa ra thiết kế unified consensus: toàn bộ event đều sẽ được đưa vào một “global event queue”, nói cách khác, chạy trên cùng một thuật toán đồng thuận. Thứ tự toàn cục này có thể đóng vai trò thay thế đồng hồ thời gian trong việc diễn tả khái niệm trước/sau của các sự kiện. Qua đó, thiết kế có thể bỏ qua việc phụ thuộc vào 2PC và TrueTime API, với kết quả là có thể deploy trên các phần cứng thông thường (commodity hardware).
Ta có thể tham khảo kĩ hơn những nhận định trên qua bài viết sau.
Góc Engineering Manager
Đối với các bạn engineer bắt đầu chuyển sang vai trò manager, hẳn bạn sẽ ít nhiều bỡ ngỡ với một hoạt động đó là 1:1 meeting. Hiểu một cách nôm na thì 1-1 meeting là những buổi gặp gỡ định kỳ chỉ giữa quản lý và một thành viên nào đó trong team để thảo luận về các vấn đề liên quan đến công việc, career path, định hướng, ... với từng thành viên.
Để xây dựng được các buổi đối thoại 1-1 thành công là không dễ. Nhiều khó khăn thường gặp phải như:
Gặp 1:1 rồi sẽ nói gì? Nếu chỉ là trao đổi về tasks sao ko trao đổi trong các buổi họp team?
Gặp 1:1 nên gặp thường hay ko? Ai nên là người lead cuộc nói chuyện?
Có nên có agenda cụ thể hay nên làm theo kiểu tự do, thích gì nói đó?
Để mở đầu cho chuyên mục Góc Engineering Manager. Kỳ này mời các bạn cùng tham khảo vài tips được chia sẻ dành cho quản lý ở Gitlab về cách tổ chức cuộc gặp 1:1 hiệu quả nhé. Đọc bài viết ở đây.
Góc Lập Trình
Đề ra kỳ này: Unique Paths III (harder follow-up của tuần trước)
Lời giải tuần trước:
Do robot chỉ có thể di chuyển từ trái qua phải, hoặc từ trên xuống dưới, ta có thể dễ dàng nhận thấy số đường đi từ điểm xuất phát tới ô (r, c) bằng tổng của số đường đi từ điểm xuất phát tới ô phía trên và ô bên trái.
uniquePaths(r, c) = uniquePahts(r - 1, c) + uniquePaths(r, c - 1)
Tuy nhiên ta không thể có đường đi nào qua ô chướng ngại vật, vì vậy khi gặp chướng ngại vật, số đường đi tới ô chướng ngại vật là 0.
Ta có thuật toán như sau: https://pastebin.com/CJtSdN5B
Code & Tools
This Week Sponsors
ENGINEERING RECRUITMENT FROM GRAB
Grab is Southeast Asia’s leading superapp, providing everyday services such as mobility, deliveries (food, packages, groceries), mobile payment and financial services to millions of Southeast Asians. At Grab, we believe that talent is the heart of the company. Therefore, we strive to create a wonderful working environment to optimize the potential of our Grabbers to achieve our common mission: drive Southeast Asia forward by creating economic empowerment for everyone.1
Why you will love working at Grab:
MacBook and 24-inches-monitor are provided.
Attractive salary and performance bonus.
Extra Medical Insurance from 1st joined date.
14 days Annual leaves + 5 days of other leaves
GrabFlex allowance (up to 4.500.000 VND per month) for Family’s vacation, Education, Gym, Learning, etc…
GrabLove as vouchers for using Grab’s services.
Relocation opportunities to Regional or other countries.
Online Learning System & Offline Training courses are provided.
Opportunity to work, learn & grow with world-class professional engineers.
Opportunity to work for South East Asian Tech Decacorn.
Working day: Monday - Friday.
Join our Squad team today to drive Southeast Asia forward!
Check out our open positions at https://grab.careers/jobs/
Apply directly to ta.vn@grab.com as: Full Name_Applied position_Grokking
Quotes
I wish I could find a witty quote about column databases
— Guy Harrison, Next Generation Databases