redis

redis


  • 簡述

  • redis的數據結構

  • redis的數據持久化實現

  • 程序與配置文件

  • redis-cli命令

  • 主從復制原理與架構實現

  • redis的高可用方案 – sentinel

  • redis分布式系統概述與簡介


簡述

什么是redis?

redis是一個基于nosql技術的kv數據庫,支持非常大的并發場景,與memcached不同的是,redis擁有持久存儲的能力,對數據的安全性有了保障,支持主從架構,并且雖然是單線程的,但卻能夠比擬memcached的性能。

redis的功能?

redis可以用來當作緩存服務器,消息隊列。

memcached是將數據存放在內存中的,而redis則是定期存儲到磁盤中,相對的磁盤IO還是會影響性能,并且redis是單線程,而memcached是多線程對多核心支持比較好。但是由于機制與優化得當redis的性能卻能與memcached相當,真的還是非常出色的

redis的數據結構

redis一共有string,sets,zset,hash,list五種數據類型。

string:字符,值類似于 key value。
sets:集合,值類似于 key value1 [value2 value3...]。
sorted_set:有序的集合,值類似于 key score1 value1 [score2 value2 score2 value2....]。
hash:哈希kv,值類似于 key field1 value1 [field2 values]。
list:列表,值類似于集合,只不過采用采用了雙向鏈表的方式,存取采用left與right兩個方向的push與pop動作的方式。

redis的數據持久化實現

RDB

RDB的方式是使redis進程會按照事先定義的存儲策略去將內存中的redis數據給存儲到磁盤文件中。

  1. 有save與bgsave兩種save方式,save在前臺允許,而bgsave則運行在后臺。

  2. save過程中,會施加寫鎖,所以會導致一定的服務不可用的狀態。

  3. 由于存儲的是實打實的數據,所以對磁盤空間的占用較合理。

AOF

AOF的方式是采用存儲數據操作命令到磁盤來實現持久化,類似于mariadb的binary-log;

  1. AOF持久化通過重寫(rewrite)的方式來實現。

  2. 重寫過程中的寫入請求不會影響重寫,新的請求會被附加在原AOF文件后。

  3. 存儲的是操作命令,所以對于磁盤占用較大,數據可以看作是偽數據。

    rewrite流程:
    1. redis主進程去fork一個子進程用來讀取當前的操作命令到臨時文件存儲。
    2. 主進程會繼續接受用戶的寫入操作,并且一方面附加到臨時文件末尾,一方面存儲到當前的AOF中。        
        #存儲兩份是為了防止子進程重寫失敗而導致一部分的寫入數據丟失。
    3. 子進程完成重寫并且去替換原來的AOF文件,完成新的AOF文件存儲。
  1. 兩種方案都有很明顯的缺點,回想一下mariadb,其實采用RDB+AOF可以互補缺點。

  2. 持久存儲并不能解決數據損壞的問題,所以我們其實還需要定期的對redis數據進程備份。

程序與配置文件

程序與文件

/etc/redis-sentinel.conf            #redis的高可用組件sentinel的默認配置文件。
/etc/redis.conf                 #redis的默認配置文件。
/usr/bin/redis-cli              #redis的命令行工具,支持遠程連接到redis進行基于command的操作。
/usr/bin/redis-sentinel         #sentinel的主程序,實際上可以認為是是redis [option] <config-file> -sentinel的alias。
/usr/bin/redis-server           #redis的主程序,主要的格式redis [option] <config-file> 。
/var/lib/redis                  #redis的默認庫目錄。
/var/log/redis                  #redis的默認日志目錄。
/var/run/redis                  #redis的允許中產生的文件存放的默認目錄。
/usr/lib/systemd/system/redis-sentinel.service      #sentinel的systemd文件。
/usr/lib/systemd/system/redis.service               #redis的systemd文件。

redis.conf的配置參數

#### GENERAL ####                       
daemonize yes                           #以守護進程的方式運行
pidfile "/var/run/redis/redis.pid"      #pidfile
port 6379                               #port
tcp-backlog 511                         #tcp的backlog隊列長度,backlog的長度是未建立的tcp連接和已經建立的tcp連接之和,等待進程從隊列中調用建立的連接。
bind 192.168.1.30 10.0.0.1              #監聽的地址,可以指定多個,0.0.0.0代表本機所有所有地址。
timeout 5000                            #客戶端連接的超時時間,單位是毫秒。
loglevel notice                         #日志的記錄等級。
logfile "/var/log/redis/redis.log"      #日志的存放位置。
databases 16                            #redis所啟動的數據庫(名稱空間)數量,可以在cli中通過select #來切換。

## SNAPSHOTTING ##
save 900 1                              #RDB方式的持久化策略,也就是說RDB方式下,數據被定期存儲到磁盤的策略。
save 300 10                             #此處三個save依次表示,在900秒內,如果1個key發生改變就寫一次磁盤;
save 60 10000                           #在300秒內,如果10個key發生改變就寫一次磁盤;在60秒內如果10000個key發生改變就寫一次磁盤。
stop-writes-on-bgsave-error yes         #在bgsave時,發生寫入操作時會報告錯誤么,即在bgsave時不允許寫入數據。
rdbcompression yes                      #rdb文件可以被壓縮。
rdbchecksum yes                         #rdb文件開啟校驗。
dbfilename "dump.rdb"                   #db的名稱為 dump.rdb
dir "/redis/data1"                      #RDB的數據目錄,在指定非默認目錄時,需要修改目錄的屬主屬組為你當前redis進程的屬主屬組,一般為redis。

# APPEND ONLY MODE #
appendonly yes                          #開啟AOF持久化方式。
appendfilename "appendonly.aof"         #AOF文件名。
appendfsync everysec                    #AOF的持久化策略,有三個值,always表示只要發生數據操作就執行保存或者重寫AOF;everysec表示一秒一次;no表示關閉;
no-appendfsync-on-rewrite yes           #在重寫時將當前AOF的日志存儲在內存中,防止AOF附加操作與重寫產生數據寫入堵塞問題,提高了性能卻增加了數據的風險性。
auto-aof-rewrite-percentage 100         #每當AOF日志是上次重寫的一倍時就自動觸發重寫操作。
auto-aof-rewrite-min-size 64mb          #自動觸發重寫的最低AOF日志大小為64MB,為了防止在AOF數據量較小的情況話頻繁發生重寫操作。
aof-load-truncated yes                  #當redis發生奔潰,通過AOF恢復時,不執行最后最后那條因為中斷而發生問題的語句。

#### LIMITS ####
maxclients 10000                        #限制最大的并發用戶連接數為10000條。
# maxmemory <bytes>                     #限制最大的內存使用量。

### SECURITY ###
requirepass <password>                  #設定認證的密碼,如果設定了,在遠程cli登錄,主從配置和sentinel時都需要指定對應參數為此passwd。

redis-cli命令

redis-cli [-h <hostname> -p <port> -a <password>]

@generic
DEL KEYS(KEYS *列出所有鍵) MOVE  ...

@server
SYNC SLAVEOF SAVE BGSAVE SHUTDOWN ... (CLIENT ... CONFIG ...)

@connection
AUTH(認證) ECHO PING QUIT SELECT(切換數據庫) ...

@string
GET SET INCR(+1) DECR(-1) SETNX STRLEN ...

@list       
LINDEX LINSERT LLEN LPOP LPUSH LPUSHX LRANGE LSET RPOP RPUSH RPUSHX(值不存在才設置) ...

@set
SADD SCARD SMEMBERS(get值) SRANDMEMBER(隨機get值) SDIFF(求差異) SDIFFSTORE SINTER(交集) SINTERSTORE SUNION(并集) SUNIONSTORE ...

@sorted_set
ZADD ZCARD ZCOUNT(返回有序集中range間的所有值) ZSCORE(根據序號get值) ...

@hash
HDEL HGET HGETALL HINCRBY HKEYS HSET HSETNX ...

詳細的cli命令可以自行通過搜索引擎,命令行幫助help或者官方文檔來仔細查閱,本文由于篇幅問題就列出了一部分命令組中常用的命令,命令格式也請自行查閱。

主從復制原理與架構實現

master\slave - redis

master\slave - redis

配置過程

# redis-cli -h 192.168.1.30 -p 6379
    192.168.1.30> SLAVEOF 192.168.1.29 6379     #只需一條命令就可以實現。詳細命令可以參考help SLAVEOF。
    OK!
    192.168.1.30> INFO
    ......
    #Repocation
    ......
    slave0:ip=192.168.1.30,port=6379,state=online....       #可以很清楚的看到slave信息和master信息,此處就不再詳述。

redis.conf中replication的幾個主要參數

### REPLICATION ###
slaveof 192.168.1.29 6379                   #主節點地址,<host> <port>。
#masterauth <master-password>               #如果設置了訪問認證就需要設定此項。
slave-server-stale-data yes                 #當slave與master連接斷開或者slave正處于同步狀態時,如果slave收到請求允許響應,no表示返回錯誤。
slave-read-only yes                         #slave節點是否為只讀。
slave-priority 100                          #設定此節點的優先級,是否優先被同步。

redis的高可用方案 – sentinel

主從復制架構中,如果主節點產生故障,那么整個redis系統都會癱瘓,為了解決這個單點,對主節點的高可用就是非常有必要的,redis自帶的sentinel,就能很好的解決redis的高可用問題,通過ping機制檢測節點狀態,并且幫助主節點轉移;
sentinel是一個第三方節點來監理而解決高可用的方案,第三方的一臺或多臺節點共同判定投票主節點的狀態并且是否轉移。

sentinel-ha-redis

配置過程

# vim /etc/redis-sentinel.conf
    port 26379
    #sentinel announce-ip 1.2.3.4                           #默認監聽在0.0.0.0 所以此處可以注釋。 
    dir "/tmp"
    sentinel monitor mymaster 192.168.1.29 6379 1           #sentinel moitor <master-name> <ip> <redis-port> <法定人數quorum>
                                                            #設定master節點的*名稱*和位置,法定人數表示多少臺sentinel節點認同才可以上線。 
    sentinel down-after-milliseconds mymaster 5000          #如果聯系不到節點5000毫秒,我們就認為此節點下線。
    sentinel failover-timeout mymaster 60000                    #設定轉移主節點的目標節點的超時時長。
    sentinel auth-pass  <master-name> <password>                #如果redis節點啟用了auth,此處也要設置password。

# redis-sentinel /etc/redis-sentinel.conf
# ss-tnl | grep 26379
    LISTEN     0      128                       *:26379                     *:*      users:(("redis-sentinel",3099,5))
    LISTEN     0      128                      :::26379                   :::*      users:(("redis-sentinel",3099,4))

cli中的sentinel組命令

sentinel master <master-name>           #查看此復制集群的主節點信息。
sentinel slaves <master-name>           #查看此復制集群的從節點信息。
sentinel failover <node-name>           #切換指定的節點為節點為主節點。

redis分布式系統概述與簡介

redis與mariadb,mongodb一樣,在海量數據的情況下,復制已經無法解決性能壓力,這時候我們就需要通過分片機制分割數據,構建分布式系統;接下來我們就來粗略的看一下分布式redis的架構與解決方案。

分布式redis架構圖

sentinel-ha-redis

與mariadb和mongodb類似,請求到分片路由節點,之后由路由節點智能的分配到相對的數據節點,并且要考慮到結構的可靠性的高可用方案,同樣的需要符合分布式系統的cap和base標準;并且還要考慮到數據怎么分片的問題,所以說較為復雜。

解決方案

twemproxy

是由推特開發的,中心化的,基于ping來監控的的redis分布式解決方案,由于不支持路由節點高可用,不能平滑升級,只有cli接口,所以現在已經不是很推薦使用了。

codis(較為推薦的解決方案)

是由豆瓣開發的強一致性的,強依賴zookeep,中心化,加入了路由節點高可用方案,基于pingpong來監控各節點,支持平滑升級,有web gui接口,不支持讀寫分離的redis高可用解決方案。

分布式redis系統,本文只是寫了大概的介紹,深入的可以自行了解,由于是國人開發的,所以文檔資料什么的還是很友好的;并由于分布式redis是在較大規模的場景下才需要的架構,一般的中小型場景中其中的復制子系統就夠用了。

文中所有圖片都為作者本人自行繪制。

原創文章,作者:Net18_肖肖,如若轉載,請注明出處:http://www.www58058.com/37667

(0)
Net18_肖肖Net18_肖肖
上一篇 2016-08-19 15:17
下一篇 2016-08-19

相關推薦

  • Linux第五周總結

    1、顯示當前系統上root、fedora或user1用戶的默認shell 2、找出/etc/rc.d/init.d/functions文件中某單詞后面跟一組小括號的行,形如:hello(); 3、使用echo命令輸出一個絕對路徑,使用gerp取出其基名;     擴展:取出其路徑名 4、找出ifconfig命令結果中的…

    2017-07-30
  • grep正則表達式及sort、diff等相關命令

    Linux文本處理三劍客: grep:文本過濾工具(模式:patter) sed:stream editor 流編輯器,文本編輯工具 awk:linux上的實現gawk,文本報告生成器(格式化文本) * 正則表達式:Regular Expression,REGEXP,由一類特殊字符及文本字符所編寫的模式,其中有些字符其不表達字面意義,而是…

    Linux干貨 2016-12-29
  • Linux系統的文件管理命令及bash的相關工作特性

    熟悉Linux系統的文件管理命令,了解bash的工作特性,加強練習并掌握其內容。

    2017-09-30
  • 大概認識linux

             linux簡介 其實對Linux系統不是很了解,都是在百度和谷歌搜索出來,才發現Linux很多版本。各版本各優缺點。首先簡單說下發展史,Linux在1991年10月5號(這是第一次正式向外公布的時間)在芬蘭誕生,以后借助于Internet網絡向全世界各地傳播,由計算機愛好者的再次開發新功能和…

    Linux干貨 2016-05-29
  • 馬哥教育網絡第21期-第十一周課程練習

    1、詳細描述一次加密通訊的過程,結合圖示最佳。 A和B進行通信 A發送數據:A使用單向加密算法獲得數據的特征碼,把特征碼附加到數據的尾部,A使用對稱加密算法對數據進行加密。A使用B發過來的公鑰對A的對稱加 密算法加密密鑰進行加密,附加到數據后面。 B接收方:B使用自己的私鑰對數據進行解密。得到A的對稱密鑰,對對稱密鑰解密獲得數據的特征碼,B使用單向加密算法獲…

    Linux干貨 2016-12-26
  • grep命令及正則表達式

    grep命令和正則表達式 grep基本概念 grep:global search regular expression and print out the line. 作用:文本過濾器,用于文本搜索,用指定“模式”逐行匹配。 模式:由正則表達式字符及文本字符所編寫的過濾條件 正則表達式:由一類特殊字符和文本字符所編寫的模式,其有些字符不表示字符字面意義,而表…

    Linux干貨 2016-11-05
欧美性久久久久