Di sebuah perusahaan tempat saya bekerja, kami memiliki hal yang disebut "daftar putar" yang merupakan file kecil ~ masing-masing 100-300 byte. Ada sekitar satu juta dari mereka. Sekitar 100.000 dari mereka diganti setiap jam. Daftar putar ini perlu diunggah ke 10 server jarak jauh lainnya di benua yang berbeda setiap jam dan itu harus dilakukan dengan cepat dalam waktu kurang dari 2 menit. Sangat penting bahwa file yang dihapus pada master juga dihapus pada semua replika. Kami saat ini menggunakan Linux untuk infrastruktur kami.
Saya sedang berpikir tentang mencoba rsync dengan opsi -W untuk menyalin seluruh file tanpa membandingkan konten. Saya belum mencobanya, tetapi mungkin orang yang lebih berpengalaman dengan rsync dapat memberi tahu saya apakah itu pilihan yang layak?
Apa opsi lain yang layak dipertimbangkan?
Pembaruan: Saya telah memilih opsi lsyncd sebagai jawabannya tetapi hanya karena itu yang paling populer. Alternatif lain yang disarankan juga berlaku dengan caranya sendiri.
sumber
Jawaban:
Karena pembaruan instan juga dapat diterima, Anda dapat menggunakan lsyncd .
Ini mengawasi direktori (tidak memberitahukan) dan akan
rsync
berubah menjadi budak.Pada startup itu akan melakukan penuh
rsync
, sehingga akan memakan waktu, tetapi setelah itu hanya perubahan yang dikirimkan.Pengamatan direktori secara berulang dimungkinkan, jika server slave down, sinkronisasi akan dicoba lagi sampai kembali.
Jika ini semua dalam satu direktori (atau daftar direktori statis), Anda juga dapat menggunakan incron .
Kekurangannya adalah tidak memungkinkan menonton folder secara rekursif dan Anda perlu menerapkan fungsi sinkronisasi sendiri.
sumber
lsyncd
mengimplementasikan itu ...lsyncd
daninotify
mendalam sebagaimana berlaku untuk OS server spesifik Anda. Ada batasan jumlah jam tangan tidak berlaku yang tersedia. Saya percaya standarnya adalah sekitar 1500 atau 8000 tergantung pada versi Linux Anda. Sebagian besar kernel memungkinkan Anda menaikkan batas, tetapi memantau 1 juta file mungkin lebih dari praktis. Itu tidak berfungsi untuk saya pada tahun 2008. Juga, antrian acara yang tidak sah dapat meluap menyebabkan Anda kehilangan acara, dan Anda harus memiliki cara untuk pulih dari itu.lsyncd
Implementasi yang disesuaikan dengan hati-hati plus harianrsync
mungkin berfungsi sekarang di 2012 untuk menutupi basis Anda.iontify
pada direktori bukan file individual. Berapa banyak direktori yang dapat Anda tonton? Periksa/proc/sys/fs/inotify/max_user_watches
(biasanya 8192).Pertimbangkan untuk menggunakan sistem file terdistribusi, seperti GlusterFS . Didesain dengan mempertimbangkan replikasi dan paralelisme, GlusterFS dapat meningkatkan skala hingga 10 server jauh lebih lancar daripada solusi ad-hoc yang melibatkan inotify dan
rsync
.Untuk kasus penggunaan khusus ini, seseorang dapat membangun 10 server GlusterFS volume 10 replika (yaitu 1 replika / bata per server), sehingga setiap replika akan menjadi cermin yang tepat dari setiap replika lain dalam volume. GlusterFS akan secara otomatis menyebarkan pembaruan sistem file ke semua replika.
Klien di setiap lokasi akan menghubungi server lokal mereka, jadi akses baca ke file akan cepat. Pertanyaan kuncinya adalah apakah latensi tulis dapat dijaga tetap rendah. Satu-satunya cara untuk menjawabnya adalah dengan mencobanya.
sumber
Saya ragu
rsync
akan bekerja untuk ini dengan cara biasa, karena memindai sejuta file dan membandingkannya dengan sistem jarak jauh 10 kali akan memakan waktu lama. Saya akan mencoba menerapkan sistem dengan sesuatu sepertiinotify
itu membuat daftar file yang dimodifikasi dan mendorongnya ke server jauh (jika perubahan ini tidak masuk dengan cara lain). Anda kemudian dapat menggunakan daftar ini untuk dengan cepat mengidentifikasi file yang diperlukan untuk ditransfer - mungkin bahkan dengan rsync (atau lebih baik 10 contoh paralel dari itu).Sunting: Dengan sedikit kerja, Anda bahkan bisa menggunakan pendekatan inotify / log watch ini untuk menyalin file segera setelah modifikasi terjadi.
sumber
Beberapa alternatif lagi:
sumber
Ini tampaknya menjadi kasus penggunaan buku cerita yang ideal untuk MongoDB dan mungkin GridFS . Karena file-file tersebut relatif kecil, MongoDB saja sudah cukup, meskipun mungkin nyaman untuk menggunakan API GridFS.
MongoDB adalah basis data nosql dan GridFS adalah penyimpanan penyimpanan di atasnya. MongoDB memiliki banyak opsi built-in untuk replikasi dan sharding , jadi ia harus berskala sangat baik dalam use case Anda.
Dalam kasus Anda, Anda mungkin akan mulai dengan set replika yang terdiri dari master yang terletak di pusat data utama Anda (mungkin yang kedua, jika Anda ingin failover di lokasi yang sama) dan sepuluh "budak" Anda didistribusikan di seluruh dunia. Kemudian lakukan load test untuk memeriksa apakah kinerja penulisan sudah cukup dan periksa waktu replikasi ke node Anda. Jika Anda membutuhkan lebih banyak performace, Anda bisa mengubah setup menjadi sharded (kebanyakan untuk mendistribusikan beban tulis ke lebih banyak server). MongoDB telah dirancang dengan meningkatkan pengaturan besar dengan perangkat keras "murah", sehingga Anda dapat membuang banyak server murah untuk meningkatkan kinerja.
sumber
Saya akan menggunakan S3 Backend dan kemudian memasangnya di semua server yang saya butuhkan - Dengan begitu, semua orang tetap sinkron secara instan
sumber
Opsi yang tampaknya belum disebutkan adalah mengarsipkan semua file menjadi satu file terkompresi. Ini harus mengurangi ukuran total secara signifikan dan menghapus semua overhead yang Anda dapatkan dari berurusan dengan jutaan file individual. Dengan mengganti seluruh rangkaian file dalam satu pembaruan besar, Anda juga dapat yakin bahwa file yang dihapus dihapus pada replika.
Kelemahannya tentu saja bahwa Anda mentransfer banyak file yang tidak perlu. Itu mungkin atau mungkin tidak diseimbangkan dengan ukuran yang diperkecil berkat kompresi. Saya juga tidak tahu berapa lama waktu yang dibutuhkan untuk mengompres banyak file.
sumber