redis는 메모리에 저장되고 일반 프로그래밍 언어에서 흔히 사용되는 데이터 구조 저장 유형을 제공하기 때문에 서버 충돌 시 데이터 복구 처리에 자주 사용됩니다.
서버는 특정 프로세스 중에 Redis에 저장해야 하는 데이터를 json 개체 형식으로 저장할 수 있습니다. 이를 우리는 종종 스냅샷이라고 부릅니다. 서버가 실행 중일 때 Redis를 읽어 데이터가 있는지 확인합니다. 비즈니스를 계속하려면 복원해야 합니다.
비즈니스 프로세스가 완료된 후 Redis 데이터를 삭제하면 됩니다.
redis는 데이터 백업을 위해 메모리 데이터를 하드 디스크로 내보내는 두 가지 방법을 제공합니다.
RDB 모드(기본값)
RDB 모드 지속성은 특정 조건이 충족되면 자동으로 메모리의 모든 데이터가 스냅샷됩니다. 그리고 하드디스크에 저장됩니다. 스냅샷을 찍기 위한 조건은 구성 파일에서 사용자가 사용자 정의할 수 있으며 시간과 변경된 키 수라는 두 가지 매개변수로 구성됩니다. 지정된 시간 내에 변경된 키 수가 지정된 값보다 클 경우 스냅샷이 생성됩니다. RDB는 redis에서 사용하는 기본 지속성 방법입니다. 구성 파일에는 세 가지 조건이 사전 설정되어 있습니다.
save 900 1 # 900초 내에 하나 이상의 키가 변경되면 스냅샷이 생성됩니다.
save 300 10 # 300 이내 초 10개 이상의 키가 변경된 경우 스냅샷이 생성됩니다
save 60 10000 # 60초 내에 10,000개 이상의 키가 변경된 경우 스냅샷이 생성됩니다
여러 조건이 있을 수 있으며, 조건 간의 "OR" 관계는 조건 중 하나가 충족되는 한 스냅샷이 생성됩니다. 자동 스냅샷을 비활성화하려면 모든 저장 매개변수를 삭제하면 됩니다.
Redis는 기본적으로 현재 디렉터리(CONFIG GET 디렉터리로 볼 수 있음)의 dump.rdb 파일에 스냅샷 파일을 저장합니다. dir 및 dbfilename을 구성하여 스냅샷 파일의 저장 경로와 파일 이름을 지정할 수 있습니다. 각각 매개변수.
스냅샷을 구현하는 Redis의 프로세스
Redis는 포크 기능을 사용하여 현재 프로세스(상위 프로세스)의 복사본(하위 프로세스)을 복사합니다.
상위 프로세스는 계속해서 클라이언트로부터 명령을 받고 처리합니다. 프로세스가 메모리 전송을 시작합니다. 데이터가 하드 디스크의 임시 파일에 기록됩니다.
하위 프로세스가 모든 데이터를 쓰면 이전 RDB 파일이 임시 파일로 대체되고 스냅샷 작업이 완료됩니다.
포크를 실행할 때 운영 체제(유닉스 계열 운영 체제)는 쓰기 중 복사 전략을 사용합니다. 즉, 상위 프로세스와 하위 프로세스는 포크 기능이 발생하는 순간 동일한 메모리 데이터를 공유합니다. 프로세스가 조각 중 하나를 변경하려고 합니다. 데이터가 검색되면(예: 쓰기 명령 실행) 운영 체제는 하위 프로세스의 데이터가 영향을 받지 않도록 조각의 데이터를 복사하므로 새 RDB 파일 포크가 실행되는 순간의 메모리 데이터를 저장합니다.
Redis는 스냅샷 프로세스 중에 RDB 파일을 수정하지 않습니다. 스냅샷이 완료된 후에만 이전 파일을 새 파일로 교체합니다. 즉, RDB 파일은 언제든지 완료됩니다. 이를 통해 RDB 파일을 정기적으로 백업하여 Redis 데이터베이스 백업을 구현할 수 있습니다. RDB 파일은 압축된 바이너리 형식(rdbcompression 매개변수는 CPU 사용량을 절약하기 위해 압축을 비활성화하도록 구성할 수 있음)이므로 차지하는 공간이 메모리의 데이터 크기보다 작으므로 전송이 더 쉽습니다.
자동 스냅샷 외에도 SAVE 또는 BGSAVE 명령을 수동으로 보내 Redis가 스냅샷을 수행하도록 할 수도 있습니다. 두 명령의 차이점은 전자는 기본 프로세스에 의해 수행되고 다른 요청을 차단한다는 것입니다. 하위 프로세스를 분기하여 수행됩니다. Redis가 시작된 후 RDB 스냅샷 파일을 읽고 하드 디스크의 데이터를 메모리로 로드합니다. 이 시간은 데이터의 크기와 구조, 서버 성능에 따라 달라집니다. 1천만 개의 문자열 유형 키를 메모리에 기록하는 1GB 스냅샷 파일을 로드하는 데 일반적으로 20~30초가 걸립니다. 지속성은 RDB를 통해 달성됩니다. Redis가 비정상적으로 종료되면 마지막 스냅샷 이후 변경된 모든 데이터는 손실됩니다. 이를 위해서는 개발자가 특정 애플리케이션 시나리오에 따라 자동 스냅샷 조건을 결합하고 설정하여 허용 가능한 범위 내에서 가능한 데이터 손실을 제어해야 합니다. 데이터가 너무 중요해서 손실을 감당할 수 없다면 지속성을 위해 AOF 방법을 사용하는 것을 고려해 볼 수 있습니다.
AOF 방법
기본적으로 Redis는 AOF(append only file) 지속성을 활성화하지 않습니다. redis.conf의appendonly 매개변수를 통해 활성화할 수 있습니다.
appendonly yes
시작할 때 Redis는 AOF 파일을 하나 실행합니다. AOF 지속성을 켠 후에는 Redis에서 데이터를 변경하는 명령이 실행될 때마다 명령을 작성합니다. 하드 디스크에서 AOF 파일을 입력합니다. AOF 파일의 저장 위치는 RDB 파일의 위치와 동일하며 둘 다 dir 매개변수를 통해 설정됩니다. 기본 파일 이름은appendonly.aof이며,appendfilename 매개변수를 통해 수정할 수 있습니다:
appendfilenameappendonly.aof
REDIS가 AOF 파일을 자동으로 다시 작성하도록 구성 조건
auto-aof-rewrite-percentage 100 # 현재 AOF 파일 크기가 마지막 다시 쓰기 중 AOF 파일 크기의 백분율을 초과하면 다시 다시 작성됩니다. 이전에 다시 작성되지 않았으므로 다시 작성됩니다. 시작 시 AOF 파일 크기는
auto-aof-rewrite-min-size 64mb # 다시 작성할 수 있는 최소 AOF 파일 크기입니다.
AOF 파일을 쓴 후 시스템이 하드 디스크 캐시를 새로 고쳐야 하는 메커니즘을 구성합니다.
# appendfsync Always # 쓰기가 수행될 때마다 동기화가 수행됩니다. 이는 가장 안전하고 가장 느립니다.
appendfsync Everysec # 동기화 실행 1초마다 작업
#appendfsync no # 활성 동기화 작업은 수행되지 않지만 완전히 운영 체제에 맡겨집니다(예: 30초마다 한 번). 이는 가장 빠르고 가장 안전하지 않습니다.
Redis에서는 AOF 및 RDB를 허용합니다. 동시에 열리므로 데이터 보안을 보장할 뿐만 아니라 백업도 가능합니다. 작업이 매우 쉽습니다. 이때 Redis를 다시 시작한 후 Redis는 AOF 파일을 사용하여 데이터를 복원합니다. AOF 지속성은 데이터 손실을 줄일 수 있기 때문입니다
redis = require('redis'),//导入js模块 RDS_PORT = , //端口号 RDS_HOST = '', //服务器IP RDS_OPTS = {}, //设置项 redisdb = redis.createClient(RDS_PORT, RDS_HOST, RDS_OPTS);//创建连接 redisdb.select(20);//指定分区库 redisdb.on('ready', function (res) { console.log('ready'); }); redisdb.on('connect', function () { console.log('connect'); }); exports.redisdb = redisdb; function redis_opt(opt, key, value, callback) { if (opt == 'get') { redisdb.get(key, function (err, data) { if (err == null) { callback(data); } else { callback(err); } }); } else if (opt == 'set') { redisdb.set(key,value, function (err,result) { if (err == null) { callback(result); } else { callback(err); } }); } else if (opt == 'del') { redisdb.del(key, function (err, result) { if (err == null) { callback(result); } else { callback(err); } }); } else { callback("error opt!"); } } function update(key) { redis_opt("get", key, null, function (data) { console.log("the redis data is " + data); if (data) { count = parseInt(data); redis_opt("set", key, ++count , function (data) { console.log("set " + count + " " + data); }); } else { redis_opt("set", key, 10000, function (data) { console.log("set " + 10000 + " " + data); }); } }); } function clear(key) { redis_opt("del", key, null, function (ret) { console.log("del " + key + " " + ret); }); } function main() { var key = "count_test"; setInterval(function () { clear(key) }, 5000); setInterval(function () { update(key) }, 1000); } //testmain(); main();
위 코드는 간단한 타이머 기능입니다. 즉, 서버가 시작된 후 정기적으로 redis 데이터를 읽습니다. . 존재하는 경우 수정사항이 누적되며, 존재하지 않는 경우에는 초기화됩니다. 동시에 설명의 편의를 위해 정기적으로 데이터를 삭제하도록 타이머가 설정됩니다.
더 많은 Redis 지식을 알고 싶다면 redis 입문 튜토리얼 칼럼을 주목해주세요.
위 내용은 Redis를 사용하여 서버 충돌로부터 데이터 복구의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!