Redis是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集 ...
Redis是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集
合)、zset(sorted set --有序集合)和hash(哈希類型)與memcached一樣,為了保證效率,數據都是緩存在記憶體中。區別的是
redis會周期性的把更新的數據寫入磁碟或者把修改操作寫入追
加的記錄文件,並且在此基礎上實現了master-slave(主從)同步
Redis支持主從同步。數據可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器
redis和memcached對處理併發請求都不存在性能瓶頸,性能瓶頸可能在網卡上
官方的bench-mark數據:結果:讀的速度是110000次/s,寫的速度是81000次/s
安裝:yum -y install epel-release yum -y install redis-3.0.7-2.el6.remi.x86_64.rpm
配置文件: etc/redis.conf vim /etc/redis.conf
如果是基於本地通信,修改開啟 unixsocket /tmp/redis.sock文件和它的許可權unixsocketperm 700可以提高性能
幾個參數介紹:
databases:指定支持多少個資料庫,在預設的集群中(分散式場景中)只使用0號庫,不支持使用多個庫
tcp-keepalive 0 關閉tcp持久連接功能
save 900 1 900秒中有一次數據的修改,將修改的數據同步到磁碟的數據文件(持久化RDB)
save 300 10
save 60 10000
可以註釋掉此功能
requirepass 設置客戶端連接後進行任何其他指定前需要使用的密碼 登陸後使用AUTH password 完成認證
登陸命令 redis-cli -h HOSTIP 例如:redis-cli -h 127.0.0.1或redis-cli
啟動服務:service redis start
redis的命令獲取幫助help
redis的持久化:
RDB 持久化可以在指定的時間間隔內生成數據集的時間點快照(point-in-time snapshot)
AOF 持久化記錄伺服器執行的所有寫操作命令,併在伺服器啟動時,通過重新執行這些命令來還原數據集
RDB 的優點: 父進程在保存 RDB 文件時唯一要做的就是 fork 出一個子進程,然後這個子進程就會處理接下來的所有保存工作,父
進程無須執行任何磁碟 I/O 操作。RDB 在恢復大數據集時的速度比 AOF 的恢復速度要快,可以根據備份策略,將數據還原到不同的
時間點
RDB 的缺點: Redis 都要 fork() 出一個子進程,並由子進程來進行實際的持久化工作。 在數據集比較龐大時, fork() 可能會非
常耗時,造成伺服器在某某毫秒內停止處理客戶端; 如果數據集非常巨大,並且 CPU 時間非常緊張的話,那麼這種停止時間甚至可能
會長達整整一秒。 雖然 AOF 重寫也需要進行 fork() ,但無論 AOF 重寫的執行間隔有多長,數據的耐久性都不會有任何損失,一旦發
生故障停機可能會丟失好幾分鐘的數據
AOF 的優點: AOF 的預設策略為每秒鐘 fsync 一次,在這種配置下,Redis 仍然可以保持良好的性能,並且就算發生故障停機,
也最多只會丟失一秒鐘的數據,AOF 文件是一個只進行追加操作的日誌文件(append only log), 因此對 AOF 文件的寫入不需要進
行 seek , 即使日誌因為某些原因而包含了未寫入完整的命令(比如寫入時磁碟已滿,寫入中途停機,等等), redis-check-aof 工
具也可以輕易地修複這種問題,Redis 可以在 AOF 文件體積變得過大時,自動地在後臺對 AOF 進行重寫: 重寫後的新 AOF 文件包
含了恢復當前數據集所需的最小命令集合。 整個重寫操作是絕對安全的,因為 Redis 在創建新 AOF 文件的過程中,會繼續將命令追加
到現有的 AOF 文件裡面,即使重寫過程中發生停機,現有的 AOF 文件也不會丟失。 而一旦新 AOF 文件創建完畢,Redis 就會從舊
AOF 文件切換到新 AOF 文件,並開始對新 AOF 文件進行追加操作。AOF 文件有序地保存了對資料庫執行的所有寫入操作, 這些寫
入操作以 Redis 協議的格式保存, 因此 AOF 文件的內容非常容易被人讀懂, 對文件進行分析(parse)也很輕鬆。 導出(export)
AOF 文件也非常簡單: 舉個例子, 如果你不小心執行了 FLUSHALL 命令, 但只要 AOF 文件未被重寫, 那麼只要停止伺服器, 移
除 AOF 文件末尾的 FLUSHALL 命令, 並重啟 Redis , 就可以將數據集恢復到 FLUSHALL 執行之前的狀態。
AOF 的缺點:對於相同的數據集來說,AOF 文件的體積通常要大於 RDB 文件的體積。根據所使用的 fsync 策略,AOF 的速度可能會
慢於 RDB 。 在一般情況下, 每秒 fsync 的性能依然非常高, 而關閉 fsync 可以讓 AOF 的速度和 RDB 一樣快, 即使在高負荷之下
也是如此。 不過在處理巨大的寫入載入時,RDB 可以提供更有保證的最大延遲時間(latency)。AOF 在過去曾經發生過這樣的 bug
: 因為個別命令的原因,導致 AOF 文件在重新載入時,無法將數據集恢覆成保存時的原樣。 (舉個例子,阻塞命令 BRPOPLPUSH
就曾經引起過這樣的 bug 。) 測試套件里為這種情況添加了測試: 它們會自動生成隨機的、複雜的數據集, 並通過重新載入這些數
據來確保一切正常。 雖然這種 bug 在 AOF 文件中並不常見, 但是對比來說, RDB 幾乎是不可能出現這種 bug 的
RDB 和 AOF ,我應該用哪一個?
如果數據沒有安全性的要求。建議關閉持久化的功能,如果要求非常高建議都開啟,折中的辦法是開啟AOF
以上redis的持久化參考鏈接:http://my.oschina.net/davehe/blog/174662
註意:持久本身不能取代備份;還應該制定備份策略,對redis資料庫定期進行備份
RDB與AOF同時啟用
(1) BGSAVE和BGREWRITEAOF不會同時執行
(2) 在Redis伺服器啟動用於恢複數據時,會優先使用AOF
在配置文件中將appendonly no的參數改為yes,就可以將AOF的持久化功能開啟,appendfilename 指定AOF文件名
no-appendfsync-on-rewrite 在重寫AOF文件時,是否對新寫的操作暫存在記憶體中,預設為no
auto-aof-rewrite-percentage 當前AOF文件大小是上次重寫AOF文件大小的兩倍時自動對當前AOF文件重寫
auto-aof-rewrite-min-size 設定當前AOF文件的大小至少要到指定大小才能進行重寫
複製:
1). 同一個Master可以同步多個Slaves
2). Slave同樣可以接受其它Slaves的連接和同步請求,這樣可以有效的分載Master的同步壓力
3). Master Server是以非阻塞的方式為Slaves提供服務。所以在Master-Slave同步期間,客戶端仍然可以提交查詢或修改請求
4). Slave Server同樣是以非阻塞的方式完成數據同步。在同步期間,如果有客戶端提交查詢請求,Redis則返回同步之前的數據
複製的工作原理: 在Slave啟動並連接到Master之後,它將主動發送一個SYNC命令。此後Master將啟動後臺存檔進程,同時收集所
有接收到的用於修改數據集的命令,在後臺進程執行完畢後,Master將傳送整個資料庫文件到Slave,以完成一次完全同步。而Slave
伺服器在接收到資料庫文件數據之後將其存檔並載入到記憶體中。此後,Master繼續將所有已經收集到的修改命令,和新的修改命令依次
傳送給Slaves,Slave將在本次執行這些數據修改命令,從而達到最終的數據同步 如果Master和Slave之間的鏈接出現斷連現象,
Slave可以自動重連Master,但是在連接成功之後,一次完全同步將被自動執行。
將從庫的配置文件設置一條參數就可以了:slaveof 192.168.238.224 6379 指定主庫的ip地址,監聽的埠
登陸後使用info replication命令查看主從同步是否成功
從庫配置參數:slave-serve-stale-data 如果從庫連接不到主庫了,當有讀請求時是否發送自己的數據,預設為yes
slave-read-only 從庫是否為只讀,預設為yes
註意:如果master使用requirepass開啟了認證功能,從伺服器要使用masterauth <PASSWORD>來連入服務請求使用此密碼進行
認證
sentinel:用於監控和管理多個redis服務實現HA,通知,自動故障轉移,要求sentinel要為基數個數,至少三個對master是否線上做
出投票式的正確判定,同時也避免了sentinel單點失效
啟動sentinel的程式 redis-sentinel /etc/redis-sentinel.conf
/etc/redis-sentinel.conf 為sentinel的專用配置文件
啟動sentinel的程式會實現以下過程
(1) 伺服器自身初始化,運行redis-server中專用於sentinel功能的代碼
(2) 初始化sentinel狀態,根據給定的配置文件,初始化監控的master伺服器列表
(3) 創建連向master的連接
配置文件中必須配置的參數:
sentinel monitor <master-name> <ip> <redis-port> <quorum>
例如:sentinel monitor mymaster 127.0.0.1 6379 1 quorum是指定有幾台sentinel
sentinel down-after-milliseconds <master-name> <milliseconds>
例如:sentinel down-after-milliseconds mymaster 30000 30秒後連接不到主庫,則判定主庫為down
sentinel parallel-syncs mymaster 1
當從庫提升為主庫時,多少從庫可以同時過來同步
sentinel failover-timeout mymaster 180000
一定要把上面三個參數配置好再開啟sentinel,不然就麻煩了,無法自動故障轉移
故障轉移超時時間
主觀下線:一個sentinel實例判斷出某節點下線
客觀下線:多個sentinel節點協商後判斷出某節點下線
專用命令:
SENTINEL masters
SENTINEL slaves <master name>
SENTINEL get-master-addr-by-name <master name>
補充:當主庫宕機後,sentinel會把新的主庫ip地址通知客戶端(需要redis的專用客戶端程式),原來的主庫回來時會變成新主庫的從
庫,sentinel以非守護進程工作