
Kubernetes menjadi standar de facto untuk menjalankan aplikasi stateless. Terutama karena secara signifikan dapat mengurangi waktu ke pasar untuk pengiriman fitur-fitur baru. Meluncurkan aplikasi stateful - basis data, microservices stateful - masih merupakan tugas yang sulit, tetapi kebutuhan untuk menahan persaingan dan mempertahankan tingkat pengiriman yang tinggi mendorong perusahaan untuk bereksperimen di bidang ini dan menciptakan permintaan untuk solusi tersebut.
Kami hadir untuk Anda solusi kami untuk meluncurkan cluster stateful
Tarantool Cartridge :
Tarantool Kubernetes Operator , untuk detail yang saya tanyakan di bawah cat.
Daftar isi:
- Alih-alih seribu kata
- Apa yang dilakukan operator sama sekali
- Sedikit tentang nuansa
- Cara operator bekerja
- Apa yang dikembangkan operator
- Ringkasan
Tarantool adalah basis data opensource dan server aplikasi dalam satu paket. Sebagai basis data, ia memiliki sejumlah karakteristik unik: efisiensi tinggi pemanfaatan besi, skema data fleksibel, dukungan untuk memori dan penyimpanan disk, dan kemungkinan ekspansi melalui penggunaan bahasa Lua. Sebagai server aplikasi, ini memungkinkan Anda untuk memindahkan kode aplikasi sedekat mungkin dengan data, sambil mencapai waktu respons minimal dan throughput maksimum. Selain itu, Tarantool memiliki
ekosistem yang luas , menyediakan modul yang siap pakai untuk menyelesaikan masalah aplikasi:
sharding ,
antrian , modul untuk memfasilitasi pengembangan (
cartridge ,
luatest ), solusi untuk operasi (
metrik ,
dimungkinkan ) - ini hanya beberapa contoh.
Untuk semua kelebihannya, kemampuan turunan Tarantool tunggal tidak terbatas: untuk menyimpan terabyte data dan memproses jutaan permintaan, Anda perlu meningkatkan puluhan dan ratusan instance, dan ini adalah sistem terdistribusi, dengan semua masalahnya yang melekat. Untuk mengatasinya, kami memiliki
Tarantool Cartridge , sebuah kerangka kerja yang tugas utamanya adalah menyembunyikan semua jenis kesulitan dalam menulis aplikasi terdistribusi dan memungkinkan pengembang untuk fokus pada nilai bisnis aplikasi tersebut. Cartridge menyediakan seperangkat komponen yang kuat untuk orkestrasi klaster otomatis, distribusi data otomatis, webui untuk pengoperasian dan alat pengembang.
Tarantool tidak hanya teknologi, tetapi juga tim insinyur yang terlibat dalam pengembangan sistem turnkey enterprise, solusi kotak dan dukungan untuk komponen opensource.
Secara global, tugas kami dapat dibagi menjadi dua area: pengembangan sistem baru dan penambahan solusi yang ada. Misalnya, ada basis besar dari vendor terkenal. Untuk skala untuk membaca, mereka menempatkan cache akhirnya konsisten pada Tarantool di belakangnya. Atau sebaliknya: untuk mengubah skala catatan, mereka menempatkan Tarantool dalam konfigurasi panas / dingin, di mana saat mereka "mendinginkan" data dibuang ke penyimpanan dingin dan secara paralel dengan antrian analitik. Atau untuk membuat cadangan sistem yang ada, versi ringan dari sistem ini (cadangan fungsional) ditulis, yang cadangan "panas" utama dengan replikasi data dari sistem utama. Informasi lebih lanjut dapat ditemukan di
laporan dari T + 2019 .
Semua sistem ini memiliki satu kesamaan: mereka cukup sulit dioperasikan. Gulir dengan cepat sekelompok 100+ instance dengan redundansi ke 3 pusat data, perbarui aplikasi yang menyimpan data tanpa downtime dan penarikan perawatan, buat pengembalian cadangan jika terjadi bencana atau kesalahan buatan manusia, pastikan kegagalan komponen yang hati-hati, atur manajemen konfigurasi ... Secara umum, ada banyak menarik
Dan akan lebih bagus jika semua ini masih dioperasikan hanya karena sedang dikembangkan. Kubernet memungkinkan untuk mencapai hasil yang diinginkan, tetapi menggunakan operator khusus membuat hidup lebih mudah.
Alih-alih seribu kata
Kami telah menyiapkan contoh kecil berdasarkan Tarantool Cartridge, dan kami akan bekerja dengannya. Aplikasi sederhana seperti "penyimpanan nilai kunci terdistribusi dengan antarmuka HTTP". Setelah diluncurkan, kami mendapatkan gambar ini:

Dimana:
- Router - bagian dari cluster yang bertanggung jawab untuk menerima dan memproses permintaan HTTP yang masuk;
- Penyimpanan adalah bagian dari cluster yang bertanggung jawab untuk menyimpan dan memproses data, 3 serpihan naik dari kotak, di setiap master dan replika.
Untuk menyeimbangkan lalu lintas HTTP yang masuk pada router, Kubernetian Ingress digunakan. Data didistribusikan dalam penyimpanan di tingkat Tarantool itu sendiri menggunakan
komponen vshard .
Kami membutuhkan kubernet 1.14+, minikube akan
berfungsi . Juga ketersediaan
kubectl tidak akan sakit. Untuk memulai operator, Anda perlu membuat ServiceAccount, Peran, dan Peran untuk itu:
$ kubectl create -f https://raw.githubusercontent.com/tarantool/tarantool-operator/0.0.1/deploy/service_account.yaml $ kubectl create -f https://raw.githubusercontent.com/tarantool/tarantool-operator/0.0.1/deploy/role.yaml $ kubectl create -f https://raw.githubusercontent.com/tarantool/tarantool-operator/0.0.1/deploy/role_binding.yaml
Operator Tarantool memperluas API Kubernetes dengan definisi sumber dayanya, kami akan membuatnya:
$ kubectl create -f https://raw.githubusercontent.com/tarantool/tarantool-operator/0.0.1/deploy/crds/tarantool_v1alpha1_cluster_crd.yaml $ kubectl create -f https://raw.githubusercontent.com/tarantool/tarantool-operator/0.0.1/deploy/crds/tarantool_v1alpha1_role_crd.yaml $ kubectl create -f https://raw.githubusercontent.com/tarantool/tarantool-operator/0.0.1/deploy/crds/tarantool_v1alpha1_replicasettemplate_crd.yaml
Semuanya siap untuk meluncurkan operator, mari kita pergi:
$ kubectl create -f https://raw.githubusercontent.com/tarantool/tarantool-operator/0.0.1/deploy/operator.yaml
Kami menunggu operator untuk memulai, dan kami dapat melanjutkan untuk meluncurkan aplikasi:
$ kubectl create -f https://raw.githubusercontent.com/tarantool/tarantool-operator/0.0.1/examples/kv/deployment.yaml
Dalam file yaml dengan contohnya, Ingress dideklarasikan di UI web; ini tersedia di
cluster_ip/admin/cluster
. Ketika setidaknya satu Pod dari Ingress naik, Anda bisa pergi ke sana dan menonton bagaimana instance baru ditambahkan ke cluster dan bagaimana topologi berubah.
Kami menunggu cluster untuk digunakan:
$ kubectl describe clusters.tarantool.io examples-kv-cluster
Kami berharap bahwa dalam Status cluster akan ada yang berikut ini:
… Status: State: Ready …
Semuanya, aplikasi siap digunakan!
Perlu lebih banyak ruang penyimpanan? Tambahkan pecahan:
$ kubectl scale roles.tarantool.io storage --replicas=3
Pecahan tidak bisa mengatasi beban? Tambah jumlah instance dalam shard dengan mengedit templat replaset:
$ kubectl edit replicasettemplates.tarantool.io storage-template
Set
.spec.replicas
, misalnya 2, untuk menambah jumlah instance dalam setiap replaset menjadi dua.
Cluster tidak lagi dibutuhkan? Kami menghapusnya bersama dengan semua sumber daya:
$ kubectl delete clusters.tarantool.io examples-kv-cluster
Apakah ada yang salah?
Skor tiketnya , kami akan dengan cepat membongkar. :)
Apa yang dilakukan operator sama sekali
Peluncuran dan pengoperasian cluster Tarantool Cartridge adalah kisah melakukan tindakan tertentu, dalam urutan tertentu, pada saat tertentu.
Cluster itu sendiri dikelola terutama melalui API admin: GraphQL melalui HTTP. Anda dapat, tentu saja, naik satu tingkat lebih rendah dan mengarahkan perintah langsung ke konsol, tetapi ini jarang terjadi. Sebagai contoh, ini adalah bagaimana cluster dimulai:
- Kami meningkatkan jumlah instance Tarantool yang diperlukan, misalnya, di bawah systemd.
- Gabungkan instance ke keanggotaan:
mutation { probe_instance: probe_server(uri: "storage:3301") }
- Tetapkan peran untuk instance, tentukan instance dan pengidentifikasi replaset. API GraphQL juga digunakan untuk ini:
mutation { join_server( uri:"storage:3301", instance_uuid: "cccccccc-cccc-4000-b000-000000000001", replicaset_uuid: "cccccccc-0000-4000-b000-000000000000", roles: ["storage"], timeout: 5 ) }
- Kami melakukan bootstrap dari komponen yang bertanggung jawab atas sharding. Juga melalui API:
mutation { bootstrap_vshard cluster { failover(enabled:true) } }
Mudah kan?
Semuanya menjadi lebih menarik ketika harus memperluas cluster. Peran Router dari skala contoh cukup: tingkatkan lebih banyak instance, kaitkan mereka ke cluster yang ada - selesai! Peran Storages agak rumit. Penyimpanan terbengkalai, jadi ketika menambahkan / menghapus instance, perlu menyeimbangkan kembali data untuk pindah ke instance baru / untuk pindah dari instance yang dihapus. Jika ini tidak dilakukan, maka dalam satu kasus kami mendapat contoh kurang beban, di kedua - kami kehilangan data. Dan jika bukan hanya satu, tetapi selusin cluster dengan topologi berbeda sedang beroperasi?
Secara umum, Operator Tarantool sibuk dengan semua ini. Pengguna menggambarkan keadaan yang diinginkan dari cluster Tarantool Cartridge, dan operator menerjemahkannya ke dalam serangkaian tindakan pada sumber daya k8s dan menjadi panggilan tertentu ke API admin cluster Tarantool dalam urutan tertentu, pada saat tertentu, dan umumnya mencoba menyembunyikan semua nuansa dari pengguna.
Sedikit tentang nuansa
Saat bekerja dengan API Cluster admin Tarantool Cartridge, urutan panggilan dan ke mana mereka datang itu penting. Kenapa begitu
Tarantool Cartridge membawa repositori topologi, komponen penemuan layanan, dan komponen konfigurasinya. Setiap instance dari cluster menyimpan salinan topologi dan konfigurasi dalam file yaml.
servers: d8a9ce19-a880-5757-9ae0-6a0959525842: uri: storage-2-0.examples-kv-cluster:3301 replicaset_uuid: 8cf044f2-cae0-519b-8d08-00a2f1173fcb 497762e2-02a1-583e-8f51-5610375ebae9: uri: storage-0-0.examples-kv-cluster:3301 replicaset_uuid: 05e42b64-fa81-59e6-beb2-95d84c22a435 … vshard: bucket_count: 30000 ...
Pembaruan terjadi dalam konser menggunakan mekanisme
komit dua fase . Peningkatan yang berhasil membutuhkan kuorum 100%: setiap contoh harus merespons, jika tidak, kembalikan. Apa artinya ini dalam hal operasi? Semua permintaan ke admin API yang memodifikasi keadaan cluster paling andal untuk dikirim ke satu instance, ke leader, jika tidak kita berisiko mengambil konfigurasi berbeda pada instance yang berbeda. Kartrid Tarantool tidak tahu bagaimana membuat pemilihan pemimpin (namun tidak tahu bagaimana), dan Operator Tarantool dapat - dan Anda hanya dapat mengetahui hal ini sebagai fakta yang menghibur, karena operator akan merusak segalanya.
Selain itu, setiap instance harus memiliki identitas tetap, yaitu seperangkat
instance_uuid
dan
replicaset_uuid
, serta
advertise_uri
. Jika penyimpanan tiba-tiba dinyalakan kembali dan salah satu dari parameter ini berubah, maka Anda berisiko melanggar kuorum - operator juga melakukan ini.
Cara operator bekerja
Tugas operator adalah untuk membawa sistem ke dalam keadaan yang ditetapkan oleh pengguna dan memelihara sistem dalam keadaan ini sampai arah baru diterima. Agar operator dapat melakukan pekerjaannya, ia membutuhkan:
- Deskripsi status sistem.
- Kode yang membawa sistem ke kondisi ini.
- Mekanisme untuk mengintegrasikan kode ini ke k8s (misalnya, untuk menerima pemberitahuan perubahan status).
Cluster Tarantool Cartridge dijelaskan dalam istilah k8s melalui
Custom Resource Definition (CRD) ; operator membutuhkan 3 sumber daya khusus seperti itu, disatukan di bawah grup tarantool.io/v1alpha:
- Cluster adalah sumber daya tingkat atas yang sesuai dengan satu kluster Tarantool Cartridge.
- Peran - dalam hal Tarantool Cartridge, ini adalah peran pengguna .
- ReplicasetTemplate - template dimana StatefulSets akan dibuat (mengapa stateful - saya akan memberitahu Anda sedikit nanti; jangan dikacaukan dengan ReplicaSet k8s).
Semua sumber daya ini secara langsung mencerminkan model deskripsi klaster Tarantool Cartridge. Memiliki kamus umum, lebih mudah bagi operator untuk berkomunikasi dengan pengembang dan memahami apa yang ingin mereka lihat di prod.
Kode yang membawa sistem ke status yang diberikan - dalam hal k8s, ini adalah Controller. Dalam kasus Operator Tarantool, ada beberapa pengontrol:
- ClusterController - bertanggung jawab untuk berinteraksi dengan cluster Tarantool Cartridge, menghubungkan instance ke cluster, memutus instance dari cluster.
- RoleController adalah pengontrol peran pengguna, ia bertanggung jawab untuk menggunakan StatefulSets dari templat dan mempertahankan nomornya dalam jumlah tertentu.
Seperti apa pengontrolnya? Serangkaian kode yang secara bertahap membawa dunia di sekitar Anda dalam urutan. ClusterController dapat digambarkan secara skematis seperti ini:

Titik masuk adalah pemeriksaan untuk melihat apakah ada sumber daya Cluster sehubungan dengan peristiwa itu terjadi. Tidak ada Kami pergi. Apa ada Kami beralih ke blok berikutnya: ambil Kepemilikan di atas peran pengguna. Diambil satu - kiri, pada lingkaran kedua kita tangkap yang kedua. Dan seterusnya, sampai kita menangkap semuanya. Apakah semua peran ditangkap? Jadi pergi ke blok operasi selanjutnya. Jadi, sampai kita mencapai yang terakhir; maka kita dapat mengasumsikan bahwa sistem yang dikendalikan dalam keadaan tertentu.
Secara umum, semuanya sederhana. Penting untuk menentukan kriteria keberhasilan untuk melewati setiap tahap. Sebagai contoh, kami menganggap berhasil operasi bergabung dengan sebuah cluster bukan ketika itu kembali kondisional sukses = benar, tetapi ketika itu mengembalikan kesalahan seperti "sudah bergabung".
Dan bagian terakhir dari mekanisme ini adalah integrasi controller dengan k8s. Tampilan udara, seluruh k8 terdiri dari satu set pengontrol yang menghasilkan peristiwa dan meresponsnya. Acara melalui antrian yang dapat kami langgani. Secara skematis, ini dapat direpresentasikan sebagai berikut:

Pengguna memanggil
kubectl create -f tarantool_cluster.yaml
, sumber daya Cluster yang sesuai dibuat. ClusterController diberitahu tentang penciptaan sumber daya Cluster. Dan hal pertama yang dia coba lakukan adalah menemukan semua sumber daya Peran yang seharusnya menjadi bagian dari klaster ini. Jika ditemukan, maka tetapkan Cluster sebagai Pemilik untuk Peran dan perbarui sumber daya Peran. RoleController menerima pemberitahuan pembaruan Peran, melihat bahwa sumber daya memiliki Pemilik, dan mulai membuat StatefulSets. Dan seterusnya dalam lingkaran: pemicu pertama dari yang kedua, pemicu kedua dari yang ketiga - dan seterusnya sampai seseorang berhenti. Dan Anda juga dapat memicu tepat waktu, misalnya, setiap 5 detik, yang kadang berguna.
Itulah keseluruhan operator: buat sumber daya khusus dan tulis kode yang merespons acara tentang sumber daya.
Apa yang dikembangkan operator
Tindakan operator pada akhirnya menyebabkan k8 membuat Pod dan wadah. Di Tarantool Cartridge cluster yang digunakan pada k8s, semua Pod digabung ke dalam StatefulSets.
Mengapa StatefulSet? Seperti yang saya tulis sebelumnya, setiap instance Tarantool Cluster menyimpan salinan topologi dan konfigurasi cluster, dan sering kali di server aplikasi, tidak, tidak, dan mereka menggunakan semacam ruang, misalnya, pada gilirannya atau data referensi, dan ini sudah merupakan keadaan penuh . Dan StatefulSet juga menjamin pelestarian Pod identitas, yang penting ketika mengelompokkan instance dalam sebuah cluster: identitas instance harus diperbaiki, jika tidak, kita berisiko kehilangan kuorum saat memulai kembali.
Ketika semua sumber daya gugus dibuat dan dibawa ke keadaan yang diinginkan, mereka membentuk hierarki berikut:

Tanda panah menunjukkan hubungan Pemilik-Tanggungan antara sumber daya. Adalah perlu bahwa
Pengumpul Sampah membersihkan setelah kami dalam kasus, misalnya, penghapusan Cluster.
Selain StatefulSets, Operator Tarantool menciptakan Layanan Tanpa Kepala, yang diperlukan untuk pemilihan pemimpin, dan melalui itu, mesin virtual berkomunikasi satu sama lain.
Di bawah kap Operator Tarantool terletak
Kerangka Operator , kode operator itu sendiri ada di golang, tidak ada yang luar biasa di sini.
Ringkasan
Itu saja, secara umum! Kami menunggu umpan balik dan tiket dari Anda - di mana tanpa itu, versi alfa semuanya sama. Apa selanjutnya Dan kemudian ada banyak pekerjaan untuk mengingat semua ini:
- Unit, pengujian E2E;
- Pengujian Chaos Monkey
- stress testing;
- backup / restore;
- penyedia topologi eksternal.
Masing-masing topik ini luas dalam dirinya sendiri dan layak untuk materi yang terpisah, tunggu pembaruan!