Tarantool Data Grid: Arsitektur dan Fitur



Pada tahun 2017, kami memenangkan persaingan untuk pengembangan inti transaksi untuk bisnis investasi Alfa-Bank dan mulai bekerja sekaligus. (Vladimir Drynkin, Ketua Tim Pengembangan untuk Inti Transaksi Bisnis Investasi Alfa-Bank, berbicara tentang inti bisnis investasi di HighLoad ++ 2018.) Sistem ini seharusnya mengumpulkan data transaksi dalam berbagai format dari berbagai sumber, menyatukan data, menyimpannya, dan berikan akses ke sana.

Dalam proses pengembangan, sistem berevolusi dan memperluas fungsinya. Pada titik tertentu, kami menyadari bahwa kami menciptakan sesuatu yang lebih dari sekadar perangkat lunak aplikasi yang dirancang untuk ruang lingkup tugas yang terdefinisi dengan baik: kami menciptakan sistem untuk membangun aplikasi terdistribusi dengan penyimpanan persisten. Pengalaman kami menjadi dasar untuk produk baru, Tarantool Data Grid (TDG).

Saya ingin berbicara tentang arsitektur TDG dan solusi yang kami lakukan selama pengembangan. Saya akan memperkenalkan fungsi dasar dan menunjukkan bagaimana produk kami dapat menjadi dasar untuk membangun solusi turnkey.

Dalam hal arsitektur, kami membagi sistem menjadi peran yang terpisah. Masing-masing dari mereka bertanggung jawab untuk serangkaian tugas tertentu. Satu instance aplikasi menjalankan mengimplementasikan satu atau lebih tipe peran. Mungkin ada beberapa peran dengan tipe yang sama dalam sebuah cluster:


Konektor


Connector bertanggung jawab untuk komunikasi dengan dunia luar; itu dirancang untuk menerima permintaan, menguraikannya, dan jika itu berhasil, maka ia mengirimkan data untuk diproses ke prosesor input. Format berikut didukung: HTTP, SOAP, Kafka, FIX. Arsitektur memungkinkan kita untuk menambahkan dukungan untuk format baru (dukungan IBM MQ akan segera hadir). Jika parsing permintaan gagal, konektor mengembalikan kesalahan. Kalau tidak, ia menjawab bahwa permintaan telah diproses dengan sukses, bahkan jika kesalahan terjadi selama pemrosesan lebih lanjut. Ini dilakukan dengan sengaja agar dapat bekerja dengan sistem yang tidak tahu cara mengulangi permintaan, atau sebaliknya, melakukannya terlalu agresif. Untuk memastikan tidak ada data yang hilang, antrian perbaikan digunakan: objek bergabung antrian dan dihapus dari itu hanya setelah pemrosesan berhasil. Administrator menerima pemberitahuan tentang objek yang tersisa dalam antrian perbaikan dan dapat mencoba lagi memproses setelah menangani kesalahan perangkat lunak atau kegagalan perangkat keras.

Prosesor masukan


Input Processor mengategorikan data yang diterima berdasarkan karakteristik dan memanggil penangan yang sesuai. Penangan adalah kode Lua yang berjalan di kotak pasir, sehingga tidak dapat memengaruhi operasi sistem. Pada tahap ini, data dapat ditransformasikan sesuai kebutuhan, dan jika perlu, sejumlah tugas dapat dijalankan untuk mengimplementasikan logika yang diperlukan. Misalnya, saat menambahkan pengguna baru di MDM (Master Data Management dibangun berdasarkan Tarantool Data Grid), catatan emas akan dibuat sebagai tugas terpisah sehingga pemrosesan permintaan tidak melambat. Kotak pasir mendukung permintaan untuk membaca, mengubah, dan menambahkan data. Ini juga memungkinkan Anda memanggil beberapa fungsi untuk semua peran dari tipe penyimpanan dan mengagregasikan hasilnya (memetakan / mengurangi).

Penangan dapat dijelaskan dalam file:

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

Kemudian dinyatakan dalam konfigurasi:

 functions: sum: { __file: sum.lua } 

Kenapa Lua? Lua adalah bahasa yang langsung. Berdasarkan pengalaman kami, orang-orang mulai menulis kode yang akan menyelesaikan masalah mereka hanya beberapa jam setelah melihat bahasa untuk pertama kalinya. Dan ini bukan hanya pengembang profesional, tetapi misalnya, analis. Selain itu, terima kasih kepada kompiler JIT, Lua lemah.

Penyimpanan


Storage menyimpan data persisten. Sebelum menyimpan, data divalidasi untuk kesesuaian dengan skema data. Untuk menjelaskan skema, kami menggunakan format Apache Avro yang diperluas. 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) untuk Tarantool DBMS dan skema GraphQL untuk akses data dihasilkan secara otomatis.

Replikasi data asinkron didukung (kami juga berencana untuk menambahkan replikasi sinkron).

Prosesor keluaran


Terkadang perlu memberi tahu konsumen eksternal tentang data baru. Itu sebabnya kami memiliki peran Prosesor Output. Setelah menyimpan data, data dapat ditransfer ke handler yang sesuai (misalnya, untuk mengubahnya sesuai kebutuhan konsumen), dan kemudian ditransfer ke konektor untuk dikirim. Antrian perbaikan juga digunakan di sini: jika tidak ada yang menerima objek, administrator dapat mencoba lagi nanti.

Scaling


Peran Connector, Input Processor, dan Output Processor adalah stateless, yang memungkinkan kita untuk skala sistem secara horizontal dengan hanya menambahkan instance aplikasi baru dengan peran diaktifkan yang diperlukan. Untuk penskalaan penyimpanan horisontal, sebuah cluster diatur menggunakan pendekatan bucket virtual. Setelah menambahkan server baru, beberapa ember dari server lama pindah ke server baru di latar belakang. Proses ini transparan untuk pengguna dan tidak mempengaruhi operasi seluruh sistem.

Properti data


Objek mungkin besar dan berisi objek lain. Kami memastikan menambah dan memperbarui data secara atom, dan menyimpan objek dengan semua dependensi pada satu ember virtual. Hal ini dilakukan untuk menghindari apa yang disebut "noda" objek di beberapa server fisik.

Versi juga didukung: setiap pembaruan objek membuat versi baru, dan kami selalu dapat membuat irisan waktu untuk melihat bagaimana segala sesuatu tampak pada saat itu. Untuk data yang tidak memerlukan riwayat panjang, kami dapat membatasi jumlah versi atau bahkan hanya menyimpan versi terakhir, yaitu, kami dapat menonaktifkan versi untuk tipe data tertentu. Kami juga dapat menetapkan batas historis: misalnya, menghapus semua objek dari jenis tertentu yang lebih tua dari satu tahun. Pengarsipan juga didukung: kita dapat mengunggah objek di atas usia tertentu untuk membebaskan ruang cluster.

Tugas


Fitur menarik yang perlu diperhatikan termasuk kemampuan untuk menjalankan tugas tepat waktu, atas permintaan pengguna, atau secara otomatis dari kotak pasir:


Di sini kita bisa melihat peran lain yang disebut Runner. Peran ini tidak memiliki status; jika perlu, lebih banyak contoh aplikasi dengan peran ini dapat ditambahkan ke cluster. Pelari bertanggung jawab untuk menyelesaikan tugas. Seperti yang telah saya sebutkan, tugas baru dapat dibuat dari kotak pasir; mereka bergabung dengan antrian di penyimpanan dan kemudian jalankan di pelari. Jenis tugas ini disebut Pekerjaan. Kami juga memiliki jenis tugas yang disebut Tugas, yaitu tugas yang ditentukan pengguna yang akan berjalan tepat waktu (menggunakan sintaks cron) atau sesuai permintaan. Untuk menjalankan dan melacak tugas-tugas tersebut, kami memiliki pengelola tugas yang praktis. Peran penjadwal harus diaktifkan untuk menggunakan fungsi ini. Peran ini memiliki keadaan, jadi tidak skala yang tidak perlu. Namun, seperti peran lainnya, ia dapat memiliki replika yang mulai berfungsi jika master tiba-tiba gagal.

Logger


Peran lain disebut Logger. Itu mengumpulkan log dari semua anggota cluster dan menyediakan antarmuka untuk mengunggah dan melihatnya melalui antarmuka web.

Layanan


Perlu disebutkan bahwa sistem membuatnya mudah untuk membuat layanan. Dalam file konfigurasi, Anda dapat menentukan permintaan mana yang harus dikirim ke handler yang ditulis pengguna yang berjalan di kotak pasir. Pawang semacam itu dapat, misalnya, melakukan semacam permintaan analitis dan mengembalikan hasilnya.
Layanan 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 panggilan:

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

Ini memanggil penangan sum yang mengembalikan hasil:

 3 

Meminta Profil dan Metrik


Kami menerapkan dukungan untuk protokol OpenTracing untuk memberikan pemahaman yang lebih baik tentang mekanisme sistem dan pembuatan profil permintaan. Sesuai permintaan, sistem dapat mengirim informasi tentang bagaimana permintaan dieksekusi ke alat yang mendukung protokol ini (mis. Zipkin):


Tidak perlu dikatakan, sistem menyediakan metrik internal yang dapat dikumpulkan menggunakan Prometheus dan divisualisasikan menggunakan Grafana.

Penempatan


Tarantool Data Grid dapat digunakan dari paket RPM atau arsip menggunakan utilitas bawaan atau Ansible. Kubernetes juga didukung ( Tarantool Kubernetes Operator ).

Aplikasi yang mengimplementasikan logika bisnis (konfigurasi, penangan) dimuat ke cluster Tarantool Data Grid yang digunakan dalam arsip melalui UI atau sebagai skrip menggunakan API yang disediakan.

Contoh aplikasi


Aplikasi apa yang dapat Anda buat dengan Tarantool Data Grid? Bahkan, sebagian besar tugas bisnis entah bagaimana terkait dengan pemrosesan, penyimpanan, dan akses data stream. Karena itu, jika Anda memiliki aliran data besar yang memerlukan penyimpanan yang aman, dan aksesibilitas, maka produk kami dapat menghemat banyak waktu dalam pengembangan dan membantu Anda berkonsentrasi pada logika bisnis Anda.

Misalnya, Anda ingin mengumpulkan informasi tentang pasar real estat agar tetap mendapatkan informasi terbaru tentang penawaran terbaik di masa mendatang. Dalam hal ini, kami memilih tugas-tugas berikut:

  1. Robot yang mengumpulkan informasi dari sumber terbuka akan menjadi sumber data Anda. Anda dapat memecahkan masalah ini menggunakan solusi yang sudah jadi atau dengan menulis kode dalam bahasa apa pun.
  2. Selanjutnya, Tarantool Data Grid menerima dan menyimpan data. Jika format data dari berbagai sumber berbeda, maka Anda dapat menulis kode dalam Lua yang akan mengubah segalanya menjadi format tunggal. Pada tahap pra-pemrosesan, Anda juga dapat, misalnya, memfilter penawaran berulang atau memperbarui informasi basis data lebih lanjut tentang agen yang beroperasi di pasar.
  3. Sekarang Anda sudah memiliki solusi terukur di kluster yang dapat diisi dengan data dan digunakan untuk membuat sampel data. Kemudian Anda dapat mengimplementasikan fungsi-fungsi baru, misalnya, menulis layanan yang akan membuat permintaan data dan mengembalikan penawaran paling menguntungkan per hari. Itu hanya akan memerlukan beberapa baris dalam file konfigurasi dan beberapa kode Lua.

Apa selanjutnya?


Bagi kami, prioritasnya adalah meningkatkan kenyamanan pengembangan dengan Tarantool Data Grid . (Misalnya, ini adalah IDE dengan dukungan untuk penangan profil dan debugging yang berfungsi di kotak pasir.)

Kami juga sangat memperhatikan masalah keamanan. Saat ini, produk kami sedang disertifikasi oleh FSTEC Rusia (Layanan Federal untuk Teknologi dan Kontrol Ekspor) untuk mengakui tingkat keamanan yang tinggi dan memenuhi persyaratan sertifikasi untuk produk perangkat lunak yang digunakan dalam sistem informasi data pribadi dan sistem informasi federal.

Source: https://habr.com/ru/post/id471744/


All Articles