[NOSQL] Redis介紹
Redis概述
Redis是Salvatore Sanfilippo在2009年為其初創公司LLOOGG開發的。眼下仍是獨立項目。但VMWare贊劣了項目(作者是其雇員)。它採用C語言實現,因此性能非常好。
採用BSD許可證。使用鍵值存儲。和Amazon Dynamo,Cassandra,Riak。Voldemort,Memcache相似。
支持豐富的數據類型。比方數組,鏈表。集合等,非常適合須要表達時間線的web服務。比如微博。
Redis支持的數據類型有:
- 字符串
- 鏈表
- 集合
- 有序集合
- 散列表
Redis的主從復制
Redis的高可用
眼下為止,Redis官方還在開發redis-cluster,可參考http://redis.io/topics/cluster-spec,中譯版http://www.cnblogs.com/chang290/archive/2012/09/05/2672506.html
但我們能夠使用keepalived+redis的方法實現高可用,例如以下所看到的:
1. redis的配置
主機 ? ? port ? 角色
redis0 6379 ? master
redis1 6379 ? slave
2. keepalived的配置
redis0和redis1使用一個虛擬ip
並使用例如以下腳本監控redis服務是否存活:
#!/bin/bash /usr/local/bin/redis-cli -h 192.168.1.53 -p 6379 info > /dev/null if [ $? -eq 0 ]; then echo "redis OK" exit 0 else echo "no redis service found!" /usr/local/bin/redis-server /path/to/redis.conf # try to start it again /usr/local/bin/redis-cli -h 192.168.11.53 -p 6380 info > /dev/null if [ $? -eq 0 ]; then exit 0 else # restart failed killall keepalived echo "error" fi fi
redis1上keepalived的配置方法例如以下,redis0僅僅要去掉notify_master, notify_backup兩行就可以。
! Configuration File for keepalived global_defs { router_id redis1 } vrrp_script Monitor_Redis { script "/opt/redis_keepalive.sh" interval 10 weight 2 } vrrp_instance 360 { state BUCKUP #(主機為MASTER,備用機為BACKUP) interface eth0 #(HA監測網絡接口) virtual_router_id 110 #(主、備機的virtual_router_id必須同樣) mcast_src_ip 192.168.11.53 #(多播的源IP,設置為本機外網IP,與VIP同一網卡)此項可不設置 priority 70 #(主、備機取不同的優先級。主機值較大。備份機值較小,值越大優先級越高) advert_int 1 #(VRRP Multicast廣播周期秒數) authentication { ...... } notify_master /opt/redis_2master.sh notify_backup /opt/redis_2backup.sh track_script { Monitor_Redis #(調用nginx進程檢測腳本) } virtual_ipaddress { 192.168.11.4 #(VRRP HA虛擬地址) } }
Redis的持久化
Redis的有下面2種的持久化機制:- 快照(snapshot)
- AOF(Append Only File)
Redis快照原理例如以下:
- Redis借助了fork命令的copy on write機制。
在生成快照時。將當前迚程fork出一個子進程,然後在子迚程中循環全部的數據。將數據寫成為RDB文件。
- Redis原來的RDB文件不會壞掉,由於其寫操作是在一個新迚程中迚行的。當生成一個新的,RDB文件時,Redis生成的子迚程會先將數據寫到一個暫時文件裏。然後通過原子性rename系統調用將暫時文件重命名為RDB文件,這樣在仸何時候出現故障。Redis的RDB文件都總是可用的。
- 同一時候。Redis的RDB文件也是Redis主從同步內部實現中的一環。
- 我們能夠非常明顯的看到,RDB有它的不足,就是一旦數據庫出現故障,那麽我們的RDB文件裏保存的數據並非全新的。從上次RDB文件生成到Redis停機這段時間的數據全部丟掉了。
在某些業務下,這是能夠忍受的,我們也推薦這些業務使用RDB的方式進行持久化。由於開啟RDB的代價並不高。
AOF優先於RDB(即快照),RDB性能優於AOF。由於裏面沒有反復。
AOF Rewrite: 又一次生成一份AOF文件。新的AOF文件裏一條記錄的操作僅僅會有一次。而不像一份老文件那樣,可能記錄了對同一個值的多次操作。
其生成過程和RDB相似, 也是fork一個進程,直接遍歷數據,寫入新的AOF暫時文件。
在寫入新文件的過程中,全部的寫操作日誌還是會寫到原來老的 AOF文件裏,同一時候還會記錄在內存緩沖區中。
當重完操作完畢後,會將全部緩沖區中的日誌一次性寫入到暫時文件裏。
然後調用原子性的rename命令用新的 AOF文件代替老的AOF文件。
[NOSQL] Redis介紹