Redis是一個key-value存儲系統。和Memcached類似,它支援存儲的value類型相對更多,包括string(字元串)、list(連結清單)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些資料類型都支援push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是緩存在記憶體中。差別的是redis會周期性的把更新的資料寫入磁盤或者把修改操作寫入追加的記錄檔案,并且在此基礎上實作了master-slave(主從)同步。
Redis 是一個高性能的key-value資料庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關系資料庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等用戶端,使用很友善。
Redis支援主從同步。資料可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。這使得Redis可執行單層樹複制。存盤可以有意無意的對資料進行寫操作。由于完全實作了釋出/訂閱機制,使得從資料庫在任何地方同步樹時,可訂閱一個頻道并接收主伺服器完整的消息釋出記錄。同步對讀取操作的可擴充性和資料備援很有幫助。
redis的官網位址,非常好記,是redis.io。(特意查了一下,域名字尾io屬于國家域名,是british Indian Ocean territory,即英屬印度洋領地)
目前,Vmware在資助着redis項目的開發和維護。
優點:
1、簡單,真的很簡單,卻相當的靈活。
2、資料結構豐富
3、高速讀寫
缺點:
1、持久化,需要盡量避免或者設計機制保障。
2、redis存儲成本高(純使用記憶體,能不高麼),是以别把它當海量資料庫來用。
一、NoSQL&Redis介紹
NoSQL,Not Only SQL,是非關系型的資料庫。傳統的關系資料庫不能滿足超大規模和高并發的應用。
是以Key-Value的形式存儲,(例如JSON,XML),不一定遵循傳統資料庫的一些基本要求,比如SQL标準、ACID屬性(Atomicity/ Consistency/Isolation/Durability)、表結構等。主要有以下的特點:非關系型的、分步式的、開源的、水準可擴充的(指能夠連接配接多個軟硬體的特性)。
NoSQL适用場景:
1)、High performance - 對資料高并發讀寫
2)、Huge storage - 對海量資料的高效率存儲和通路
3)、High scalability && HighAvailability - 對資料的高可擴充性和高可用性
開源的NoSQL資料庫:Redis, MongoDB, Cassandra…...
Redis的介紹
Redis是一個Key-Value存儲系統。它支援存儲的value類型有:string(字元串),list(連結清單), set(無序集合), zset(sorted set有序集合)和hash,也可以把redis看成一個資料結構伺服器。這些資料類型都支援pust/pop、add/remove及取交集、并集和差集運算,Redis支援各種不同方式的排序。資料都是緩存在記憶體中的,它也可以周期性的把更新的資料寫入磁盤或者把修改操作寫入追加的記錄檔案,并實作了master-slave(主從)同步。
Redis提供的API語言包括C、C++、C#、Java、JavaScript、Lua、Objective-C、Perl、PHP、Python、Ruby、Go、Tcl等。
使用Redis:新浪微網誌,200+ Server、400 port、4G data.
使用方式:與memcache相同
1. 應用程式直接通路Redis資料庫;
2. 應用程式直接通路Redis,隻有當通路Redis失敗時才通路MySQL
應用場合:
1. 取最新N個資料的操作
2. 排行榜應用
3. 需要精确設定過期時間的應用
4. 計數器應用
5. Uniq操作,擷取某段時間所有資料排重值
6. 實時系統,反垃圾系統
7. Pub/Sub建構實時消息系統
8. 建構隊列系統
9. 緩存
10. 存儲微網誌關注關系
Redis有庫無表無字段無行列。MongoDB有庫有集合(對應于Mysql中的表)
二、Redis的安裝
官網:http://redis.io
步驟一:
下載下傳安裝包:
wget http://redis.googlecode.com/files/redis-2.4.17.tar.gz
步驟二:
編譯源代碼:
tarzxvf redis-2.4.17.tar.gz
cd redis-2.4.17
make
cd src
make install
注:make完成後,有産生可執行檔案
redis-server:redis伺服器的啟動程式
redis-cli:redis指令行工具,也可為用戶端
redis-benchmark:redis性能測試工具(讀寫)
redis-stat:redis狀态檢測工具(狀态參數延遲)
步驟三:(非必須)
移動檔案,便于管理
mkdir –p /usr/local/redis/bin
mkdir –p /usr/local/redis/etc
mv redis-2.4.17/redis.conf/usr/local/redis/etc
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cliredis-server /usr/lcoal/redis/bin
步驟四:
啟動redis服務
/usr/local/redis/bin/redis-server(
有警告,沒有加載配置檔案
)
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
Redis服務端的預設連接配接端口是6379
Redis預設不是背景運作
步驟五:
用戶端連接配接
/usr/local/redis/bin/redis-cli
或者其他用戶端:如
phpredis
[php] view plain copy
print?
$redis = new Redis();
$redis->connect(“127.0.0.1”, 6379);
步驟六:
停止Redis
/usr/local/redis/bin/redis-clishutdown
or
pkill redis-server
三、Redis的配置
daemonize 如果需要在背景運作,把該項改為yes
pidfile 配置多個pid的位址,預設在/var/run/redis.pid
bind 綁定ip,設定後隻接受自該ip的請求
port 監聽端口,預設為6379
timeout 設定用戶端連接配接時的逾時時間,機關為秒
loglevel 分為4級,debug、verbose、notice、warning
logfile 配置log檔案位址
databases 設定資料庫的個數,預設使用的資料庫為0
save 設定redis進行資料庫鏡像的頻率,儲存快照的頻率,第一個*表示多長時間, 第三個*表示執行多少次寫操作。在一定時間内執行一定數量的寫操作時,自動儲存快照。可設定多個條件。
rdbcompression 在進行鏡像備份時,是否進行壓縮
Dbfilename 鏡像備份檔案的檔案名
Dir 資料庫鏡像備份的檔案放置路徑
Slaveof 設定資料庫為其他資料庫的從資料庫
Masterauth 主資料庫連接配接需要的密碼驗證
Requirepass 設定登入時需要使用的密碼
Maxclients 限制同時連接配接的客戶數量
Maxmemory 設定redis能夠使用的最大記憶體
Appendonly 開啟append only模式
appendfsync 設定對appendonly.aof檔案同步的頻率
vm-enabled 是否虛拟記憶體的支援
vm-swap-file 設定虛拟記憶體的交換檔案路徑
vm-max-memory 設定redis使用的最大實體記憶體大小
vm-page-size 設定虛拟記憶體的頁大小
vm-pages 設定交換檔案的總page數量
vm-max-threads 設定VMIO同時使用的線程數量
glueoutputbuf 把小的輸出緩存存放在一起
hash-max-zipmap-entries 設定hash的臨界值
activerehashing 重新hash
一、Redis 主從複制
因為目前版本沒有mysql 主從那樣的增量備份,對網路穩定性要求很高,如果頻繁TCP連接配接斷開會對伺服器和網絡帶來很大負擔。
就目前生産環境主從機器部署同一個機架下,幾個月都不會又一次連接配接斷開重連的情況的。
二、通過keepalived實作的高可用方案
參考官方文檔:http://keepalived.org/pdf/sery-lvs-cluster.pdf
Keepalived 是一個用c寫的路由選擇軟體,配合IPVS負載均衡實用,通過VRRP 協定提供高可用。目前最新版本1.2.7.Keepalived 機器之間實用VRRP路由協定切換VIP,切換速度秒級,且不存在腦裂問題。可以實作
可以實作一主多備,主挂後備自動選舉,漂移VIP,切換速度秒級;切換時可通過運作指定腳本更改業務服務狀态。
如兩台主機A、B,可以實作如下切換:
1.A 、B 依次啟動,A作為主、B為從
2 .主A 挂掉,B接管業務,作為主
3.A 起來,作為從SLAVEOF B
4.B 挂掉,A 切回主
将一台全部作為主,即可實作主從,可做讀寫分離;也可以通過多個VIP,在一台機器上多個執行個體中一半主、一半從,實作互備份,兩機同時負責部分業務,一台當機後業務都集中在一台上
安裝配置都比較簡單:
需要依賴包:openssl-devel(ubuntu 中為 libssl-dev),popt-devel (ubuntu中為libpopt-dev)。
配置檔案預設路徑:/etc/keepalived/keepalived.conf 也可以手動指定路徑,不過要注意的是手動指定需要使用絕對路徑。主要要確定配置檔案的正确性,keepalived 不會檢查配置是否符合規則。
使用keepalived -D 運作,即可啟動3個守護程序:一個父程序,一個check健康檢查,一個Vrrp,-D将日志寫入/var/log/message,可以通過日志檢視切換狀況。
注意問題:
1. VRRP 協定是多點傳播協定,需要保證主、備、VIP 都在同一個VLAN下
2. 不同的VIP 需要與不同的VRID 對應,一個VLAN 中VRID 不能和其他組沖突
3. 在keepalived 有兩個角色:Master(一個)、Backup(多個),如果設定一個為Master,但Master挂了後再起來,必然再次業務又一次切換,這對于有 狀态服務是不可接受的。解決方案就是兩台機器都設定為Backup,而且優先級高的Backup設定為nopreemt 不搶占。
切換流程:
1. 當Master挂了後,VIP漂移到Slave;Slave 上keepalived 通知redis 執行:slaveof noone ,開始提供業務
2. 當Master起來後,VIP 位址不變,Master的keepalived 通知redis 執行slaveofslave IP host ,開始作為從同步資料
3. 依次類推
主從同時Down機情況:
1. 非計劃性,不做考慮,一般也不會存在這種問題
2. 、計劃性重新開機,重新開機之前通過運維手段SAVEDUMP 主庫資料;需要注意順序:
1. 關閉其中一台機器上所有redis,是得master全部切到另外一台機器(多執行個體部署,單機上既有主又有從的情況);并關閉機器
2. 依次dump主上redis服務
3. 關閉主
4. 啟動主,并等待資料load完畢
5. 啟動從删除DUMP 檔案(避免重新開機加載慢)
三、使用Twemproxy 實作叢集方案
一個由twitter開源的c版本proxy,同時支援memcached和redis,目前最新版本為:0.2.4,持續開發中;https://github.com/twitter/twemproxy .twitter用它主要減少前端與緩存服務間網絡連接配接數。
特點:快、輕量級、減少後端Cache Server連接配接數、易配置、支援ketama、modula、random、常用hash 分片算法。
這裡使用keepalived實作高可用主備方案,解決proxy單點問題;