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