redis & redis-cluster

NO IMAGE

redis是一款快取記憶體非關係型資料庫,為什麼說他是”高速“的,應為其讀寫都在記憶體中,這也是非關係行資料庫的一大特點,Redis是以key-value的形式儲存的。下面將從以下幾點來介紹redis。(redis的安裝及啟動請自行解決…)

  1. redis資料結構
  2. redis資料持久化
  3. redis cluster叢集的實現方案

8.最後可以安裝redis視覺化工具–brew install rdm


一:redis支援的資料結構

  1. 字串(Strings)
    設定:set key value 獲取:get key
  2. 列表(List)
    設定:lpush key value1 / lpush key value2 獲取:lrange 0 1
  3. 集合(Sets)
    設定:sadd key value1 / sadd key value2 獲取:sismember key
  4. 集合(Sorted Sets)
    設定:zadd key value1 / zadd key value2 獲取:sismember key
  5. 雜湊(Hashes)
    hmset key:001 cou1 value1 cou2 value2 獲取:hgetall key:001

具體大家可以按照上面的格式去嘗試新建各類資料型別。

二:redis資料持久化
Redis雖然是一種記憶體型資料庫,一旦伺服器程序退出,資料庫的資料就會丟失,為了解決這個問題Redis提供了兩種持久化的方案,將記憶體中的資料儲存到磁碟中,避免資料的丟失。

  1. RDB持久化
    RDB是預設持久化方式,其規定以下幾種時間段內去觸發持久化操作

    # 以下配置表示的條件:
    # 伺服器在900秒之內被修改了1次
    save 900 1
    # 伺服器在300秒之內被修改了10次
    save 300 10
    # 伺服器在60秒之內被修改了10000次
    save 60 10000

    該方式有個致命的缺點——RDB持久化相當於備份資料庫狀態,那麼如果資料檔案很大的化就會導致服務崩潰等一系列問題。

  2. AOF持久化
    AOF持久化(Append-Only-File),與RDB持久化不同,AOF持久化是通過儲存Redis伺服器鎖執行的寫狀態來記錄資料庫的。具體來說,RDB持久化相當於備份資料庫狀態,而AOF持久化是備份資料庫接收到的命令,所有被寫入AOF的命令都是以redis的協議格式來儲存的。以下為開啟AOF持久化的配置方式:

    #AOF 和 RDB 持久化方式可以同時啟動並且無衝突。  
    #如果AOF開啟,啟動redis時會載入aof檔案,這些檔案能夠提供更好的保證。 
    appendonly yes
    # 只增檔案的檔名稱。(預設是appendonly.aof)  
    # appendfilename appendonly.aof 
    #redis支援三種不同的寫入方式:  
    #  
    # no:不呼叫,之等待作業系統來清空緩衝區當作業系統要輸出資料時。很快。  
    # always: 每次更新資料都寫入僅增日誌檔案。慢,但是最安全。
    # everysec: 每秒呼叫一次。折中。
    appendfsync everysec  
    # 設定為yes表示rewrite期間對新寫操作不fsync,暫時存在記憶體中,等rewrite完成後再寫入.官方文件建議如果你有特殊的情況可以配置為'yes'。但是配置為'no'是最為安全的選擇。
    no-appendfsync-on-rewrite no  
    # 自動重寫只增檔案。  
    # redis可以自動盲從的呼叫‘BGREWRITEAOF’來重寫日誌檔案,如果日誌檔案增長了指定的百分比。  
    # 當前AOF檔案大小是上次日誌重寫得到AOF檔案大小的二倍時,自動啟動新的日誌重寫過程。
    auto-aof-rewrite-percentage 100  
    # 當前AOF檔案啟動新的日誌重寫過程的最小值,避免剛剛啟動Reids時由於檔案尺寸較小導致頻繁的重寫。
    auto-aof-rewrite-min-size 64mb

    其實我麼可以檢視dump.rdb檔案和appendonly.aof檔案就會很明顯發現他們各自的儲存資料的方式。還有一點就是所有的配置都是在redis.conf檔案中。服務每次重啟的時候都會首先從持久化檔案中去拉取資料。兩個持久化檔案路徑大家可檢視redis.conf中的dir配置項獲得,我本地的如下:

    clipboard.png

自行嘗試:先利用RDB的方式新增一些key-value,在開啟aof方式,觀察dump.rdb檔案和appendonly.aof檔案大小的變化。

三:redis cluster叢集的實現方案
redis在年初發布了3.0.0,官方支援了redis cluster,也就是叢集。redis cluster在設計的時候,就考慮到了去中心化,去中介軟體,也就是說,叢集中的每個節點都是平等的關係,都是對等的,每個節點都儲存各自的資料和整個叢集的狀態。每個節點都和其他所有節點連線,而且這些連線保持活躍,這樣就保證了我們只需要連線叢集中的任意一個節點,就可以獲取到其他節點的資料。

Redis 叢集沒有並使用傳統的一致性雜湊來分配資料,而是採用另外一種叫做雜湊槽 (hash slot)的方式來分配的。redis cluster 預設分配了 16384 個slot,當我們set一個key 時,會用CRC16演算法來取模得到所屬的slot,然後將這個key 分到雜湊槽區間的節點上,具體演算法就是:CRC16(key) % 16384。必須要3個以後的主節點,否則在建立叢集時會失敗。

1.開啟叢集配置

[[email protected] redis-3.0.5]# vi redis.conf
#修改以下地方
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

2.我們這邊模擬6臺服務(3M 3S)

[[email protected] redis-3.0.5]# mkdir -p /usr/local/cluster-test
[[email protected] redis-3.0.5]# cd /usr/local/cluster-test/
[[email protected] cluster-test]# mkdir 7000
[[email protected] cluster-test]# mkdir 7001
[[email protected] cluster-test]# mkdir 7002
[[email protected] cluster-test]# mkdir 7003
[[email protected] cluster-test]# mkdir 7004
[[email protected] cluster-test]# mkdir 7005

3.把redis.conf檔案拷貝6份並修改相應的埠號最後CP到7000-7005資料夾下去,再將對行的服務檔案redis-serverCP到7000-7005資料夾下去

4.啟動這這6個服務

[[email protected] cluster-test]# cd /usr/local/cluster-test/7000/
[[email protected] 7000]# redis-server redis.conf
[[email protected] 7000]# cd ../7001
[[email protected] 7001]# redis-server redis.conf
[[email protected] 7001]# cd ../7002
[[email protected] 7002]# redis-server redis.conf
[[email protected] 7002]# cd ../7003
[[email protected] 7003]# redis-server redis.conf
[[email protected] 7003]# cd ../7004
[[email protected] 7004]# redis-server redis.conf
[[email protected] 7004]# cd ../7005
[[email protected] 7005]# redis-server redis.conf
[[email protected] 7005]#

5.檢視6個服務的啟動程序情況

[[email protected] 7005]# ps -ef|grep redis
root     11380     1  0 07:37 ?        00:00:00 redis-server *:7000 [cluster]
root     11384     1  0 07:37 ?        00:00:00 redis-server *:7001 [cluster]
root     11388     1  0 07:37 ?        00:00:00 redis-server *:7002 [cluster]
root     11392     1  0 07:37 ?        00:00:00 redis-server *:7003 [cluster]
root     11396     1  0 07:37 ?        00:00:00 redis-server *:7004 [cluster]
root     11400     1  0 07:37 ?        00:00:00 redis-server *:7005 [cluster]
root     11404  8259  0 07:38 pts/0    00:00:00 grep redis

6.將6個服務連在一起構招成叢集

redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

7.如果輸出以下資訊恭喜你叢集搭建成功了

[[email protected] 7000]# redis-trib.rb check 127.0.0.1:7000
Connecting to node 127.0.0.1:7000: OK
Connecting to node 127.0.0.1:7002: OK
Connecting to node 127.0.0.1:7003: OK
Connecting to node 127.0.0.1:7005: OK
Connecting to node 127.0.0.1:7001: OK
Connecting to node 127.0.0.1:7004: OK
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4 127.0.0.1:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: dfa0754c7854a874a6ebd2613b86140ad97701fc 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: d2237fdcfbba672de766b913d1186cebcb6e1761 127.0.0.1:7003
slots: (0 slots) slave
replicates 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4
S: 30858dbf483b61b9838d5c1f853a60beaa4e7afd 127.0.0.1:7005
slots: (0 slots) slave
replicates dfa0754c7854a874a6ebd2613b86140ad97701fc
M: cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 4b4aef8b48c427a3c903518339d53b6447c58b93 127.0.0.1:7004
slots: (0 slots) slave
replicates cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

8.最後可以安裝redis視覺化工具--brew install rdm

圖片描述