Bạn đã bao giờ nghe về vụ Roblox sập 73 giờ liên tục vào tháng 10/2021 chưa? Hàng triệu game thủ như ngồi trên đống lửa, còn giới lập trình thì 'ngứa ngáy' muốn biết chuyện gì đã xảy ra. Không phải tấn công hay lỗi vớ vẩn đâu, mà là một 'món nợ kỹ thuật' cũ rích, ẩn sâu trong lòng cơ sở dữ liệu đã bùng nổ thành cơn ác mộng! Tớ đã 'mổ xẻ' bản báo cáo sau sự cố (post-mortem) của Roblox và phải nói là, nó chi tiết đến kinh ngạc! Đúng là bài học 'xương máu' cho bất kỳ ai làm trong ngành. <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/Qz1fQ5D.png' alt='Minh họa báo cáo sau sự cố'> Tưởng tượng Roblox như một thành phố lớn, nơi mỗi tòa nhà là một 'dịch vụ nhỏ' (microservices) chuyên làm một việc cụ thể. Để các tòa nhà này tìm thấy và nói chuyện được với nhau, họ cần một 'bảng chỉ dẫn thần kỳ' tên là Consul của HashiCorp. Nó giống như Google Maps nội bộ của hệ thống vậy. Thế mà, chiều ngày 28/10, một anh chàng Consul bỗng dưng 'thở dốc' (CPU lên cao ngất ngưởng), rồi cả 'bảng chỉ dẫn' này bắt đầu đơ dần, kéo theo cả thành phố Roblox chìm vào bóng tối. Lý do ư? Consul đã vô tình trở thành 'điểm yếu chí mạng' của cả hệ thống. Các kỹ sư Roblox và HashiCorp đã lao vào 'chiến trường' như những thám tử tài ba. Họ thử đủ mọi cách: Nghi ngờ phần cứng: Thay máy chủ Consul mới toanh – không ăn thua! Nghi ngờ traffic: Nâng cấp hẳn lên máy siêu khủng 128 lõi, ổ cứng NVMe tốc độ bàn thờ – vẫn tịt ngóm! Reset lại Consul: Tắt hẳn, khôi phục từ bản lưu trước đó vài tiếng – ban đầu có vẻ ổn, nhưng rồi lại 'ngã bệnh' y như cũ. Giảm tải: Giảm số lượng dịch vụ gọi Consul xuống mức thấp nhất – cứu vãn được vài tiếng, rồi lại 'đâu vào đấy'. Cuộc điều tra sâu hơn: Cuối cùng, qua các bản ghi debug, họ phát hiện ra 'thủ phạm' là tính năng 'streaming' mới của Consul. Tính năng này tưởng ngon, ai dè lại gây tranh chấp tài nguyên kinh khủng trên một 'kênh' duy nhất (Go channel) khi tải nặng. Tắt 'streaming' đi cái là Consul khỏe re luôn! Tối ưu 'bầu cử lãnh đạo': Consul đôi khi tự động 'bầu' lãnh đạo mới (cũng là chuyện thường tình). Nhưng có mấy anh lãnh đạo 'lên voi xuống chó' y hệt. Thế là họ phải 'né' mấy anh lãnh đạo hay làm loạn này. <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/DebuggingProcess.png' alt='Minh họa quá trình gỡ lỗi'> Sau hàng loạt biện pháp 'chữa cháy' thần tốc này, cuối cùng hệ thống cũng ổn định trở lại. Cả đội thận trọng 'khai trương' lại Roblox bằng cách khôi phục cache, rồi từ từ cho game thủ kết nối lại theo kiểu 'chọn ngẫu nhiên'. Sau 73 giờ 'đau khổ', Roblox đã trở lại 'sống' bình thường! Nhưng khoan đã, 'thủ phạm' chính của vụ này lại là một thứ khác 'lạnh lùng' hơn nhiều: cái 'ruột gan' của Consul, tức là cơ sở dữ liệu BoltDB, nó bị 'ốm nặng' do một vấn đề hiệu suất cực kỳ thú vị! Consul dùng BoltDB để lưu trữ các 'cuộc nói chuyện' của nó. Giống như mọi database khác, BoltDB có một 'danh sách trống' (freelist) để quản lý các 'trang giấy' (vùng nhớ) đã dùng xong và giờ có thể tái sử dụng. Nghe thì có vẻ ổn đúng không? Nó giúp database không bị phình to và chạy mượt mà hơn. Ấy thế mà, cái 'danh sách trống' của BoltDB lại được 'viết' theo kiểu hơi bị... 'cổ lỗ sĩ'! Nó dùng một mảng (array) để lưu ID của từng trang trống. Tức là, mỗi khi database đọc hay ghi gì đó, nó phải 'quét' cả cái danh sách này từ đầu đến cuối! Cứ tưởng tượng danh sách này dài dằng dặc, thì việc quét tìm càng ngày càng chậm, chậm đến mức 'đứng hình' luôn! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/BoltDBFreelist.png' alt='Minh họa BoltDB Freelist'> Đáng chú ý là, lỗi hiệu suất này đã được báo cáo từ tận năm 2016 rồi (trên GitHub ấy!). Nhưng tác giả của BoltDB lại ngừng bảo trì dự án vào năm 2017. 'Tôi không còn thời gian và năng lượng để tiếp tục nữa. Bolt đang ổn định và đã được dùng thành công nhiều năm rồi.' – Anh ấy nói vậy đó. Thật may, cộng đồng Go đã 'sao chép' BoltDB thành một dự án mới tên là bbolt để tiếp tục phát triển. Và đến năm 2019, cái lỗi 'danh sách trống' khó chịu kia cuối cùng cũng được sửa trong bbolt! Giải pháp đơn giản đến không ngờ: thay vì dùng mảng 'quét từng tí', họ chuyển sang dùng 'hashmap' – một kiểu danh sách giúp tìm kiếm tức thì. (Bạn thấy không, một ý tưởng nhỏ có thể tạo ra cú hích hiệu suất khổng lồ đấy!) <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/HashMapVsArray.png' alt='So sánh Hashmap và Array'> Và bi kịch là ở chỗ này: Vì Consul vẫn đang dùng phiên bản BoltDB 'cổ lổ sĩ' không được bảo trì, nên nó không nhận được bản vá lỗi tuyệt vời của bbolt. Kết quả là, cả Roblox 'sập' tưng bừng 3 ngày trời vào năm 2021! Vụ này còn nhiều 'uẩn khúc' lắm mà tớ vẫn đang tò mò: Sao Roblox không tắt tính năng streaming của Consul sớm hơn? Rõ ràng Consul là 'đầu mối' ngay từ đầu, và đây là một thay đổi lớn cơ mà? Tại sao chỉ một vài máy chủ Consul gặp vấn đề với BoltDB freelist? Về lý thuyết thì chúng phải giống nhau chứ? Tại sao việc khôi phục trạng thái Consul từ snapshot lại không sửa được lỗi? Phải chăng snapshot không 'reset' được cái file `raft.db` của BoltDB, nên cái danh sách trống 'phình to' vẫn còn đó? Tại sao việc giảm tải Consul chỉ có tác dụng tạm thời? Nếu danh sách đã quá lớn rồi thì giảm tải có ích gì đâu? Tại sao tính năng streaming mới hoạt động ngon lành cả ngày trước khi sập? Nó có 'bộ đệm' nào đó che giấu vấn đề ban đầu không, hay có kiểu traffic đặc biệt nào kích hoạt nó? Lỗi freelist đã có từ 2016, tại sao mãi đến 2021 Roblox mới 'đổ bệnh' vì nó? Có phải tính năng streaming mới của Consul đã 'đổ thêm dầu vào lửa', tăng cường ghi dữ liệu vào BoltDB không? Báo cáo này đúng là một 'kho báu' bài học đó các bạn. Tớ khuyến khích mọi người nên tìm đọc để 'khai sáng' thêm! Trên Hacker News cũng có nhiều tranh luận sôi nổi về vụ này, chính tác giả BoltDB cũng tham gia nữa đó. Là một kỹ sư phần mềm, tớ tin rằng khả năng 'xoay sở' trong hệ thống phức tạp và 'chẩn đoán bệnh' dưới áp lực là một đặc điểm của kỹ sư giỏi. Tớ thực sự ngưỡng mộ các kỹ sư của Roblox và HashiCorp đã làm việc không ngừng nghỉ dưới áp lực khổng lồ để tìm ra vấn đề và giải quyết nó. Chúc mừng các anh hùng thầm lặng này! Cảm ơn bạn đã đọc đến đây nhé! Nếu thấy bài này hay, đừng quên chia sẻ với bạn bè nha!
Khám phá nguyên nhân đằng sau vụ sập hệ thống 73 giờ của Roblox vào năm 2021, từ lỗi database BoltDB cũ kỹ đến vấn đề Consul streaming. Bài học về nợ công nghệ và khắc phục sự cố.
Bạn muốn hiểu về scaling hệ thống trong thế giới lập trình nhưng ngại khô khan? Cùng khám phá 5 bài học 'máu và nước mắt' từ kỹ sư Big Tech về cách xây dựng hệ thống bền vững, từ quản lý database đến xử lý lỗi, theo cách dễ hiểu và hài hước nhất!
Khám phá cách xây dựng Microservices 'chai lì' với C# và .NET: từ các nguyên tắc thiết kế cốt lõi đến các mẫu như Retry và Circuit Breaker. Tìm hiểu cách tạo ra các dịch vụ chịu lỗi, mở rộng hiệu quả và dễ quản lý, kèm theo ví dụ code thực tế và mẹo xử lý sự cố.
Khám phá nguyên nhân sâu xa đằng sau sự cố sập hệ thống Roblox kéo dài 73 giờ vào năm 2021, từ vai trò của HashiCorp Consul đến lỗi 'freelist' trong cơ sở dữ liệu BoltDB lỗi thời. Một minh chứng điển hình về món nợ kỹ thuật và hành trình gỡ lỗi đầy kịch tính.