Saya dapat menghabiskan beberapa waktu minggu lalu dengan orang-orang Linux menguji skenario dan bekerja di sisi C# dari implementasi ini dan saya menggunakan pendekatan berikut:
- Baca alamat sentinel dari konfigurasi dan buat ConnectionMultiplexer untuk menghubungkannya
- Berlangganan ke saluran +switch-master
- Tanyakan masing-masing server sentinel secara bergiliran apa pendapat mereka tentang master redis dan slave, bandingkan semuanya untuk memastikan mereka semua setuju
- Buat ConnectionMultiplexer baru dengan alamat server redis yang dibaca dari sentinel dan sambungkan, tambahkan event handler ke ConnectionFailed dan ConnectionRestored.
- Saat saya menerima pesan +switch-master, saya memanggil Configure() di ConnectionMultiplexer redis
- Saat ikat pinggang dan kurung kurawal mendekat, saya selalu memanggil Configure() pada ConnectionMultiplexer redis 12 detik setelah menerima peristiwa connectionFailed atau connectionRestored saat jenis koneksinya adalah ConnectionType.Interactive.
Saya menemukan bahwa secara umum saya bekerja dan mengkonfigurasi ulang setelah sekitar 5 detik kehilangan master redis. Selama ini saya tidak bisa menulis tapi saya bisa membaca (karena Anda bisa membacakan budak). 5 detik tidak masalah bagi kami karena data kami diperbarui dengan sangat cepat dan menjadi basi setelah beberapa detik (dan kemudian ditimpa).
Satu hal yang saya tidak yakin adalah apakah saya harus menghapus server redis dari redis ConnectionMultiplexer ketika sebuah instance turun, atau membiarkannya terus mencoba kembali koneksi. Saya memutuskan untuk membiarkannya mencoba lagi karena kembali ke campuran sebagai budak segera setelah muncul kembali. Saya melakukan beberapa pengujian kinerja dengan dan tanpa koneksi yang dicoba ulang dan tampaknya membuat sedikit perbedaan. Mungkin seseorang dapat mengklarifikasi apakah ini pendekatan yang benar.
Kadang-kadang membawa kembali sebuah contoh yang sebelumnya master tampaknya menyebabkan beberapa kebingungan - beberapa detik setelah muncul kembali saya akan menerima pengecualian dari menulis - "READONLY" menyarankan saya tidak bisa menulis ke budak. Ini jarang terjadi tetapi saya menemukan bahwa pendekatan "catch-all" saya untuk memanggil Configure() 12 detik setelah perubahan status koneksi menangkap masalah ini. Memanggil Configure() tampaknya sangat murah dan oleh karena itu memanggilnya dua kali terlepas dari apakah perlu atau tidak.
Sekarang setelah saya memiliki slave, saya telah menurunkan beberapa kode pembersihan data yang melakukan pemindaian kunci ke slave, yang membuat saya senang.
Secara keseluruhan saya cukup puas, ini tidak sempurna tetapi untuk sesuatu yang sangat jarang terjadi, ini sudah lebih dari cukup.