ソース分析:redisのRDB持続化方式

1610 ワード

rdbスナップショットの保存には、saveとbgsaveの2つの方法があります.
同じ点:
スナップショット保存のためにrdbSave関数が呼び出されます.
相違点:
(1)SAVEはrdbSaveを直接呼び出し,保存が完了するまでRedisメインプロセスをブロックする.プライマリ・プロセスがブロックされている間、サーバはクライアントの要求を処理できません.(2)BGSAVEは、rdbSaveを呼び出し、保存が完了した後にメインプロセスに信号を送信し、保存が完了したことを通知するサブプロセスをforkが出力する.rdbSaveはサブプロセスで呼び出されるので、Redisサーバは、BGSAVEの実行中にクライアントの要求を処理し続けることができる.
次はbgsaveの適用シーンです.
1.redisのプロファイルはrdbを開くように設定でき、m秒でn回変更が発生した場合はrdbファイルの保存を行う.
redisサーバ起動後は主に時間イベントでserverCron関数を実行して条件チェックを行い、条件が満たされたらrdbファイル保存を行う.
        /* If there is not a background saving/rewrite in progress check if
         * we have to save/rewrite now */
         //      ,   RDB      
         for (j = 0; j < server.saveparamslen; j++) {
            struct saveparam *sp = server.saveparams+j;

            if (server.dirty >= sp->changes &&
                server.unixtime-server.lastsave > sp->seconds) {
                redisLog(REDIS_NOTICE,"%d changes in %d seconds. Saving...",
                    sp->changes, sp->seconds);
                rdbSaveBackground(server.rdb_filename);
                break;
            }
         }
注:赤い部分は以下の点を示しています.
(1)サブプロセスを開始することによりrdbファイルの生成と保存を行う.ファイルの保存中は、プライマリ・プロセスがブロックされずに正常にサービスを提供できます.
(2)生成されたrdbファイルは,サブプロセスが開始された時点でredisメモリデータのスナップショットであるため,aof方式のデータよりもファイル内容が古い.したがってrdbとaof方式の両方がオンの場合、aofファイルが優先的にロードされます.
(3)rdbはメモリスナップショットの完全な保存である.したがってrdbスナップショットの保存操作は頻繁に行うべきではない.
2.redisのプライマリ・スレーブ・レプリケーション・モードもbgsave方式を採用し、rdbスナップショットをスレーブ・サーバに送信してバックアップを行う.
ps:覚えやすいのは腐ったペンに及ばない!