Arsitektur dan kemampuan Tarantool Data Grid

Arsitektur dan kemampuan Tarantool Data Grid

Pada tahun 2017, kami memenangkan kompetisi untuk mengembangkan inti transaksional bisnis investasi Alfa-Bank dan mulai bekerja (di HighLoad++ 2018 dengan laporan tentang inti bisnis investasi dilakukan Vladimir Drynkin, kepala inti transaksi bisnis investasi Alfa Bank). Sistem ini seharusnya mengumpulkan data transaksi dari berbagai sumber dalam berbagai format, menyatukan data, menyimpannya, dan menyediakan akses ke dalamnya.

Selama proses pengembangan, sistem berevolusi dan memperoleh fungsionalitas, dan pada titik tertentu kami menyadari bahwa kami mengkristalkan sesuatu yang lebih dari sekadar perangkat lunak aplikasi yang dibuat untuk menyelesaikan serangkaian tugas yang ditentukan secara ketat: kami berhasil sistem untuk membangun aplikasi terdistribusi dengan penyimpanan persisten. Pengalaman yang kami peroleh membentuk dasar dari produk baru - Jaringan Data Tarantool (TDG).

Saya ingin berbicara tentang arsitektur TDG dan solusi yang kami dapatkan selama proses pengembangan, memperkenalkan Anda pada fungsi utama dan menunjukkan bagaimana produk kami dapat menjadi dasar untuk membangun solusi lengkap.

Secara arsitektur, kami membagi sistem menjadi beberapa bagian ΠΎΠ»ΠΈ, yang masing-masing bertanggung jawab untuk memecahkan sejumlah masalah tertentu. Sebuah instance aplikasi yang sedang berjalan mengimplementasikan satu atau lebih tipe peran. Mungkin ada beberapa peran dengan tipe yang sama dalam sebuah cluster:

Arsitektur dan kemampuan Tarantool Data Grid

konektor

Connector bertanggung jawab untuk komunikasi dengan dunia luar; tugasnya adalah menerima permintaan, menguraikannya, dan jika berhasil, kemudian mengirimkan data untuk diproses ke pemroses input. Kami mendukung format HTTP, SOAP, Kafka, FIX. Arsitekturnya memungkinkan Anda menambahkan dukungan untuk format baru, dengan dukungan untuk IBM MQ segera hadir. Jika penguraian permintaan gagal, konektor akan mengembalikan kesalahan; jika tidak, ia akan menjawab bahwa permintaan telah berhasil diproses, meskipun terjadi kesalahan selama pemrosesan selanjutnya. Hal ini dilakukan secara khusus untuk bekerja dengan sistem yang tidak dapat mengulangi permintaan - atau, sebaliknya, melakukannya terlalu terus-menerus. Agar tidak kehilangan data, antrian perbaikan digunakan: objek pertama kali masuk ke dalamnya dan hanya setelah pemrosesan berhasil dihapus darinya. Administrator dapat menerima peringatan tentang objek yang tersisa dalam antrian perbaikan, dan setelah menghilangkan kesalahan perangkat lunak atau kegagalan perangkat keras, coba lagi.

Prosesor masukan

Pemroses masukan mengklasifikasikan data yang diterima menurut ciri-ciri karakteristiknya dan memanggil pemroses yang sesuai. Penangan adalah kode Lua yang berjalan di kotak pasir, sehingga tidak dapat mempengaruhi fungsi sistem. Pada tahap ini, data dapat direduksi menjadi bentuk yang diperlukan, dan, jika perlu, sejumlah tugas dapat diluncurkan yang dapat mengimplementasikan logika yang diperlukan. Misalnya, dalam produk MDM (Master Data Management) yang dibangun di Tarantool Data Grid, saat menambahkan pengguna baru, agar tidak memperlambat pemrosesan permintaan, kami meluncurkan pembuatan catatan emas sebagai tugas terpisah. Kotak pasir mendukung permintaan untuk membaca, mengubah dan menambahkan data, memungkinkan Anda melakukan beberapa fungsi pada semua peran jenis penyimpanan dan agregasi hasilnya (petakan/pengurangan).

Penangan dapat dijelaskan dalam file:

sum.lua

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

Dan kemudian, dideklarasikan dalam konfigurasi:

functions:
  sum: { __file: sum.lua }

Kenapa Lua? Lua adalah bahasa yang sangat sederhana. Berdasarkan pengalaman kami, beberapa jam setelah mengetahuinya, orang-orang mulai menulis kode yang memecahkan masalah mereka. Dan ini bukan hanya pengembang profesional, tetapi, misalnya, analis. Selain itu, berkat kompiler jit, Lua berjalan sangat cepat.

Storage

Penyimpanan menyimpan data persisten. Sebelum disimpan, data divalidasi berdasarkan skema data. Untuk mendeskripsikan rangkaian kami menggunakan format yang diperluas Apache Avro. Contoh:

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

Berdasarkan uraian ini, DDL (Data Definition Language) secara otomatis dihasilkan untuk DBMS Tarantula dan GraphQL skema untuk akses data.

Replikasi data asinkron didukung (ada rencana untuk menambahkan replikasi sinkron).

Prosesor keluaran

Terkadang perlu untuk memberi tahu konsumen eksternal tentang kedatangan data baru; untuk tujuan ini, ada peran pemroses keluaran. Setelah menyimpan data, data tersebut dapat diteruskan ke pengendali yang sesuai (misalnya, untuk membawanya ke bentuk yang dibutuhkan oleh konsumen) - dan kemudian diteruskan ke konektor untuk dikirim. Antrian perbaikan juga digunakan di sini: jika tidak ada yang menerima objek, administrator dapat mencoba lagi nanti.

penskalaan

Peran konektor, pemroses masukan, dan pemroses keluaran tidak memiliki kewarganegaraan, sehingga memungkinkan kami menskalakan sistem secara horizontal hanya dengan menambahkan instance aplikasi baru dengan jenis peran yang diinginkan diaktifkan. Penyimpanan digunakan untuk penskalaan horizontal pendekatan untuk mengatur cluster menggunakan bucket virtual. Setelah menambahkan server baru, beberapa keranjang dari server lama dipindahkan ke server baru di latar belakang; ini terjadi secara transparan kepada pengguna dan tidak mempengaruhi pengoperasian keseluruhan sistem.

Properti Data

Objek bisa berukuran sangat besar dan berisi objek lain. Kami memastikan atomisitas penambahan dan pembaruan data dengan menyimpan objek dengan semua dependensi dalam satu keranjang virtual. Hal ini mencegah objek β€œmenyebar” ke beberapa server fisik.

Pembuatan versi didukung: setiap pembaruan suatu objek membuat versi baru, dan kita selalu dapat mengambil waktu sejenak dan melihat bagaimana tampilan dunia saat itu. Untuk data yang tidak memerlukan histori panjang, kita dapat membatasi jumlah versi atau bahkan hanya menyimpan satu - yang terbaru - yang pada dasarnya menonaktifkan pembuatan versi untuk jenis tertentu. Anda juga dapat membatasi riwayat berdasarkan waktu: misalnya, menghapus semua objek jenis tertentu yang berumur lebih dari 1 tahun. Pengarsipan juga didukung: kita dapat membongkar objek yang lebih lama dari waktu yang ditentukan, sehingga mengosongkan ruang di cluster.

tugas

Di antara fitur-fitur menarik yang perlu diperhatikan adalah kemampuan untuk meluncurkan tugas sesuai jadwal, atas permintaan pengguna, atau secara terprogram dari kotak pasir:

Arsitektur dan kemampuan Tarantool Data Grid

Di sini kita melihat peran lain - pelari. Peran ini tidak memiliki kewarganegaraan, dan instans aplikasi tambahan dengan peran ini dapat ditambahkan ke klaster sesuai kebutuhan. Tanggung jawab pelari adalah menyelesaikan tugas. Seperti disebutkan, dimungkinkan untuk menghasilkan tugas baru dari kotak pasir; mereka disimpan dalam antrian di penyimpanan dan kemudian dieksekusi di runner. Jenis tugas ini disebut Pekerjaan. Kami juga memiliki jenis tugas yang disebut Tugas - ini adalah tugas yang ditentukan pengguna yang berjalan sesuai jadwal (menggunakan sintaks cron) atau sesuai permintaan. Untuk meluncurkan dan melacak tugas-tugas tersebut, kami memiliki pengelola tugas yang nyaman. Agar fungsi ini tersedia, Anda harus mengaktifkan peran penjadwal; peran ini dimiliki oleh negara, sehingga tidak dapat diukur, namun hal ini tidak diperlukan; pada saat yang sama, seperti semua peran lainnya, peran ini dapat memiliki replika yang mulai berfungsi jika master tiba-tiba menolak.

Pencatat

Peran lainnya disebut logger. Ini mengumpulkan log dari semua anggota cluster dan menyediakan antarmuka untuk mengunggah dan melihatnya melalui antarmuka web.

Layanan

Perlu disebutkan bahwa sistem ini memudahkan pembuatan layanan. Dalam file konfigurasi, Anda dapat menentukan permintaan mana yang dikirim ke pengendali yang ditulis pengguna yang berjalan di kotak pasir. Di pengendali ini, Anda bisa, misalnya, menjalankan beberapa jenis kueri analitis dan mengembalikan hasilnya.

Layanan ini dijelaskan dalam file konfigurasi:

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

API GraphQL dihasilkan secara otomatis dan layanan tersedia untuk dipanggil:

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

Ini akan memanggil pawang sumyang akan mengembalikan hasilnya:

3

Profil dan Metrik Kueri

Untuk memahami pengoperasian sistem dan pembuatan profil permintaan, kami menerapkan dukungan untuk protokol OpenTracing. Sistem dapat mengirimkan informasi sesuai permintaan ke alat yang mendukung protokol ini, seperti Zipkin, yang memungkinkan Anda memahami bagaimana permintaan dijalankan:

Arsitektur dan kemampuan Tarantool Data Grid

Tentu saja, sistem menyediakan metrik internal yang dapat dikumpulkan menggunakan Prometheus dan divisualisasikan menggunakan Grafana.

Menyebarkan

Tarantool Data Grid dapat di-deploy dari paket RPM atau arsip, menggunakan utilitas dari distribusi atau Ansible, ada juga dukungan untuk Kubernetes (Operator Tarantool Kubernetes).

Aplikasi yang mengimplementasikan logika bisnis (konfigurasi, penangan) dimuat ke dalam cluster Tarantool Data Grid yang dikerahkan dalam bentuk arsip melalui UI atau menggunakan skrip melalui API yang kami sediakan.

Contoh Aplikasi

Aplikasi apa saja yang bisa dibuat menggunakan Tarantool Data Grid? Faktanya, sebagian besar tugas bisnis terkait dengan pemrosesan, penyimpanan, dan akses aliran data. Oleh karena itu, jika Anda memiliki aliran data besar yang perlu disimpan dan diakses dengan aman, produk kami dapat menghemat banyak waktu pengembangan dan fokus pada logika bisnis Anda.

Misalnya, kami ingin mengumpulkan informasi tentang pasar real estat, sehingga di masa mendatang, misalnya, kami memiliki informasi tentang penawaran terbaik. Dalam hal ini, kami akan menyoroti tugas-tugas berikut:

  1. Robot yang mengumpulkan informasi dari sumber terbuka akan menjadi sumber data kami. Anda dapat mengatasi masalah ini menggunakan solusi siap pakai atau menulis kode dalam bahasa apa pun.
  2. Selanjutnya Tarantool Data Grid akan menerima dan menyimpan data. Jika format data dari sumber berbeda berbeda, maka Anda dapat menulis kode dalam Lua yang akan melakukan konversi ke format tunggal. Pada tahap pra-pemrosesan, Anda juga akan dapat, misalnya, memfilter penawaran duplikat atau memperbarui informasi tambahan tentang agen yang bekerja di pasar dalam database.
  3. Sekarang Anda sudah memiliki solusi terukur dalam sebuah cluster yang dapat diisi dengan data dan membuat pilihan data. Kemudian Anda dapat mengimplementasikan fungsionalitas baru, misalnya, menulis layanan yang akan membuat permintaan data dan memberikan penawaran paling menguntungkan per hari - ini memerlukan beberapa baris dalam file konfigurasi dan sedikit kode Lua.

Apa selanjutnya?

Prioritas kami adalah meningkatkan kemudahan penggunaan pengembangan Jaringan Data Tarantool. Misalnya, ini adalah IDE dengan dukungan untuk pembuatan profil dan penangan debugging yang berjalan di kotak pasir.

Kami juga menaruh perhatian besar pada masalah keselamatan. Saat ini kami sedang menjalani sertifikasi oleh FSTEC Rusia untuk memastikan tingkat keamanan yang tinggi dan memenuhi persyaratan sertifikasi produk perangkat lunak yang digunakan dalam sistem informasi data pribadi dan sistem informasi pemerintah.

Sumber: www.habr.com

Tambah komentar