1. 程式人生 > >[NOSQL] Redis介紹

[NOSQL] Redis介紹

eight edi htm 可用 表達 ror kill script lse

Redis概述

Redis是Salvatore Sanfilippo在2009年為其初創公司LLOOGG開發的。眼下仍是獨立項目。但VMWare贊劣了項目(作者是其雇員)。它採用C語言實現,因此性能非常好。

採用BSD許可證。使用鍵值存儲。和Amazon Dynamo,Cassandra,Riak。Voldemort,Memcache相似。

支持豐富的數據類型。比方數組,鏈表。集合等,非常適合須要表達時間線的web服務。比如微博。

Redis支持的數據類型有:

  • 字符串
  • 鏈表
  • 集合
  • 有序集合
  • 散列表

Redis的主從復制

Redis自帶有主從復制的功能,僅僅要設置配置文件redis.conf的slaveof選項就可以,例如以下所看到的: 技術分享圖片

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


要實現redis的故障恢復,能夠使用keepalived配置的notify_master, notify_backup這兩個方法運行特有的腳本。實際上僅僅要在slave(即redis1)上有2個腳本,第一個用於在redis1接管虛擬ip之後。運行slaveof no one把自己變成master。第二個是在redis1交出虛擬ip之後,在redis0運行slaveof no one確保redis0恢復為主的狀態。並對redis1運行slaveof redis0 6379開始又一次從master同步數據,假設自己已經是slave就不是必需同步了。
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快照原理例如以下:

  • 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的配置例如以下: 技術分享圖片

AOF優先於RDB(即快照),RDB性能優於AOF。由於裏面沒有反復。
AOF Rewrite: 又一次生成一份AOF文件。新的AOF文件裏一條記錄的操作僅僅會有一次。而不像一份老文件那樣,可能記錄了對同一個值的多次操作。

其生成過程和RDB相似, 也是fork一個進程,直接遍歷數據,寫入新的AOF暫時文件。

在寫入新文件的過程中,全部的寫操作日誌還是會寫到原來老的 AOF文件裏,同一時候還會記錄在內存緩沖區中。

當重完操作完畢後,會將全部緩沖區中的日誌一次性寫入到暫時文件裏。

然後調用原子性的rename命令用新的 AOF文件代替老的AOF文件。

[NOSQL] Redis介紹