Opsi untuk menyinkronkan 1 juta file secara efisien dengan server jarak jauh?

27

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.

Zilvinas
sumber
1
Apakah Anda memiliki log yang menunjukkan file apa yang telah diubah atau dihapus?
Oliver
3
Kalau saja daftar putar adalah catatan mysql. Anda kemudian dapat menggunakan replikasi database dan meminta mysql untuk mengetahui apa yang perlu dikirim / diterima.
Matt
@oliver kita lakukan. Namun kemudian Anda harus percaya bahwa log berarti kode yang menghasilkannya harus benar dan kemudian Anda perlu kode kustom untuk memproses log yang juga perlu benar. Saya lebih suka menghindari kode yang dibuat sendiri untuk melakukannya atas sesuatu yang telah diuji secara luas oleh masyarakat.
Zilvinas
Apakah Anda ingin perubahan hanya diterapkan setiap jam? Atau apakah replikasi instan juga dapat diterima?
faker
1
Jangan meremehkan waktu yang dibutuhkan rsync untuk bekerja melalui jutaan file. Coba saja dan Anda akan melihat apa yang Anda lakukan. Jika Anda memiliki log itu, gunakan atau coba solusi lain yang diusulkan.
Oliver

Jawaban:

39

Karena pembaruan instan juga dapat diterima, Anda dapat menggunakan lsyncd .
Ini mengawasi direktori (tidak memberitahukan) dan akan rsyncberubah 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.

pemalsu
sumber
Lagi tip yang brilian :)
Zilvinas
1
+1 Ini pada dasarnya adalah masalah koherensi cache, monitor yang mendorong perubahan adalah solusi termudah. lsyncdmengimplementasikan itu ...
Chris S
1
Saya akan menyelidiki lsyncddan inotifymendalam 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. lsyncdImplementasi yang disesuaikan dengan hati-hati plus harian rsyncmungkin berfungsi sekarang di 2012 untuk menutupi basis Anda.
Old Pro
2
Sebenarnya ia melakukan iontifypada direktori bukan file individual. Berapa banyak direktori yang dapat Anda tonton? Periksa /proc/sys/fs/inotify/max_user_watches(biasanya 8192).
faker
2
Dengan ~ 50k direktori yang di-inotify akan sangat mungkin tidak skala dengan baik. Ketika kami mencoba pendekatan serupa pada tahun 2009 dengan direktori 100rb, butuh cara kernel terlalu lama untuk berlangganan semua direktori. Sedangkan untuk @OldPro tidak berfungsi untuk kita.
neovatar
11

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.

Steven Monday
sumber
+1 untuk Glusterfs
Tom O'Connor
8

Saya ragu rsyncakan 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 seperti inotifyitu 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.

Sven
sumber
5

Beberapa alternatif lagi:

  • Masukkan pekerjaan ke RabbitMQ atau Gearman untuk secara tidak sinkron pergi dan menghapus (atau menambah) file yang sama di semua server jarak jauh setiap kali Anda menghapus atau menambahkan file di server utama.
  • Simpan file dalam database dan gunakan replikasi untuk menjaga server remote tetap sinkron.
  • Jika Anda memiliki ZFS, Anda dapat menggunakan replikasi ZFS .
  • Beberapa SAN memiliki replikasi file. Saya tidak tahu apakah ini dapat digunakan melalui Internet.
Ladadadada
sumber
4

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.

neovatar
sumber
0

Saya akan menggunakan S3 Backend dan kemudian memasangnya di semua server yang saya butuhkan - Dengan begitu, semua orang tetap sinkron secara instan

Tuan IT Guru
sumber
Sementara penyimpanan akan disinkronkan, Anda harus memberi tahu aplikasi tersebut, jadi Anda akan kembali ke titik awal, atau aplikasi harus melakukan polling penyimpanan setiap kali seseorang mengakses daftar putar ini. Performanya akan mengerikan dalam kedua kasus itu.
Chris S
Aplikasi tidak perlu polling penyimpanan setiap kali seseorang mengakses daftar putar, cukup beberapa kali dalam satu jam untuk memastikan bahwa aplikasi berjalan tanpa data basi. Juga, jika S3 digunakan sebagai backend, mengapa aplikasi harus melakukan polling file di tempat pertama? Mereka akan selalu terkini
Mister IT Guru
0

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.

Supr
sumber