save 900 1 #当有一条Keys数据被改变时,900秒刷新到Disk一次 save 300 10 #当有10条Keys数据被改变时,300秒刷新到Disk一次 save 60 10000 #当有10000条Keys数据被改变时,60秒刷新到Disk一次
appendonly yes #启用AOF持久化方式 appendfilename appendonly.aof #AOF文件的名称,默认为appendonly.aof # appendfsync always #每次收到写命令就当即强制写入磁盘,是最有保证的彻底的持久化,但速度也是最慢的,通常不推荐使用。 appendfsync everysec #每秒钟强制写入磁盘一次,在性能和持久化方面作了很好的折中,是受推荐的方式。 # appendfsync no #彻底依赖OS的写入,通常为30秒左右一次,性能最好可是持久化最没有保证,不被推荐。
AOF的彻底持久化方式同时也带来了另外一个问题,持久化文件会变得愈来愈大。好比咱们调用INCR test命令100次,文件中就必须保存所有的100条命令,但其实99条都是多余的。由于要恢复数据库的状态其实文件中保存一条SET test 100就够了。为了压缩AOF的持久化文件,Redis提供了bgrewriteaof命令。收到此命令后Redis将使用与快照相似的方式将内存中的数据以命令的方式保存到临时文件中,最后替换原来的文件,以此来实现控制AOF文件的增加。因为是模拟快照的过程,所以在重写AOF文件时并无读取旧的AOF文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的AOF文件。对应的设置参数为:
# vim /opt/redis/etc/redis_6379.confgit
no-appendfsync-on-rewrite yes #在日志重写时,不进行命令追加操做,而只是将其放在缓冲区里,避免与命令的追加形成DISK IO上的冲突。 auto-aof-rewrite-percentage 100 #当前AOF文件大小是上第二天志重写获得AOF文件大小的二倍时,自动启动新的日志重写过程。 auto-aof-rewrite-min-size 64mb #当前AOF文件启动新的日志重写过程的最小值,避免刚刚启动Reids时因为文件尺寸较小致使频繁的重写。
#save 900 1 #禁用Snapshot #save 300 10 #save 60 10000 appendonly no #禁用AOF
接着,修改Slave上的以下配置:
# vim /opt/redis/etc/redis_6379.confredis
save 900 1 #启用Snapshot save 300 10 save 60 10000 appendonly yes #启用AOF appendfilename appendonly.aof #AOF文件的名称 # appendfsync always appendfsync everysec #每秒钟强制写入磁盘一次 # appendfsync no no-appendfsync-on-rewrite yes #在日志重写时,不进行命令追加操做 auto-aof-rewrite-percentage 100 #自动启动新的日志重写过程 auto-aof-rewrite-min-size 64mb #启动新的日志重写过程的最小值
# /etc/init.d/redis start
redis 127.0.0.1:6379> CONFIG GET save 1) "save" 2) ""
#!/bin/bash REDISCLI="redis-cli -a slavepass -n 1 SET" ID=1 while(($ID<50001)) do INSTANCE_NAME="i-2-$ID-VM" UUID=`cat /proc/sys/kernel/random/uuid` PRIVATE_IP_ADDRESS=10.`echo "$RANDOM % 255 + 1" | bc`.`echo "$RANDOM % 255 + 1" | bc`.`echo "$RANDOM % 255 + 1" | bc`\ CREATED=`date "+%Y-%m-%d %H:%M:%S"` $REDISCLI vm_instance:$ID:instance_name "$INSTANCE_NAME" $REDISCLI vm_instance:$ID:uuid "$UUID" $REDISCLI vm_instance:$ID:private_ip_address "$PRIVATE_IP_ADDRESS" $REDISCLI vm_instance:$ID:created "$CREATED" $REDISCLI vm_instance:$INSTANCE_NAME:id "$ID" ID=$(($ID+1)) done
接着执行该脚本数据库
# chmod 755 redis-cli-generate.temp.sh # ./redis-cli-generate.temp.sh
在数据的生成过程当中,能够很清楚的看到Master上仅在第一次作Slave同步时建立了dump.rdb文件,以后就经过增量传输命令的方式给Slave了。
dump.rdb文件没有再增大。vim
# ls -lh total 4.0K -rw-r--r-- 1 root root 10 Sep 27 00:40 dump.rdb
而Slave上则能够看到dump.rdb文件和AOF文件在不断的增大,而且AOF文件的增加速度明显大于dump.rdb文件。后端
# ls -lh total 24M -rw-r--r-- 1 root root 15M Sep 27 12:06 appendonly.aof -rw-r--r-- 1 root root 9.2M Sep 27 12:06 dump.rdb
等待数据插入完成之后,首先确认当前的数据量。api
redis 127.0.0.1:6379> info redis_version:2.4.17 redis_git_sha1:00000000 redis_git_dirty:0 arch_bits:64 multiplexing_api:epoll gcc_version:4.4.5 process_id:27623 run_id:e00757f7b2d6885fa9811540df9dfed39430b642 uptime_in_seconds:1541 uptime_in_days:0 lru_clock:650187 used_cpu_sys:69.28 used_cpu_user:7.67 used_cpu_sys_children:0.00 used_cpu_user_children:0.00 connected_clients:1 connected_slaves:1 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 used_memory:33055824 used_memory_human:31.52M used_memory_rss:34717696 used_memory_peak:33055800 used_memory_peak_human:31.52M mem_fragmentation_ratio:1.05 mem_allocator:jemalloc-3.0.0 loading:0 aof_enabled:0 changes_since_last_save:250000 bgsave_in_progress:0 last_save_time:1348677645 bgrewriteaof_in_progress:0 total_connections_received:250007 total_commands_processed:750019 expired_keys:0 evicted_keys:0 keyspace_hits:0 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:246 vm_enabled:0 role:master slave0:10.6.1.144,6379,online db1:keys=250000,expires=0
当前的数据量为25万条key,占用内存31.52M。而后直接Kill掉Master的Redis进程,模拟灾难。缓存
# killall -9 redis-server
接着到Slave中查看状态:安全
redis 127.0.0.1:6379> info redis_version:2.4.17 redis_git_sha1:00000000 redis_git_dirty:0 arch_bits:64 multiplexing_api:epoll gcc_version:4.4.5 process_id:13003 run_id:9b8b398fc63a26d160bf58df90cf437acce1d364 uptime_in_seconds:1627 uptime_in_days:0 lru_clock:654181 used_cpu_sys:29.69 used_cpu_user:1.21 used_cpu_sys_children:1.70 used_cpu_user_children:1.23 connected_clients:1 connected_slaves:0 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 used_memory:33047696 used_memory_human:31.52M used_memory_rss:34775040 used_memory_peak:33064400 used_memory_peak_human:31.53M mem_fragmentation_ratio:1.05 mem_allocator:jemalloc-3.0.0 loading:0 aof_enabled:1 changes_since_last_save:3308 bgsave_in_progress:0 last_save_time:1348718951 bgrewriteaof_in_progress:0 total_connections_received:4 total_commands_processed:250308 expired_keys:0 evicted_keys:0 keyspace_hits:0 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:694 vm_enabled:0 role:slave aof_current_size:17908619 aof_base_size:16787337 aof_pending_rewrite:0 aof_buffer_length:0 aof_pending_bio_fsync:0 master_host:10.6.1.143 master_port:6379 master_link_status:down master_last_io_seconds_ago:-1 master_sync_in_progress:0 master_link_down_since_seconds:25 slave_priority:100 db1:keys=250000,expires=0
能够看到master_link_status的状态已是down了,Master已经不可访问了。而此时,Slave依然运行良好,而且保留有AOF与RDB文件。下面将经过Slave上保存好的AOF与RDB文件来恢复Master上的数据。首先,将Slave上的同步状态取消,避免主库在未完成数据恢复前就重启,进而直接覆盖掉从库上的数据,致使全部的数据丢失。bash
redis 127.0.0.1:6379> SLAVEOF NO ONE OK
确认一下已经没有了master相关的配置信息:服务器
redis 127.0.0.1:6379> INFO redis_version:2.4.17 redis_git_sha1:00000000 redis_git_dirty:0 arch_bits:64 multiplexing_api:epoll gcc_version:4.4.5 process_id:13003 run_id:9b8b398fc63a26d160bf58df90cf437acce1d364 uptime_in_seconds:1961 uptime_in_days:0 lru_clock:654215 used_cpu_sys:29.98 used_cpu_user:1.22 used_cpu_sys_children:1.76 used_cpu_user_children:1.42 connected_clients:1 connected_slaves:0 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 used_memory:33047696 used_memory_human:31.52M used_memory_rss:34779136 used_memory_peak:33064400 used_memory_peak_human:31.53M mem_fragmentation_ratio:1.05 mem_allocator:jemalloc-3.0.0 loading:0 aof_enabled:1 changes_since_last_save:0 bgsave_in_progress:0 last_save_time:1348719252 bgrewriteaof_in_progress:0 total_connections_received:4 total_commands_processed:250311 expired_keys:0 evicted_keys:0 keyspace_hits:0 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:1119 vm_enabled:0 role:master aof_current_size:17908619 aof_base_size:16787337 aof_pending_rewrite:0 aof_buffer_length:0 aof_pending_bio_fsync:0 db1:keys=250000,expires=0
在Slave上复制数据文件:
# tar cvf /home/kevin/data.tar * appendonly.aof dump.rdb
将data.tar上传到Master上,尝试恢复数据:能够看到Master目录下有一个初始化Slave的数据文件,很小,将其删除。
#ls -l total 4 -rw-r--r-- 1 root root 10 Sep 27 00:40 dump.rdb # rm -f dump.rdb
而后解压缩数据文件:
# tar xf /home/kevin/data.tar # ls -lh total 29M -rw-r--r-- 1 root root 18M Sep 27 01:22 appendonly.aof -rw-r--r-- 1 root root 12M Sep 27 01:22 dump.rdb
启动Master上的Redis
# /etc/init.d/redis start
查看数据是否恢复:
redis 127.0.0.1:6379> INFO redis_version:2.4.17 redis_git_sha1:00000000 redis_git_dirty:0 arch_bits:64 multiplexing_api:epoll gcc_version:4.4.5 process_id:16959 run_id:6e5ba6c053583414e75353b283597ea404494926 uptime_in_seconds:22 uptime_in_days:0 lru_clock:650292 used_cpu_sys:0.18 used_cpu_user:0.20 used_cpu_sys_children:0.00 used_cpu_user_children:0.00 connected_clients:1 connected_slaves:0 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 used_memory:33047216 used_memory_human:31.52M used_memory_rss:34623488 used_memory_peak:33047192 used_memory_peak_human:31.52M mem_fragmentation_ratio:1.05 mem_allocator:jemalloc-3.0.0 loading:0 aof_enabled:0 changes_since_last_save:0 bgsave_in_progress:0 last_save_time:1348680180 bgrewriteaof_in_progress:0 total_connections_received:1 total_commands_processed:1 expired_keys:0 evicted_keys:0 keyspace_hits:0 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:0 vm_enabled:0 role:master db1:keys=250000,expires=0
能够看到25万条数据已经完整恢复到了Master上。此时,能够放心的恢复Slave的同步设置了。
redis 127.0.0.1:6379> SLAVEOF 192.168.10.10 6379 OK
查看同步状态:
redis 127.0.0.1:6379> INFO redis_version:2.4.17 redis_git_sha1:00000000 redis_git_dirty:0 arch_bits:64 multiplexing_api:epoll gcc_version:4.4.5 process_id:13003 run_id:9b8b398fc63a26d160bf58df90cf437acce1d364 uptime_in_seconds:2652 uptime_in_days:0 lru_clock:654284 used_cpu_sys:30.01 used_cpu_user:2.12 used_cpu_sys_children:1.76 used_cpu_user_children:1.42 connected_clients:2 connected_slaves:0 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 used_memory:33056288 used_memory_human:31.52M used_memory_rss:34766848 used_memory_peak:33064400 used_memory_peak_human:31.53M mem_fragmentation_ratio:1.05 mem_allocator:jemalloc-3.0.0 loading:0 aof_enabled:1 changes_since_last_save:0 bgsave_in_progress:0 last_save_time:1348719252 bgrewriteaof_in_progress:1 total_connections_received:6 total_commands_processed:250313 expired_keys:0 evicted_keys:0 keyspace_hits:0 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:12217 vm_enabled:0 role:slave aof_current_size:17908619 aof_base_size:16787337 aof_pending_rewrite:0 aof_buffer_length:0 aof_pending_bio_fsync:0 master_host:10.6.1.143 master_port:6379 master_link_status:up master_last_io_seconds_ago:0 master_sync_in_progress:0 slave_priority:100 db1:keys=250000,expires=0