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 20:23

相關推薦

  • 基于lamp實現wordpress(php-rpm)與phpMyAdmin(pph-rpm+https支持)

    前言    踩了好多坑終于把想象中的樣子搭建出來了。真的是,只有遇到問題了,然后扎耳撓腮把問題解決了,才是真的學到了。此次環境我們采用lamp架構,并且通過fastcgi讓httpd和php進行通信。當然所有的一切都是在同一臺主機上實現。本次安裝的應用是phpMyAdmin-4.4.14.1和wordpress-4.3.1

    Linux干貨 2016-12-26
  • 第十八周

    “1、為LNMP架構添加memcached支持,并完成對緩存效果的測試報告; 架構(3臺centos7) nginx與php 192.168.1.108    nginx,php-fpm,php-mysql php-pecl-memcache mysql         192…

    2017-08-21
  • Week1: Linux 初步

    1. 描述計算機的組成及其功能 一個完整的計算機系統由硬件系統和軟件系統兩大部分組成 馮諾依曼體系下的計算機五大部件 CPU:運算器、控制器、寄存器、緩存(一二三級緩存)) 存儲器:內存 RAM(Random-Access Memory) Input:輸入指令、提供數據 Output: 輸出數據加工后的結果 要點:計算機中的信息(程序和數據)以二進制方式表示…

    Linux干貨 2016-12-04
  • 編譯安裝httpd-2.2.27.tat.gz及配置常見參數

    一、編譯安裝的整體步驟  1、在官網下載源碼,并解壓 2、切換到其目錄中  3、執行./configure 4、編譯   二、編譯中及安裝后配置常見的參數及其說明 編譯中配置 1)指定安裝路徑 –prefix=/usr/local/Pacakage_name  指定安裝路徑 –sysc…

    Linux干貨 2016-08-24
  • 20160804作業

    查出分區空間使用率的最大百分比值 查出用戶UID最大值的用戶名、UID及shell類型 查出/tmp的權限,以數字方式顯示 統計當前連接本機的每個遠程主機IP的連接數,并按從大到小排序 利用擴展正則表達式分別表示0-9、10-99、100-199、200-249、250-255        &nb…

    Linux干貨 2016-08-08
欧美性久久久久