Mengembangkan aplikasi cluster

Saya tidak yakin di mana (atau bahkan bagaimana tepatnya menanyakan) pertanyaan ini, jadi saya berharap seseorang di sini dapat mengarahkan saya ke arah yang benar.

Saya memiliki layanan yang sedang saya bangun. Layanan itu memiliki objek berbeda di memori - masing-masing dengan statusnya sendiri. Setiap kali sebuah objek dibuat, ia memuat status dari database dan menahannya. Ketika perubahan dilakukan pada objek, perubahan tersebut juga tetap ada pada database.

Saya ingin meningkatkan layanan ini. Saya telah melihat solusi seperti akka.net (model aktor) dan mereka memiliki solusi pengelompokan. Dari apa yang saya baca, ia menyinkronkan negara dengan sesuatu yang mereka sebut "gosip" di mana setiap node mengirimkan negara ke node lainnya. Saya tidak yakin apakah aplikasi saya yang berfungsi dapat dikonversi ke akka.net pada saat ini.

Saya bertanya-tanya bagaimana tepatnya cluster menjaga status tetap tersinkronisasi antara node yang berbeda (saya mengerti konsep gosip), apa yang terjadi jika saya memiliki mesin A yang menerima pesan dan pada saat yang sama, mesin B juga menerima pesan - keduanya mengubah keadaan yang sama suatu objek - yang akan membuat masalah dengan integritas data antar negara. Satu-satunya pemikiran saya tentang ini adalah mengunci sumber daya bersama, tetapi itu menggagalkan tujuan cluster.

Mempertahankan status dalam database juga bukan suatu pilihan karena database menjadi penghambat dan satu titik kegagalan.

Sepertinya saya tidak dapat menemukan bahan bacaan yang relevan secara online - namun saya juga kekurangan frasa teknis yang perlu saya fokuskan.

Jika relevan, saya menggunakan .NET Core dan c# untuk pengembangan.

Adakah yang bisa menjelaskan konsep pengelompokan, cara kerjanya, dan memastikan node sinkron? atau dapat menunjuk ke arah yang benar?


person developer82    schedule 16.11.2016    source sumber
comment
Untuk memperjelas, gosip klaster Akka.NET hanya ada untuk mengawasi kesehatan klaster, yaitu: mengetahui kapan node tersedia, kapan node tersebut mati, dll. Ia tidak akan menyinkronkan status aktor mana pun untuk Anda . Mengirimkan pesan dan memastikan status sinkron dalam aktor di klaster Anda sepenuhnya menjadi tanggung jawab Anda. Ada beberapa metode berbeda yang dapat Anda gunakan untuk mencapai hal ini, IIRC Petabridge memiliki beberapa postingan blog mengenai hal ini (dan artikel Akka.NET bermanfaat lainnya).   -  person easuter    schedule 17.11.2016


Jawaban (1)


Anda punya masalah besar. Menurut saya cara Anda berpikir tentang suatu masalah adalah masalah yang lebih besar. Mari kita bahas beberapa hal mendasar.

Clustering digunakan untuk memecahkan masalah besar, seperti masalah “makan gajah”. Untuk mengatasi masalah ini, Anda dapat merancang predator unik yang lebih besar dan bermulut besar. Namun sejarah dan paleontologi telah menunjukkan kepada kita bahwa predator besar tidak mudah bertahan hidup (mereka merugikan lingkungan).

Jadi untuk mengatasi masalah Anda, Anda bisa menggunakan server yang lebih besar dan lebih kuat.

Atau, Anda bisa menggunakan pengelompokan.

Pengelompokan memecahkan masalah “makan gajah” dengan cara yang sangat berbeda. Alih-alih mengirimkan predator besar yang unik dengan mulut besar untuk memakan gajah, mereka akan menggunakan konsep pemrosesan terdistribusi dan berbagi untuk memakannya satu gigitan dalam satu waktu. Jika dilakukan dengan benar, semut bisa memakan gajah. Jika jumlahnya cukup dan situasinya tepat.

Namun perhatikan dalam contoh saya, semut berukuran sangat kecil... Seekor semut tidak akan pernah membawa seluruh gajah. Anda dapat membawa seluruh gajah jika semua semut bekerja sama tetapi kemudian Anda mengalami masalah konkurensi dan penguncian (Anda harus mengoordinasikan semut).

Semut telah menunjukkan kepada kita cara yang lebih baik untuk mengatasi hal ini. Mereka akan mengambil sepotong gajah dan menangani masalahnya dalam bagian yang lebih kecil.

Di sistem Anda, Anda bertanya bagaimana Anda dapat menyinkronkan data antar node... Pertanyaan saya adalah mengapa? Jika Anda menyinkronkan data maka Anda melakukan mirroring dan masalah Anda menjadi lebih besar (Anda mengkloning gajah tetapi hanya bisa memakan yang asli).

Solusi untuk masalah Anda adalah memikirkan kembali solusinya dan melihat apakah Anda dapat memecah masalah menjadi bagian-bagian yang lebih kecil.

Dalam pola Akka dan Aktor, cara terbaik untuk mengatasi masalah adalah dengan menggunakan "proses" yang lebih kecil (satu semut). Walaupun prosesnya sendiri hampir tidak ada gunanya, namun bila digunakan dalam skala besar, proses ini bisa menjadi sangat berguna. Ketika arsitekturnya dikerjakan dengan benar, Anda akan melihat bahwa membawa penyembur api ke semut tidak akan mengalahkan mereka... Lebih banyak semut akan datang, mereka akan terus mengatasi masalahnya.

Menyalin dan menyinkronkan data bukanlah solusi Anda, melainkan mengelompokkannya. Anda harus mengambil data Anda dan memecahnya hingga Anda dapat memberikannya kepada seekor semut. Jika Anda bisa melakukan ini maka Anda bisa menggunakan Akka. Jika pendekatan ini tampak menggelikan maka Akka bukan untuk Anda.

Namun pertimbangkan ini... Anda jelas memiliki kekhawatiran terhadap backend database Anda - Anda tidak ingin meningkatkan IO dan menyebabkan satu titik kegagalan. Saya harus setuju dengan Anda. Namun Anda perlu memikirkan kembali beberapa hal. Anda dapat melakukan pencerminan basis data untuk menghilangkan satu titik kegagalan tetapi Anda benar bahwa ini tidak akan menghilangkan hambatan. Jadi katakanlah cermin menghilangkan satu titik kegagalan... Sekarang mari kita serang bagian kemacetannya.

Jika Anda dapat membagi data Anda menjadi potongan-potongan yang cukup kecil sehingga semut dapat menanganinya maka saya akan mendorong Anda untuk memberitahu semut Anda untuk hanya melaporkan ke database ketika data berubah... Anda dapat membacanya sekali pada inisialisasi (Anda memerlukan backend simpan, jangan menipu diri sendiri, listrik bisa cepat hilang... harus disimpan di suatu tempat) tetapi jika Anda menyuruh semut Anda untuk tetap bertahan hanya data yang diubah maka Anda akan menghapus semua pertanyaan dari persamaan yang akan secara drastis menggeser ke mana bebannya. berasal dari. Setelah Anda hanya memiliki pembaruan, penyisipan, dan penghapusan untuk ditangani... keseluruhan lanskap akan jauh lebih sederhana.

Clustering seharusnya menjadi solusi bagi Anda, tetapi hanya jika Anda dapat menghilangkan konsep cermin dari pikiran Anda.

Node cluster dapat dan akan crash... Namun node tersebut dapat direspawn di tempat lain ke node lain, sehingga Anda selalu memiliki sistem yang cepat. Hanya ketika Anda menghadapi kerusakan atau kehilangan sebuah node/proses pekerja/semut Anda harus memuat ulang data...

Semoga berhasil... Anda telah menguraikan masalah berat yang saya lihat orang-orang dengan gelar rekayasa perangkat lunak gagal memecahkannya.

person Karell Ste-Marie    schedule 17.11.2016