Rumah >pangkalan data >Redis >Kuasai sepenuhnya kegigihan Redis: RDB dan AOF
Artikel ini membawa anda pengetahuan yang berkaitan tentang Redis, yang terutamanya memperkenalkan isu berkaitan tentang kegigihan, termasuk sebab kegigihan diperlukan, kegigihan RDB, kegigihan AOF, dll. Mari lihat kandungan di bawah I semoga ianya bermanfaat kepada semua.
Pembelajaran yang disyorkan: Tutorial video Redis
Redis mengendalikan data berdasarkan memori Apabila menghadapi situasi yang tidak dijangka seperti proses keluar dan masa henti pelayan, jika tiada mekanisme kegigihan, data dalam Redis akan hilang dan tidak boleh dipulihkan. Dengan mekanisme kegigihan, Redis boleh menggunakan fail yang berterusan sebelum ini untuk pemulihan data apabila ia dimulakan semula. Dua mekanisme kegigihan yang disokong oleh Redis:
RDB: menjana syot kilat data semasa dan menyimpannya pada cakera keras.
AOF: Rakam setiap operasi pada data ke cakera keras.
Tulis syot kilat set data dalam ingatan ke cakera dalam selang masa yang ditetapkan Apabila ia dipulihkan, fail syot kilat baca terus dalam ingatan. Kegigihan RDB (Redis DataBase) adalah untuk menjana gambar semua data semasa dalam Redis dan menyimpannya pada cakera keras. Kegigihan RDB boleh dicetuskan secara manual atau automatik.
Redis akan mencipta (fork) sub-proses yang berasingan untuk kegigihan Ia akan menulis data ke fail sementara Selepas proses kegigihan selesai, fail sementara ini akan digunakan untuk menggantikan kegigihan terakhir. Ok fail. Semasa keseluruhan proses, proses utama tidak melakukan sebarang operasi IO, yang memastikan prestasi yang sangat tinggi. Jika pemulihan data berskala besar diperlukan dan integriti pemulihan data tidak begitu sensitif, maka kaedah RDB adalah lebih cekap daripada kaedah AOF. Kelemahan RDB ialah data terakhir yang berterusan mungkin hilang.
save
dan Perintah bgsave
boleh mencetuskan kegigihan RDB secara manual.
save
save
secara manual akan mencetuskan kegigihan RDB, tetapi perintah save
akan menyekat perkhidmatan Redis sehingga kegigihan RDB selesai. Apabila perkhidmatan Redis menyimpan sejumlah besar data, ia akan menyebabkan kesesakan jangka panjang dan tidak disyorkan. bgsave
bgsave
juga akan mencetuskan kegigihan RDB secara manual Tidak seperti perintah save
, perkhidmatan Redis biasanya tidak menyekat. Proses Redis akan melakukan operasi garpu untuk mencipta proses anak Proses anak bertanggungjawab untuk kegigihan RDB dan tidak akan menyekat proses perkhidmatan Redis. Penyekatan perkhidmatan Redis hanya berlaku dalam fasa garpu, dan secara amnya masanya sangat singkat. Proses khusus perintah bgsave
adalah seperti berikut: bgsave
terlebih dahulu menentukan sama ada terdapat pada masa ini melaksanakan subrutin RDB atau AOF Utas, jika wujud, ditamatkan secara langsung. bgsave
tamat Mulai dari itu, proses Redis tidak akan disekat dan boleh bertindak balas kepada arahan lain. Selain pencetus manual dengan melaksanakan arahan di atas, kegigihan RDB boleh dicetuskan secara automatik di dalam Redis. Kegigihan RDB yang dicetuskan secara automatik menggunakan kaedah bgsave
untuk mengurangkan penyekatan proses Redis. Jadi, dalam keadaan apakah ia akan dicetuskan secara automatik?
save
dalam fail konfigurasi, seperti sava m n
, yang bermaksud apabila data diubah suai n kali dalam m saat, operasi bgsave
dicetuskan secara automatik . bgsave
dan menghantar fail RDB yang dijana ke nod hamba. Apabila debug reload
, operasi bgsave
juga akan dicetuskan secara automatik. shutdown
, jika kegigihan AOF tidak didayakan, operasi bgsave
akan dicetuskan secara automatik. Fail RDB ialah fail mampat binari padat, yang merupakan petikan semua data Redis pada masa tertentu. Oleh itu, kelajuan pemulihan data menggunakan RDB jauh lebih pantas daripada AOF, yang sangat sesuai untuk senario seperti sandaran, replikasi penuh dan pemulihan bencana.
Setiap kali operasi bgsave
dilakukan, operasi garpu mesti dilakukan untuk mencipta anak. Kos pelaksanaan yang kerap adalah terlalu tinggi. jadi ketekunan masa nyata tidak boleh dicapai, atau tahap ketekunan saat.
Selain itu, disebabkan oleh lelaran berterusan versi Redis, terdapat versi RDB dalam format yang berbeza, dan mungkin terdapat masalah bahawa format RDB versi lebih rendah tidak serasi dengan fail RDB versi lebih tinggi.
Tempoh syot kilat : Walaupun syot kilat memori boleh dilakukan oleh juruteknik yang melaksanakan perintah SAVE
atau BGSAVE
secara manual, Dalam kebanyakan persekitaran pengeluaran, syarat pelaksanaan berkala akan ditetapkan.
# 周期性执行条件的设置格式为 save <seconds> <changes> # 默认的设置为: save 900 1 save 300 10 save 60 10000 # 以下设置方式为关闭RDB快照功能 save ""</changes></seconds>
Maksud tiga tetapan maklumat lalai di atas ialah:
# 文件名称 dbfilename dump.rdb # 文件保存路径 dir ./ # 如果持久化出错,主进程是否停止写入 stop-writes-on-bgsave-error yes # 是否压缩 rdbcompression yes # 导入时是否检查 rdbchecksum yes
bgsave
子进程相互不影响。但是,如果主线程要修改一块数据(例如图中的键值对 C),那么,这块数据就会被复制一份,生成该数据的副本。然后,bgsave
子进程会把这个副本数据写入 RDB 文件,而在这个过程中,主线程仍然可以直接修改原来的数据。针对RDB不适合实时持久化的问题,Redis提供了AOF持久化方式来解决
AOF(Append Only File)持久化是把每次写命令追加写入日志中,当需要恢复数据时重新执行AOF文件中的命令就可以了。AOF解决了数据持久化的实时性,也是目前主流的Redis持久化方式。
Redis是“写后”日志,Redis先执行命令,把数据写入内存,然后才记录日志。日志里记录的是Redis收到的每一条命令,这些命令是以文本形式保存。PS: 大多数的数据库采用的是写前日志(WAL),例如MySQL,通过写前日志和两阶段提交,实现数据和逻辑的一致性。
而AOF日志采用写后日志,即先写内存,后写日志。
为什么采用写后日志?
Redis要求高性能,采用写日志有两方面好处:
但这种方式存在潜在风险:
AOF日志记录Redis的每个写命令,步骤分为:命令追加(append)、文件写入(write)和文件同步(sync)。
默认情况下,Redis是没有开启AOF的,可以通过配置redis.conf文件来开启AOF持久化,关于AOF的配置如下:
# appendonly参数开启AOF持久化 appendonly no # AOF持久化的文件名,默认是appendonly.aof appendfilename "appendonly.aof" # AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的 dir ./ # 同步策略 # appendfsync always appendfsync everysec # appendfsync no # aof重写期间是否同步 no-appendfsync-on-rewrite no # 重写触发配置 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb # 加载aof出错如何处理 aof-load-truncated yes # 文件重写策略 aof-rewrite-incremental-fsync yes
以下是Redis中关于AOF的主要配置信息:
appendfsync:这个参数项是AOF功能最重要的设置项之一,主要用于设置“真正执行”操作命令向AOF文件中同步的策略。
什么叫“真正执行”呢?还记得Linux操作系统对磁盘设备的操作方式吗? 为了保证操作系统中I/O队列的操作效率,应用程序提交的I/O操作请求一般是被放置在linux Page Cache中的,然后再由Linux操作系统中的策略自行决定正在写到磁盘上的时机。而Redis中有一个fsync()函数,可以将Page Cache中待写的数据真正写入到物理设备上,而缺点是频繁调用这个fsync()函数干预操作系统的既定策略,可能导致I/O卡顿的现象频繁 。
与上节对应,appendfsync参数项可以设置三个值,分别是:always、everysec、no,默认的值为everysec。
no-appendfsync-on-rewrite:always和everysec的设置会使真正的I/O操作高频度的出现,甚至会出现长时间的卡顿情况,这个问题出现在操作系统层面上,所有靠工作在操作系统之上的Redis是没法解决的。为了尽量缓解这个情况,Redis提供了这个设置项,保证在完成fsync函数调用时,不会将这段时间内发生的命令操作放入操作系统的Page Cache(这段时间Redis还在接受客户端的各种写操作命令)。
auto-aof-rewrite-percentage: Seperti yang dinyatakan di atas, dalam persekitaran pengeluaran, adalah mustahil untuk juruteknik menggunakan perintah "BGREWRITEAOF
" untuk menulis semula fail AOF bila-bila masa dan di mana sahaja. Jadi lebih kerap kita perlu bergantung pada strategi penulisan semula automatik fail AOF dalam Redis. Redis menyediakan dua tetapan untuk mencetuskan penulisan semula automatik fail AOF:
auto-aof-rewrite-percentage bermakna jika saiz fail AOF semasa melebihi masa terakhir Selepas menulis semula a peratusan tertentu fail AOF, mula menulis semula fail AOF sekali lagi. Sebagai contoh, nilai tetapan lalai bagi nilai parameter ini ialah 100, yang bermaksud bahawa jika saiz fail AOF melebihi 1 kali saiz penulisan semula fail AOF terakhir, operasi tulis semula akan dimulakan.
auto-aof-rewrite-min-size: Item tetapan menunjukkan saiz minimum fail AOF untuk memulakan operasi menulis semula fail AOF. Jika saiz fail AOF lebih rendah daripada nilai ini, operasi tulis semula tidak akan dicetuskan. Ambil perhatian bahawa auto-aof-rewrite-percentage dan auto-aof-rewrite-min-size hanya digunakan untuk mengawal penulisan semula automatik fail AOF dalam Redis Jika juruteknik memanggil perintah "BGREWRITEAOF
" secara manual, ia tidak akan Tertakluk kepada dua kekangan ini.
AOF akan merekodkan setiap arahan tulis ke fail AOF seiring dengan berlalunya masa, fail AOF akan menjadi lebih besar. Jika tidak dikawal, ia akan menjejaskan pelayan Redis dan juga sistem pengendalian Selain itu, lebih besar fail AOF, semakin perlahan pemulihan data. Untuk menyelesaikan masalah pengembangan saiz fail AOF, Redis menyediakan mekanisme penulisan semula fail AOF untuk "mengurangkan" fail AOF.
Ilustrasi yang menerangkan penulisan semula AOF
Adakah AOF akan menulis semula menyekat?
Proses penulisan semula AOF diselesaikan dengan proses latar belakang bgrewriteaof. Benang utama bercabang daripada proses anak bgrewriteaof di latar belakang Garpu akan menyalin memori utas utama ke proses anak bgrewriteaof, yang mengandungi data terkini pangkalan data. Kemudian, sub-proses bgrewriteaof boleh menulis data yang disalin ke dalam operasi satu demi satu dan merekodkannya dalam log tulis semula tanpa menjejaskan utas utama. Oleh itu, apabila aof ditulis semula, ia akan menyekat benang utama apabila memotong proses.
Bilakah log AOF akan ditulis semula?
Terdapat dua item konfigurasi untuk mengawal pencetus penulisan semula AOF:
auto-aof-rewrite-min-size: Menunjukkan saiz minimum fail semasa menjalankan AOF menulis semula , lalai ialah 64MB.
auto-aof-rewrite-percentage: Nilai ini dikira sebagai perbezaan antara saiz fail aof semasa dan saiz fail aof selepas penulisan semula terakhir, dibahagikan dengan saiz fail aof selepas penulisan semula terakhir saiz. Iaitu, saiz tambahan fail aof semasa berbanding dengan fail aof selepas penulisan semula terakhir, dan nisbah saiz fail aof selepas penulisan semula terakhir.
Apakah yang berlaku apabila data baharu ditulis semasa menulis semula log?
Proses penulisan semula diringkaskan sebagai: "Satu salinan, dua log". Apabila keluar daripada proses kanak-kanak, dan apabila menulis semula, jika data baharu ditulis, utas utama akan merekodkan arahan ke dalam dua penimbal memori log aof. Jika dasar tulis balik AOF dikonfigurasikan untuk sentiasa, arahan akan ditulis kembali ke fail log lama dan salinan arahan akan disimpan dalam penimbal tulis semula AOF Operasi ini tidak akan memberi kesan kepada fail log baharu. (Fail log lama: fail log yang digunakan oleh utas utama, fail log baharu: fail log yang digunakan oleh proses bgrewriteaof)
Selepas proses anak bgrewriteaof menyelesaikan operasi penulisan semula fail log, ia akan menggesa bahawa benang utama mempunyai Selepas menyelesaikan operasi tulis semula, utas utama akan menambahkan arahan dalam penimbal tulis semula AOF ke penghujung fail log baharu. Pada masa ini, dalam keadaan konkurensi yang tinggi, pengumpulan penimbal tulis semula AOF mungkin sangat besar, yang akan menyebabkan penyekatan kemudiannya Redis menggunakan teknologi saluran paip Linux untuk membenarkan main balik serentak semasa penulisan semula AOF, supaya selepas penulisan semula AOF selesai, hanya A. sejumlah kecil data yang tinggal perlu dimainkan semula. Akhir sekali, keatoman penukaran fail dipastikan dengan mengubah suai nama fail.
Jika masa henti berlaku semasa AOF menulis semula log, kerana fail log belum ditukar, fail log lama masih akan digunakan semasa memulihkan data.
Kendalian ringkasan:
Peringatan hangat
Proses dan benang di sini Konsepnya agak mengelirukan. Kerana proses bgreweiteaof latar belakang hanya mempunyai satu utas yang beroperasi, dan utas utama ialah proses pengendalian Redis, yang juga merupakan satu utas. Apa yang saya ingin nyatakan di sini ialah selepas proses utama Redis memotong proses latar belakang, operasi proses latar belakang tidak ada kaitan dengan proses utama, dan tidak akan menyekat utas utama
Bagaimanakah benang utama menghalang proses kanak-kanak dan menyalin data memori?
Fork menggunakan mekanisme copy on write yang disediakan oleh sistem pengendalian untuk mengelak daripada menyalin sejumlah besar data memori sekaligus dan menyekat proses kanak-kanak. Apabila memotong proses anak, proses anak akan menyalin jadual halaman proses induk, iaitu hubungan pemetaan maya dan sebenar (jadual indeks pemetaan antara ingatan maya dan ingatan fizikal), tetapi bukan ingatan fizikal. Salinan ini akan menggunakan banyak sumber CPU, dan utas utama akan disekat sebelum salinan selesai Masa menyekat bergantung pada jumlah data dalam memori Semakin besar jumlah data, semakin besar jadual halaman memori. Selepas salinan selesai, proses ibu bapa dan anak menggunakan ruang alamat memori yang sama.
Tetapi proses utama boleh menulis data, dan pada masa ini data dalam memori fizikal akan disalin. Seperti yang ditunjukkan di bawah (proses 1 dianggap sebagai proses utama, proses 2 dianggap sebagai proses kanak-kanak):
Apabila proses utama mempunyai data yang ditulis, dan data ini berada di halaman c, sistem pengendalian akan Mencipta salinan halaman ini (salinan halaman c), iaitu menyalin data fizikal halaman semasa dan memetakannya ke proses utama, sementara proses anak masih menggunakan halaman asal c.
Di manakah urutan utama akan disekat semasa keseluruhan proses menulis semula log?
Mengapakah penulisan semula AOF tidak menggunakan semula log AOF asal?
Redis 4.0 mencadangkan kaedah penggunaan campuran log AOF dan syot kilat memori. Ringkasnya, syot kilat memori dilaksanakan pada frekuensi tertentu, dan antara dua syot kilat, log AOF digunakan untuk merekod semua operasi arahan dalam tempoh ini.
Dengan cara ini, syot kilat tidak perlu dilaksanakan dengan kerap sekali, yang mengelakkan kesan garpu yang kerap pada utas utama. Selain itu, log AOF hanya merekodkan operasi antara dua syot kilat, yang bermaksud bahawa tidak perlu merekodkan semua operasi Oleh itu, fail tidak akan terlalu besar dan overhed menulis semula boleh dielakkan.
Seperti yang ditunjukkan dalam rajah di bawah, pengubahsuaian pada T1 dan T2 direkodkan dalam log AOF Apabila syot kilat penuh kedua diambil, log AOF boleh dikosongkan, kerana semua pengubahsuaian pada masa ini telah direkodkan. dalam petikan , log tidak akan digunakan lagi semasa pemulihan.
Kaedah ini bukan sahaja boleh menikmati faedah pemulihan pantas fail RDB, tetapi juga menikmati kelebihan mudah AOF hanya merakam arahan operasi Ia digunakan secara meluas dalam persekitaran sebenar.
Sekarang sandaran dan ketekunan data selesai, bagaimanakah kita memulihkan data daripada fail berterusan ini? Jika terdapat kedua-dua fail RDB dan fail AOF pada pelayan, yang manakah harus dimuatkan?
Malah, jika anda ingin memulihkan data daripada fail ini, anda hanya perlu memulakan semula Redis. Kami masih memahami proses ini melalui rajah:
Pembelajaran yang disyorkan: Tutorial video Redis
Atas ialah kandungan terperinci Kuasai sepenuhnya kegigihan Redis: RDB dan AOF. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!