Tại Amazon, các dịch vụ chúng tôi xây dựng phải đáp ứng các mục tiêu về tính sẵn sàng cực cao. Điều này có nghĩa là chúng tôi cần cẩn thận cân nhắc về những yếu tố phụ thuộc mà hệ thống của chúng tôi tạo ra. Chúng tôi thiết kế hệ thống để duy trì khả năng phục hồi ngay cả khi những yếu tố phụ thuộc đó bị suy yếu. Trong bài viết này, chúng tôi sẽ định nghĩa mô hình ổn định tĩnh mà chúng tôi sử dụng để đạt được mức độ phục hồi này. Chúng tôi sẽ chỉ cho bạn cách chúng tôi áp dụng khái niệm này cho Vùng sẵn sàng, một khối dựng cơ sở hạ tầng quan trọng trong AWS và do đó, là một yếu tố phụ thuộc nền tảng mà tất cả các dịch vụ của chúng tôi được xây dựng dựa trên.

Trong thiết kế ổn định tĩnh, hệ thống tổng thể tiếp tục hoạt động ngay cả khi yếu tố phụ thuộc trở nên suy yếu. Có thể là hệ thống không thấy bất kỳ thông tin cập nhật nào (chẳng hạn như những nội dung mới, đã bị xóa hoặc đã được sửa đổi) mà yếu tố phụ thuộc được cho là đã được cung cấp. Tuy nhiên, mọi việc hệ thống đang thực hiện trước khi yếu tố phụ thuộc trở nên suy yếu vẫn tiếp tục hoạt động mặc dù yếu tố phụ thuộc bị suy yếu. Chúng tôi sẽ mô tả cách thức chúng tôi xây dựng Amazon Elastic Compute Cloud (EC2) để mang tính ổn định tĩnh. Sau đó, chúng tôi sẽ cung cấp hai kiến trúc ví dụ về ổn định tĩnh mà chúng tôi thấy là hữu ích trong việc xây dựng các hệ thống khu vực có tính sẵn sàng cao trên Vùng sẵn sàng.

Cuối cùng, chúng tôi sẽ đi sâu hơn vào một số triết lý thiết kế phía sau Amazon EC2, bao gồm cả cách mà hệ thống được thiết kế kiến trúc để cung cấp tính độc lập của Vùng sẵn sàng ở cấp độ phần mềm. Ngoài ra, chúng tôi sẽ thảo luận về một vài sự đánh đổi đi kèm với việc xây dựng dịch vụ khi lựa chọn kiến trúc này.

Vai trò của Vùng sẵn sàng
Vùng sẵn sàng là các vùng bị cách ly logic của Khu vực AWS: Mỗi Khu vực AWS có nhiều Vùng sẵn sàng được thiết kế để hoạt động độc lập. Vùng sẵn sàng được ngăn cách vật lý bằng một khoảng cách có ý nghĩa để bảo vệ khỏi tác động tương quan từ các vấn đề tiềm ẩn như sét đánh, lốc xoáy và động đất. Vùng sẵn sàng không chia sẻ năng lượng hoặc cơ sở hạ tầng khác, nhưng được kết nối với nhau bằng mạng cáp quang riêng, được mã hóa, nhanh để cho phép các ứng dụng nhanh chóng chuyển sang phương án dự phòng mà không bị gián đoạn. Nói cách khác, Vùng sẵn sàng cung cấp một lớp trừu tượng cho hoạt động cách ly cơ sở hạ tầng của chúng tôi. Các dịch vụ cần có Vùng sẵn sàng cho phép người gọi báo cho AWS biết nơi cung cấp cơ sở hạ tầng một cách vật lý trong Khu vực để có thể hưởng lợi từ tính độc lập này. Tại Amazon, chúng tôi đã xây dựng các dịch vụ AWS khu vực tận dụng tính độc lập vùng này để đạt được các mục tiêu sẵn sàng cao của riêng các dịch vụ này. Các dịch vụ như Amazon DynamoDB, Amazon Simple Queue Service (SQS) và Amazon Simple Storage Service (S3) là những ví dụ về các dịch vụ khu vực như vậy.
 
Khi tương tác với dịch vụ AWS cung cấp cơ sở hạ tầng đám mây bên trong Amazon Virtual Private Cloud (VPC), nhiều dịch vụ trong số này yêu cầu người gọi chỉ định cả Khu vực lẫn Vùng sẵn sàng. Vùng sẵn sàng thường được ngầm chỉ định trong một đối số mạng con bắt buộc, ví dụ như khi khởi chạy phiên bản EC2, cung cấp cơ sở dữ liệu Amazon Relational Database Service (RDS) hoặc tạo một cụm Amazon ElastiCache. Mặc dù thường có nhiều mạng con trong một Vùng sẵn sàng, nhưng một mạng con sẽ tồn tại hoàn toàn trong một Vùng sẵn sàng và do đó, bằng cách cung cấp đối số mạng con, người gọi cũng đang ngầm cung cấp Vùng sẵn sàng để sử dụng.

Ổn định tĩnh

Khi xây dựng hệ thống trên Vùng sẵn sàng, chúng tôi đã rút ra một bài học là phải sẵn sàng ứng phó với suy yếu trước khi suy yếu xảy ra. Một cách tiếp cận kém hiệu quả hơn có thể là triển khai tới nhiều Vùng sẵn sàng với kỳ vọng rằng nếu có suy yếu trong một Vùng sẵn sàng, dịch vụ sẽ mở rộng (có thể sử dụng AWS Auto Scaling) trong các Vùng sẵn sàng khác và được khôi phục về trạng thái bình thường. Cách tiếp cận này ít hiệu quả hơn vì nó dựa vào việc phản ứng với suy yếu khi chúng xảy ra, thay vì chuẩn bị ứng phó với suy yếu trước khi chúng xảy ra. Nói cách khác, cách tiếp cận này thiếu sự ổn định tĩnh. Trái lại, dịch vụ ổn định tĩnh, hiệu quả hơn sẽ cung cấp vượt mức cho cơ sở hạ tầng đến mức cơ sở hạ tầng sẽ tiếp tục hoạt động chính xác mà không phải khởi chạy bất kỳ phiên bản EC2 mới nào, ngay cả khi Vùng sẵn sàng bị suy yếu.
 
Để minh họa rõ hơn tính chất của sự ổn định tĩnh, hãy xem Amazon EC2, dịch vụ được thiết kế theo các nguyên tắc đó.
 
Dịch vụ Amazon EC2 bao gồm mặt phẳng điều khiển và mặt phẳng dữ liệu. “Mặt phẳng điều khiển” và “mặt phẳng dữ liệu” là thuật ngữ riêng trong kết nối mạng, nhưng chúng tôi sử dụng các thuật ngữ này ở mọi nơi trong AWS. Mặt phẳng điều khiển là cơ cấu liên quan đến việc thay đổi hệ thống—thêm tài nguyên, xóa tài nguyên, sửa đổi tài nguyên—và truyền bá những thay đổi đó đến bất cứ nơi nào cần phát huy hiệu lực. Ngược lại, mặt phẳng dữ liệu là hoạt động hàng ngày của các tài nguyên đó, nghĩa là, những thứ cần thiết để các tài nguyên hoạt động.
 
Trong Amazon EC2, mặt phẳng điều khiển là mọi thứ xảy ra khi EC2 khởi chạy phiên bản mới. Logic của mặt phẳng điều khiển tập hợp mọi thứ cần thiết cho phiên bản EC2 mới bằng cách thực hiện nhiều tác vụ. Sau đây là một vài ví dụ:
 
• Mặt phẳng điều khiển tìm máy chủ vật lý để tính toán trong khi vẫn tuân thủ các yêu cầu của nhóm vị trí và hình thức thuê VPC.
• Mặt phẳng điều khiển phân bổ giao diện mạng ra ngoài mạng con VPC.
• Mặt phẳng điều khiển chuẩn bị ổ đĩa Amazon Elastic Block Store (EBS).
• Mặt phẳng điều khiển tạo các thông tin xác thực vai trò của AWS Identity and Access Management (IAM).
• Mặt phẳng điều khiển cài đặt các quy tắc Nhóm bảo mật.
• Mặt phẳng điều khiển lưu trữ kết quả trong kho dữ liệu của các dịch vụ xuôi chiều khác nhau.
• Mặt phẳng điều khiển truyền bá cấu hình cần thiết đến máy chủ trong VPC và biên mạng khi thích hợp.
 
Ngược lại, mặt phẳng dữ liệu Amazon EC2 giữ cho các phiên bản EC2 hiện tại hoạt động tốt như mong đợi, thực hiện các tác vụ như sau:
 
• Mặt phẳng dữ liệu định tuyến các gói theo bảng định tuyến của VPC.
• Mặt phẳng dữ liệu đọc và ghi từ ổ đĩa Amazon EBS.
• v.v.
 
Như thường thấy với mặt phẳng dữ liệu và mặt phẳng điều khiển, mặt phẳng dữ liệu Amazon EC2 đơn giản hơn nhiều so với mặt phẳng điều khiển. Do tính đơn giản tương đối của mình, thiết kế của mặt phẳng dữ liệu Amazon EC2 hướng đến tính sẵn sàng cao hơn so với mặt phẳng điều khiển Amazon EC2.
 
Điều quan trọng là mặt phẳng dữ liệu Amazon EC2 đã được thiết kế cẩn thận để ổn định tĩnh khi đối mặt với các sự kiện liên quan đến tính sẵn sàng của mặt phẳng điều khiển (chẳng hạn như suy yếu khả năng khởi chạy các phiên bản EC2). Ví dụ: Để tránh gián đoạn trong kết nối mạng, mặt phẳng dữ liệu Amazon EC2 được thiết kế sao cho máy vật lý chạy phiên bản EC2 có quyền truy cập cục bộ vào tất cả thông tin cần thiết để định tuyến các gói đến các điểm bên trong và bên ngoài VPC của mình. Mặt phẳng điều khiển Amazon EC2 suy yếu có nghĩa là trong suốt sự kiện, máy chủ vật lý có thể không thấy các bản cập nhật như phiên bản EC2 mới được thêm vào VPC hoặc quy tắc Nhóm bảo mật mới. Tuy nhiên, lưu lượng truy cập mà nó đã có thể gửi và nhận trước sự kiện sẽ tiếp tục hoạt động.
 
Các khái niệm về mặt phẳng điều khiển, mặt phẳng dữ liệu và tính ổn định tĩnh được áp dụng rộng rãi, thậm chí vượt ra ngoài Amazon EC2. Khả năng phân tách hệ thống thành mặt phẳng điều khiển và mặt phẳng dữ liệu có thể là một công cụ khái niệm hữu ích để thiết kế các dịch vụ có tính sẵn sàng cao, vì một số lý do:
 
• Thường thì tính sẵn sàng của mặt phẳng dữ liệu thậm chí còn quan trọng với sự thành công của khách hàng sử dụng dịch vụ hơn mặt phẳng điều khiển. Ví dụ: Tính khả dụng liên tục và hoạt động chính xác của phiên bản EC2, sau khi bắt đầu chạy, thậm chí còn quan trọng với hầu hết các khách hàng AWS hơn so với khả năng khởi chạy các phiên bản EC2 mới.
• Mặt phẳng dữ liệu thường hoạt động ở ổ đĩa cao hơn (thường theo thứ tự cường độ) so với mặt phẳng điều khiển. Vì vậy, nên giữ các mặt phẳng này tách biệt để mỗi mặt phẳng có thể được điều chỉnh quy mô theo kích thước tỷ lệ phù hợp riêng.
• Chúng tôi nhận thấy trong nhiều năm qua, mặt phẳng điều khiển của hệ thống có xu hướng có nhiều bộ phận chuyển động hơn mặt phẳng dữ liệu, vậy nên chỉ riêng lý do đó cũng khiến nó có khả năng bị suy yếu hơn dựa trên thống kê.
 
Khi cân nhắc tất cả những điều đó, chúng tôi nhận thấy tốt nhất là nên tách các hệ thống theo ranh giới của mặt phẳng điều khiển và mặt phẳng dữ liệu.
 
Để đạt được sự tách biệt này trong thực tế, chúng tôi áp dụng các nguyên tắc ổn định tĩnh. Mặt phẳng dữ liệu thường phụ thuộc vào dữ liệu đến từ mặt phẳng điều khiển. Tuy nhiên, để đạt được mục tiêu sẵn sàng cao hơn, mặt phẳng dữ liệu duy trì trạng thái hiện có và tiếp tục hoạt động ngay cả khi mặt phẳng điều khiển suy yếu. Mặt phẳng dữ liệu có thể không nhận được các bản cập nhật trong thời gian suy yếu, nhưng mọi thứ đã hoạt động trước đó vẫn tiếp tục hoạt động.
 
Trước đó, chúng tôi đã lưu ý rằng kế hoạch đòi hỏi thay thế phiên bản EC2 để phản hồi cho sự suy yếu của Vùng sẵn sàng là cách tiếp cận kém hiệu quả hơn. Đó không phải vì chúng tôi sẽ không thể khởi chạy phiên bản EC2 mới, mà là vì để đối phó với sự suy yếu, hệ thống phải phụ thuộc tức thì vào đường dẫn khôi phục trên mặt phẳng điều khiển Amazon EC2, cộng với tất cả các hệ thống dành riêng cho ứng dụng là yếu tố cần thiết để một phiên bản mới bắt đầu thực hiện công việc hữu ích. Tùy thuộc vào ứng dụng, các yếu tố phụ thuộc này có thể bao gồm các bước như tải xuống cấu hình thời gian chạy, đăng ký phiên bản với các dịch vụ khám phá, lấy thông tin xác thực, v.v.. Các hệ thống mặt phẳng điều khiển nhất thiết phải phức tạp hơn các hệ thống trong mặt phẳng dữ liệu và có nhiều khả năng không hoạt động chính xác khi toàn bộ hệ thống bị suy yếu.

Các mô hình ổn định tĩnh

Trong phần này, chúng tôi sẽ giới thiệu hai mô hình cấp cao mà chúng tôi sử dụng trong AWS để thiết kế các hệ thống có tính sẵn sàng cao bằng cách tận dụng sự ổn định tĩnh. Mỗi mô hình có thể áp dụng cho tập hợp các tình huống riêng, nhưng cả hai đều tận dụng sự trừu tượng của Vùng sẵn sàng.

Ví dụ về mô hình chủ động-chủ động trên Vùng sẵn sàng: Dịch vụ được cân bằng tải
Cấu phần bên trong một số dịch vụ AWS là nhóm các phiên bản EC2 không trạng thái có thể mở rộng theo chiều ngang hoặc các bộ chứa Amazon Elastic Container Service (ECS). Chúng tôi chạy các dịch vụ này trong Auto Scaling group trên ba Vùng sẵn sàng trở lên. Ngoài ra, các dịch vụ này cung cấp cung cấp khả năng vượt mức để ngay cả khi toàn bộ một Vùng sẵn sàng bị suy yếu, máy chủ trong các Vùng sẵn sàng còn lại có thể chịu tải. Ví dụ: Khi chúng tôi sử dụng ba Vùng sẵn sàng, chúng tôi cung cấp vượt mức tới 50%. Nói cách khác, chúng tôi cung cấp vượt mức sao cho mỗi Vùng sẵn sàng chỉ hoạt động ở 66% mức mà chúng tôi đã kiểm tra tải.
 
Ví dụ phổ biến nhất là dịch vụ HTTPS cân bằng tải. Sơ đồ sau đây thể hiện Cân bằng tải ứng dụng công khai cung cấp dịch vụ HTTPS. Mục tiêu của cân bằng tải là một Auto Scaling group trải rộng trên ba Vùng sẵn sàng trong Khu vực eu-west-1. Đây là ví dụ về tính sẵn sàng cao chủ động-chủ động sử dụng Vùng sẵn sàng.

Trong trường hợp suy yếu Vùng sẵn sàng, kiến trúc được thể hiện trong sơ đồ trước không yêu cầu thực hiện thao tác gì. Các phiên bản EC2 trong Vùng sẵn sàng bị suy yếu sẽ bắt đầu không vượt qua kiểm tra tình trạng và Cân bằng tải ứng dụng sẽ chuyển lưu lượng truy cập khỏi các phiên bản này. Trên thực tế, dịch vụ Elastic Load Balancing được thiết kế theo nguyên tắc này. Nó đã cung cấp đủ khả năng cân bằng tải để chịu đựng sự suy yếu của Vùng sẵn sàng mà không cần phải mở rộng quy mô.

Chúng tôi cũng sử dụng mô hình này ngay cả khi không có dịch vụ HTTPS hoặc cân bằng tải. Ví dụ: Nhóm các phiên bản EC2 xử lý tin nhắn từ hàng đợi Amazon Simple Queue Service (SQS) cũng có thể thực hiện theo mô hình này. Các phiên bản được triển khai trong Auto Scaling group trên nhiều Vùng sẵn sàng, được cung cấp vượt mức một cách thích hợp. Trong trường hợp Vùng sẵn sàng bị suy yếu, dịch vụ sẽ không làm gì cả. Các phiên bản đã suy yếu dừng thực hiện tác vụ và các phiên bản khác sẽ thực hiện tác vụ đó.

Ví dụ về mô hình chủ động-dự phòng trên Vùng sẵn sàng: Cơ sở dữ liệu quan hệ
Một số dịch vụ chúng tôi xây dựng có trạng thái và yêu cầu có một nút chính hoặc nút chỉ huy để điều phối công việc. Ví dụ về mô hình này là dịch vụ sử dụng cơ sở dữ liệu quan hệ, chẳng hạn như Amazon RDS với công cụ cơ sở dữ liệu MySQL hoặc Postgres. Thiết lập có tính sẵn sàng cao điển hình cho loại cơ sở dữ liệu quan hệ này có một phiên bản chính, là phiên bản mà toàn bộ bản ghi phải đi qua, và một ứng viên dự phòng. Chúng tôi cũng có thể có các bản sao đọc bổ sung, không được thể hiện trong sơ đồ sau. Khi chúng tôi làm việc với cơ sở hạ tầng có trạng thái như cơ sở hạ tầng này, sẽ có một nút dự phòng ấm trong một Vùng sẵn sàng không phải là Vùng sẵn sàng của nút chính.
 
Sơ đồ sau thể hiện cơ sở dữ liệu Amazon RDS. Khi chúng tôi cung cấp cơ sở dữ liệu bằng Amazon RDS, hệ thống này yêu cầu có nhóm mạng con. Nhóm mạng con là tập hợp các mạng con trải rộng trên nhiều Vùng sẵn sàng mà các phiên bản cơ sở dữ liệu sẽ được cung cấp trong đó. Amazon RDS đặt ứng viên dự phòng vào Vùng sẵn sàng khác với nút chính. Đây là ví dụ về tính sẵn sàng cao chủ động-dự phòng sử dụng Vùng sẵn sàng.

Tương tự như với ví dụ về mô hình hoạt động chủ động-chủ động không trạng thái, khi Vùng sẵn sàng chứa nút chính bị suy yếu, dịch vụ có trạng thái sẽ không làm gì với cơ sở hạ tầng. Đối với các dịch vụ sử dụng Amazon RDS, RDS sẽ quản lý việc chuyển đổi dự phòng và trỏ lại tên DNS sang nút chính mới trong Vùng sẵn sàng đang hoạt động. Mô hình này cũng áp dụng cho các thiết lập chủ động-dự phòng khác, ngay cả khi các thiết lập đó không sử dụng cơ sở dữ liệu quan hệ. Cụ thể, chúng tôi áp dụng mô hình này cho các hệ thống có kiến trúc cụm chứa nút chỉ huy. Chúng tôi triển khai các cụm này trên các Vùng sẵn sàng và chọn nút chỉ huy mới từ một ứng viên dự phòng thay vì khởi chạy một thay thế “vừa đúng lúc”.

Điểm chung của hai mô hình này là cả hai đều đã cung cấp khả năng cần thiết trong trường hợp suy yếu Vùng sẵn sàng trước bất kỳ suy yếu thực tế nào. Trong cả hai trường hợp này, dịch vụ đều không sử dụng bất kỳ yếu tố phụ thuộc mặt phẳng điều khiển có chủ ý nào, chẳng hạn như cung cấp cơ sở hạ tầng mới hoặc thực hiện sửa đổi, để đáp lại khi Vùng sẵn sàng bị suy yếu.

Chi tiết: Ổn định tĩnh bên trong Amazon EC2

Phần cuối cùng của bài viết này sẽ đi sâu hơn một cấp vào các kiến trúc Vùng sẵn sàng phục hồi, bao gồm một số cách mà trong đó, chúng tôi tuân theo nguyên tắc độc lập của Vùng sẵn sàng trong Amazon EC2. Việc nắm được một số khái niệm này rất hữu ích khi chúng tôi xây dựng một dịch vụ không chỉ cần có tính sẵn sàng cao mà còn cần cung cấp cơ sở hạ tầng để các dịch vụ khác cũng có thể ở trạng thái sẵn sàng cao. Amazon EC2, với tư cách là nhà cung cấp cơ sở hạ tầng AWS cấp thấp, là cơ sở hạ tầng mà các ứng dụng có thể sử dụng để có tính sẵn sàng cao. Đôi khi các hệ thống khác cũng muốn áp dụng chiến lược đó.

Chúng tôi tuân theo nguyên tắc độc lập của Vùng sẵn sàng trong Amazon EC2 ở các hoạt động triển khai của mình. Trong Amazon EC2, phần mềm được triển khai đến máy chủ vật lý lưu trữ các phiên bản EC2, thiết bị biên, trình phân giải DNS, các thành phần mặt phẳng điều khiển trong đường dẫn khởi chạy của phiên bản EC2 và nhiều thành phần khác mà phiên bản EC2 phụ thuộc vào. Những triển khai này tuân theo lịch triển khai vùng. Điều này có nghĩa là hai Vùng sẵn sàng trong cùng một Khu vực sẽ nhận được một triển khai nhất định vào các ngày khác nhau. Trên AWS, chúng tôi sử dụng triển khai theo từng giai đoạn. Ví dụ: Chúng tôi tuân theo biện pháp tốt nhất (bất kể loại dịch vụ mà chúng tôi triển khai tới) của lần đầu tiên triển khai một hộp và sau đó là 1/N máy chủ, v.v.. Tuy nhiên, trong trường hợp cụ thể của các dịch vụ như dịch vụ trong Amazon EC2, việc triển khai của chúng tôi tiến thêm một bước và được điều chỉnh có chủ ý theo ranh giới của Vùng sẵn sàng. Theo cách đó, sự cố khi triển khai chỉ ảnh hưởng đến một Vùng sẵn sàng và sẽ được quay lui cũng như khắc phục. Sự cố sẽ không ảnh hưởng đến các Vùng sẵn sàng khác, các vùng khác tiếp tục hoạt động như bình thường.

Một cách khác mà chúng tôi sử dụng nguyên tắc Vùng sẵn sàng độc lập khi xây dựng trong Amazon EC2 là thiết kế để tất cả các luồng gói đều ở trong Vùng sẵn sàng thay vì vượt qua ranh giới. Điểm thứ hai này—khi lưu lượng truy cập mạng được giữ cục bộ với Vùng sẵn sàng—đáng để khám phá chi tiết hơn. Đây là minh họa thú vị về cách chúng tôi suy nghĩ khác biệt khi xây dựng hệ thống mang tính khu vực, có tính sẵn sàng cao, là khách hàng của Vùng sẵn sàng độc lập (nghĩa là hệ thống sử dụng đảm bảo về tính độc lập của Vùng sẵn sàng làm nền tảng để xây dựng dịch vụ có tính sẵn sàng cao), trái ngược với thời điểm chúng tôi cung cấp cơ sở hạ tầng độc lập của Vùng sẵn sàng cho những hệ thống khác sẽ cho phép Vùng sẵn sàng được xây dựng để có tính sẵn sàng cao.

Sơ đồ sau minh họa dịch vụ bên ngoài có tính sẵn sàng cao, được thể hiện bằng màu cam, phụ thuộc vào một dịch vụ nội bộ khác, được thể hiện bằng màu lục. Thiết kế đơn giản sẽ coi cả hai dịch vụ này là khách hàng của Vùng sẵn sàng EC2 độc lập. Mỗi dịch vụ màu cam và màu lục đứng sau một Cân bằng tải ứng dụng và mỗi dịch vụ đều có một nhóm máy chủ phụ trợ được cung cấp đầy đủ trải rộng trên ba Vùng sẵn sàng. Một dịch vụ khu vực có tính sẵn sàng cao sẽ gọi một dịch vụ khu vực có tính sẵn sàng cao khác. Đây là một thiết kế đơn giản và phù hợp đối với nhiều dịch vụ mà chúng tôi đã xây dựng.

Tuy nhiên, giả sử rằng dịch vụ màu lục là dịch vụ nền tảng. Nghĩa là, giả sử dịch vụ không chỉ nhằm hướng đến tính sẵn sàng cao mà còn để phục vụ với tư cách một khối dựng để cung cấp tính độc lập của Vùng sẵn sàng. Trong trường hợp đó, chúng tôi có thể thiết kế dịch vụ thành ba phiên bản dịch vụ cục bộ vùng, theo đó chúng tôi tuân theo các biện pháp triển khai nhận biết Vùng sẵn sàng. Sơ đồ sau minh họa thiết kế trong đó dịch vụ khu vực có tính sẵn sàng cao gọi là dịch vụ vùng có tính sẵn sàng cao.

Lý do tại sao chúng tôi thiết kế các dịch vụ khối dựng thành Vùng sẵn sàng độc lập đến từ số học đơn giản. Giả sử Vùng sẵn sàng bị suy yếu. Đối với các lỗi đen trắng, Cân bằng tải ứng dụng sẽ tự động chuyển khỏi các nút bị ảnh hưởng. Tuy nhiên, không phải tất cả các lỗi đều rõ ràng. Có thể có các lỗi xám, chẳng hạn như lỗi trong phần mềm, mà cân bằng tải sẽ không thể phát hiện khi kiểm tra tình trạng và xử lý hết.

Trong ví dụ trước, khi một dịch vụ khu vực có tính sẵn sàng cao gọi một dịch vụ khu vực có tính sẵn sàng cao khác, nếu yêu cầu được gửi qua hệ thống thì với một số giả định đơn giản hóa, cơ hội để yêu cầu này tránh Vùng sẵn sàng bị suy yếu là 2/3 * 2/3 = 4/9. Nghĩa là, tỷ lệ tránh xảy ra sự kiện này của yêu cầu thậm chí còn tệ hơn 50/50. Ngược lại, nếu chúng tôi xây dựng dịch vụ màu lục thành dịch vụ vùng như trong ví dụ hiện tại, thì các máy chủ trong dịch vụ màu cam có thể gọi điểm cuối màu lục trong cùng một Vùng sẵn sàng. Với kiến trúc này, cơ hội tránh Vùng sẵn sàng bị suy yếu là 2/3. Nếu N dịch vụ là một phần của đường dẫn cuộc gọi này, thì các con số này sẽ tổng quát hóa thành (2/3)^N đối với N dịch vụ khu vực so với hằng số còn lại là 2/3 đối với N dịch vụ vùng.

Vì lý do này, chúng tôi đã xây dựng cổng NAT Amazon EC2 dưới dạng dịch vụ vùng. Cổng NAT là một tính năng của Amazon EC2 cho phép lưu lượng truy cập internet đi từ mạng con riêng và không xuất hiện dưới dạng cổng toàn VPC, khu vực mà dưới dạng tài nguyên vùng do khách hàng khởi tạo riêng theo Vùng sẵn sàng như được thể hiện trong sơ đồ sau. Cổng NAT nằm trong đường dẫn kết nối internet cho VPC và do đó, là một phần thuộc mặt phẳng dữ liệu của bất kỳ phiên bản EC2 nào trong VPC đó. Nếu có sự suy yếu kết nối trong một Vùng sẵn sàng, chúng tôi muốn giữ sự suy yếu trong Vùng sẵn sàng đó, thay vì lan rộng đến các vùng khác. Cuối cùng, chúng tôi muốn khách hàng đã xây dựng kiến trúc tương tự như vừa được đề cập trong bài viết này (nghĩa là, bằng cách cung cấp một nhóm trên ba Vùng sẵn sàng với bất kỳ hai khu vực nào cũng có đủ khả năng để mang toàn bộ tải) biết rằng các Vùng sẵn sàng còn lại sẽ hoàn toàn không bị ảnh hưởng bởi bất cứ điều gì đang diễn ra bên trong Vùng sẵn sàng bị suy yếu. Cách duy nhất để chúng tôi thực hiện điều này là đảm bảo rằng tất cả các thành phần nền tảng—giống như cổng NAT—thực sự nằm trong Vùng sẵn sàng.

Lựa chọn này sẽ làm tăng chi phí do tính phức tạp tăng thêm. Đối với chúng tôi tại Amazon EC2, tính phức tạp bổ sung này xuất hiện dưới dạng quản lý các môi trường dịch vụ vùng, thay vì dịch vụ khu vực. Đối với khách hàng sử dụng cổng NAT, tính phức tạp bổ sung này xuất hiện dưới dạng có nhiều cổng NAT và bảng định tuyến để sử dụng trong các Vùng sẵn sàng khác nhau của VPC. Tính phức tạp bổ sung này là thích hợp vì bản thân cổng NAT đã là một dịch vụ nền tảng, một phần của mặt phẳng dữ liệu Amazon EC2 được cho là cung cấp các đảm bảo về tính sẵn sàng của vùng.

Chúng tôi còn cân nhắc đến một điểm nữa khi xây dựng các dịch vụ mang tính độc lập của Vùng sẵn sàng, đó là độ bền dữ liệu. Mặc dù mỗi kiến trúc vùng được mô tả ở trên đều cho thấy toàn bộ ngăn xếp có trong một Vùng sẵn sàng duy nhất, nhưng chúng tôi vẫn sao chép mọi trạng thái cứng trên nhiều Vùng sẵn sàng nhằm mục đích phục hồi sau thảm họa. Ví dụ: Chúng tôi thường lưu trữ các bản sao lưu cơ sở dữ liệu định kỳ trong Amazon S3 và duy trì các bản sao đọc của kho dữ liệu qua các ranh giới Vùng sẵn sàng. Hoạt động của Vùng sẵn sàng chính không cần đến những bản sao này. Thay vào đó, những bản sao này đảm bảo rằng chúng tôi lưu trữ dữ liệu quan trọng của khách hàng hoặc của doanh nghiệp ở nhiều vị trí.

Khi thiết kế kiến trúc hướng đến dịch vụ sẽ chạy trong AWS, chúng tôi đã học cách sử dụng một trong hai mô hình này hoặc kết hợp cả hai:

• Mô hình đơn giản hơn: khu vực-gọi đến-khu vực. Đây thường là lựa chọn phù hợp nhất cho các dịch vụ hướng ngoại và cũng phù hợp với hầu hết các dịch vụ nội bộ. Ví dụ: Khi xây dựng các dịch vụ ứng dụng cấp cao hơn trong AWS, chẳng hạn như Amazon API Gateway và các công nghệ không có máy chủ của AWS, chúng tôi sử dụng mô hình này để cung cấp tính sẵn sàng cao ngay cả khi Vùng sẵn sàng bị suy yếu.
• Mô hình phức tạp hơn: khu vực-gọi đến-vùng hoặc vùng-gọi đến-vùng. Khi thiết kế các thành phần bên trong và trong một số trường hợp là bên ngoài, mặt phẳng dữ liệu trong Amazon EC2 (ví dụ: các thiết bị mạng hoặc cơ sở hạ tầng khác nằm trực tiếp trong đường dẫn dữ liệu quan trọng), chúng tôi tuân theo mô hình tính độc lập của Vùng sẵn sàng và sử dụng các phiên bản nằm cố định trong Vùng sẵn sàng, để lưu lượng truy cập mạng vẫn nằm trong cùng một Vùng sẵn sàng. Mô hình này không chỉ giúp cô lập các yếu tố suy yếu trong Vùng sẵn sàng mà còn có các ưu điểm về chi phí lưu lượng truy cập mạng trong AWS.

Kết luận

Trong bài viết này, chúng tôi đã thảo luận về một số chiến lược đơn giản mà chúng tôi sử dụng tại AWS để tạo ra thành công các yếu tố phụ thuộc trên Vùng sẵn sàng. Chúng tôi rút ra được rằng điểm mấu chốt trong ổn định tĩnh chính là dự đoán suy yếu trước khi chúng xảy ra. Cho dù hệ thống chạy trên nhóm có thể mở rộng theo chiều ngang chủ động-chủ động hoặc cho dù đó là mô hình trạng thái, chủ động-dự phòng, chúng tôi đều có thể sử dụng Vùng sẵn sàng để hướng đến mục tiêu mức sẵn sàng cao. Chúng tôi triển khai các hệ thống sao cho tất cả khả năng cần thiết trong trường hợp xảy ra suy yếu đều đã được cung cấp đầy đủ và trong trạng thái sẵn sàng. Cuối cùng, chúng tôi đã xem xét kỹ hơn về cách bản thân Amazon EC2 sử dụng các khái niệm ổn định tĩnh để giữ các Vùng sẵn sàng độc lập với nhau.


Về tác giả

Becky Weiss là Kỹ sư chính cấp cao tại Amazon Web Services. Cô hiện đang tập trung vào Identity and Access Management trong AWS và cũng thường làm về lĩnh vực cung cấp công cụ kiểm soát bảo mật linh hoạt, toàn diện và có thẩm quyền cho khách hàng trên đám mây. Trước đây, cô đã làm về Amazon Virtual Private Cloud (tức là kết nối mạng) và AWS Lambda, cô cũng đã làm việc với AWS Professional Services để giúp khách hàng doanh nghiệp bảo vệ thành công môi trường của họ trong AWS. Becky cũng là người hâm mộ lớn nhất của AWS, và trong thời gian rảnh rỗi, cô xây dựng mọi thứ hữu ích và vô ích trên AWS. Trước khi làm việc tại AWS, Becky đã làm việc cho Microsoft về nền tảng Windows và Windows Phone.

Mike Furr là Kỹ sư chính cấp cao tại Amazon Web Services. Ông gia nhập Amazon năm 2009 sau khi hoàn thành bằng Tiến sĩ Khoa học máy tính tại Đại học Maryland, College Park. Trong thời gian làm việc tại Amazon, ông đã làm việc về Virtual Private Cloud, Direct Connect, cũng như ngăn xếp thanh toán và đo lường của AWS. Hiện ông tập trung vào EC2, nơi ông giúp các nhóm mở rộng ra điện toán đám mây.

Sử dụng biện pháp giảm tải để tránh quá tải