What it's like to work as an embedded microservices SRE

Bài tóm tắt Mercari 2022 4. Điều chỉnh Độ khó: Trung bình

Mercari · 2022 · 4. Điều chỉnh · Độ khó: Trung bình — bài gốc

Bối cảnh

  • Mercari có Microservices SRE Team mà thành viên được nhúng (embedded) vào từng team sản phẩm một thời gian, kể cả trực on-call ở team đó. Tác giả vào 5/2021; nhúng vào team Item (7–12/2021) rồi team Mercari API (từ 1/2022).
  • Item: microservice Go quản lý sản phẩm đăng bán, tới 80.000 rps lúc cao điểm, nhiều service phụ thuộc.
  • Mercari API: monolith PHP có từ trước khi chuyển sang microservice; nhiều tính năng đã tách nhưng vẫn còn phần quan trọng, nhiều team cùng phát triển; chạy trên GCE.

Thay đổi chính

  1. SLO thành công cụ ra quyết định ở Item: đưa SLO Dashboard (do Merpay SRE làm) vào; kiểm error budget trước release (đã tiêu nhiều thì hoãn thay đổi lớn), xem lại budget ba tháng. Thêm SLI gần trải nghiệm người dùng: thời gian từ lúc sản phẩm được cập nhật tới lúc search index cập nhật, thay vì chỉ đếm độ dài hàng đợi (chỉ bắt được khi cả quy trình chết).
  2. Đưa Istio vào Item: chạy một canary pod có istio-proxy một ngày để đo tài nguyên. Vì pod nhiều container làm HPA tính sai CPU, dùng Datadog External Metrics để HPA theo CPU từng container; rồi chỉnh tài nguyên để các container có CPU tương đương, phòng khi không lấy được metric từ Datadog. Chưa dùng được traffic shifting cho canary vì mọi caller phải bật Istio.
  3. Chuyển Mercari API từ GCE sang GKE (nền chung của microservice): chuyển từng thành phần (server, worker, cron); thêm HPA, Datadog; tăng traffic 1% → 5% → 10% từ 12/2021, qua 50:50, tới 100% trên GKE 2/2022.
    • Lỗi lớn nhất: "connection reset by peer" từ phút 5 tới 15 mỗi giờ. Nguyên nhân: một CronJob của service khác restart pod mỗi giờ (để chống rò bộ nhớ), làm node scale out tới giới hạn số VM trên một internal backend service của GCLB. Sửa bằng GKE subsetting và tạo lại LB.
    • Cron chuyển sang Kubernetes CronJob qua k8s-kit (viết bằng CUE): một dòng workloadIdentity: true sinh luôn initContainer chờ metadata server, tránh lỗi timeout mà team không cần biết.

Vì sao

  • Theo tác giả: service theo chuẩn microservice của Mercari (Item) thì cải thiện được bằng nền tảng; monolith cũ (log, monitoring, ngôn ngữ khác) thì không dùng được nền tảng, nên chuyển nó lên GKE để có cùng công cụ và trải nghiệm.
  • Mặc định của k8s-kit tốt dần nhờ phản hồi của nhiều team; đổi lại người dùng phải chấp nhận cấu hình bị bọc.

Bài học cho SWE

  • SRE nhúng mang thực hành (SLO, error budget) vào team chưa dùng; khác mô hình SRE trung tâm như Netflix 2020 (Xử lý sự cố và on-call).
  • SLI nên đo thứ người dùng thấy (độ trễ tới khi search thấy thay đổi), không chỉ sức khoẻ thành phần.
  • Lỗi theo chu kỳ giờ thường do một tác vụ định kỳ ở chỗ khác; giới hạn quota của cloud là thứ dễ quên (Migration không downtime).
  • Nền tảng gói sẵn cách sửa lỗi đã biết vào mặc định, để team không cần biết lỗi đó (Nền tảng nội bộ cho service (đường ray chung)).

Liên quan