Skip to content

Anycast Routing with Global Load Balancer

Vì sao quan trọng trong production

Anycast là kỹ thuật cho phép single IP address serve từ multiple locations. Global Load Balancer trong GCP sử dụng anycast để:

  1. Announce cùng IP từ tất cả regions
  2. Users tự động route tới vị trí gần nhất (via BGP)
  3. Zero application changes — application chỉ biết về single IP

Điều này cho phép bạn:

  • Deploy infrastructure ở nhiều chỗ
  • Users tự động reach nearest endpoint (low latency)
  • Failover automatic nếu region down
  • Geo-distribution mà không cần DNS tricks

Internal Model: Anycast Mechanism

Unicast Truyền Thống (1 IP mỗi chỗ)

App: api.example.com

Bản ghi DNS:
├─ api-us.example.com → 35.201.123.45 (vùng Mỹ)
├─ api-eu.example.com → 34.159.123.45 (vùng Âu)
└─ api-ap.example.com → 34.87.123.45 (vùng Á)

Mã App:
```javascript
if (user.location == 'US') {
  fetch('https://api-us.example.com')
} else if (user.location == 'EU') {
  fetch('https://api-eu.example.com')
} // ... logic cho mỗi vùng

Vấn đề: ├─ App phải định vị địa lý người dùng ├─ Phải quản lý đa tên máy ├─ Dự phòng cần thay đổi DNS (chậm) └─ Logic phía khách phức tạp


### Anycast (IP Một, Chỗ Đa)

App: api.example.com

Bản ghi DNS: └─ api.example.com → 35.201.123.45 (IP anycast một)

Quảng cáo BGP (phía sau): ├─ Từ us-central1: "Tôi có 35.201.123.45" (đường AS64512 1) ├─ Từ eu-west1: "Tôi có 35.201.123.45" (đường AS64512 1) └─ Từ asia-southeast1: "Tôi có 35.201.123.45" (đường AS64512 1)

Truy vấn người dùng: ├─ Người dùng San Francisco: Tuyến BGP "35.201.123.45 qua đường-as 1 (us-central1)" ├─ Người dùng Berlin: Tuyến BGP "35.201.123.45 qua đường-as 1 (eu-west1)" ├─ Người dùng Tokyo: Tuyến BGP "35.201.123.45 qua đường-as 1 (asia-southeast1)"

Kết quả: ├─ IP giống cho tất cả người dùng ├─ Định tuyến địa lý tự động qua BGP ├─ App: Tìm nạp đơn('https://api.example.com') └─ Tính minh bạch: Khách không cần biết địa lý


### Quảng Cáo Anycast BGP

GLB GCP quảng cáo tuyến:

Chi tiết quảng cáo: ├─ Tiền tố: 35.201.123.0/24 (chứa 35.201.123.45) ├─ AS Gốc: AS Google (15169) ├─ Từ vùng: us-central1, eu-west1, asia-southeast1 (tất cả quảng cáo) ├─ Số liệu tuyến: Bằng (độ dài đường AS giống) │ └─ Tất cả 3 đường chi phí giống (ECMP có khả năng) │ └─ Bảng định tuyến ISP thấy: ├─ Tuyến 1: 35.201.123.0/24 qua PoP-us (ngắn nhất) ├─ Tuyến 2: 35.201.123.0/24 qua PoP-eu (chi phí bằng) └─ Tuyến 3: 35.201.123.0/24 qua PoP-ap (chi phí bằng)

Lựa chọn tuyến tốt nhất BGP (cho traffic người dùng): ├─ ISP Người dùng: "Tuyến nào tới 35.201.123.45?" ├─ Tất cả 3 độ dài đường AS bằng → dùng chính sách BGP cục bộ ├─ Thường: Ưa tuyến qua PoP gần nhất (chi phí IGP) └─ Kết quả: Traffic người dùng định tuyến địa lý tự nhiên


## Mô hình kiến trúc production

### Mô hình 1: Triển khai đa vùng toàn cầu

Triển khai: ├─ Backend ở us-central1 (Bắc Mỹ) ├─ Backend ở eu-west1 (Châu Âu) ├─ Backend ở asia-southeast1 (Đông Nam Á) │ └─ IP anycast toàn cầu: 35.201.123.45 └─ Quảng cáo từ 3 vùng

Luồng lưu lượng: ┌──────────────────────────────────────────────┐ │ Người dùng Internet (bất kỳ vị trí) │ │ Truy vấn DNS: "api.example.com?" │ │ Phản hồi: 35.201.123.45 │ └──────────────────┬───────────────────────────┘ │ ┌────────────┼────────────┐ │ │ │ ┌────▼─────┐ ┌───▼──────┐ ┌──▼────────┐ │ Dùng Mỹ │ │ Dùng EU │ │ Dùng Á │ └────┬─────┘ └───┬──────┘ └──┬────────┘ │ │ │ (Định tuyến BGP qua PoPs) ┌────▼──────┐ ┌───▼──────┐ ┌──▼────────┐ │ PoP-US │ │ PoP-EU │ │ PoP-ASIA │ └────┬──────┘ └───┬──────┘ └──┬────────┘ │ │ │ └────────┬───┴────┬───────┘ │ │ ┌─────▼──┬─────▼──┬──────────┐ │ Bộ cân │ Tải │ Quyết │ │ bằng │ │ định │ │ toàn │ │ │ │ cầu │ │ │ └─────────┴───────┴──────────┘ │ ┌─────▼──────────┐ │ Backend (3 vùng│ │ đều có thể │ │ nhận lưu lượng)│ └────────────────┘

Kết quả: ├─ Dùng Mỹ → Định tuyến tới us-central1 (qua PoP-US) ├─ Dùng EU → Định tuyến tới eu-west1 (qua PoP-EU) ├─ Dùng Á → Định tuyến tới asia-southeast1 (qua PoP-ASIA) └─ Dự phòng: Nếu vùng down, dùng định tuyến lại tới gần nhất


### Mô hình 2: Hoạt động hai chiều với định tuyến bất đối xứng

Triển khai: ├─ Chính: us-central1 (60% lưu lượng) ├─ Phụ: eu-west1 (40% lưu lượng) │ └─ IP anycast duy nhất có chính sách Traffic Director └─ Nhập: User→GLB định tuyến tới gần nhất └─ Xuất: Có thể thoát từ vùng khác (bất đối xứng)

Ví dụ luồng: ├─ Dùng ở London gửi yêu cầu │ └─ Nhập: PoP-EU định tuyến tới eu-west1 (nhập chính) │ └─ Backend ở eu-west1 xử lý, gửi phản hồi │ └─ Xuất: Phản hồi thoát qua PoP-EU (đường trở lại) │ └─ Kịch bản PoP-EU hỏng: └─ Nhập: PoP-UK định tuyến lại tới us-central1 └─ Backend ở us-central1 xử lý └─ Xuất: Phản hồi thoát qua PoP-US (trở lại bất đối xứng!) └─ Mạng xử lý đường bất đối xứng (kết nối stateful)


### Mô hình 3: Di chuyển lưu lượng từng chút (Triển khai Canary)

Trạng thái ban đầu: 100% lưu lượng tới us-central1 ├─ IP anycast: 35.201.123.45 quảng cáo từ us-central1 thôi ├─ eu-west1 sẵn sàng nhưng không quảng cáo

Di chuyển: ├─ Bước 1: Quảng cáo từ eu-west1 (ưu tiên thấp) │ └─ Chỉ số BGP: đường eu-west1 chi phí cao │ └─ Lưu lượng: ~5% tới eu-west1 │ ├─ Bước 2: Tăng ưu tiên eu-west1 dần dần │ └─ Bước 2a: 10% lưu lượng tới eu-west1 │ └─ Bước 2b: 25% lưu lượng tới eu-west1 │ └─ Bước 2c: 50% lưu lượng tới eu-west1 │ └─ Bước 3: Hoàn thành di chuyển (nếu không có vấn đề) └─ Hủy quảng cáo us-central1, 100% tới eu-west1

Giám sát: ├─ Mỗi bước: Giám sát tỷ lệ lỗi, độ trễ, sức khỏe ├─ Quay lại: Quảng cáo lại us-central1, hoàn nguyên lưu lượng └─ Kết quả: Di chuyển vùng không thời gian chết


## Kịch bản hỏng thực tế

### Kịch bản 1: PoP hỏng (Dự phòng tự động Anycast)

Thiết lập: Triển khai anycast 3 vùng ├─ us-central1, eu-west1, asia-southeast1 └─ Tất cả quảng cáo IP anycast giống

Hỏng: PoP-EU không thể tiếp cận ├─ Dấu hiệu: Dùng ở Âu thấy độ trễ tăng cao ├─ Hội tụ BGP: ISP phát hiện PoP-EU rút ├─ Tuyến mới: Dùng định tuyến lại tới PoP-US hoặc PoP-AP

Dòng thời gian phục hồi: ├─ T+0s: PoP-EU hỏng ├─ T+10-30s: ISP phát hiện hỏng (BGP timeout) ├─ T+30-60s: Lưu lượng dùng định tuyến lại tới PoP khác ├─ T+60-180s: Độ trễ bình thường (dùng trên đường khác) └─ T+5-10 phút: PoP-EU phục hồi, tuyến hội tụ lại

Lợi ích anycast: ├─ Dự phòng tự động: Không can thiệp thủ công ├─ Minh bạch: Dùng không quan tâm backend nào phục vụ └─ Từ từ: Lưu lượng dịch chuyển dần, không mất đột ngột


### Kịch bản 2: Vùng down (Anycast che giấu hỏng)

Hỏng: Trung tâm dữ liệu us-central1 down (sự cố điện)

Unicast bình thường (nhiều IP): ├─ Dùng cố tiếp cận 35.201.123.45 (IP us-central1) → Timeout ├─ Cần: DNS dự phòng thủ công hoặc thay đổi mã └─ Kết quả: Mất kết nối 10-60 giây cho mỗi dùng

Anycast (IP duy nhất): ├─ Dùng tiếp cận 35.201.123.45 (IP anycast) ├─ BGP: Tuyến tới us-central1 rút ├─ Tuyến mới: PoP-US tự động định tuyến lại tới eu-west1 hoặc asia-southeast1 ├─ Độ trễ: Cao hơn (bây giờ liên vùng) nhưng có thể tiếp cận └─ Kết quả: Dự phòng tự động, <1 giây mất kết nối cảm nhận

Lợi ích anycast: └─ Hỏng che giấu tự động, không cần thay đổi ứng dụng


### Kịch bản 3: BGP bị đánh cắp / Rò rỉ tuyến (Bảo mật)

Mối đe dọa: Kẻ tấn công quảng cáo 35.201.123.0/24 từ AS64000 (AS xấu)

Kịch bản bình thường: ├─ Google quảng cáo: 35.201.123.0/24 từ AS15169 (đường AS 1) ├─ Kẻ xấu quảng cáo: 35.201.123.0/24 từ AS64000 (đường AS 1) ├─ Quyết định BGP: Ưa thích đường AS ngắn/tốt hơn ├─ Nếu kẻ xấu có đường ngắn hơn: Lưu lượng bị đánh cắp

Giảm thiểu GCP: ├─ RPKI (Cơ sở hạ tầng khóa công cộng): Xác thực mã hóa ├─ Google ký: "AS15169 có thể quảng cáo 35.201.123.0/24" ├─ Bộ lọc ISP: Từ chối quảng cáo không được ký bởi Google ├─ Kết quả: Quảng cáo xấu bị chặn


## Lỗi thường gặp & Mô hình chống

### Lỗi 1: Kỳ vọng hiệu năng giống qua Anycast

❌ **Suy nghĩ sai**:

"Anycast có nghĩa tất cả dùng có độ trễ giống"


✅ **Hiểu đúng**:
- Anycast định tuyến tới gần nhất (vị trí địa lý)
- Gần nhất ≠ độ trễ tốt nhất (phụ thuộc chỉ số BGP)
- PoP khác nhau có độ trễ khác nhau
- Nếu backend down, lưu lượng có thể định tuyến xa

**Phòng chống**: Giám sát độ trễ mỗi vùng. Cảnh báo khi vùng hỏng.

### Lỗi 2: Không xử lý tuyến bất đối xứng

❌ **Suy nghĩ sai**:

"Yêu cầu và phản hồi luôn cùng một đường"


✅ **Hiểu đúng**:
- Anycast có thể gây định tuyến bất đối xứng
- Nhập: dùng→PoP-A→backend-A
- Xuất: backend-A→PoP-B (khác!)
- Mạng phải xử lý đường bất đối xứng (tường lửa stateful phức tạp)

**Phòng chống**: Kiểm tra kịch bản định tuyến bất đối xứng. Hiểu tác động kết nối TCP/UDP.

### Lỗi 3: Dựa quá lên Anycast cho dự phòng

❌ **Suy nghĩ sai**:

"Anycast xử lý dự phòng tự động, không cần kiểm tra sức khỏe"


✅ **Hiểu đúng**:
- Dự phòng Anycast: Phụ thuộc hội tụ BGP (~10-30 giây)
- Kiểm tra sức khỏe: Có thể phát hiện và dịch chuyển nhanh hơn (giây)
- Kết hợp: Dùng cả hai cho dự phòng nhanh nhất

**Phòng chống**: Bật kiểm tra sức khỏe trên backend. Giám sát thời gian dự phòng.

## Hướng dẫn triển khai GCP

### Thiết lập bộ cân bằng tải toàn cầu với Anycast

```bash
# Tạo IP toàn cầu (anycast theo mặc định)
gcloud compute addresses create global-static-ip \
  --global \
  --address-type=EXTERNAL

# Tạo kiểm tra sức khỏe
gcloud compute health-checks create tcp \
  --name=tcp-health-check \
  --port=443

# Tạo dịch vụ backend mỗi vùng
gcloud compute backend-services create backend-us \
  --global \
  --protocol=HTTPS \
  --health-checks=tcp-health-check

gcloud compute backend-services create backend-eu \
  --global \
  --protocol=HTTPS \
  --health-checks=tcp-health-check

# Thêm backend
gcloud compute backend-services add-backends backend-us \
  --global \
  --instance-group=ig-us-central1 \
  --instance-group-zone=us-central1-a

gcloud compute backend-services add-backends backend-eu \
  --global \
  --instance-group=ig-eu-west1 \
  --instance-group-zone=europe-west1-b

# Tạo bản đồ URL cho định tuyến
gcloud compute url-maps create my-url-map \
  --default-service=backend-us

# Tạo proxy HTTPS
gcloud compute target-https-proxies create my-https-proxy \
  --url-map=my-url-map \
  --ssl-certificates=my-cert

# Tạo quy tắc chuyển tiếp (anycast quảng cáo tự động)
gcloud compute forwarding-rules create my-forwarding-rule \
  --global \
  --target-https-proxy=my-https-proxy \
  --address=global-static-ip \
  --ports=443

# Kết quả: IP duy nhất quảng cáo từ tất cả vùng qua anycast

Giám sát sức khỏe Anycast

bash
# Kiểm tra sức khỏe backend
gcloud compute backend-services get-health backend-us --global

# Giám sát phân phối lưu lượng
gcloud logging read \
  "resource.type=http_load_balancer AND jsonPayload.backend_region" \
  --format='json' | \
  jq -r '.[] | "\(.jsonPayload.backend_region) \(.jsonPayload.bytes_sent)"' | \
  sort | uniq -c

# Kiểm tra nếu tất cả vùng quảng cáo
gcloud compute routes list --filter="dest_range~35.201.123" --format='table(dest_range,next_hop_gateway)'

Tài liệu tham khảo


Tiếp theo: Cold Potato vs Hot Potato Routing — Lựa chọn chiến lược trong chọn đường lưu lượng