Kiến trúc và khả năng của Lưới dữ liệu Tarantool

Kiến trúc và khả năng của Lưới dữ liệu Tarantool

Năm 2017, chúng tôi đã giành chiến thắng trong cuộc thi phát triển cốt lõi giao dịch trong hoạt động kinh doanh đầu tư của Alfa-Bank và bắt đầu công việc (tại HighLoad++ 2018 với báo cáo về cốt lõi của hoạt động kinh doanh đầu tư đã nói Vladimir Drynkin, người đứng đầu bộ phận giao dịch cốt lõi của hoạt động kinh doanh đầu tư của Ngân hàng Alfa). Hệ thống này được cho là tổng hợp dữ liệu giao dịch từ các nguồn khác nhau ở nhiều định dạng khác nhau, đưa dữ liệu về một dạng thống nhất, lưu trữ và cung cấp quyền truy cập vào dữ liệu đó.

Trong quá trình phát triển, hệ thống đã phát triển và có được chức năng, đồng thời tại một thời điểm nào đó, chúng tôi nhận ra rằng chúng tôi đang kết tinh một thứ gì đó không chỉ là phần mềm ứng dụng được tạo ra để giải quyết một loạt nhiệm vụ được xác định nghiêm ngặt: chúng tôi đã thành công hệ thống xây dựng các ứng dụng phân tán với bộ lưu trữ liên tục. Kinh nghiệm chúng tôi thu được đã hình thành nền tảng cho một sản phẩm mới - Lưới dữ liệu Tarantool (TĐG).

Tôi muốn nói về kiến ​​trúc TDG và các giải pháp mà chúng tôi đã đưa ra trong quá trình phát triển, giới thiệu cho bạn chức năng chính và cho thấy cách sản phẩm của chúng tôi có thể trở thành nền tảng để xây dựng các giải pháp hoàn chỉnh.

Về mặt kiến ​​trúc, chúng tôi chia hệ thống thành các phần riêng biệt vai trò, mỗi người chịu trách nhiệm giải quyết một loạt vấn đề nhất định. Một phiên bản ứng dụng đang chạy duy nhất sẽ triển khai một hoặc nhiều loại vai trò. Có thể có một số vai trò cùng loại trong một cụm:

Kiến trúc và khả năng của Lưới dữ liệu Tarantool

của DINTEK

Connector chịu trách nhiệm liên lạc với thế giới bên ngoài; Nhiệm vụ của nó là chấp nhận yêu cầu, phân tích cú pháp và nếu thành công thì gửi dữ liệu để xử lý đến bộ xử lý đầu vào. Chúng tôi hỗ trợ các định dạng HTTP, SOAP, Kafka, FIX. Kiến trúc cho phép bạn chỉ cần thêm hỗ trợ cho các định dạng mới và sắp có hỗ trợ cho IBM MQ. Nếu phân tích cú pháp yêu cầu không thành công, trình kết nối sẽ trả về lỗi; nếu không, nó sẽ phản hồi rằng yêu cầu đã được xử lý thành công, ngay cả khi xảy ra lỗi trong quá trình xử lý tiếp theo. Điều này được thực hiện đặc biệt để làm việc với các hệ thống không biết cách lặp lại các yêu cầu - hoặc ngược lại, thực hiện điều đó quá kiên trì. Để không làm mất dữ liệu, hàng đợi sửa chữa được sử dụng: đối tượng trước tiên sẽ vào đó và chỉ sau khi xử lý thành công mới bị xóa khỏi nó. Quản trị viên có thể nhận thông báo về các đối tượng còn lại trong hàng đợi sửa chữa và sau khi loại bỏ lỗi phần mềm hoặc lỗi phần cứng, hãy thử lại.

Bộ xử lý đầu vào

Bộ xử lý đầu vào phân loại dữ liệu nhận được theo các tính năng đặc trưng và gọi các bộ xử lý thích hợp. Trình xử lý là mã Lua chạy trong hộp cát nên chúng không thể ảnh hưởng đến hoạt động của hệ thống. Ở giai đoạn này, dữ liệu có thể được giảm xuống dạng yêu cầu và nếu cần, một số tác vụ tùy ý có thể được khởi chạy để thực hiện logic cần thiết. Ví dụ: trong sản phẩm MDM (Quản lý dữ liệu chính) được xây dựng trên Lưới dữ liệu Tarantool, khi thêm người dùng mới, để không làm chậm quá trình xử lý yêu cầu, chúng tôi triển khai việc tạo bản ghi vàng như một nhiệm vụ riêng biệt. Hộp cát hỗ trợ các yêu cầu đọc, thay đổi và thêm dữ liệu, cho phép bạn thực hiện một số chức năng trên tất cả các vai trò của loại lưu trữ và tổng hợp kết quả (bản đồ/thu nhỏ).

Trình xử lý có thể được mô tả trong các tệp:

sum.lua

local x, y = unpack(...)
return x + y

Và sau đó, được khai báo trong cấu hình:

functions:
  sum: { __file: sum.lua }

Tại sao lại là Lua? Lua là một ngôn ngữ rất đơn giản. Dựa trên kinh nghiệm của chúng tôi, một vài giờ sau khi biết về nó, mọi người bắt đầu viết mã để giải quyết vấn đề của họ. Và đây không chỉ là những nhà phát triển chuyên nghiệp, mà còn là những nhà phân tích chẳng hạn. Ngoài ra, nhờ trình biên dịch jit nên Lua chạy rất nhanh.

Kho

Bộ nhớ lưu trữ dữ liệu liên tục. Trước khi lưu, dữ liệu được xác thực dựa trên lược đồ dữ liệu. Để mô tả mạch chúng tôi sử dụng một định dạng mở rộng Apache Avro. Thí dụ:

{
    "name": "User",
    "type": "record",
    "logicalType": "Aggregate",
    "fields": [ 
        { "name": "id", "type": "string"}, 
        {"name": "first_name", "type": "string"}, 
        {"name": "last_name", "type": "string"} 
    ], 
    "indexes": ["id"] 
}

Dựa trên mô tả này, DDL (Ngôn ngữ định nghĩa dữ liệu) được tạo tự động cho DBMS Tarantula và GraphQL lược đồ để truy cập dữ liệu.

Hỗ trợ sao chép dữ liệu không đồng bộ (có kế hoạch thêm dữ liệu đồng bộ).

Bộ xử lý đầu ra

Đôi khi cần phải thông báo cho người tiêu dùng bên ngoài về sự xuất hiện của dữ liệu mới; vì mục đích này, cần có vai trò của Bộ xử lý đầu ra. Sau khi lưu dữ liệu, nó có thể được chuyển đến trình xử lý tương ứng (ví dụ: để đưa dữ liệu đó đến biểu mẫu mà người tiêu dùng yêu cầu) - và sau đó được chuyển đến trình kết nối để gửi. Hàng đợi sửa chữa cũng được sử dụng ở đây: nếu không có ai chấp nhận đối tượng, quản trị viên có thể thử lại sau.

Mở rộng quy mô

Các vai trò của trình kết nối, bộ xử lý đầu vào và bộ xử lý đầu ra là không có trạng thái, cho phép chúng tôi mở rộng quy mô hệ thống theo chiều ngang bằng cách chỉ cần thêm các phiên bản ứng dụng mới với loại vai trò mong muốn được bật. Bộ nhớ được sử dụng để chia tỷ lệ theo chiều ngang cách tiếp cận để tổ chức một cụm bằng cách sử dụng các nhóm ảo. Sau khi thêm máy chủ mới, một số nhóm từ máy chủ cũ sẽ được chuyển sang máy chủ mới ở chế độ nền; điều này diễn ra một cách minh bạch với người dùng và không ảnh hưởng đến hoạt động của toàn bộ hệ thống.

Thuộc tính dữ liệu

Các đối tượng có thể rất lớn và chứa các đối tượng khác. Chúng tôi đảm bảo tính nguyên tử của việc thêm và cập nhật dữ liệu bằng cách lưu trữ một đối tượng có tất cả các phần phụ thuộc trong một nhóm ảo. Điều này ngăn không cho đối tượng bị “lan rộng” trên một số máy chủ vật lý.

Hỗ trợ lập phiên bản: mỗi bản cập nhật của một đối tượng sẽ tạo ra một phiên bản mới và chúng ta luôn có thể dành một khoảng thời gian để xem thế giới lúc đó trông như thế nào. Đối với dữ liệu không cần lịch sử lâu dài, chúng tôi có thể giới hạn số lượng phiên bản hoặc thậm chí chỉ lưu trữ một - phiên bản mới nhất - tức là về cơ bản vô hiệu hóa tính năng tạo phiên bản cho một loại nhất định. Bạn cũng có thể giới hạn lịch sử theo thời gian: ví dụ: xóa tất cả các đối tượng thuộc một loại nhất định cũ hơn 1 năm. Tính năng lưu trữ cũng được hỗ trợ: chúng tôi có thể dỡ bỏ các đối tượng cũ hơn thời gian đã chỉ định, giải phóng không gian trong cụm.

nhiệm vụ

Trong số các tính năng thú vị, đáng chú ý là khả năng khởi chạy các tác vụ theo lịch trình, theo yêu cầu của người dùng hoặc theo chương trình từ hộp cát:

Kiến trúc và khả năng của Lưới dữ liệu Tarantool

Ở đây chúng ta thấy một vai trò khác - người chạy. Vai trò này không có trạng thái và các phiên bản ứng dụng bổ sung có vai trò này có thể được thêm vào cụm nếu cần. Trách nhiệm của người chạy là hoàn thành nhiệm vụ. Như đã đề cập, có thể tạo các tác vụ mới từ hộp cát; chúng được lưu trong hàng đợi trên bộ lưu trữ và sau đó được thực thi trên trình chạy. Loại nhiệm vụ này được gọi là Công việc. Chúng tôi cũng có một loại nhiệm vụ được gọi là Nhiệm vụ - đây là những nhiệm vụ do người dùng xác định chạy theo lịch trình (sử dụng cú pháp cron) hoặc theo yêu cầu. Để khởi chạy và theo dõi các tác vụ như vậy, chúng tôi có trình quản lý tác vụ thuận tiện. Để sử dụng được chức năng này, bạn phải kích hoạt vai trò người lập lịch trình; vai trò này có một trạng thái, vì vậy nó không có quy mô, tuy nhiên, điều này là không bắt buộc; đồng thời, giống như tất cả các vai trò khác, nó có thể có một bản sao bắt đầu hoạt động nếu chủ đột ngột từ chối.

Bộ ghi chép

Một vai trò khác được gọi là logger. Nó thu thập nhật ký từ tất cả các thành viên của cụm và cung cấp giao diện để tải lên và xem chúng thông qua giao diện web.

Dịch vụ

Điều đáng nói là hệ thống giúp bạn dễ dàng tạo ra các dịch vụ. Trong tệp cấu hình, bạn có thể chỉ định những yêu cầu nào được gửi đến trình xử lý do người dùng viết chạy trong hộp cát. Ví dụ: trong trình xử lý này, bạn có thể chạy một số loại truy vấn phân tích và trả về kết quả.

Dịch vụ được mô tả trong tệp cấu hình:

services:
   sum:
      doc: "adds two numbers"
      function: sum
      return_type: int
      args:
         x: int
         y: int

API GraphQL được tạo tự động và dịch vụ có sẵn để gọi:

query {
   sum(x: 1, y: 2) 
}

Điều này sẽ gọi trình xử lý sumsẽ trả về kết quả:

3

Hồ sơ truy vấn và số liệu

Để hiểu hoạt động của hệ thống và lập hồ sơ yêu cầu, chúng tôi đã triển khai hỗ trợ cho giao thức OpenTracing. Hệ thống có thể gửi thông tin theo yêu cầu tới các công cụ hỗ trợ giao thức này, chẳng hạn như Zipkin, điều này sẽ cho phép bạn hiểu cách yêu cầu được thực hiện:

Kiến trúc và khả năng của Lưới dữ liệu Tarantool

Đương nhiên, hệ thống cung cấp các số liệu nội bộ có thể được thu thập bằng Prometheus và trực quan hóa bằng Grafana.

Triển khai

Lưới dữ liệu Tarantool có thể được triển khai từ các gói RPM hoặc kho lưu trữ, sử dụng tiện ích từ bản phân phối hoặc Ansible, cũng có hỗ trợ cho Kubernetes (Toán tử Tarantool Kubernetes).

Ứng dụng triển khai logic nghiệp vụ (cấu hình, trình xử lý) được tải vào cụm Lưới dữ liệu Tarantool đã triển khai dưới dạng kho lưu trữ thông qua giao diện người dùng hoặc sử dụng tập lệnh thông qua API do chúng tôi cung cấp.

Ứng dụng mẫu

Những ứng dụng nào có thể được tạo bằng Lưới dữ liệu Tarantool? Trên thực tế, hầu hết các nhiệm vụ kinh doanh đều liên quan đến việc xử lý, lưu trữ và truy cập luồng dữ liệu. Do đó, nếu bạn có luồng dữ liệu lớn cần được lưu trữ và truy cập an toàn thì sản phẩm của chúng tôi có thể giúp bạn tiết kiệm rất nhiều thời gian phát triển và tập trung vào logic kinh doanh của mình.

Ví dụ: chúng tôi muốn thu thập thông tin về thị trường bất động sản, chẳng hạn như trong tương lai, chúng tôi sẽ có thông tin về những ưu đãi tốt nhất. Trong trường hợp này, chúng tôi sẽ nêu bật các nhiệm vụ sau:

  1. Robot thu thập thông tin từ các nguồn mở sẽ là nguồn dữ liệu của chúng tôi. Bạn có thể giải quyết vấn đề này bằng cách sử dụng các giải pháp có sẵn hoặc viết mã bằng bất kỳ ngôn ngữ nào.
  2. Tiếp theo, Tarantool Data Grid sẽ chấp nhận và lưu dữ liệu. Nếu định dạng dữ liệu từ các nguồn khác nhau là khác nhau thì bạn có thể viết mã bằng Lua để thực hiện chuyển đổi sang một định dạng duy nhất. Ở giai đoạn tiền xử lý, chẳng hạn, bạn cũng có thể lọc các ưu đãi trùng lặp hoặc cập nhật bổ sung thông tin về các đại lý đang hoạt động trên thị trường trong cơ sở dữ liệu.
  3. Bây giờ bạn đã có một giải pháp có thể mở rộng trong một cụm có thể chứa đầy dữ liệu và thực hiện các lựa chọn dữ liệu. Sau đó, bạn có thể triển khai chức năng mới, chẳng hạn như viết một dịch vụ đưa ra yêu cầu về dữ liệu và đưa ra ưu đãi có lợi nhất mỗi ngày - việc này sẽ yêu cầu một vài dòng trong tệp cấu hình và một ít mã Lua.

Cái gì tiếp theo?

Ưu tiên của chúng tôi là cải thiện sự dễ dàng phát triển bằng cách sử dụng Lưới dữ liệu Tarantool. Ví dụ: đây là một IDE có hỗ trợ lập hồ sơ và gỡ lỗi các trình xử lý chạy trong hộp cát.

Chúng tôi cũng rất quan tâm đến vấn đề an toàn. Hiện tại chúng tôi đang được FSTEC của Nga chứng nhận để khẳng định mức độ bảo mật cao và đáp ứng các yêu cầu chứng nhận sản phẩm phần mềm được sử dụng trong hệ thống thông tin dữ liệu cá nhân và hệ thống thông tin chính phủ.

Nguồn: www.habr.com

Thêm một lời nhận xét