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數據給存儲到磁盤文件中。
-
有save與bgsave兩種save方式,save在前臺允許,而bgsave則運行在后臺。
-
save過程中,會施加寫鎖,所以會導致一定的服務不可用的狀態。
-
由于存儲的是實打實的數據,所以對磁盤空間的占用較合理。
AOF
AOF的方式是采用存儲數據操作命令到磁盤來實現持久化,類似于mariadb的binary-log;
-
AOF持久化通過重寫(rewrite)的方式來實現。
-
重寫過程中的寫入請求不會影響重寫,新的請求會被附加在原AOF文件后。
-
存儲的是操作命令,所以對于磁盤占用較大,數據可以看作是偽數據。
rewrite流程:
1. redis主進程去fork一個子進程用來讀取當前的操作命令到臨時文件存儲。 2. 主進程會繼續接受用戶的寫入操作,并且一方面附加到臨時文件末尾,一方面存儲到當前的AOF中。 #存儲兩份是為了防止子進程重寫失敗而導致一部分的寫入數據丟失。 3. 子進程完成重寫并且去替換原來的AOF文件,完成新的AOF文件存儲。
兩種方案都有很明顯的缺點,回想一下mariadb,其實采用RDB+AOF可以互補缺點。
持久存儲并不能解決數據損壞的問題,所以我們其實還需要定期的對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或者官方文檔來仔細查閱,本文由于篇幅問題就列出了一部分命令組中常用的命令,命令格式也請自行查閱。
主從復制原理與架構實現
配置過程
# 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是一個第三方節點來監理而解決高可用的方案,第三方的一臺或多臺節點共同判定投票主節點的狀態并且是否轉移。
配置過程
# 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架構圖
與mariadb和mongodb類似,請求到分片路由節點,之后由路由節點智能的分配到相對的數據節點,并且要考慮到結構的可靠性的高可用方案,同樣的需要符合分布式系統的cap和base標準;并且還要考慮到數據怎么分片的問題,所以說較為復雜。
解決方案
twemproxy
是由推特開發的,中心化的,基于ping來監控的的redis分布式解決方案,由于不支持路由節點高可用,不能平滑升級,只有cli接口,所以現在已經不是很推薦使用了。
codis(較為推薦的解決方案)
是由豆瓣開發的強一致性的,強依賴zookeep,中心化,加入了路由節點高可用方案,基于pingpong來監控各節點,支持平滑升級,有web gui接口,不支持讀寫分離的redis高可用解決方案。
分布式redis系統,本文只是寫了大概的介紹,深入的可以自行了解,由于是國人開發的,所以文檔資料什么的還是很友好的;并由于分布式redis是在較大規模的場景下才需要的架構,一般的中小型場景中其中的復制子系統就夠用了。
文中所有圖片都為作者本人自行繪制。
原創文章,作者:Net18_肖肖,如若轉載,請注明出處:http://www.www58058.com/37667