inotify+rsync实时同步的一个实例介绍
背景
我们公司在用inotify+rsync做实时同步,来解决分布式集群文件一致性的问题。但当web文件越来越多(百万级数量html,jpg等小 文件),同步就越来越慢,根本做不到实时,按照网上的调优方法都尝试过,问题根本没有解决。经过我一翻细致研究,终于把慢的核心问题研究明白,先总结一句 inotifywait响应不会有延迟,rsync也很快。大家同样有慢的烦恼,那是因为网上的inotify+rsync的教程都是坑。下面我们来分 析。
inotifywait 单独分析
/usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib /data/
执行上面命令,是让inotifywait监听/data/目录,当监听到有发生modify,create,delete,attrib等事件发生时,按%Xe %w%f的格式输出。
在/data/目录touch几个文件
touch /data/{1..5}
观看inotify输出
ATTRIB /data/1 -- 表示发生了ATTRIB事件 路径为/data/1 ATTRIB /data/2 ATTRIB /data/3 ATTRIB /data/4 ATTRIB /data/5
知道上面的输出效果之后 我们应该想得到,可以用rsync获取inotifywait监控到的文件列表来做指定的文件同步,而不是每次都由rsync做全目录扫描来判断文件是否存在差异。
网上的inotify+rsync分析
我们来看网上的教程,我加了注释。(网上所有的教程基本都一模一样,尽管写法不一样,致命点都是一样的)
#!/bin/bash /usr/bin/inotifywait -mrq --format '%w%f'-e create,close_write,delete /backup |while read file #把发生更改的文件列表都接收到file 然后循环,但有什么鬼用呢?下面的命令都没有引用这个$file 下面做的是全量rsync do cd /backup && rsync -az --delete /backup/ rsync_backup@192.168.24.101::backup/--password-file=/etc/rsync.password done
#注意看 这里的rsync 每次都是全量的同步(这就坑爹了),而且 file列表是循环形式触发rsync ,等于有10个文件发生更改,就触发10次rsync全量同步(简直就是噩梦),那还不如直接写个死循环的rsync全量同步得了。
#有很多人会说 日志输出那里明明只有差异文件的同步记录。其实这是rsync的功能,他本来就只会输出有差异需要同步的文件信息。不信你直接拿这句rsync来跑试试。
#这种在需要同步的源目录文件量很大的情况下,简直是不堪重负。不仅耗CPU还耗时,根本不可以做到实时同步。
备注:backup为rsync server配置module,除了编写脚本以外,还需要配置一个rsync server,rsync server配置参考《》
改良方法
要做到实时,就必须要减少rsync对目录的递归扫描判断,尽可能的做到只同步inotify监控到已发生更改的文件。结合rsync的特性,所以这里要分开判断来实现一个目录的增删改查对应的操作。
脚本如下
#!/bin/bash src=/data/ # 需要同步的源路径 des=data # 目标服务器上 rsync --daemon 发布的名称,rsync --daemon这里就不做介绍了,网上搜一下,比较简单。 rsync_passwd_file=/etc/rsyncd.passwd # rsync验证的密码文件 ip1=192.168.0.18 # 目标服务器1 ip2=192.168.0.19 # 目标服务器2 user=root # rsync --daemon定义的验证用户名 cd ${src} # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果 /usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file # 把监控到有发生更改的"文件路径列表"循环 do INO_EVENT=$(echo $file | awk '{print $1}') # 把inotify输出切割 把事件类型部分赋值给INO_EVENT INO_FILE=$(echo $file | awk '{print $2}') # 把inotify输出切割 把文件路径部分赋值给INO_FILE echo "-------------------------------$(date)------------------------------------" echo $file #增加、修改、写入完成、移动进事件 #增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。 if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] # 判断事件类型 then echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO' rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} && # INO_FILE变量代表路径哦 -c校验文件内容 rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des} #仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡) 然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性 fi #删除、移动出事件 if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]] then echo 'DELETE or MOVED_FROM' rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} && rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des} #看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间。这里有更好方法的同学,欢迎交流。 fi #修改属性事件 指 touch chgrp chmod chown等操作 if [[ $INO_EVENT =~ 'ATTRIB' ]] then echo 'ATTRIB' if [ ! -d "$INO_FILE" ] # 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。 then rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} && rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des} fi fi done
每两小时做1次全量同步
因为inotify只在启动时会监控目录,他没有启动期间的文件发生更改,他是不知道的,所以这里每2个小时做1次全量同步,防止各种意外遗漏,保证目录一致。
crontab -e * */2 * * * rsync -avz --password-file=/etc/rsync-client.pass /data/ root@192.168.0.18::data && rsync -avz --password-file=/etc/rsync-client.pass /data/ root@192.168.0.19::data
改良后我们公司这种百万级小文件也能做到实施同步了。
下面附上inotify的参数说明
inotify介绍-- 是一种强大的、细颗粒的、异步的文件系统监控机制,###&0###&内核从2.6.13起,加入Inotify可以监控文件系统中添加、删除、修改移动等各种事件,利用这个内核接口,就可以监控文件系统下文件的各种变化情况。
inotifywait 参数说明
参数名称 | 参数说明 |
---|---|
-m,–monitor | 始终保持事件监听状态 |
-r,–recursive | 递归查询目录 |
-q,–quiet | 只打印监控事件的信息 |
–excludei | 排除文件或目录时,不区分大小写 |
-t,–timeout | 超时时间 |
–timefmt | 指定时间输出格式 |
–format | 指定时间输出格式 |
-e,–event | 后面指定删、增、改等事件 |
inotifywait events事件说明
事件名称 | 事件说明 |
---|---|
access | 读取文件或目录内容 |
modify | 修改文件或目录内容 |
attrib | 文件或目录的属性改变 |
close_write | 修改真实文件内容 |
close_nowrite | |
close | |
open | 文件或目录被打开 |
moved_to | 文件或目录移动到 |
moved_from | 文件或目录从移动 |
move | 移动文件或目录移动到监视目录 |
create | 在监视目录下创建文件或目录 |
delete | 删除监视目录下的文件或目录 |
delete_self | |
unmount | 卸载文件系统 |
优化 Inotify
#在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制
[root@web ~]# ll /proc/sys/fs/inotify/ 总用量0 -rw-r--r--1 root root 09月923:36 max_queued_events -rw-r--r--1 root root 09月923:36 max_user_instances -rw-r--r--1 root root 09月923:36 max_user_watches
max_user_watches #设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)
max_user_instances #设置每个用户可以运行的inotifywait或inotifywatch命令的进程数
max_queued_events #设置inotify实例事件(event)队列可容纳的事件数量
----------------------------
[root@web ~]# echo 50000000>/proc/sys/fs/inotify/max_user_watches -- 把他加入/etc/rc.local就可以实现每次重启都生效 [root@web ~]# echo 50000000>/proc/sys/fs/inotify/max_queued_events
Atas ialah kandungan terperinci inotify+rsync实时同步的一个实例介绍. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Penyelesaian kepada masalah sistem Win11 tidak dapat memasang pek bahasa Cina Dengan pelancaran sistem Windows 11, ramai pengguna mula menaik taraf sistem pengendalian mereka untuk mengalami fungsi dan antara muka baharu. Walau bagaimanapun, sesetengah pengguna mendapati bahawa mereka tidak dapat memasang pek bahasa Cina selepas menaik taraf, yang menyusahkan pengalaman mereka. Dalam artikel ini, kami akan membincangkan sebab mengapa sistem Win11 tidak dapat memasang pek bahasa Cina dan menyediakan beberapa penyelesaian untuk membantu pengguna menyelesaikan masalah ini. Analisis sebab Pertama, mari kita menganalisis ketidakupayaan sistem Win11 untuk

Apabila teknologi telefon pintar terus berkembang, telefon bimbit memainkan peranan yang semakin penting dalam kehidupan seharian kita. Sebagai telefon perdana yang memfokuskan pada prestasi permainan, telefon Black Shark sangat digemari oleh pemain. Namun, kadangkala kita juga menghadapi situasi telefon Black Shark tidak boleh dihidupkan Pada masa ini, kita perlu mengambil beberapa langkah untuk menyelesaikan masalah ini. Seterusnya, izinkan kami berkongsi lima petua untuk mengajar anda cara menyelesaikan masalah telefon Black Shark tidak dihidupkan: Langkah 1: Periksa kuasa bateri Pertama, pastikan telefon Black Shark anda mempunyai kuasa yang mencukupi. Ia mungkin kerana bateri telefon telah habis

Dengan perkembangan media sosial yang berterusan, Xiaohongshu telah menjadi platform untuk lebih ramai golongan muda berkongsi kehidupan mereka dan menemui perkara yang indah. Ramai pengguna bermasalah dengan isu autosimpan semasa menyiarkan imej. Jadi, bagaimana untuk menyelesaikan masalah ini? 1. Bagaimana untuk menyelesaikan masalah menyimpan gambar secara automatik semasa menerbitkan di Xiaohongshu? 1. Kosongkan cache Pertama, kita boleh cuba mengosongkan data cache Xiaohongshu. Langkah-langkahnya adalah seperti berikut: (1) Buka Xiaohongshu dan klik butang "Saya" di sudut kanan bawah (2) Pada halaman tengah peribadi, cari "Tetapan" dan klik padanya (3) Tatal ke bawah dan cari "; Kosongkan Cache". Klik OK. Selepas mengosongkan cache, masukkan semula Xiaohongshu dan cuba siarkan gambar untuk melihat sama ada masalah penjimatan automatik telah diselesaikan. 2. Kemas kini versi Xiaohongshu untuk memastikan bahawa Xiaohongshu anda

Semua orang tahu bahawa jika komputer tidak dapat memuatkan pemacu, peranti mungkin tidak berfungsi dengan betul atau berinteraksi dengan komputer dengan betul. Jadi bagaimana kita menyelesaikan masalah apabila kotak gesaan muncul pada komputer bahawa pemandu tidak boleh dimuatkan pada peranti ini? Editor di bawah akan mengajar anda dua cara untuk menyelesaikan masalah dengan mudah. Tidak dapat memuatkan pemacu pada peranti ini Penyelesaian 1. Cari "Pengasingan Kernel" dalam menu Mula. 2. Matikan Integriti Memori, dan ia akan menggesa "Integriti Memori telah dimatikan. Peranti anda mungkin terdedah. Klik di belakang untuk mengabaikannya, dan ia tidak akan menjejaskan penggunaan." 3. Masalah boleh diselesaikan selepas menghidupkan semula mesin.

Masalah bercelaru Cina Linux adalah masalah biasa apabila menggunakan set aksara Cina dan pengekodan. Watak bercelaru mungkin disebabkan oleh tetapan pengekodan fail yang salah, tempat sistem tidak dipasang atau ditetapkan, dan ralat konfigurasi paparan terminal, dsb. Artikel ini akan memperkenalkan beberapa penyelesaian biasa dan memberikan contoh kod khusus. 1. Periksa tetapan pengekodan fail Gunakan arahan fail untuk melihat pengekodan fail Gunakan perintah fail dalam terminal untuk melihat pengekodan fail: nama fail-fail jika terdapat "charset".

Apabila anda mendapati bahawa satu atau lebih item dalam folder penyegerakan anda tidak sepadan dengan mesej ralat dalam Outlook, ini mungkin disebabkan anda mengemas kini atau membatalkan item mesyuarat. Dalam kes ini, anda akan melihat mesej ralat yang mengatakan bahawa versi tempatan anda data bercanggah dengan salinan jauh. Keadaan ini biasanya berlaku dalam aplikasi desktop Outlook. Satu atau lebih item dalam folder yang anda segerakkan tidak sepadan. Untuk menyelesaikan konflik, buka projek dan cuba operasi semula. Betulkan Satu atau lebih item dalam folder yang disegerakkan tidak sepadan dengan ralat Outlook Dalam versi desktop Outlook, anda mungkin menghadapi masalah apabila item kalendar tempatan bercanggah dengan salinan pelayan. Nasib baik, walaupun, terdapat beberapa cara mudah untuk membantu

Tajuk: Cara menyelesaikan masalah yang PyCharm tidak boleh dibuka ialah persekitaran pembangunan bersepadu Python yang berkuasa, tetapi kadangkala kita mungkin menghadapi masalah yang tidak dapat dibuka PyCharm. Dalam artikel ini, kami akan berkongsi beberapa penyelesaian biasa dan memberikan contoh kod khusus. Semoga ini membantu mereka yang menghadapi masalah ini. Kaedah 1: Kosongkan cache Kadangkala fail cache PyCharm boleh menyebabkan program gagal dibuka seperti biasa. Kami boleh cuba mengosongkan cache untuk menyelesaikan masalah ini. alat

Bagaimana untuk menyelesaikan masalah bahawa pintu masuk lalai hilang secara automatik Dalam masyarakat moden, Internet telah menjadi bahagian yang sangat diperlukan dalam kehidupan orang ramai. Sama ada untuk kerja atau hiburan, kita semua memerlukan sambungan rangkaian yang stabil untuk menyelesaikan pelbagai tugas. Gerbang lalai ialah salah satu elemen utama yang menghubungkan rangkaian tempatan ke Internet luaran. Walau bagaimanapun, kadangkala kita mungkin menghadapi masalah bahawa get laluan lalai hilang secara automatik, mengakibatkan ketidakupayaan untuk mengakses Internet. Jadi, bagaimanakah kita harus menyelesaikan masalah ini apabila gerbang lalai hilang? Pertama, kita harus menjelaskan konsep gerbang lalai. Gerbang lalai ialah laluan rangkaian
