Đây có phải là một kiến ​​trúc phù hợp, hoặc có thể cải tiến?


7

Do sự kết hợp của các yêu cầu kinh doanh / doanh nghiệp và sở thích của kiến ​​trúc sư của chúng tôi, chúng tôi đã đến một kiến ​​trúc cụ thể có vẻ hơi khó chịu với tôi, nhưng tôi có kiến ​​thức kiến ​​trúc rất hạn chế và thậm chí ít kiến ​​thức về đám mây, vì vậy tôi rất thích kiểm tra sự tỉnh táo nếu có cải tiến có thể được thực hiện ở đây:

Bối cảnh: Chúng tôi đang phát triển một sự thay thế cho một hệ thống hiện có được viết lại hoàn chỉnh từ đầu. Điều này yêu cầu chúng tôi lấy nguồn dữ liệu từ một phiên bản SAP thông qua BAPI / SOAP Web Services, cũng như sử dụng một số cơ sở dữ liệu của riêng chúng tôi cho dữ liệu không có trong SAP. Hiện tại tất cả dữ liệu mà chúng tôi sẽ quản lý tồn tại trong các DB cục bộ trên một ứng dụng phân tán hoặc trong cơ sở dữ liệu MySQL sẽ cần phải được di chuyển khỏi. Chúng tôi sẽ cần tạo một số ứng dụng web sao chép chức năng của ứng dụng phân tán hiện có, cũng như cung cấp chức năng liên quan đến quản trị viên đối với dữ liệu chúng tôi kiểm soát.

Yêu cầu kinh doanh / doanh nghiệp:

  • Bất kỳ cơ sở dữ liệu nào chúng tôi kiểm soát phải được triển khai trong MS SQL Server

  • Giảm thiểu số lượng cơ sở dữ liệu được tạo

  • Giai đoạn 1 sẽ cho chúng tôi triển khai các ứng dụng của mình lên Azure, nhưng chúng tôi cần khả năng mang các ứng dụng này ra mắt trong tương lai

  • Nhóm Ops của chúng tôi muốn chúng tôi cập nhật mọi thứ vì họ cảm thấy điều đó sẽ giúp việc quản lý mã của họ đơn giản hơn rất nhiều.

  • Giảm thiểu / loại bỏ sao chép dữ liệu

  • Ngăn xếp mã hóa sẽ là .NET Core cho các dịch vụ microservice và Admin, nhưng Angular 5 cho ứng dụng front-end chính.

Từ những yêu cầu này, kiến ​​trúc sư của chúng tôi đã đưa ra thiết kế này: Kiến trúc chính

Mặt trước của chúng tôi sẽ cung cấp từ một loạt các dịch vụ siêu nhỏ (tôi sử dụng thuật ngữ đó một cách nhẹ nhàng vì chúng ở cấp độ 'Miền' và khá lớn), sẽ được chia thành Dịch vụ Đọc và Dịch vụ Viết trong mỗi miền. Cả hai sẽ có khả năng mở rộng và tải cân bằng thông qua Kubernetes. Mỗi người cũng sẽ có một bản sao chỉ đọc cơ sở dữ liệu của họ được đính kèm trong thùng chứa của họ, với một phiên bản chính của db có sẵn để ghi sẽ đẩy ra các bản cập nhật cho những bản sao chỉ đọc.

kiến trúc container Kiến trúc đọc-viết

(Xin lỗi vì hình ảnh kém chất lượng, tôi đang làm lại chúng từ bộ nhớ vì, tự nhiên, không có tài liệu thực tế nào cho nội dung này ngoại trừ trong đầu của kiến ​​trúc sư)

Giao tiếp giữa Dịch vụ với Dịch vụ sẽ diễn ra thông qua hàng đợi tin nhắn mà mỗi dịch vụ sẽ lắng nghe và xử lý mọi tin nhắn có liên quan. Việc sử dụng chính của việc này sẽ là để tạo email, vì không có gì khác chúng tôi đã xác định yêu cầu dịch vụ liên lạc với dịch vụ để biết thông tin. Bất cứ điều gì "logic kinh doanh" liên quan sẽ yêu cầu nhiều dịch vụ tham gia đều có khả năng chảy từ các giao diện người dùng, trong đó các giao diện sẽ gọi riêng từng dịch vụ và xử lý nguyên tử.

Từ góc nhìn của tôi, điều khiến tôi hiểu lầm là các trường hợp db chỉ đọc được quay bên trong các thùng chứa docker cho các dịch vụ. Bản thân dịch vụ và db sẽ có các nhu cầu khác nhau đáng kể về tải, do đó, sẽ có ý nghĩa hơn nhiều nếu chúng ta có thể tải cân bằng chúng một cách riêng biệt. Tôi tin rằng MYSQL có cách thực hiện điều đó với các cấu hình chính / nô lệ, nơi các nô lệ mới có thể xuất hiện bất cứ khi nào tải cao. Đặc biệt là trong khi chúng tôi có hệ thống của chúng tôi trên đám mây và đang trả tiền cho từng trường hợp, việc tạo ra một phiên bản mới của toàn bộ dịch vụ khi chúng tôi chỉ cần một phiên bản db khác có vẻ lãng phí (ngược lại, quay lên một bản sao db mới khi chúng tôi thực sự chỉ cần một ví dụ dịch vụ web). Tuy nhiên, tôi không biết những hạn chế của MS SQL Server cho việc này.

Mối quan tâm lớn nhất của tôi là xung quanh việc triển khai MS SQL Server. Khớp các trường hợp chỉ đọc rất chặt chẽ với các dịch vụ cảm thấy sai. Có cách nào tốt hơn để làm điều này?

LƯU Ý: Tôi đã hỏi điều này về kỹ thuật phần mềm và họ đã chỉ cho tôi ở đây. Xin lỗi nếu đây không phải là SE thích hợp.

Ngoài ra không có thẻ MS SQL Server


4
Chắc chắn, đặt DB và dịch vụ web trong cùng một vùng chứa không phải là một cách làm tốt. Tôi thực sự không thể nói cho các máy chủ MS SQL, nhưng chúng hỗ trợ sao chép, cho đến thời điểm nào (số lượng bản sao) tôi không biết.
Tensibai

Câu trả lời:


2

Mối quan tâm lớn nhất của tôi là xung quanh việc triển khai MS SQL Server. Khớp các trường hợp chỉ đọc rất chặt chẽ với các dịch vụ cảm thấy sai. Có cách nào tốt hơn để làm điều này?

Về cơ bản những gì bạn đã thiết kế là một hệ thống lưu trữ - các thùng chứa dịch vụ có một bản sao dữ liệu cục bộ có lẽ để cho các lần đọc họ không phải thực hiện thêm một chuyến đi mạng.

Như bạn đã chỉ ra, một cách tiếp cận tiêu chuẩn hơn là có một cụm các bản sao đọc mà tất cả các container có thể đọc được. Điều này cho phép bạn chia tỷ lệ chúng riêng biệt với các máy chủ ứng dụng, điều này tốt, bởi vì chúng thường cần những thứ khác nhau (bạn có thực sự muốn phân bổ số lượng lớn RAM cho mỗi bộ chứa ứng dụng không?). Điều này sẽ thêm các cuộc gọi mạng để đọc cơ sở dữ liệu, nhưng cho đến khi điều đó được chứng minh là một vấn đề, tôi sẽ không làm phức tạp kiến ​​trúc để giải quyết nó.

Nếu nó không trở thành một vấn đề, một cách nhiều nhẹ hơn xử lý vấn đề là để chạy một bộ nhớ cache thực tế tại địa phương, như memcache hoặc redis. Bạn có thể điều chỉnh các TTL trên các đối tượng riêng lẻ cho phù hợp và nó sẽ tự động loại bỏ dữ liệu hiếm khi được yêu cầu để giữ cho máy chủ ứng dụng sáng.


Bạn có biết về cách cân bằng tải / quay lên các phiên bản mới của các bản sao đã đọc cho máy chủ ms sql không?
Marshall Tigerus

Tôi không có bất kỳ kinh nghiệm nào với SQL Server, nhưng bạn sẽ có thể sử dụng các quy trình thông thường. Nếu tải của bạn khá ổn định, bạn có thể tạo nô lệ mới theo cách bạn thường làm như vậy; nếu bạn cần tự động mở rộng lên xuống, thì điều đó phụ thuộc vào nền tảng lưu trữ của bạn. Và bạn có thể yêu cầu cân bằng tải giữa chúng với bộ cân bằng tải mà bạn chọn.
Xiong Chiamiov

1

Tôi có thể nói rất nhiều về kiến ​​trúc nhưng đây là một cộng đồng tín đồ vì vậy tôi sẽ chỉ giải quyết mối quan tâm chính của bạn về việc chạy cơ sở dữ liệu.

Câu trả lời ngắn:

Nếu bạn sửa đổi thiết kế để nói "Azure SQL" cho mỗi microservice thì nó sẽ ổn với tôi. Mỗi microservice có thể có phiên bản cơ sở dữ liệu Azure SQL riêng (có thể chạy trên một cụm chia sẻ nhưng điều đó là vô hình với bạn). Để di chuyển nó tại chỗ sau, bạn có thể quyết định xem bạn có muốn xây dựng thiết lập "Azure SQL giống như" trên kubernetes hay chỉ đơn giản là chạy cụm SQL Server truyền thống tại chỗ. Sử dụng Azure SQL không khóa kiến ​​trúc của bạn vào Azure như tôi sẽ thảo luận bên dưới.

Câu trả lời dài:

MS SQL Server yêu cầu một lượng bộ nhớ lớn so với cơ sở dữ liệu mã nguồn mở hoặc các dịch vụ ứng dụng không trạng thái. Nó cũng yêu cầu giấy phép phần mềm (chúng tôi sẽ xem xét tối ưu hóa chi phí dưới đây). Vì vậy, nó có thể là trường hợp đơn giản là không hiệu quả về chi phí để chạy một phiên bản được cấp phép cho mỗi dịch vụ. Bạn có thể cấp phép cho một phiên bản SQLServer và chạy nhiều cơ sở dữ liệu riêng cho mỗi dịch vụ trên đó. Tốt hơn hết là sử dụng Azure SQL phiên bản cơ sở dữ liệu được quản lý của SQL Server. Điều đó không khóa chúng vào Azure khi bạn có thể chuyển sang AWS có "Amazon RDS cho SQL Server". Mỗi nhà cung cấp đám mây nghiêm túc sẽ cung cấp một dịch vụ cơ sở dữ liệu được quản lý chuyên nghiệp cho tất cả các cơ sở dữ liệu chính.

Ngoài ra, khi bạn chỉ ra việc chạy một cơ sở dữ liệu trong cùng một nhóm kubernetes vì ​​mã máy chủ ứng dụng của bạn sẽ không cho phép bạn mở rộng chúng một cách độc lập. Ngoài ra, các máy chủ ứng dụng không trạng thái có thể chạy trên các nhóm không có bộ nhớ liên tục. Sau đó, các máy chủ ứng dụng không trạng thái có thể chết và được khởi động lại theo ý muốn và di chuyển giữa các vùng khả dụng của đám mây một cách tầm thường. Rõ ràng, cơ sở dữ liệu cần lưu trữ liên tục được "sở hữu" bởi pod. Vì vậy, một cơ sở dữ liệu cần một yêu cầu khối lượng liên tục. Nếu bạn muốn chúng chạy với tính sẵn sàng cao, bạn cần chúng chạy như một bộ trạng thái. Chạy cơ sở dữ liệu trong cùng nhóm với máy chủ ứng dụng là điều mà nhà phát triển có thể chạy cục bộ, nhưng tôi không khuyến nghị nó cho SQL Server, vì nó khởi động chậm hơn 10 lần so với mã của bạn. Thay vào đó, trên máy tính xách tay mac chạy hình ảnh docker SQL Server để lộ cổng của nó.

Nó được coi là một kiến ​​trúc rất chuẩn cho mỗi microservice có cơ sở dữ liệu logic (nhưng không nhất thiết phải là vật lý), nhưng để chạy như một dịch vụ phi trạng thái với nhiều bản sao, để chúng có thể được thu nhỏ độc lập. Ngoài ra Azure có hỗ trợ rất tốt cho Redis dưới dạng bộ đệm. Do đó, nó được coi là một kiến ​​trúc tiêu chuẩn cho mỗi microservice để có cơ sở dữ liệu riêng logic, nó là bộ đệm Redis riêng và nhiều nhóm được chia tỷ lệ độc lập. Nếu bạn đang thuê Azure SQL và Azure Redis, bạn không được chọn cách họ chạy nó một cách vật lý. Và tại sao bạn muốn? Hãy để các chuyên gia tìm ra cách chạy một thiết lập linh hoạt có hiệu suất cao mà bạn có thể "trả cho những gì bạn sử dụng" và tập trung vào việc viết logic kinh doanh của bạn chứ không phải quản lý các dịch vụ trạng thái trong đám mây mà bạn có thể dễ dàng thuê.

Tôi đã thấy các nhà phát triển chạy MS SQL Server Express cục bộ trên máy tính xách tay của họ để gỡ lỗi và kiểm tra đơn vị, sau đó triển khai lên Kubernetes trên Azure nơi cơ sở dữ liệu microservice đều chạy trên Azure SQL. Tôi cũng đã thấy các nhóm chạy với Azure SQL trong sản xuất, nhưng kiểm tra thiết lập SQL Server trên các máy ảo đơn giản trong Azure. Tại sao? Bởi vì Azure SQL chỉ đi kèm với "giá sản xuất". Tổ chức đó đã có SQL Server tại chỗ và các DBA để họ cài đặt và chạy SQL Server trên máy ảo trong Azure để lưu trữ các envs thử nghiệm rẻ hơn. Tất cả các dịch vụ siêu nhỏ có cơ sở dữ liệu riêng của họ. Trong thử nghiệm những cơ sở dữ liệu trên mỗi dịch vụ microservice trong đó trên một phiên bản SQL Server được chia sẻ trên máy ảo có cụm hai nút để phục hồi. Trong sản xuất, các phiên bản cho mỗi microservice đều có trên Azure SQL để có hiệu suất cao và tính sẵn sàng cao,


Tôi khuyên bạn nên đọc tài liệu mẫu Azure chính thức. Họ rất rõ ràng và sẽ cung cấp cho bạn rất nhiều điều bạn có thể chỉ ra trong các cuộc thảo luận của bạn. Ví dụ, kiến ​​trúc bạn đã được cung cấp dựa trên CQSR. Tôi thấy tài liệu kiến ​​trúc Azure rất tốt và nó bao gồm rất nhiều mẫu nổi tiếng với mã mẫu và cách triển khai chúng trên Azure. Họ có thể không cập nhật với Kubernete trong mã mẫu, nhưng chắc chắn đối với quản lý cơ sở dữ liệu saround đề xuất và bố cục logic cho CQSR, chúng sẽ rất hữu ích.
simbo1905
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.