アプリケーション開発ポータルサイト
ServerNote.NET
カテゴリー【RedisDebian
【Redisメモ・2】基礎設定、バックアップ、リストア
POSTED BY
2023-05-01

【Redisメモ・1】インストール、CLI、C言語からのアクセス

【メモリの設定】

Redisはオンメモリで動作するため、使用するメモリ量の設定をする。

/etc/redis/redis.conf

# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes

# maxmemory <bytes>
</bytes>

デフォルトではコメントアウトされている=物理メモリ最大まで使おうとすると思われる?ので、とりあえず物理メモリの半分ほど使う設定にする。

マシンのメモリ量確認
dmesg | grep Memory
[    0.126563] Memory: 3340408K/3605636K available (10252K kernel code, 1241K rwdata, 3320K rodata, 1592K init, 2276K bss, 265228K reserved, 0K cma-reserved)
[    0.609431] x86/mm: Memory block size: 128MB

↑3Gほどあるとのことなので、

maxmemory 1500mb

と、1.5GB使う設定。

続いて、データがこのメモリ量の上限に達した場合の振る舞いを決める。

# volatile-lru -> Evict using approximated LRU among the keys with an expire set.
# allkeys-lru -> Evict any key using approximated LRU.
# volatile-lfu -> Evict using approximated LFU among the keys with an expire set.
# allkeys-lfu -> Evict any key using approximated LFU.
# volatile-random -> Remove a random key among the ones with an expire set.
# allkeys-random -> Remove a random key, any key.
# volatile-ttl -> Remove the key with the nearest expire time (minor TTL)
# noeviction -> Don't evict anything, just return an error on write operations.

# maxmemory-policy noeviction

デフォルトはnoenviction=上限に達したら書き込みエラーを返して登録しない設定。

allkeys-lru は、未使用の時間が最も長いキーを削除して新しいものを登録する設定。
しかしこれは、「最近たまたま1回アクセスされたが通常ほとんど使用されないキーは生き残る」という紛れがある。対して、

allkeys-lfu は、使用頻度の統計を取った上で、最も不要と判断されたキーが削除される(らしい)。このアルゴリズムのデフォルトチューニング。

# lfu-log-factor 10
# lfu-decay-time 1

【データのファイルバックアップとリストア】

Redisはオンメモリのため、終了すると当然ながら、データはすべて消える
それだと困るので、デフォルトではメモリの内容を定期的にファイルに保存する設定となっている。

save 900 1 # 900秒間に1回変更があったらバックアップ
save 300 10 # 300秒間に10回変更があったらバックアップ
save 60 10000 # 60秒間に10000回変更があったらバックアップ

このようなオートバックアップは不要もしくはredis-cliから手動で行いたい場合、

# save 900 1
# save 300 10
# save 60 10000

save ""

とする。

バックアップファイルはデフォルトで以下の場所設定になっている。必要なら適宜変更する。

# Note that you must specify a directory here, not a file name.
dir /var/lib/redis

# The filename where to dump the DB
dbfilename dump.rdb

Redisは起動時、上記場所にバックアップファイル(/var/lib/redis/dump.rdb)が存在したら、自動でロードして(自動リストア)、スタートする。このため、メモリに何もない状態からスタートさせたい=自動リストア不要=場合、このファイルを退避しておく。以下は、その動作を確認するオペレーション。

1、バックアップファイルの存在を確認

 ls -ltr /var/lib/redis/
total 4
-rw-rw---- 1 redis redis 182 Apr 30 15:57 dump.rdb

2、現在起動中のRedisのオンメモリデータ数の確認

redis-cli dbsize
(integer) 7

3、7つあるのが確認できたので、Redisを終了する。

/etc/init.d/redis-server stop

4、バックアップファイルを退避する(名前を変える)

cd /var/lib/redis
mv dump.rdb dump.rdb.org

5、この状態でRedisを起動する

/etc/init.d/redis-server start

6、ふたたびRedisのオンメモリデータ数の確認

redis-cli dbsize
(integer) 0

0(データ無し)が確認できた。4、でバックアップファイルを退避したため、起動時に読み込まれなかったことを確認。

7、今度は正常にバックアップを読み込む動作を確認するため、一旦終了させる。

/etc/init.d/redis-server stop

8、退避したバックアップファイルを元に戻す

cd /var/lib/redis
mv dump.rdb.org dump.rdb

9、Redisを起動する

/etc/init.d/redis-server start

10、Redisのオンメモリデータ数の確認

redis-cli dbsize
(integer) 7

データが7つに復帰している=dump.rdbから自動でリストアしたのを確認できた。

【手動バックアップ】

save ""

と設定している(オートバックアップoff)ときは適時、自分でバックアップする。

redis-cli
127.0.0.1:6379> save
OK

saveコマンドはその場で他の処理をすべて止めてdump.rdbを作るコマンド。終わるまで他のことはできない。

redis-cli
bgsave
Background saving started
...しばらく待って...
lastsave
(integer) 1588229824

bgsaveコマンドはバックグラウンドでdump.rdbの作成を開始し、他の処理ができる。
終わったかどうかはlastsaveコマンドで確認する。タイムスタンプが出力されれば完了している。

なお、手動リストアというのは無い模様。代わりに/etc/init.d/redis-server restart = 再起動が、リストアと等価である。

【AOF(Append Only file)方式を使用したバックアップ】

RDBスナップショットのほかにもう1つ、更新内容をファイルに蓄積していって、起動時リストアという方法=AOF方式もある。こちらのほうが、パフォーマンスは落ちるがリストアデータの信頼性は高くなる

これを使用するredis.confの設定は以下。

appendonly yes
appendfilename "appendonly.aof"

# appendfsync always
appendfsync everysec
# appendfsync no

appendonlyをyesとすることでこのバックアップが開始され、/var/lib/redis/appendonly.aofというファイルに変更内容が書き込まれていき、次回再起動時ここから復帰する。

appendfsyncは変更内容書き込みのファイル反映=Cで言うfflush関数=をいつ行うか、という設定。alwaysは毎更新ごとにfflush関数を呼ぶためパフォーマンスは著しく低くなる。everysecは1秒ごとにfflushを呼ぶ(デフォルト)。noはredisでfflushを呼ばずOSの気分に任せるという設定。

なお、redis起動時、dump.rdbとappendonly.aofのどちらも存在した場合appendonly.aofが優先されRDBは無視される。ただこれは起動時そうだというだけで、AOFモード時にRDBバックアップができない、という訳ではない。よって安全を取り、パフォーマンスはともあれ以下のように両方を有効にする設定もあり。

save 900 1
save 300 10
save 60 10000
appendonly yes

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

【キーワード検索】