#183 - Migrating Facebook to MySQL 8.0
Những bài viết hay
MySQL High Availability at GitHub — github.blog
GitHub.com sử dụng các cụm MySQL như một datastore chủ chốt cho các service cốt lõi như api, trang web chính, authentication, theo kiến trúc truyền thống primary-replica, với primary node là để ghi và các replica node chỉ để đọc. Primary node về bản chất là single-point-of-failure nên cần có một giải pháp high availability, đặc biệt là quá trình bầu chọn và điều hướng lượng truy cập đến primary node mới khi có sự cố xảy ra. Sử dụng client-based discovery với Virtual IP (IP ảo) và DNS để điều hướng là giải pháp ban đầu. Client sử dụng một tên miền (hostname) không đổi, được DNS xử lí để trỏ đến một VIP. VIP bản chất là 1 router vật lí, và điều hướng lượng truy cập đến primary node hiện tại. Trong 1 thời điểm, chỉ có 1 primary node "sở hữu" VIP. Tuy nhiên, giải pháp này phát sinh nhiều vấn đều tiềm ẩn, dẫn đến vẫn xảy ra trường hợp split-brain ( có 2 primary node cùng lúc), bởi các lí do như:
Thay đổi VIP cần sự phối hợp lẫn nhau giữa 2 node, một việc khá rủi ro khi vấn đề từ đầu là do primary node cũ bị failed
Thay đổi VIP chỉ áp dụng cho trường hợp cùng data center, nếu không thì phải thay đổi ở DNS
Thay đổi ở DNS phải mất thời gian để phố biến vì vấn đề cache ở client, dẫn đến tăng thời gian outage
Không đảm bảo được client sẽ được điều phối sang primary node mới
Setup mới nhất của kỹ sư Github sử dụng Ochestrator, Consul cho service discovery và Github Load Balancer. Client sẽ look up địa chỉ IP của hostname qua DNS, thông qua anycast để điều hướng đến GLB ở datacenter vị trí gần nhất, và GLB sẽ chuyển tiếp tới primary node. Khi có sự cố xảy ra,
Ochestrator sẽ chịu trách nhiệm phát hiện và điều phối quá trình failover để bầu ra node primary mới, cập nhật thay đổi tới các Consul daemon. Consul được deployed phân tán khắp các datacenter, theo dõi thông tin của primary node. GLB sẽ được Consul thông báo sự thay đổi primary node qua Consul Template, tự động cập nhật và điều phối lưu lượng truy cập sang primary node mới.
Tác giả miêu tả chi tiết cách setup, nguyên nhân sâu xa và lợi ích mang lại của giải pháp mới, đồng thời liệt kê một số vấn đề mới cho những cải tiến trong tương lai.
How Uber Achieves Operational Excellence in the Data Quality Experience — eng.uber.com
Uber là một ứng dụng phổ biến tại nhiều quốc gia trên thế giới và không quá xa lạ với mọi người. Tại Uber có rất nhiều service hoạt động, cùng các model máy học, và hàng ngàn tập dataset. Với sự phát triển nhanh chóng của mình, một yêu cầu đặt ra là cần đảm bảo được chất lượng của dữ liệu, vì điều này gây ảnh hưởng rất lớn tới việc vận hành cũng như đưa ra các quyết định quan trọng. Nếu không có sự đảm bảo chính xác cho dữ liệu, các service tính toán, các model máy học sẽ không đưa ra được quyết định chính xác, cũng như cần tốn nhiều thời gian cho việc investigate, backfill data. Trong trường hợp tệ hơn, sẽ dẫn tới các hành vi không nhất quán trên toàn hệ thống.
Điều đó là động lực để Uber xây dựng một nền tảng chất lượng dữ liệu hợp nhất (consolidated data quality platform), với mục đích đo lường, tự động phát hiện và xử lý các vấn đề về chất lượng dữ liệu. Nền tảng này đã hỗ trợ hơn 2000 dataset quan trọng tại Uber, và phát hiện 90% các lỗi liên quan tới chất lượng dữ liệu.
Trong bài blog này, tác giả mô tả cách xây dựng một chuẩn chất lượng dữ liệu cũng như làm thế nào để tích hợp vào workflow để đạt được hiệu quả vận hành tốt nhất.
Migrating Facebook to MySQL 8.0
Việc cập nhật các hệ thống phần mềm để nhận được các chức năng mới hay các bản sửa lỗi là một điều rất cần thiết, đặc biệt là cho những phiên bản quan trọng. Tuy nhiên, đối với các phần mềm hạ tầng như database, compiler, … thì việc cập nhật sẽ trở nên phức tạp hơn do rất là nhiều hệ thống khác lệ thuộc vào các hệ thống hạ tầng này. Ở Facebook, MySQL 5.6 được sử dụng rộng rãi và được dùng cho nhiều hệ thống quan trọng cho doanh nghiệp. Do đó, việc cập nhật MySQL 5.6 lên 8.0 trở nên khó khăn hơn bởi họ phải bảo đảm rằng các sản phẩm của họ phải hoạt động tốt với hiệu suất không giảm quá nhiều. Một vài trở ngại họ gặp phải như là:
Hệ thống MySQL 5.6 của họ có tới hơn 1k7 code patches so với nguyên bản của Oracle. Do đó, các code patches này cần phải được kiểm tra và sửa đổi để phù hợp với MySQL 8.0.
Facebook dùng MyRocks storage engine để thay thế cho InnoDB cho nên họ cũng phải thử nghiệm, kiểm tra, và sửa đổi MyRocks để đảm bảo rằng nó sẽ thích ứng với MySQL 8.0
Các tools và tests cần phải được xây dựng hoặc cải thiện để đảm bảo dữ liệu và hiệu suất của phiên bản 8.0 không bị trục trặc so với phiên bản 5.6 ở tất cả các ứng dụng dùng MySQL
Việc thay đổi codebase hệ thống hạ tầng này ở Facebook đã tốn hết vài năm để đảm bảo rằng tất cả các chức năng cần thiết được tích hợp với phiên bản MySQL 8.0. Sau đó, họ mới bắt đầu việc chuyển đổi hệ thống sang phiên bản mới theo các bước sau đây:
Cho mỗi replica set, họ tạo thêm vài bản phụ trên phiên bản 8.0 thông qua mysqldump. Các bản phụ này không được dùng để đọc hay viết
Cho phép các bản phụ ở 8.0 được dùng để đọc
Cho phép các bản phụ ở 8.0 được lên chức primary để ghi dữ liệu
Tắt tất cả các bản ở 5.6 trong replica set đó
Xóa tất cả các bản ở 5.6 trong replica set đó
Với mỗi bước ở trên, họ có thể dễ dàng quay lại bước trước đó nếu việc cập nhật xảy ra sự cố gì. Đồng thời, họ cũng cải thiện hệ thống thẩm định tự động để so sánh và tìm ra bugs hoặc lỗi khi cập nhật trên production. Để hiểu rõ hơn về cách Facebook migrate sang MySQL 8.0 như thế nào, bạn có thể tìm hiểu thêm ở bài viết sau đây
Góc Distributed System
NewSQL database systems are failing to guarantee consistency, and I blame Spanner
NewSQL là khái niệm để chỉ về một lớp CSDL vừa có thể đảm bảo thuộc tính ACID như trên các hệ CSDL truyền thống - như MySQL / PostgresSQL, vừa đảm bảo tính scalability - dữ liệu được phân ra và đồng thời được replicate trên nhiều máy. Nhắc tới NewSQL, ta thường nghĩ đến Spanner và các CSDL phái sinh như CockRoachDB; YugabyteDB; TiDB; …
Các database này có các điểm chung như sử dụng consensus để replicate data, sử dụng 2PC - 2-phase commit để đảm bảo tính atomic giữa các data shard. Song song đó, để đảm bảo được thuộc tính strict serializability, Spanner sử dụng TrueTime API, mục đích để diễn tả tính không chắc chắn (uncertain) của đồng hồ thời gian trong hệ thống (hình minh họa). Điểm đặc biệt của API là sử dụng Google Infrastructure, do vậy luôn đảm bảo error margin là tầm 10ms. Đây cũng là điểm khó khăn cho các CSDL liệu khác xây dựng trên kiến trúc này.
Bài viết sau trình bày những điểm yếu của các database như YugabyteDB; CockroachDB gặp phải khi hiện thực lại theo paper Google Spanner, đồng thời giới thiệu hướng tiếp cận mới - mục đích có thể đảm bảo được “CAP consistency”, và hoàn toàn có thể hiện thực trên những hardware thông thường.
Góc Database
Trong những năm gần đây Graph Database ngày càng trở nên phổ biến. Duyệt qua một số bài báo gần đây thì có thể nhìn thấy một vài lý do:
Đối với một số bài toán, việc diễn đạt nó về cấu trúc dữ liệu phù hợp sẽ giúp ta chọn lựa những thuật toán tốt hơn. Trong tình huống của chúng ta, một vài bài toán khi đưa về dạng Graph giúp chúng ta sử dụng được các thuật toán đồ thị giúp giải quyết vấn đề nhanh hơn.
Việc tổ chức dữ liệu ở dạng Graph, đôi khi cũng "tự nhiên" hơn với chúng ta. Ví dụ như khi biểu diễn mối quan hệ xã hội giữa người với người, việc biểu diễn thành đồ thị trong đó mỗi người là một đỉnh, mỗi mối quan hệ như anh/chị/em hoặc bạn sẽ được biểu diễn bằng các cạnh.
Không chỉ dừng ở mức thuật toán, việc truy vấn dưới dạng đồ thị có thể giúp các phân tích viên (analyst) phân tích các vấn đề dễ dạng hơn. Ví dụ như việc đề xuất một người để kết nối có thể thực hiện bằng cách tìm các đỉnh có đường đi đến đỉnh được chọn ngắn hơn 2 (đề xuất những người có chung bạn với ta)
Một vài dấu hiệu nhận biết liệu bài toán của bạn có thể nên sử dụng Graph database hay không:
Thuộc nhóm bài toán đã và đang sử dụng Graph một cách phổ biến như: Knowledge Graph, Fraud detection, Social network, ...
Cùng một loại thực thể (entity), có thể có nhiều kiểu mối quan hệ khác nhau (relationship). Ví dụ như giữa 2 thực thể Person có thể có nhiều kiểu quan hệ là spouse, parent, brother, relatives, ...
Số lượng và thông tin về mối quan hệ (relationship) quan trọng hơn và nhiều hơn số lượng thực thể (entity)
Việc truy vấn thường được diễn đạt dưới các dạng như: đếm số đỉnh, đếm số cạnh, tìm đường đi ngắn nhất, tìm các đỉnh lân cận, ...
Một vài bài viết liên quan mà bạn có thể tham khảo:
Góc Lập Trình
Đề ra kỳ này:
Một robot được đặt ở góc trên cùng bên trái của một ma trận m x n
.
Robot chỉ có thể di chuyển theo chiều từ trái qua phải hoặc từ trên xuống. Nhiệm vụ của robot là cố gắng đi tới điểm dưới cùng bên phải. Tuy nhiên trên đường đi có một vài chướng ngại vật khiến robot ko thể đi vào 1 số ô nhất định. Hãy tìm số đường đi của robot để di chuyển tới điểm yêu cầu.
Các bạn có thể thử sức tại đây.
Lời giải tuần trước:
Chúng ta có thể giải bài này bằng khá nhiều phương pháp như sort, sử dụng hash table, bit manipulation v.v...
Cách 1: Chúng ta có thể đếm tổng số bit xuất hiện của từng số tại mỗi vị trí, sau đó lấy modules với 3. Phần remainder sẽ là các bit của số duy nhất xuất hiện 1 lần.
Cách 2: Chúng ta sẽ có ba bitmask (ones, twos, threes) thể hiện cho các bit xuất hiện 1 lần, 2 lần và 3 lần. Với bất kỳ phần tử nào xuất hiện 3 lần, ta sẽ clear bitmask ones và twos. Giá trị kết quả sau cùng sẽ là ones.
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
“Data is a precious thing and will last longer than the systems themselves.”
– Tim Berners-Lee, inventor of the World Wide Web.