Hoàn tất di chuyển cơ sở dữ liệu PostgreSQL chỉ với 11 giây downtime
(gds.blog.gov.uk)- GOV.UK Notify đã giảm downtime xuống khoảng 11 giây khi chuyển cơ sở dữ liệu PostgreSQL 11 dung lượng 400GB sang PostgreSQL 15 trên RDS trong tài khoản AWS riêng của họ, phù hợp với việc PaaS ngừng hoạt động
- Với DB đích, họ chỉ tạo bảng trước rồi sao chép dữ liệu bằng DMS full load, sau đó mới áp dụng chỉ mục và ràng buộc khóa để rút ngắn thời gian nạp dữ liệu quy mô lớn
- DB nguồn có khoảng 1,3 tỷ hàng, 85 bảng, 185 chỉ mục, 120 khóa ngoại, và vào ngày làm việc thường phát sinh khoảng 1.000 thao tác chèn/cập nhật mỗi giây cùng số lượng đọc tương tự
- Do việc tái triển khai ứng dụng mất khoảng 5 phút, họ chuẩn bị sẵn cùng thông tin xác thực và chuyển đổi trọng số DNS bằng Route53 để giảm thời gian chuyển đổi thực tế
- DMS được chọn vì dễ nhận hỗ trợ từ PaaS và AWS, nhưng với bài toán di chuyển giữa các PostgreSQL, các lựa chọn như pglogical có thể đã đơn giản hơn
Di chuyển cơ sở dữ liệu Notify trong bối cảnh PaaS ngừng hoạt động
- GOV.UK Notify đang được lưu trữ trên GOV.UK Platform as a Service, và do PaaS ngừng hoạt động nên toàn bộ hạ tầng phải được chuyển sang tài khoản AWS riêng
- Cơ sở dữ liệu của Notify là AWS RDS PostgreSQL trong tài khoản AWS của PaaS, lưu trữ từ dữ liệu gửi thông báo đến nội dung của hàng trăm nghìn mẫu mà các nhóm dịch vụ sử dụng
- Trong quá trình di chuyển, cơ sở dữ liệu cũ được gọi là source database, còn cơ sở dữ liệu mới là target database
- Thách thức cốt lõi không phải là tạo một cơ sở dữ liệu PostgreSQL mới, mà là giảm thiểu downtime trong lúc chuyển toàn bộ dữ liệu và đổi đích kết nối của ứng dụng
Quy mô của cơ sở dữ liệu nguồn và các ràng buộc dịch vụ
- Cơ sở dữ liệu nguồn là PostgreSQL 11 có dung lượng khoảng 400GB
- khoảng 1,3 tỷ hàng
- 85 bảng
- 185 chỉ mục
- 120 khóa ngoại
- Vào một ngày làm việc thông thường, hệ thống phát sinh khoảng 1.000 thao tác chèn hoặc cập nhật mỗi giây, cùng số lượng đọc tương tự
- GOV.UK Notify gửi hàng triệu thông báo quan trọng và cần tính kịp thời mỗi ngày, như cảnh báo lũ lụt hay trạng thái xử lý hồ sơ hộ chiếu
- Mọi lần gửi thông báo đều cần truy cập cơ sở dữ liệu, nên thời gian gián đoạn dịch vụ phải được giữ ở mức rất ngắn
Cấu trúc nạp dữ liệu ban đầu và sao chép liên tục bằng DMS
- Nhóm PaaS cung cấp phương án di chuyển cơ sở dữ liệu bằng AWS Database Migration Service
- DMS chịu trách nhiệm chuyển dữ liệu từ cơ sở dữ liệu nguồn sang cơ sở dữ liệu đích, và có thể chạy trong tài khoản AWS của nguồn hoặc đích
- Tác vụ DMS được chia thành hai giai đoạn
- full load: sao chép toàn bộ dữ liệu đã tồn tại đến một thời điểm nhất định theo từng bảng
- sao chép liên tục: phát lại các giao dịch mới từ cơ sở dữ liệu nguồn sang cơ sở dữ liệu đích để giữ hai bên đồng bộ
- Việc chuyển ứng dụng sang sử dụng cơ sở dữ liệu đích thay cho cơ sở dữ liệu nguồn do chính nhóm Notify phụ trách
Chuẩn bị cơ sở dữ liệu đích và full load
- Một instance DMS được tạo trong tài khoản AWS của nguồn
- Nhóm PaaS đã cấu hình sẵn instance DMS trong tài khoản nên có thể chuẩn bị nhanh chóng
- Instance DMS cần thông tin xác thực để kết nối tới cả cơ sở dữ liệu PostgreSQL nguồn và đích
- Vì instance DMS và cơ sở dữ liệu đích nằm ở hai VPC khác nhau, họ thiết lập VPC peering để lưu lượng DMS từ VPC của PaaS được định tuyến sang VPC riêng mà không đi qua Internet công cộng
- Instance RDS đích được tạo trong tài khoản AWS riêng, và do PostgreSQL 11 sắp hết hỗ trợ nên cơ sở dữ liệu mới được cấu hình là PostgreSQL 15
- Họ dùng
pg_dumpđể dump schema của cơ sở dữ liệu nguồn, tạo file SQL tái tạo schema, và ban đầu chỉ áp dụng phần khai báo bảng lên cơ sở dữ liệu đích - Khóa ngoại không được áp dụng tại thời điểm full load
- vì DMS full load không sao chép dữ liệu theo thứ tự phù hợp với ràng buộc khóa ngoại
- Khóa chính và chỉ mục cũng không được tạo trước khi full load
- vì mỗi lần chèn sẽ phải cập nhật chỉ mục, có thể làm tăng đáng kể tổng thời gian khi nạp hàng tỷ hàng
- sao chép hết dữ liệu trước rồi mới thêm chỉ mục là cách nhanh hơn
- Tác vụ full load sao chép dữ liệu tồn tại ở thời điểm nhấn nút bắt đầu
- dữ liệu mới hoặc cập nhật phát sinh sau đó không nằm trong full load
- quá trình full load mất khoảng 6 giờ
- Sau full load, họ áp dụng phần còn lại của file schema để thêm chỉ mục và ràng buộc khóa, việc này mất khoảng 3 giờ
Duy trì sao chép trong 10 ngày rồi chuyển lưu lượng
- Sau khi full load hoàn tất, cơ sở dữ liệu đích khớp với dữ liệu nguồn tại thời điểm full load bắt đầu, nhưng sau đó ở nguồn vẫn tiếp tục có chèn, cập nhật và xóa
- Họ khởi động tác vụ sao chép liên tục của DMS, tức change data capture, để gửi các giao dịch trong transaction log của cơ sở dữ liệu nguồn phát sinh sau thời điểm bắt đầu full load sang cơ sở dữ liệu đích
- Mất vài giờ để quá trình sao chép bắt kịp, sau đó họ theo dõi độ trễ sao chép của DMS để kiểm tra trạng thái đồng bộ
- Sao chép DMS chạy nền trong khoảng 10 ngày, giữ cho hai cơ sở dữ liệu đồng bộ đến thời điểm chuyển lưu lượng đã được thông báo trước cho người dùng
- Quy trình chuyển lưu lượng được họ viết sẵn thành script Python
- dừng lưu lượng ứng dụng đi tới cơ sở dữ liệu nguồn
- xác nhận sao chép đã bắt kịp hoàn toàn
- cho phép ứng dụng kết nối tới cơ sở dữ liệu đích
- Họ phải tránh tình trạng một số ứng dụng dùng DB nguồn còn số khác dùng DB đích
- vì các thay đổi phát sinh trên DB đích không được phản ánh ngược lại về DB nguồn, điều này có thể khiến người dùng nhìn thấy dữ liệu không nhất quán
- Script được xây dựng để rõ ràng hơn thao tác thủ công, có thể lặp lại, và chạy nhanh; nó đã được dùng ít nhất 40 lần trong các đợt kiểm thử và diễn tập trước đó
- Mục tiêu downtime là dưới 5 phút, và thời điểm di chuyển được chọn vào một tối thứ Bảy tương đối yên tĩnh nhưng không phải giữa đêm
Chuyển DNS tạo ra 11 giây downtime
- Việc ngắt lưu lượng tới cơ sở dữ liệu nguồn được xử lý bằng cách gọi
pg_terminate_backendtrên các kết nối ứng dụng, mất chưa đến 1 giây - Họ cũng đổi mật khẩu người dùng PostgreSQL để ứng dụng không thể kết nối lại vào DB nguồn, khiến các lần kết nối lại bị lỗi xác thực
- DMS tạo một bảng trạng thái sao chép trong cơ sở dữ liệu đích và cập nhật mỗi phút, script di chuyển dùng bảng này để kiểm tra độ trễ giữa nguồn và đích
- Như một lớp an toàn bổ sung, sau khi ứng dụng ngừng truy cập DB nguồn, script ghi một bản ghi duy nhất vào DB nguồn rồi chờ đến khi nó xuất hiện trong DB đích
- Thông tin kết nối cơ sở dữ liệu của ứng dụng được cung cấp qua biến môi trường
SQLALCHEMY_DATABASE_URI- dạng cũ là
postgresql://...@random-identifier.eu-west-1.rds.amazonaws.com:5432, bao gồm tên người dùng, mật khẩu và vị trí RDS - để thay đổi vị trí cơ sở dữ liệu hoặc thông tin xác thực thì cần tái triển khai ứng dụng, và việc này mất khoảng 5 phút
- dạng cũ là
- Để tránh thêm downtime do tái triển khai, trước khi di chuyển họ chuẩn bị hai việc
- tạo người dùng có cùng tên đăng nhập và mật khẩu trên cả cơ sở dữ liệu nguồn và đích
- tạo bản ghi DNS
database.notifications.service.gov.uktrên AWS Route53 và đặt TTL là 1 giây
- Bản ghi DNS ban đầu có trọng số nguồn 100% và đích 0%
- URI của ứng dụng được đổi trước để dùng tên người dùng, mật khẩu chung và tên miền mới
- Khi chuyển thực tế, script đổi trọng số DNS trên AWS sang 100% cho đích rồi chờ TTL 1 giây hết hạn
- Tại thời điểm chuyển đổi vào tối thứ Bảy ngày 4 tháng 11 năm 2023, độ trễ giữa cơ sở dữ liệu đích và nguồn chỉ ở mức vài giây
- Kết quả chạy script di chuyển cho thấy ứng dụng ngừng truy cập DB nguồn và bắt đầu dùng DB đích mới, với downtime khoảng 11 giây
Đánh giá về việc chọn DMS và công việc tiếp theo
- DMS được chọn vì được hỗ trợ tốt trong GOV.UK PaaS và cũng có thể nhận hỗ trợ từ AWS
- Nếu trong tương lai phải thực hiện lại việc di chuyển cơ sở dữ liệu giữa các PostgreSQL, họ dự định xem xét kỹ hơn các công cụ thay thế như pglogical
- DMS có thể đã làm tăng thêm độ phức tạp và đưa vào một quy trình sao chép ít quen thuộc hơn so với các công cụ khác
- Sau khi hoàn tất di chuyển cơ sở dữ liệu, bước tiếp theo là di chuyển ứng dụng
- Ứng dụng GOV.UK Notify sẽ được chuyển sang AWS Elastic Container Service, và quá trình này sẽ được chia sẻ sau
1 bình luận
Các ý kiến trên Hacker News
Chúng tôi cũng đã thực hiện một migration tương tự bằng AWS RDS Blue-Green Deployments; cơ sở dữ liệu còn lớn hơn một chút, nhưng downtime chỉ khoảng 20 giây và khối lượng công việc cũng ít hơn rất nhiều. Khá ngạc nhiên là trong thread này vẫn chưa ai nhắc đến
Về cơ bản, khi bạn tạo một triển khai Blue/Green mới với các thay đổi mong muốn, AWS sẽ đồng bộ triển khai green bằng logical replication trong khi cấu hình blue hiện tại vẫn tiếp tục xử lý traffic
Trên green, miễn là không ghi dữ liệu, bạn có thể chỉnh sửa, kiểm thử, thậm chí load test; các ghi vẫn tiếp tục đi vào blue đang live rồi được replicate sang green
Khi đã sẵn sàng, bạn chạy lệnh switch, và AWS sẽ xử lý việc kiểm tra đồng bộ, ngắt ghi và kết nối, chờ replication bắt kịp, đổi tên cơ sở dữ liệu, rồi nối lại kết nối và ghi
Với chúng tôi, downtime dưới 20 giây, và toàn bộ cấu hình gồm primary cùng nhiều read replica đã chuyển đổi suôn sẻ. AWS cũng đổi luôn URL cơ sở dữ liệu nên không cần thay đổi cấu hình; green trở thành blue, blue cũ trở thành old blue và có thể xóa sau
Rất khuyến nghị, nhưng vẫn có các giới hạn, chẳng hạn có thể không dùng được trong trường hợp di chuyển giữa các tài khoản: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/blue-...
Cần đọc đi đọc lại tài liệu, đặc biệt là phần hạn chế. Nên chạy thử trong môi trường dev dưới tải, rồi thử lại ở staging
Hoặc cứ YOLO đưa thẳng vào production thì có lẽ cũng ổn
Tuy nhiên, tôi đã phải học theo cách khó rằng RDS Blue/Green không dùng được cho mọi thay đổi tùy ý. Trong trường hợp của chúng tôi, nó chỉ dùng được để nâng phiên bản engine, không dùng để hạ xuống
Trên MySQL 8.0 có một stored procedure rất thỉnh thoảng bị lỗi nên chúng tôi đã xem xét phương án quay lại 5.7, nhưng điều đó là không thể
Trade-off là một số request bị chậm trong vài giây
Kết hợp DNS Groups với retry là một cơ chế khá hữu dụng cho những việc như thế này
Công cụ đã dùng: https://github.com/shayonj/pg_easy_replicate
Có nhiều cách để “tạm dừng” các query Postgres đi vào; ví dụ có thể dùng pgbouncer để không làm chúng fail, mà trì hoãn cho đến khi replication bắt kịp rồi tiếp tục trên cơ sở dữ liệu mới
Nếu có gì đó sai và replication không bắt kịp, bạn có thể bỏ tạm dừng để các query đó chạy trên cơ sở dữ liệu cũ
Như vậy, 11 giây downtime sẽ biến thành 0–11 giây thời gian tải trang bổ sung. Quan trọng hơn, trong số hàng nghìn người dùng cơ sở dữ liệu vốn chưa từng thấy query thất bại, nếu có đường xử lý lỗi bị bug hoặc chỉ một query thất bại cũng làm hỏng toàn bộ batch job, thì thiệt hại lan truyền sẽ giảm đi rất nhiều
Thú vị khi so sánh với https://knock.app/blog/zero-downtime-postgres-upgrades. Thảo luận liên quan từng có ở https://news.ycombinator.com/item?id=38616181
Phần lớn thảo luận khi đó đi đến kết luận kiểu “có phải quá phức tạp chỉ để tránh vài phút downtime không”. Trường hợp lần này trông như một minh chứng, và có vẻ chỉ cần dùng AWS Data Migration Service, đổi bản ghi DNS để chuyển sang vận hành, rồi chấp nhận 11 giây downtime
Một số kiểu dữ liệu đặc thù thậm chí có thể không được xử lý. Sau khi migrate cũng phải cập nhật sequence, nếu không có thể gặp lỗi trùng primary key
Nếu không có primary key phù hợp, cũng có thể phát sinh vấn đề vì không phải lúc nào nó cũng sao chép toàn bộ row một lượt
Nếu database nằm trong cùng một tài khoản AWS và bạn chấp nhận được 4–5 phút downtime, replication ở cấp phần cứng bằng global database hoặc snapshot có khả năng sẽ dễ hơn
Gần đây tôi đã chuyển một database PostgreSQL 3TB tự host từ 12 lên 16, đồng thời chuyển từ Ubuntu 18 sang Ubuntu 22. Cùng lúc còn phải nâng cấp nhiều extension, đặc biệt Timescale không có phiên bản tương thích nào thỏa mãn mọi tổ hợp
Chúng tôi làm bằng cách nâng cấp read-only replica: ban đầu là PG12, Ubuntu 18, TS2.9; trước tiên tạo một read-only replica trên Ubuntu 22 nhưng vẫn giữ PG12 và TS2.9
Sau đó vào maintenance mode, dừng mọi service, tách read-only replica ra, rồi nâng PG12 lên PG15 trên Ubuntu 22 nhưng vẫn giữ TS2.9
Tiếp theo nâng từ TS2.9 lên TS2.13 trên PG15, rồi cuối cùng nâng PG15 lên PG16 trên Ubuntu 22 trong khi giữ TS2.13
Cuối cùng, kết nối lại các service vào database server mới, khởi động lại mọi service rồi thoát maintenance mode
Mọi bước nâng cấp database đều đã được kiểm thử đầy đủ và tự động hóa bằng Ansible, nhưng đã phát sinh một vấn đề không xuất hiện trong lúc test, khiến downtime tăng lên khoảng 30 phút. Với nhu cầu của chúng tôi thì mức này hoàn toàn chấp nhận được
Nếu dùng logical replication, có lẽ đã giảm được sự cố bất ngờ vào phút chót, và chúng tôi dự định xem xét cách tiếp cận này trong chu kỳ nâng cấp tiếp theo
Chúng tôi cũng xem xét logical replication để giảm downtime khi nâng cấp, nhưng vì schema database và các lệnh DDL không được replicate, nên có vẻ không được khuyến nghị khi có Timescale tham gia
Những thay đổi schema nền tảng mà Timescale phải thực hiện nội bộ phần lớn sẽ là hàm của kích thước chunk hypertable và pattern ghi đến, nên có thể lập kế hoạch hoặc căn thời điểm, nhưng chúng tôi thấy độ phức tạp và rủi ro tiềm ẩn là quá lớn so với việc đặt một maintenance window ngắn trong lúc pg_upgrade hoàn tất
Kẻ thù của các migration ít downtime/không downtime kiểu này là query chạy lâu
Ví dụ nếu có một query update đơn lẻ mất 30 phút, bạn phải kill query đó và rollback, hoặc chấp nhận mất khả dụng trong 30 phút
Theo tôi biết thì hiện không có cách nào migrate các query đang chạy
statement_timeoutlà bạn của bạnNếu có transaction cực kỳ dài, nhiều khả năng bạn có thể tránh thời điểm nó chạy để thực hiện chuyển đổi. Hy vọng đó là kết quả của một tác vụ được lên lịch chứ không phải phát sinh ngẫu nhiên
Bằng cách kết hợp giới hạn thời gian transaction, cấu hình failover, chẳng hạn làm primary cũ fail, cùng những thứ như pgbouncer, bạn có thể kiểm soát khá chính xác khoảng thời gian bị chậm thay vì downtime
Thành thật mà nói, điều tôi lo hơn là toàn bộ stack và các DNS cache server bên ngoài mà nó phụ thuộc có tuân thủ đúng DNS TTL hay không
Nhưng thường thì với ứng dụng, tránh hơn chục giây downtime không phải là chuyện sống còn, nên chọn giải pháp đơn giản hơn cho mình là đúng
Tất nhiên trường hợp đầu thực tế tồn tại rất nhiều. Tôi đã khá nhiều lần tận hưởng việc biến các tác vụ tính bằng phút hoặc giờ xuống còn tính bằng mili giây
Không biết loại dữ liệu nào và những người nào xử lý các thao tác ghi database như vậy, đến mức phải dựa vào DB engine làm việc lâu đến thế thay vì chia nhỏ tốt hơn thành queue ở tầng trên
Có điểm lạ ở đoạn nói rằng họ tạo bản ghi DNS AWS Route53 cho
database.notifications.service.gov.ukvới TTL 1 giây, rồi script migration đổi trọng số DNS của AWS để gửi 100% sang vị trí database đích, sau đó đợi 1 giây cho TTL hết hạnHọ nói rằng như vậy lần tiếp theo ứng dụng cố query database thì nó sẽ query database đích; điều này có nghĩa là ORM của họ hoặc hành vi mặc định của Python bị chặn vì thực hiện tra cứu DNS ở mỗi query sao?
Tức là không cache địa chỉ đã phân giải trong một khoảng thời gian nào đó, cũng không connection pooling hay tái sử dụng kết nối à?
getaddrinfohoặcgethostnamecủa OS sẽ thực hiện hành vi này. Python hầu như không tự triển khai lại các lệnh gọi cấp hệ thống, nên nó phụ thuộc vào cấu hình hệ thốngNếu TTL 1 giây được tuân thủ thì nó sẽ được cache trong 1 giây, nhưng cũng không hiếm trường hợp thư viện tra cứu DNS, và đặc biệt là caching DNS server, không hoàn toàn tuân thủ TTL. Thành thật mà nói, điều đó cũng có thể giải thích một phần downtime đã quan sát được
Hay đấy. Chúng tôi vừa migration 3 cụm Postgres trên RDS, gồm khoảng 2TB dữ liệu và 8 database, từ Postgres 14 lên 16. Hệ thống ngừng từ 00:00 đến 04:00
Trước tiên, chúng tôi bật “chế độ bảo trì”, một site thay thế rất nhẹ chạy trên Cloudflare Workers, rồi dùng Terraform scale down tất cả app dùng DB về 0
Trong AWS web UI, chúng tôi bấm nút upgrade để chạy
pg_upgradetừ 14→15 và đợi hoàn tất, rồi bấm lại để tiến hành 15→16Chúng tôi đợi cho đến khi database bắt đầu nhận kết nối; có vẻ nó đã nhận kết nối ngay cả trước khi được hiển thị là ready, và dường như AWS còn làm thêm việc gì đó ngoài
pg_upgradeSau đó chúng tôi bắt đầu
VACUUM ANALYZE; REINDEX DATABASE CONCURRENTLY. Mục đích là để tránh vấn đề hiệu năng giữa các phiên bản và tận dụng các cải thiện hiệu năng của phiên bản mớiChúng tôi bắt đầu khởi động lại các app, đợi cho đến khi tất cả app đều có vài container đang chạy, rồi bắt đầu nhận traffic, tắt site bảo trì và đi ngủ
REINDEX CONCURRENTLYchạy thêm 18 giờ trên DB lớn nhất nhưng không chặn gì cảLần tới, chúng tôi dự định dùng AWS Blue/Green deployment để tránh downtime. Lần này không dùng được vì chúng tôi không ở phiên bản minor tối thiểu của 14 mà Blue/Green hỗ trợ, tức 14.9
Nếu tự làm, tôi sẽ không trả chi phí AWS mà tự dựng Blue/Green bằng logical replication và load balancer
pg_upgrade --hardlinkscho nâng cấp tại chỗTôi từng xử lý cả DB 2TB trong chưa đến 1 phút trên một instance Postgres tự vận hành on-premises
GOV.UK Notify là một phần trong bộ dịch vụ mà GDS cung cấp cho các cơ quan công quyền của Anh. Cùng với đó còn có GOV.UK Pay và GOV.UK PaaS, ban đầu được biết đến với tên Government As A Platform
DMS là một công cụ migration tệ hại. Tôi đã vật lộn gần một tháng với nhiều vấn đề migration rồi bỏ cuộc
Nó không migration được kiểu text và json, và AWS Support cũng không đưa ra được giải pháp
Tôi đã dùng AWS Blue/Green ở giai đoạn thử nghiệm ban đầu, và nhờ vậy việc upgrade gần như không downtime đã trở thành hiện thực
Nó hỏng hoàn toàn
Thú vị đấy, nhưng ngay từ đầu tôi không hiểu vì sao chính phủ lại dùng AWS. Đây không phải là một startup đang hack để tìm product-market fit, cũng không phải tình huống không dự đoán được lượng truy cập tăng vọt do marketing rồi phải ứng phó
Họ biết dịch vụ kiểu này sẽ cần thiết trong dài hạn, và cũng có thể dự đoán khá tốt mô hình sử dụng
Có thể xây dựng cloud cho khu vực công hoặc áp dụng cách tiếp cận on-premise hợp lý. Việc đó cần tiền, sự phối hợp và năng lực lãnh đạo kỹ thuật, nhưng về dài hạn sẽ tiết kiệm chi phí khổng lồ cho người đóng thuế
IT khu vực công nhìn chung khá hỗn loạn, nhưng tôi biết trong đó vẫn có những kỹ sư giỏi
Mỗi giờ chạy loanh quanh với ổ cứng và driver, hoặc phiên bản cloud của chúng như storage và Ansible, là một giờ không dùng để xây thứ khách hàng cần
Vì sao chính phủ lại phải khác?
Chúng ta không kỳ vọng chính phủ tự chế tạo ô tô, mà kỳ vọng họ mua từ Volkswagen hoặc Renault. Dù chính phủ rõ ràng có nhu cầu vận tải. Vậy tại sao lại cứ khăng khăng bắt họ tự xây hạ tầng IT thì tôi không hiểu
Và còn có những việc hoàn toàn bất ngờ như đại dịch. Việc có thể mở rộng để đáp ứng nhu cầu trong đại dịch là một trong những ví dụ minh họa cốt lõi cho lý do khu vực công nên dùng cloud công cộng thương mại
Tôi khuyên nên xem bài trình bày hồi tháng 9 về nhiều lần lặp lại của Gov.UK và việc migration giữa các cloud https://youtube.com/watch?v=mpY1lxkikqM&pp=ygUOUmljaGFyZCB0b...
Ít nhất trong chính phủ Anh, do các yêu cầu mua sắm công, cứ vài năm họ lại phải đưa báo giá theo mức sử dụng ra thị trường một lần
Ví dụ nếu Oracle Cloud rẻ bằng một phần mười, khả năng cao họ sẽ thắng hợp đồng, khi đó trong thời hạn hợp đồng phải migration sang Oracle, rồi sau đó nếu xuất hiện cloud khác rẻ hơn thì có thể lại phải chuyển tiếp
Đó là thứ tệ nhất tôi từng thấy trong đời. Kể cả khi tôi đã từng xử lý nhiều legacy như VB.NET, Web Forms, SharePoint cũ, Basic, thậm chí cả những ứng dụng mà toàn bộ gần như là một khối stored procedure khổng lồ
AWS, Azure, Google Cloud ít nhất còn được xây dựng với người dùng cuối, tức developer, trong đầu. Còn cloud của chính phủ thì được thiết kế và xây dựng bởi nhà thầu giá thấp nhất, với mục tiêu số một là cắt chi phí ở mọi nơi có thể
Ngược lại, tôi cũng từng gặp những người phụ trách hạ tầng và vận hành thực sự xuất sắc, từng vận hành datacenter nội bộ của một cơ quan y tế chính phủ Đức. Vấn đề ở đó 100% không phải là công nghệ hay con người, mà là ban quản lý và quy trình luôn trở thành nút thắt trong mọi tương tác giữa đội hạ tầng và đội engineering