Bagaimana sebenarnya kegigihan Redis RDB bekerja di balik layar?

saya sedang mengalami kegigihan Redis RDB. Saya memiliki keraguan mengenai kegigihan RDB terkait dengan kelemahannya.

Pemahaman Sejauh Ini:

Kita harus menggunakan persistensi rdb ketika kita perlu menyimpan snapshot dari kumpulan data yang saat ini ada di memori pada interval tertentu.

Saya dapat memahami bahwa dengan cara ini kami dapat kehilangan beberapa data jika server rusak. Tetapi kelemahan lain yang saya tidak mengerti adalah bagaimana fork dapat memakan waktu lama ketika mempertahankan kumpulan data besar menggunakan rdb.

Mengutip dari Dokumentasi

RDB perlu melakukan fork() sesering mungkin agar dapat bertahan di disk menggunakan proses anak. Fork() dapat memakan waktu jika kumpulan datanya besar, dan dapat menyebabkan Redis berhenti melayani klien selama beberapa milidetik atau bahkan satu detik jika kumpulan datanya sangat besar dan kinerja CPU tidak bagus. AOF juga perlu melakukan fork() tetapi Anda dapat menyesuaikan seberapa sering Anda ingin menulis ulang log tanpa mengorbankan daya tahan.

Saya tahu cara kerja fork sesuai pengetahuan saya. Ketika proses induk melakukan fork, ia membuat proses Anak baru dan kami dapat mengizinkan beberapa kode yang akan dieksekusi oleh proses anak berdasarkan pidnya atau kami dapat menyediakan beberapa executable baru yang akan berfungsi menggunakan exec( ) panggilan sistem.

Tetapi hal-hal yang saya tidak mengerti betapa beratnya tugas ketika ukuran kumpulan data lebih besar?

Saya rasa saya tahu jawabannya tetapi saya tidak yakin tentang itu

Dikutip dari tautan ini https://www.bottomupcs.com/fork_and_exec.xhtml

Ketika suatu proses memanggil fork, maka

sistem operasi akan membuat proses baru yang sama persis dengan proses induknya. Ini berarti semua status yang dibicarakan sebelumnya disalin, termasuk file yang terbuka, status register, dan semua alokasi memori, termasuk kode program.

Sesuai pernyataan di atas, seluruh kumpulan data redis akan disalin ke anak.

Apakah aku paham betul?


person Thinker    schedule 06.10.2017    source sumber
comment
Secara pribadi saya lebih memilih metode AOF, metode ini lebih tahan lama dan cepat. Menurut pengalaman saya, kedua metode tersebut memerlukan memori x2 tetapi metode RDB memerlukan lebih banyak IO hingga HD, jadi jika DB Anda besar maka akan memakan waktu...   -  person h0x91B    schedule 06.10.2017
comment
Saya telah menjawab mengapa fork bisa lambat, dan mengapa penyimpanan rdb bisa lambat, tetapi Anda mungkin ingin membuat pertanyaan Anda lebih spesifik dan tidak bertele-tele, dan memperbarui judul pertanyaan Anda.   -  person nnog    schedule 06.10.2017


Jawaban (1)


Ketika fork standar dipanggil dengan copy-on-write, OS harus tetap menyalin semua entri tabel halaman, yang dapat memakan waktu lama jika Anda memiliki halaman 4k kecil dan kumpulan data yang besar, inilah yang membuat waktu fork() sebenarnya lambat.

Anda juga dapat menemukan banyak waktu dan memori diperlukan jika kumpulan data Anda banyak berubah dalam cara yang jarang, karena semantik copy-on-write memicu halaman memori sebenarnya untuk disalin saat perubahan dilakukan pada aslinya. Redis juga melakukan pengulangan bertahap dan mempertahankan masa berlaku, dll. sehingga instance yang lebih aktif biasanya membutuhkan waktu lebih lama untuk disimpan ke disk.

Bacaan lebih lanjut:

Forking proses besar yang lebih cepat di Linux?

http://kirkwylie.blogspot.co.uk/2008/11/linux-fork-Performance-redux-large.html

person nnog    schedule 06.10.2017