天天看點

redis實戰-資料安全與性能保障

持久化

資料存儲于硬碟

主從:通過從伺服器儲存和持久化,如monogodb的replication set配置

日志:操作生成日志并通過日志來恢複資料,mysql的主從複制

将記憶體中的資料存儲到硬碟主要是為了之後重用資料,或者為了防止系統故障而将資料備份到遠端位置,

RDB快照持久化

快照持久化:将存在某一時刻的所有資料寫入硬碟裡面。可以做資料備份,拷貝到其他伺服器上可以達到資料同步。快照寫入dbfilename filename

dir 指定AOF和rdb公用的目錄。

持久化選項:

每隔幾分鐘幾次進行操作,
save 60 1000
在寫入rdb檔案的時候發生錯誤就停止寫入,比如磁盤寫滿導緻寫入錯誤。
stop-writes-on-bgsave-error no
是否進行壓縮
rdbcompression yes
rdb儲存的檔案
dbfilename dump.rdb
存放rdb的目錄
dir ./
存儲和加載RDB檔案時候校驗。
rdbchecksum yes


寫入RDB檔案的條件,如果滿足條件進行寫入RDB檔案。可以将寫入條件注釋掉,RDB就禁止寫入
save 900 1如果在900s有一個change時寫入rdb
save 300 10如果在300s有10個change是寫入rdb
save 60 10000 如果在60s有10000個change時寫入rdb
           

RDB導出原理:

主程序:redis-server處理用戶端請求,在rdb進行導出的時候同時redis-server還能響應用戶端請求。

bgsave子程序:rdb導出程序,bgsave程序進行導出,主程序開辟一個子程序。

save指令阻塞redis伺服器程序,直到RDB檔案建立完畢,在阻塞期間不接受任何請求。
           

RDB檔案載入工作是在伺服器啟動的時候自動執行的,沒有專門的用于載入RDB檔案的指令。

執行10000條指令
[root@localhost bin]# ./redis-benchmark -n 10000           

注意:如果沒有達到RDB儲存條件,斷電就會導緻部分資料來不及存儲到RDB檔案中。這個在商業系統中是不能出現的,新增一個AOF來進行彌補

個人開發注意點:

把開發環境的設定盡量貼近生産環境,有助于判斷快照是否生成得過于頻繁或者稀少。
(頻繁浪費資源,稀少可能導緻資料大量丢失)
根據實際情況來設定save儲存條件。
           

大資料時注意的點

AOF日志持久性

AOF:append only file追加到檔案,通過儲存redis伺服器所執行的寫指令來記錄資料庫狀态。會影響一定效率的redis請求。這個根據實際應用場景來決定是否開啟。

相關指令:

appendonly no是否打開AOF日志功能
appendfilename /var/rdb/appendonly.aof指定aof存放路徑檔案名。
appendfsync always 每一個指令立即同步到aof,安全,但是速度慢。
appendfsync everysec 折中方案,每秒寫一次。
appendfsync no寫入工作交給作業系統,由作業系統判斷緩沖區大小,統一寫入到aof同步頻率低,速度快。

no-appendfsync-on-rewrite yes正在導出rdb快照的過程中,要不要停止同步aof,如果選擇停止AOF,避免I/O頻繁操作。
如果暫停aof,所有的操作會緩存在記憶體隊列裡面,dump完成後,統一寫入aof。
auto-aof-rewrite-percentage 100 aof檔案大小比起上次重寫時的大小,增長率100%時候,重寫。
auto-aof-rewrite-min-size 64mb aof檔案至少超過64M時候,重寫。
           

持久化注意點

恢複rdb和AOF,rdb恢複的是比較快的。rdb資料是記憶體的映射直接載入記憶體比較快。
AOF使用的是指令,需要時間。
如果aof和rdb同時存在的話,會使用aof進行恢複。
           

redis主從複制

單點故障的防護,搭建叢集,主從備份,防止主機當機。讀寫分離,分擔主伺服器的壓力,任務分類,如讓從伺服器分别分擔備份工作與計算工作。

星型結構

master---->slave1
   |
   |
   slave2
           

線型結構

master---->slave1----->slave2
           

主從通訊過程

1、slave主動發起請求建立連接配接master
2、master直接dump rdb檔案傳輸給slave,同時緩存aof
3、等slave恢複完rdb檔案的時候,master便發送緩存的aof給slave使得資料達到同步。
4、replicationfeedslaves,master一旦發生變動就通知slave。
           

實驗配置過程

在同一台伺服器上配置不同的端口運作三個redis伺服器,并配置不一樣的配置啟動檔案。采用實驗結構星型結構,伺服器6379作為master

1、配置從伺服器: 跑在6380端口

複制配置檔案,修改配置端口資訊
[[email protected] bin]# ls
redis6381.conf  redis6380.conf   redis.conf  

修改從伺服器配置檔案:
[[email protected] bin]# vi redis6380.conf

修改端口
port 6380

修改pid,程序檔案。
pidfile /var/run/redis_6380.pid

開啟rdb,直接在從伺服器上進行rdb備份,主伺服器就關閉rdb
dbfilename dump6380.rdb


設定slave:
設定主機的IP位址和端口
slaveof 127.0.0.1 6379


配置另一台從伺服器6381
關閉rdb,注釋save
關閉aof,appendonley no

           

注意:主伺服器可以關閉RDB快照,開啟aof,備份工作可以交給slave從伺服器。分擔主伺服器壓力

從伺服器配置連接配接主伺服器密碼:masterauth password配置主伺服器的密碼。

配置主伺服器密碼:

requirepass password設定主伺服器密碼

用戶端進去需要進行auth password進行連接配接。

缺陷:

如果每次slave斷開後,無論是主動斷開還是網絡故障,
再連接配接master,都要master全部dump出來RDB,再AOF,即同步的過程都要執行一遍。

是以要記住,多台slave不要一下子啟動起來,會使得主伺服器I/O飙升。甚至當機。
           

運維相關指令

TIME 檢視時間戳與微秒數
DBSIZE 檢視目前庫中的key數量
BGREWRITEAOF 背景程序重寫AOF
BGSAVE       背景儲存rdb快照
SAVE         儲存rdb快照
LASTSAVE     上次儲存時間
SLAVEOF      設為slave伺服器
FLUSHALL     清空所有db
FLUSHDB      清空目前db
SHUTDOWN[""|save|nosave]     斷開連接配接,關閉伺服器
SLOWLOG   顯示慢查詢
INFO      顯示伺服器資訊
CONFIG GET 擷取配置資訊
CONFIG SET 設定配置資訊
MONITOR    打開控制台
SYNC       主從同步
CLIENT LIST 用戶端清單
CLIENT KILL 關閉某個用戶端
CLIENT SETNAME 為用戶端設定名字
CLIENT GETNAME 擷取用戶端名字
           
time 檢視時間戳與微秒數
127.0.0.1:6379> time
1) "1489301930"
2) "878970"

dbsize檢視目前資料庫中的key數量。
127.0.0.1:6379> dbsize
(integer) 1
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> dbsize
(integer) 0
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> dbsize
(integer) 1

bgrewriteaof背景重寫aof,背景重寫aof
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started

BGSAVE       子程序,背景儲存rdb快照
SAVE         目前程序,阻塞型儲存rdb快照
127.0.0.1:6379> bgsave
Background saving started
127.0.0.1:6379> save
OK

檢視上次保留時間lastsave如果redis崩潰,可以檢視上次儲存時間。
7.0.0.1:6379> lastsave
(integer) 1489302208

FLUSHALL     清空所有db
FLUSHDB      清空目前db
從伺服器不允許使用清空資料。設定slave-read-only從伺服器隻讀
127.0.0.1:6381> flushall
(error) READONLY You can't write against a read only slave.

info傳回redis伺服器資訊
info memory / info cpu / info stat
# Memory
used_memory:842456
used_memory_human:822.71K
used_memory_rss:7852032
used_memory_rss_human:7.49M
used_memory_peak:842456
used_memory_peak_human:822.71K
total_system_memory:1912483840
total_system_memory_human:1.78G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:9.32
mem_allocator:jemalloc-4.0.3

主從複制情況
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=1448,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=1448,lag=1
master_repl_offset:1448
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:1447

持久化資訊
# Persistence
loading:0
rdb_changes_since_last_save:3
rdb_bgsave_in_progress:0
rdb_last_save_time:1489302208
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:1
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:0
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
....

fork耗時
# Stats
total_connections_received:3
total_commands_processed:1920
instantaneous_ops_per_sec:1
total_net_input_bytes:69245
total_net_output_bytes:6111955
instantaneous_input_kbps:0.07
.....

檢視reids.config的配置檔案中的參數資訊。
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""
127.0.0.1:6379> config get save
1) "save"
2) ""
127.0.0.1:6379> config get appendonly
1) "appendonly"
2) "yes"

檢視慢日志設定情況。
127.0.0.1:6379> config get slowlog-log-slower-than
1) "slowlog-log-slower-than"
2) "10000"

config set 參數名 參數值,用來設定redis的配置參數值。
127.0.0.1:6379> config set slowlog-log-slower-than 100
OK
127.0.0.1:6379> config get slowlog-max-len
1) "slowlog-max-len"
2) "128"

slowlog get N檢視擷取慢日志。

shutdown [save/nosave]關閉是否儲存。


           

繼續閱讀