Cảm ơn minseokkang về tài liệu quý giá này.
✏️ Máy chủ - Server
Khi có trình duyệt web, máy chủ web và DNS, mình cần biết yêu cầu của người dùng (yêu cầu được gửi bởi trình duyệt web) được xử lý như thế nào.
Giả sử tôi kết nối với google.
- Nhập www.google.com vào thanh địa chỉ
- Truy vấn IP của www.google.com đến máy chủ DNS
- Máy chủ DNS trả về đúng IP cho www.google.com.
- Yêu cầu HTTP tới IP được trả về.
- Máy chủ web nhận được yêu cầu xử lý yêu cầu
✏️ Cơ sở dữ liệu - Database
Tại đây, nếu số lượng người dùng tăng lên, máy chủ xử lý lưu lượng (lớp web) và máy chủ cơ sở dữ liệu (lớp data) có thể được tách ra và mở rộng.
Khi chọn sử dụng cơ sở dữ liệu nào, tôi có thể chọn phần lớn giữa cơ sở dữ liệu quan hệ relational database
và cơ sở dữ liệu không, phi quan hệ non relational database
.
Cơ sở dữ liệu quan hệ - Relational database
- Nó còn được gọi là RDBMS (Hệ thống quản lý cơ sở dữ liệu quan hệ).
- MySQL, Oracle, PostgreSQL, v.v.
- Có thể tham gia các hoạt động.
Cơ sở dữ liệu phi quan hệ - Non relational database
- Còn được gọi là NoQuery.
- CouchDB, Neo4j, Cassandra, HBase, Amazon DynamoDB, v.v.
- Chúng cũng có thể được tách thành bốn.
- cửa hàng khóa-giá trị
- cửa hàng đồ thị
- cửa hàng cột
- cửa hàng tài liệu
- Nói chung, các hoạt động tham gia là không thể.
Cơ sở dữ liệu quan hệ được sử dụng vì chúng luôn được yêu thích. Cơ sở dữ liệu phi quan hệ là tốt để xem xét trong các tình huống sau:
- Yêu cầu độ trễ phản hồi rất thấp.
- Nó không phải là dữ liệu quan hệ vì dữ liệu mà nó xử lý không có cấu trúc.
- Chỉ tuần tự hóa hoặc giải tuần tự hóa dữ liệu (JSON, YAML, XML,…).
- Cần lưu trữ một lượng dữ liệu rất lớn.
NoSQL nhanh vì nó sử dụng cấu trúc dữ liệu được tối ưu hóa để đọc dữ liệu trong trường hợp khóa giá trị. Kho lưu trữ khóa giá trị NoSQL sử dụng HashMaps, có tốc độ truy cập là O(1), trong khi RDB điển hình sử dụng mảng, có tốc độ truy cập O(N).
✏️ Tỷ lệ ngang so với tỷ lệ dọc
Có chia tỷ lệ theo chiều dọc, được gọi là tăng tỷ lệ và chia tỷ lệ theo chiều ngang, được gọi là thu nhỏ.
Phương pháp mở rộng quy mô là phương pháp thêm phần cứng như đặt thêm CPU hoặc bảo mật nhiều RAM trong máy chủ để thực hiện những việc có thể thực hiện được nhiều nhất có thể trên một máy chủ và phương pháp mở rộng quy mô là phương pháp cải thiện hiệu suất bằng cách thêm nhiều máy chủ hơn . .
Mở rộng quy mô - Scale Up
- Thuận lợi
- Mở rộng là đơn giản.
- Điều bất lợi
- Không thể tăng CPU hoặc bộ nhớ vô hạn.
- Không đề xuất kế hoạch chuyển đổi dự phòng hoặc kế hoạch dự phòng cho sự cố.
- Trong trường hợp máy chủ bị lỗi, các dịch vụ như web và ứng dụng sẽ bị dừng hoàn toàn.
Bất lợi nghiêm trọng đến mức tốt hơn là sử dụng phương pháp mở rộng quy mô trong các hệ thống lớn.
Khi xảy ra sự cố máy chủ, người dùng không thể truy cập trang web và lưu lượng truy cập quá nhiều là một trong những nguyên nhân gây ra sự cố máy chủ.
Để giải quyết vấn đề này, cách tốt nhất là giới thiệu một bộ cân bằng tải load balancer
.
Cân bằng tải - Load Balancer
Bộ cân bằng tải chịu trách nhiệm phân bổ đều tải lưu lượng giữa các máy chủ web trong bộ cân bằng tải.
Như đã giải thích ở trên, khi người dùng nhập IP của một máy chủ, bộ cân bằng tải bên trong thiết kế hệ thống máy chủ sẽ phân bổ lưu lượng bằng một thuật toán thích hợp cho IP riêng, tức là IP của mỗi máy chủ web, còn được gọi là IP riêng.
IP riêng là địa chỉ IP chỉ được sử dụng để liên lạc giữa các máy chủ thuộc cùng một mạng.
Việc thêm bộ cân bằng tải như thế này sẽ giải quyết vấn đề tự động phục hồi và tăng khả năng sử dụng của tầng web.
Điều này là do nếu máy chủ 1 chết, lưu lượng truy cập có thể được cung cấp cho máy chủ 2 trong khi nó đang được khôi phục và nếu lưu lượng truy cập tăng quá mức, có thể đối phó với nó một cách tao nhã bằng cách thêm nhiều máy chủ hơn và sử dụng bộ cân bằng tải.
Máy chủ web có thể được mở rộng như thế này, nhưng cơ sở dữ liệu, lớp dữ liệu, có thể được mở rộng như thế nào?
Ghép kênh cơ sở dữ liệu - Database Multiplexing
Thông thường, mối quan hệ chủ-tớ được thiết lập và dữ liệu gốc được lưu trữ trên máy chủ chính và bản sao được lưu trữ trên máy chủ phụ.
Nó chỉ được hỗ trợ bởi máy chủ chính vì nó mất nhiều thời gian hơn thao tác đọc, chẳng hạn như thao tác ghi và nó có thể gây ra các vấn đề về tính nhất quán nếu được quản lý với số lượng lớn . Máy chủ cơ sở dữ liệu thứ cấp nhận một bản sao từ máy chủ cơ sở dữ liệu chính và chỉ hỗ trợ các thao tác đọc.
- Thuận lợi
- Hiệu suất tốt hơn: Hiệu quả vì các thao tác đọc và ghi được phân phối và hiệu suất được cải thiện vì các thao tác đọc có thể được xử lý song song.
- Độ tin cậy: Tôi lưu trữ các bản sao dữ liệu ở nhiều vị trí, vì vậy nếu một phần của máy chủ cơ sở dữ liệu gặp sự cố, dữ liệu sẽ được lưu trữ ở nơi khác.
- Tính khả dụng: Vì các bản sao được tạo ở nhiều nơi, nên ngay cả khi một máy chủ cơ sở dữ liệu bị lỗi, dịch vụ vẫn có thể tiếp tục bằng cách lấy dữ liệu từ một máy chủ khác.
Vì vậy, cuối cùng, một bộ cân bằng tải được đặt trên máy chủ web để phân phối tải và cơ sở dữ liệu phân chia tải giữa máy chủ cơ sở dữ liệu chính và phụ để phân phối tải.
✏️ Chi phí - Money and Cost
Lý do để nhận biết bộ đệm là để cải thiện độ trễ.
Bộ đệm giúp tăng tốc độ xử lý các yêu cầu bằng cách giữ các kết quả tính toán đắt tiền hoặc dữ liệu được tham chiếu thường xuyên trong bộ nhớ.
Nếu tôi làm mới thì sẽ phải tìm hiểu và nạp lại dữ liệu, nhưng việc gọi cơ sở dữ liệu mỗi lần có thể gây ra các vấn đề về hiệu suất. Bộ đệm có thể giảm bớt vấn đề này.
Buffer level
Lớp bộ đệm là nơi lưu trữ dữ liệu tạm thời. Nó nhanh hơn nhiều so với cơ sở dữ liệu và có thể giảm tải cho cơ sở dữ liệu. Hệ thống phân cấp bộ đệm cũng có thể được thu nhỏ một cách độc lập.
Như trên, máy chủ bộ đệm hoạt động và phương pháp này được gọi là chiến lược bộ nhớ đệm đọc qua . Chiến lược khác nhau tùy thuộc vào loại dữ liệu được lưu trong bộ nhớ cache, kích thước, kiểu truy cập, v.v., vì vậy hãy chọn chiến lược phù hợp.
Máy chủ bộ nhớ cache rất dễ sử dụng vì chúng cung cấp API bằng các ngôn ngữ lập trình thường được sử dụng.
1
2
3
4
// memcached Hệ thống cache sử dụng ngôn ngữ C
SECONDS = 1
cache.set('cache', 'hi cache', 3600 * SECONDS)
cache.get('cache')
Thận trọng khi sử dụng bộ đệm
- Các bản cập nhật không diễn ra thường xuyên, nhưng các tài liệu tham khảo đáng để xem xét nếu có.
- Vì bộ nhớ đệm không ổn định nên không nên giữ dữ liệu sẽ được lưu vĩnh viễn trong bộ nhớ đệm.
- Cần phải thiết lập một chính sách về cách thức và thời điểm bộ đệm hết hạn. Cẩn thận không đặt thời gian hết hạn quá ngắn hoặc quá dài.
- Làm thế nào để duy trì tính nhất quán với cơ sở dữ liệu? nên suy nghĩ về Có vẻ như có rất nhiều nghiên cứu đang diễn ra nên thậm chí còn có cả những bài báo.
- Cần suy nghĩ về cách đối phó với những trở ngại. Có một máy chủ bộ nhớ đệm có khả năng biến máy chủ đó thành
một điểm lỗi duy nhất
. Vì lý do này, các máy chủ bộ đệm phải được phân phối trên nhiều vùng.
Điểm lỗi duy nhất (SPOF): Khi lỗi tại một điểm cụ thể có thể khiến toàn bộ hệ thống ngừng hoạt động, điểm đó được gọi là điểm lỗi duy nhất.
- Bộ nhớ cache sẽ lớn đến mức nào? Nếu bộ nhớ cache nhỏ, hiệu suất sẽ bị suy giảm do dữ liệu được đẩy ra ngoài và cập nhật thường xuyên. Người ta nói rằng thà lấy lớn còn hơn.
- Chính sách trục xuất dữ liệu cũng phải được thiết lập. Khi bộ đệm đầy, dữ liệu cũ phải được xuất ra và phải nhận dữ liệu mới.Một thuật toán thường được sử dụng là phương pháp
LRU
(Least Recent used). Ngoài ra, còn cóLFU
vàFIFO
.
✏️ Mạng phân phối nội dung (CDN)
CDN là một mạng máy chủ được phân phối theo địa lý được sử dụng để phân phối nội dung tĩnh.
Hình ảnh, video, CSS, tệp JavaScript, v.v. có thể được lưu vào bộ đệm.
Cách thức hoạt động cũng đơn giản như sau:
- Người dùng truy cập trang web
- Các máy chủ CDN gần về mặt địa lý cung cấp nội dung tĩnh cho người dùng.
Bởi vì nó là một mạng phân tán về mặt địa lý, nên phản hồi chậm khi khoảng cách lớn là điều đương nhiên.
Khoảng cách càng xa, yêu cầu gửi càng chậm.
CDN được phân phối bằng bộ nhớ đệm theo cách này.
Phương pháp hoạt động không khó để giải thích, nhưng có những điều bổ sung cần biết.
Người dùng truy cập image.png
thông qua URL hình ảnh và miền URL này được cung cấp bởi nhà cung cấp CDN.
1
https://mysite.imagekit.io/logo.png
Đây là một URL hình ảnh ví dụ.
Ngoài ra, khi máy chủ ban đầu lưu trữ hình ảnh trả lại tệp cho máy chủ CDN ở bước 3, tệp chứa giá trị TTL (Thời gian tồn tại) mô tả khoảng thời gian tệp có thể được lưu vào bộ nhớ cache. Giá trị này cho phép CDN xác định thời gian hình ảnh có thể tồn tại trong bộ đệm.
Những điều cần xem xét khi sử dụng CDN
Chi phí
: Vì CDN thường được vận hành bởi các nhà cung cấp bên thứ ba và tính phí theo lượng dữ liệu được truyền, nên việc lưu trữ nội dung được tham chiếu không thường xuyên vào bộ nhớ đệm rất tốn kém.Cài đặt thời gian hết hạn phù hợp
: Cũng như bộ nhớ cache, thời gian hết hạn hợp lý có thể cải thiện hiệu suất.Cách xử lý lỗi CDN
: Cần suy nghĩ xem phải làm gì nếu CDN không phản hồi. Một cách là định cấu hình máy khách để tải nội dung trực tiếp từ máy chủ gốc.Phương pháp vô hiệu hóa nội dung
: Ngay cả khi nội dung chưa hết hạn, nó vẫn có thể bị xóa khỏi CDN thông qua phương pháp bên dưới.- Vô hiệu hóa bằng API do nhà cung cấp dịch vụ CDN cung cấp
- Sử dụng
phiên bản đối tượng
để phục vụ các phiên bản khác nhau của nội dung . - Để tạo phiên bản mới, hãy chuyển số phiên bản làm đối số ở cuối URL. ví dụ)
image.png?v=2
Việc thêm máy chủ web, máy chủ cơ sở dữ liệu, bộ cân bằng tải, ghép kênh cơ sở dữ liệu (Master-Slave
), máy chủ bộ đệm và CDN sẽ dẫn đến thiết kế hệ thống sau.
✏️ Lớp web phi trạng thái - Stateless web layer
kiến trúc nhà nước
Để mở rộng tầng web theo chiều ngang, thông tin trạng thái (chẳng hạn như dữ liệu phiên của người dùng) phải được xóa khỏi máy chủ web. Giả sử có 3 máy chủ (máy chủ A, máy chủ B, máy chủ C) và 3 người dùng (người dùng A, người dùng B, người dùng C).
Nếu máy chủ A có thông tin xác thực của người dùng A, máy chủ B có thông tin xác thực của người dùng B và máy chủ C có thông tin xác thực của người dùng C, thì mỗi khi người dùng gửi yêu cầu, yêu cầu sẽ được truyền đến máy chủ tương ứng. Nghĩa là, các yêu cầu phải luôn được gửi đến cùng một máy chủ tùy thuộc vào người dùng. Hầu hết các bộ cân bằng tải đều hỗ trợ tình huống trên bằng cách cung cấp một tính năng gọi là phiên cố định, đây là gánh nặng đối với bộ cân bằng tải. Ngoài ra, nó có thể gây ra lỗi không mong muốn khi thêm hoặc xóa các máy chủ bổ sung và việc này trở nên phức tạp vì phải chạm vào cài đặt cân bằng tải.
stateless architecture
Đó là lý do tại sao nên có một kho lưu trữ thu thập dữ liệu người dùng riêng biệt. Bộ nhớ này được gọi là bộ nhớ dùng chung.
Với cấu hình trên, không cần phải tách các yêu cầu về mặt vật lý, vì vậy máy chủ web có thể được thu nhỏ theo chiều ngang mà không gặp bất kỳ gánh nặng nào.
Bộ lưu trữ được chia sẻ thông thường có thể là cơ sở dữ liệu quan hệ , hệ thống bộ đệm như Redis hoặc NoSQL.
Nếu một dịch vụ phát triển và được phân phối và cung cấp trên toàn thế giới, thì điều cần thiết là phải hỗ trợ một trung tâm dữ liệu để có thể sử dụng nó một cách nhanh chóng và thuận tiện trên toàn thế giới.
✏️ Data Center
Nếu có hai trung tâm dữ liệu, nó sẽ giống như hình dưới đây.
Nếu mọi việc suôn sẻ, yêu cầu của người dùng sẽ đến trung tâm dữ liệu gần nhất, được gọi là geoDNS-routing . Nó chịu trách nhiệm xác định địa chỉ IP nào sẽ trả về dựa trên vị trí của người dùng.
Cuốn sách hiển thị một ví dụ trong đó x% được chỉ định, x% được gửi đến trung tâm dữ liệu bên trái và (100-x)% được gửi đến trung tâm dữ liệu bên phải.
Điều gì sẽ xảy ra nếu một trung tâm dữ liệu bị lỗi và lưu lượng truy cập dồn về trung tâm dữ liệu kia?
Có một số điều cần xem xét khi xây dựng một trung tâm dữ liệu để tránh tình trạng này.
Chuyển hướng lưu lượng: Phải suy nghĩ về cách gửi yêu cầu đến đúng trung tâm dữ liệu.
- Đồng bộ hóa dữ liệu: Nếu một cơ sở dữ liệu riêng biệt được sử dụng cho mỗi trung tâm dữ liệu, các vấn đề về tính nhất quán của dữ liệu có thể xảy ra, vì vậy dữ liệu được ghép kênh trong mỗi trung tâm dữ liệu. Một trong những phương pháp đó được cho là được sử dụng bởi Netflix.
- Thử nghiệm và triển khai: Nếu được xây dựng để sử dụng nhiều trung tâm dữ liệu, nên thử nghiệm và triển khai trong nhiều môi trường. Hãy để trung tâm dữ liệu cung cấp dịch vụ tương tự thông qua triển khai tự động.
Để mở rộng quy mô lớn hơn, cần phải tách các thành phần của hệ thống ra và giúp chúng mở rộng độc lập, và Message Queue sẽ giúp ích.
✏️ Message Queue
Hàng đợi tin nhắn là một thành phần hỗ trợ giao tiếp không đồng bộ đảm bảo không làm mất tin nhắn.
Nó phục vụ như một bộ đệm cho các tin nhắn và gửi chúng một cách không đồng bộ.
Khi một nhà sản xuất (nhà sản xuất/nhà xuất bản) tạo một tin nhắn và xuất bản nó vào hàng đợi tin nhắn, thì người tiêu dùng (người tiêu dùng/người đăng ký) sẽ nhận được tin nhắn và thực hiện một hành động phù hợp với tin nhắn.
Việc sử dụng hàng đợi tin nhắn nới lỏng sự liên kết giữa các dịch vụ hoặc máy chủ, mang lại sự ổn định cho các ứng dụng phải có khả năng mở rộng.
Do có hàng đợi tin nhắn nên nhà sản xuất có thể xuất bản tin nhắn ngay cả khi quy trình tiêu dùng ngừng hoạt động và người tiêu dùng cũng có thể nhận tin nhắn từ hàng đợi tin nhắn ngay cả khi nhà sản xuất ngừng hoạt động.
Nếu cần thực hiện một tác vụ dài, chẳng hạn như chỉnh sửa ảnh,
Máy chủ web gửi tác vụ tương ứng đến hàng đợi tin nhắn và các quy trình công nhân của người tiêu dùng nhận được tin nhắn này và thực hiện tác vụ không đồng bộ.
Điều này cho phép người tiêu dùng và nhà sản xuất mở rộng quy mô một cách độc lập. Khi hàng đợi tin nhắn phát triển, thời gian xử lý có thể giảm bằng cách thêm nhiều quy trình hơn cho người tiêu dùng và nếu hàng đợi tin nhắn gần như trống, việc giảm quy trình có thể giảm chi phí.
✏️ Nhật ký, số liệu và tự động hóa
Nhật ký, số liệu và tự động hóa tốt cho các trang web nhỏ, nhưng chúng không cần thiết, vì vậy tôi không quan tâm. Nhưng khi quy mô của trang web tăng lên, nó đã tạo ra một môi trường mà việc đầu tư vào những công cụ này là điều cần thiết.
Nhật ký
: Theo dõi nhật ký lỗi là rất quan trọng, nếu không được viết ra. Thay vì giám sát bởi máy chủ, tốt hơn là sử dụng một công cụ thu thập nhật ký vào một máy chủ duy nhất.Metrics
: Giúp dễ dàng hiểu được trạng thái hiện tại của hệ thống.Per Host Metrics
: Metrics cho CPU, Memory và Disk I/OSố liệu toàn diện
: hiệu suất của lớp DB, hiệu suất của lớp bộ đệmCác số liệu kinh doanh chính
: những thứ như người dùng hàng ngày, doanh thu và lượt truy cập lặp lại.
Tự động hóa
: CI (tích hợp liên tục) Các công cụ trợ giúp tích hợp liên tục cho phép mã của nhà phát triển tự động trải qua một số quy trình xác minh. Điều này cũng có thể phát hiện vấn đề. Hơn nữa, năng suất phát triển có thể được tăng lên bằng cách tự động hóa quá trình xây dựng, thử nghiệm và triển khai.
✏️ Mở rộng quy mô cơ sở dữ liệu
Những ưu và nhược điểm của việc mở rộng quy mô đã được giải thích ở trên và cuốn sách giải thích rằng mở rộng quy mô = mở rộng theo chiều ngang = sharding .
Sharding
Sharding đề cập đến một công nghệ phân chia cơ sở dữ liệu lớn thành các đơn vị nhỏ hơn được gọi là segment.
Tất cả các segment sử dụng cùng một lược đồ, nhưng không có sự trùng lặp dữ liệu.
Phương pháp trên user_id
xác định segment lưu trữ dữ liệu theo phần còn lại của phép chia.
Vì vậy, trong segment 0, user_id
là 0,4,8,12 … sẽ được lưu trữ và trong segment 1, user_id là 1,5,9,13,… các giá trị sẽ được lưu trữ.
Khi định cấu hình segment như thế này, điều quan trọng là phải đặt khóa segment xác định segment, chẳng hạn như user_id. Khóa sharding còn được gọi là khóa phân vùng . Nó bao gồm một hoặc nhiều cột xác định cách phân phối dữ liệu. Điều quan trọng là phải xác định khóa bảo vệ có thể phân phối dữ liệu đồng đều.
Sharding không hoàn hảo. Điều này là do các vấn đề mới phát sinh khi sharding được giới thiệu.
- segment lại dữ liệu: Sự cố này xảy ra khi có quá nhiều dữ liệu và một segment không thể xử lý dữ liệu đó hoặc khi một không gian segment nhanh chóng cạn kiệt do mất cân bằng dữ liệu giữa các segment. Điều này còn được gọi là cạn kiệt segment và yêu cầu phải di chuyển dữ liệu bằng cách thay đổi hàm tính toán khóa segment. Điều này có thể được giải quyết thông qua băm nhất quán.
- Vấn đề về người nổi tiếng: Nếu Bong Joon-ho, BTS và Son Heung-min ở trong một segment, thì rất nhiều lượt đọc trên segment đó có thể gây tải. Có thể giải quyết vấn đề bằng cách chia từng người nổi tiếng ở trên thành các mảnh.
- Tham gia và không chuẩn hóa: Các segment gây khó khăn cho việc tham gia vì dữ liệu được trải ra ở nhiều nơi. Một cách là chuẩn hóa cơ sở dữ liệu để một truy vấn được thực hiện trên một bảng.
🤔 Organization
Đúc kết lại đã giải thích những vấn đề cần xem xét mỗi khi mở rộng quy mô hệ thống dưới dạng một câu chuyện.
- Những điều cần cân nhắc khi thiết lập cơ sở dữ liệu (DB quan hệ? NoSQL?)
- Để giải quyết vấn đề này, lưu lượng truy cập được quản lý bằng bộ cân bằng tải trong lớp web và phương pháp chủ-tớ trong lớp dữ liệu .
- Hơn nữa, nó cung cấp tốc độ phản hồi nhanh bằng cách đặt máy chủ bộ đệm được tham chiếu thường xuyên.
- Thông qua CDN, tài nguyên tĩnh có thể nhanh chóng được gửi đến người dùng.
- Để xử lý yêu cầu linh hoạt hơn, nên định cấu hình web không trạng thái và bộ nhớ dùng chung được cung cấp để trợ giúp việc này.
- Các trung tâm dữ liệu được thiết lập để cung cấp phản hồi nhanh cho các cấu hình trên và tính nhất quán của dữ liệu cũng được xem xét trong mỗi trung tâm dữ liệu.
- Queue message giúp người tiêu dùng và nhà sản xuất mở rộng độc lập và hiệu quả công việc cũng tăng lên do xử lý không đồng bộ.
- Thông qua nhật ký và số liệu, hệ thống có thể được kiểm tra và theo dõi tình trạng.
- Nó giúp kiểm tra, xây dựng và triển khai thông qua logic đã được xác minh thông qua tự động hóa.
- Mặc dù có thể quản lý cơ sở dữ liệu một cách hiệu quả bằng cách chia cơ sở dữ liệu thành các đơn vị nhỏ gọi là phân đoạn, nhưng tôi phát hiện ra rằng có nhiều điều cần xem xét
Comments powered by Disqus.