Seni bina dan keupayaan Grid Data Tarantool

Seni bina dan keupayaan Grid Data Tarantool

Pada 2017, kami memenangi pertandingan untuk membangunkan teras transaksi perniagaan pelaburan Alfa-Bank dan mula bekerja (di HighLoad++ 2018 dengan laporan mengenai teras perniagaan pelaburan dilakukan Vladimir Drynkin, ketua teras transaksi perniagaan pelaburan Alfa Bank). Sistem ini sepatutnya mengagregatkan data transaksi daripada sumber yang berbeza dalam pelbagai format, membawa data ke dalam bentuk bersatu, menyimpannya dan menyediakan akses kepadanya.

Semasa proses pembangunan, sistem berkembang dan memperoleh kefungsian, dan pada satu ketika kami menyedari bahawa kami mengkristal sesuatu yang lebih daripada sekadar perisian aplikasi yang dicipta untuk menyelesaikan pelbagai tugasan yang ditetapkan dengan ketat: kami berjaya sistem untuk membina aplikasi teragih dengan storan berterusan. Pengalaman yang kami peroleh membentuk asas kepada produk baharu - Grid Data Tarantool (TDG).

Saya ingin bercakap tentang seni bina TDG dan penyelesaian yang kami peroleh semasa proses pembangunan, memperkenalkan anda kepada fungsi utama dan menunjukkan bagaimana produk kami boleh menjadi asas untuk membina penyelesaian lengkap.

Dari segi seni bina, kami membahagikan sistem kepada berasingan peranan, setiap satunya bertanggungjawab untuk menyelesaikan pelbagai masalah tertentu. Satu contoh aplikasi berjalan melaksanakan satu atau lebih jenis peranan. Terdapat beberapa peranan jenis yang sama dalam kelompok:

Seni bina dan keupayaan Grid Data Tarantool

penyambung

Penyambung bertanggungjawab untuk komunikasi dengan dunia luar; tugasnya adalah untuk menerima permintaan, menghuraikannya, dan jika ini berjaya, kemudian hantar data untuk diproses ke pemproses input. Kami menyokong format HTTP, SOAP, Kafka, FIX. Seni bina membolehkan anda menambah sokongan untuk format baharu sahaja, dengan sokongan untuk IBM MQ akan datang tidak lama lagi. Jika menghuraikan permintaan gagal, penyambung akan mengembalikan ralat; jika tidak, ia akan bertindak balas bahawa permintaan telah diproses dengan jayanya, walaupun ralat berlaku semasa pemprosesan selanjutnya. Ini dilakukan secara khusus untuk bekerja dengan sistem yang tidak tahu cara mengulangi permintaan - atau, sebaliknya, lakukannya terlalu berterusan. Untuk tidak kehilangan data, baris gilir pembaikan digunakan: objek mula-mula masuk ke dalamnya dan hanya selepas pemprosesan yang berjaya dialih keluar daripadanya. Pentadbir boleh menerima makluman tentang objek yang tinggal dalam baris gilir pembaikan, dan selepas menghapuskan ralat perisian atau kegagalan perkakasan, cuba lagi.

Pemproses input

Pemproses Input mengelaskan data yang diterima mengikut ciri ciri dan memanggil pemproses yang sesuai. Pengendali ialah kod Lua yang berjalan dalam kotak pasir, jadi ia tidak boleh menjejaskan fungsi sistem. Pada peringkat ini, data boleh dikurangkan kepada bentuk yang diperlukan, dan, jika perlu, bilangan tugas yang sewenang-wenangnya boleh dilancarkan yang boleh melaksanakan logik yang diperlukan. Sebagai contoh, dalam produk MDM (Pengurusan Data Induk) yang dibina pada Grid Data Tarantool, apabila menambah pengguna baharu, untuk tidak memperlahankan pemprosesan permintaan, kami melancarkan penciptaan rekod emas sebagai tugas yang berasingan. Kotak pasir menyokong permintaan untuk membaca, menukar dan menambah data, membolehkan anda melaksanakan beberapa fungsi pada semua peranan jenis storan dan pengagregatan hasil (peta/kurangkan).

Pengendali boleh diterangkan dalam fail:

sum.lua

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

Dan kemudian, diisytiharkan dalam konfigurasi:

functions:
  sum: { __file: sum.lua }

Kenapa Lua? Lua adalah bahasa yang sangat mudah. Berdasarkan pengalaman kami, beberapa jam selepas mengetahuinya, orang mula menulis kod yang menyelesaikan masalah mereka. Dan ini bukan sahaja pemaju profesional, tetapi, sebagai contoh, penganalisis. Di samping itu, terima kasih kepada penyusun jit, Lua berjalan dengan sangat pantas.

Pada Suhu Ambien

Storan menyimpan data berterusan. Sebelum menyimpan, data disahkan terhadap skema data. Untuk menerangkan litar kami menggunakan format lanjutan 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 penerangan ini, DDL (Data Definition Language) dijana secara automatik untuk Tarantula DBMS dan GraphQL skema untuk capaian data.

Replikasi data tak segerak disokong (terdapat rancangan untuk menambah satu segerak).

Pemproses keluaran

Kadangkala adalah perlu untuk memberitahu pengguna luar tentang ketibaan data baharu; untuk tujuan ini, terdapat peranan pemproses Output. Selepas menyimpan data, ia boleh dihantar kepada pengendali yang sepadan (contohnya, untuk membawanya ke borang yang diperlukan oleh pengguna) - dan kemudian diserahkan kepada penyambung untuk dihantar. Barisan pembaikan juga digunakan di sini: jika tiada sesiapa yang menerima objek tersebut, pentadbir boleh mencuba lagi kemudian.

Penskalaan

Peranan penyambung, pemproses input dan pemproses keluaran adalah tanpa kewarganegaraan, membolehkan kami menskalakan sistem secara mendatar dengan hanya menambah kejadian aplikasi baharu dengan jenis peranan yang diingini didayakan. Storan digunakan untuk penskalaan mendatar pendekatan untuk mengatur kluster menggunakan baldi maya. Selepas menambah pelayan baharu, beberapa baldi daripada pelayan lama dipindahkan ke pelayan baharu di latar belakang; ini berlaku secara telus kepada pengguna dan tidak menjejaskan operasi keseluruhan sistem.

Sifat Data

Objek boleh menjadi sangat besar dan mengandungi objek lain. Kami memastikan atomicity menambah dan mengemas kini data dengan menyimpan objek dengan semua kebergantungan dalam satu baldi maya. Ini menghalang objek daripada "tersebar" merentasi beberapa pelayan fizikal.

Pemberian versi disokong: setiap kemas kini objek mencipta versi baharu dan kami sentiasa boleh mengambil sedikit masa dan melihat rupa dunia ketika itu. Untuk data yang tidak memerlukan sejarah yang panjang, kami boleh mengehadkan bilangan versi atau menyimpan hanya satu - yang terkini - iaitu, pada dasarnya melumpuhkan versi untuk jenis tertentu. Anda juga boleh mengehadkan sejarah mengikut masa: contohnya, padamkan semua objek daripada jenis tertentu yang lebih tua daripada 1 tahun. Pengarkiban juga disokong: kita boleh memunggah objek yang lebih lama daripada masa yang ditentukan, membebaskan ruang dalam kelompok.

tugas-tugas

Antara ciri menarik, perlu diperhatikan keupayaan untuk melancarkan tugas mengikut jadual, atas permintaan pengguna, atau secara pemrograman dari kotak pasir:

Seni bina dan keupayaan Grid Data Tarantool

Di sini kita melihat satu lagi peranan - pelari. Peranan ini tidak mempunyai kewarganegaraan, dan contoh aplikasi tambahan dengan peranan ini boleh ditambahkan pada kluster mengikut keperluan. Tanggungjawab pelari adalah untuk menyelesaikan tugasan. Seperti yang dinyatakan, adalah mungkin untuk menjana tugas baru dari kotak pasir; ia disimpan dalam baris gilir pada simpanan dan kemudian dilaksanakan pada pelari. Tugas jenis ini dipanggil Ayub. Kami juga mempunyai jenis tugas yang dipanggil Tugas - ini adalah tugasan yang ditentukan pengguna yang dijalankan mengikut jadual (menggunakan sintaks cron) atau atas permintaan. Untuk melancarkan dan menjejaki tugasan tersebut, kami mempunyai pengurus tugas yang mudah. Untuk membolehkan fungsi ini tersedia, anda mesti mendayakan peranan penjadual; peranan ini mempunyai keadaan, jadi ia tidak berskala, yang, bagaimanapun, tidak diperlukan; pada masa yang sama, seperti semua peranan lain, ia boleh mempunyai replika yang mula berfungsi jika tuannya tiba-tiba menolak.

Pembalak

Peranan lain dipanggil logger. Ia mengumpul log daripada semua ahli kluster dan menyediakan antara muka untuk memuat naik dan melihatnya melalui antara muka web.

Perkhidmatan

Perlu dinyatakan bahawa sistem memudahkan untuk membuat perkhidmatan. Dalam fail konfigurasi, anda boleh menentukan permintaan yang dihantar kepada pengendali bertulis pengguna yang dijalankan dalam kotak pasir. Dalam pengendali ini, anda boleh, sebagai contoh, menjalankan beberapa jenis pertanyaan analitik dan mengembalikan hasilnya.

Perkhidmatan ini diterangkan dalam fail konfigurasi:

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

API GraphQL dijana secara automatik dan perkhidmatan menjadi tersedia untuk panggilan:

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

Ini akan memanggil pengendali sumyang akan mengembalikan hasilnya:

3

Pemprofilan Pertanyaan dan Metrik

Untuk memahami pengendalian sistem dan permintaan pemprofilan, kami melaksanakan sokongan untuk protokol OpenTracing. Sistem boleh menghantar maklumat atas permintaan kepada alat yang menyokong protokol ini, seperti Zipkin, yang akan membolehkan anda memahami cara permintaan itu dilaksanakan:

Seni bina dan keupayaan Grid Data Tarantool

Sememangnya, sistem ini menyediakan metrik dalaman yang boleh dikumpulkan menggunakan Prometheus dan divisualisasikan menggunakan Grafana.

Sebarkan

Grid Data Tarantool boleh digunakan daripada pakej RPM atau arkib, menggunakan utiliti daripada pengedaran atau Ansible, terdapat juga sokongan untuk Kubernetes (Operator Kubernetes Tarantool).

Aplikasi yang melaksanakan logik perniagaan (konfigurasi, pengendali) dimuatkan ke dalam kelompok Grid Data Tarantool yang digunakan dalam bentuk arkib melalui UI atau menggunakan skrip melalui API yang disediakan oleh kami.

Contoh Aplikasi

Apakah aplikasi yang boleh dibuat menggunakan Grid Data Tarantool? Malah, kebanyakan tugas perniagaan entah bagaimana berkaitan dengan pemprosesan, penyimpanan dan akses aliran data. Oleh itu, jika anda mempunyai aliran data yang besar yang perlu disimpan dan diakses dengan selamat, maka produk kami boleh menjimatkan banyak masa pembangunan dan menumpukan pada logik perniagaan anda.

Sebagai contoh, kami ingin mengumpul maklumat tentang pasaran hartanah, supaya pada masa hadapan, sebagai contoh, kami akan mempunyai maklumat tentang tawaran terbaik. Dalam kes ini, kami akan menyerlahkan tugas berikut:

  1. Robot yang mengumpul maklumat daripada sumber terbuka akan menjadi sumber data kami. Anda boleh menyelesaikan masalah ini menggunakan penyelesaian siap sedia atau menulis kod dalam mana-mana bahasa.
  2. Seterusnya, Grid Data Tarantool akan menerima dan menyimpan data. Jika format data daripada sumber yang berbeza adalah berbeza, maka anda boleh menulis kod dalam Lua yang akan melakukan penukaran kepada satu format. Pada peringkat pra-pemprosesan, anda juga akan dapat, contohnya, menapis tawaran pendua atau mengemas kini maklumat tambahan tentang ejen yang bekerja di pasaran dalam pangkalan data.
  3. Kini anda sudah mempunyai penyelesaian berskala dalam kelompok yang boleh diisi dengan data dan membuat pilihan data. Kemudian anda boleh melaksanakan fungsi baharu, sebagai contoh, menulis perkhidmatan yang akan membuat permintaan untuk data dan memberikan tawaran yang paling berfaedah setiap hari - ini memerlukan beberapa baris dalam fail konfigurasi dan sedikit kod Lua.

Apa seterusnya?

Keutamaan kami adalah untuk meningkatkan kemudahan pembangunan menggunakan Grid Data Tarantool. Sebagai contoh, ini ialah IDE dengan sokongan untuk pengendali pemprofilan dan penyahpepijatan yang dijalankan dalam kotak pasir.

Kami juga memberi perhatian besar kepada isu keselamatan. Pada masa ini kami sedang menjalani pensijilan oleh FSTEC dari Rusia untuk mengesahkan tahap keselamatan yang tinggi dan memenuhi keperluan untuk pensijilan produk perisian yang digunakan dalam sistem maklumat data peribadi dan sistem maklumat kerajaan.

Sumber: www.habr.com

Tambah komen