3.redis実戦:redis自動バックアップとバックアップ管理


redis実戦:redis自動バックアップとバックアップ管理
redisを使用して複数のサービスを開始
実際の導入では、redisは複数のポートを開いてサービスを外部に提供する必要があります.異なる起動パラメータを設定するだけでなく、shellやpythonなどのスクリプトを使用して管理構成を行う必要があります.次に,実際の例を用いて,作業におけるredisに関する動作を紹介する.
必要:
1.複数のredisサービスを自動的に開く必要があります.2.redisを定期的にバックアップする必要がある.3.ディスクの容量を考慮して、バックアップの規模を1つの範囲に制限して、ディスクの容量が不足しないようにする必要があります.4.異なるredisサービスに対して、バックアップファイルもディレクトリ管理が必要である.
/dataディレクトリの下にredisサービスが存在するディレクトリとredisバックアップディレクトリを作成します.
[root@server1 data]# pwd
/data
[root@server1 data]# ls
redis-backup  redis-file

redis-fileでは、異なるポートをバインドし、異なるディレクトリ、バックアップファイル、pidファイルを指定する4つのredisサービスを開始しました.
[root@server1 redis-file]# ls
allredisrun.sh  redis_test1  redis_test2  redis_test3  redis_test4


[root@server1 redis-file]# cd redis_test1
[root@server1 redis_test1]# ls
redis.conf  redis-server  redis_test1.pid  redis_test1.rdb  run_redis_test1.sh

我々はredisでtest 1サービスの例では、起動スクリプトを表示できます.
[root@server1 redis_test1]# cat run_redis_test1.sh 
#!/bin/bash

rootdir=/data/redis-file/redis_test1

${rootdir}/redis-server ${rootdir}/redis.conf --port 6381 --dbfilename redis_test1.rdb --save 900 1000 -save 300 10000 --pidfile redis_test1.pid &

その他のredisサービスとredis_test 1は似ているので、総起動スクリプトを設定します.
[root@server1 redis-file]# cat allredisrun.sh 
#!/bin/bash

redis_root_dir="/data/redis-file"
bash="/bin/bash"

for i in `seq 1 4`
do
    cd ${redis_root_dir}/redis_test${i}
    ${bash} ${redis_root_dir}/redis_test${i}/run_redis_test${i}.sh
done

スクリプトを実行した後、サーバ上のredisサービスを表示します.
[root@server1 redis-file]# ps aux |grep redis
root      1602  0.1  0.5 133544  7864 pts/0    Sl   06:45   0:00 /data/redis-file/redis_test1/redis-server 192.168.1.8:6381                                                                                                                          
root      1604  0.1  0.5 133544  7868 pts/0    Sl   06:45   0:00 /data/redis-file/redis_test2/redis-server 192.168.1.8:6382                                                                                                                          
root      1606  0.1  0.5 133544  7868 pts/0    Sl   06:45   0:00 /data/redis-file/redis_test3/redis-server 192.168.1.8:6383                                                                                                                          
root      1612  0.0  0.5 133544  7868 pts/0    Sl   06:45   0:00 /data/redis-file/redis_test4/redis-server 192.168.1.8:6384                                                                                                                          
root      1619  0.0  0.0 103256   868 pts/0    S+   06:45   0:00 grep redis

複数のredisサービスバックアップ
サービスが正常に開始されると、/data/redis-backupの下で、スクリプトの内容を以下に示す自動バックアップスクリプトを設定する必要があります(redis_backup.py):
#encoding:utf-8

#!/usr/bin/env python

import os
import tarfile
import time

backupFrom="/data/redis-file"
backupTo="/data/redis-backup"

redisFileSuffix=(".rdb", ".aof")

sourceRedisFile={}
sourceRedisFilePath={}
targetBackupFolder={}

#      ,             
#0:don't create folder
#1:create folder every hour
#2:create folder every day
folderCut = 2

def now_time():
    return time.strftime("%Y%m%d%H%M", time.localtime(time.time()))


def mkdir(dirpath):
    if(os.path.exists(dirpath)):
        return 
    os.mkdir(dirpath)

def cutFolder(type):
    if type == 0:
        return 
    elif type == 1:
        return time.strftime("%Y%m%d", time.localtime(time.time()))    
    elif type == 2:
        return time.strftime("%Y%m%d%H", time.localtime(time.time()))    

#    
def compressFile(localPath, targetPath, filename):
    localfullPath = os.path.join(localPath, filename)
    targetfullPath = os.path.join(targetPath, filename + now_time() + ".tar.gz")
    tar = tarfile.open(targetfullPath, "w:gz")
    tar.add(localfullPath)
    tar.close()
    print ("compress file: %s ====> %s" % (localfullPath, targetfullPath))

def genRedisBackupFolder():
    mkdir(backupTo)
    for i in range(0, len(sourceRedisFile)):
        targetName = sourceRedisFile[i].split(".")[0]
        mkdir(os.path.join(backupTo, targetName))
        targetFolder = os.path.join(os.path.join(backupTo, targetName), cutFolder(folderCut))
        mkdir(targetFolder)
        targetBackupFolder[i] = targetFolder


#                
def findRedisFile():
    index = 0
    for parent, dirnames, filenames in os.walk(backupFrom):
        for filename in filenames:
            for suffix in redisFileSuffix:
                if suffix in filename:
                    sourceRedisFile[index] = filename
                    sourceRedisFilePath[index] = parent
                    index = index + 1

# redis         
def compressRedisFiles():
    if not (len(sourceRedisFilePath) == len(targetBackupFolder) and
            len(targetBackupFolder) == len(sourceRedisFile)):
        print "error occured in function compressRedisFiles()!"

    for i in range(0, len(sourceRedisFile)):
        compressFile(sourceRedisFilePath[i], targetBackupFolder[i], sourceRedisFile[i])

if __name__ == "__main__":
    print "================================begin backup redis file=================================="
    findRedisFile()
    genRedisBackupFolder()
    compressRedisFiles()
    print "=======================================finished=========================================="


このスクリプトを実行すると、バックアップ・ファイルがバックアップ・ディレクトリ(/data/redis-backup)にパッケージされていることがわかります.異なるサービスには独立したディレクトリがあります.
[root@server1 redis-backup]# python redis_backup.py 
================================begin backup redis file==================================
compress file: /data/redis-file/redis_test4/redis_test4.rdb ====> /data/redis-backup/redis_test4/2016071106/redis_test4.rdb201607110646.tar.gz
compress file: /data/redis-file/redis_test1/redis_test1.rdb ====> /data/redis-backup/redis_test1/2016071106/redis_test1.rdb201607110646.tar.gz
compress file: /data/redis-file/redis_test3/redis_test3.rdb ====> /data/redis-backup/redis_test3/2016071106/redis_test3.rdb201607110646.tar.gz
compress file: /data/redis-file/redis_test2/redis_test2.rdb ====> /data/redis-backup/redis_test2/2016071106/redis_test2.rdb201607110646.tar.gz
=======================================finished==========================================

バックアップを自動化するには、バックアップスクリプトの実行コマンドをcrontabに書き込み、タイミング実行の目的を達成する必要があります.
#     1  31      
[root@server1 redis-backup]# crontab -l
01,31 * * * * python /data/redis-backup/redis_backup.py

バックアップを継続する場合は、ディスクの容量も考慮する必要があります.これはzabbixサービスで監視し、ディスクの容量が一定パーセントに達したときに手動で削除することができます.これはlowを比較する方法で、スクリプトが自分で問題を発見できるようにするのが最善の方法です.そのため、別のスクリプトを作成してredisのバックアップファイルを定期的に削除する必要があります.最新のバックアップ情報のみを保持します.このスクリプトは、自分で書くことを望んでいます.