1. 程式人生 > >Redis存儲

Redis存儲

redis

NoSQL:

NoSQL DEFINITION: Next Generation Databases mostly addressing some of the points: being non-relational, distributed, open-source and horizontally scalable.

ACID:
    原子性、一致性、隔離性、持久性;
    2phase commit, 3phase comit, ...

non SQL, Not Only SQL; Web 2.0

    www.nosql-databases.org
    https://db-engines.com/en/ranking

特性:數據量大、數據變化非常快(數據增長快、流量分布變化大、數據間耦合結構變化快)、數據源很多;

    CAP、BASE
        CAP:
            2000年,PODC(Principle of Distributed Computing)會議, Brewer
                Consistency、Availablity、Partition tolerence
                    C:多個數據節點上的數據一致;
                    A:用戶發出請求後的有限時間範圍內返回結果;
                    P:network partition,網絡發生分區後,服務是否依然可用;
            CAP理論:一個分布式系統不可能同時滿足C、A、P三個特性,最多可同時滿足其中兩者;對於分布式系統滿足分區容錯性幾乎是必須的。新時代P出現的可能性很小,故而3個條件可同時滿足;
                AP: 
                    C:弱一致性;
                CP:

        BASE:BA,S,E,基於CAP演化而來
            BA:Basically Available,基本可用;
            S:Soft state,軟狀態/柔性事務,即狀態可以在一個時間窗口內是不同步的;
            E:Eventually consistency,最終一致性;

NoSQL:Not Only SQL  NOSQL流派
    Key Value / Tuple Store:DynamoDB, redis 
    Wide Column Store / Column Families:列式數據庫, hbase
    Document Store:文檔數據庫,mongodb,Elastic
    Graph Databases:圖式數據庫,Neo4j

    Time Series / Streaming Databases:時間序列存儲

    Multimodel Databases:
    Object Databases:

Redis:

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. 
    開源、內存存儲、數據結構存儲;
    可用作:數據庫、緩存、消息隊列;

It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries.
    數據結構:字符串、列表(數組)、hashes(關聯數組)、集合、有序集合、bitmaps、hyperloglogs、空間索引;

Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
    內建的復制、Lua scripting、LRU、事務、持久存儲、高可用(Sentinel,Redis Cluster)

REmote DIctionary Server:數據結構服務器,k/v,數據結構;

單進程:
    CPU並非瓶頸;
    單進程即只能跑到一個內核核心上
持久化:
    snapshotting
    AOF

程序環境:
    配置文件:/etc/redis.conf
    主程序:/usr/bin/redis-server
            6379/tcp
    客戶端:/usr/bin/redis-cli
    Unit File:/usr/lib/systemd/system/redis.service
    數據目錄:/var/lib/redis

redis:k/v
    key:直接ASCII字符串;
    value:strings, lists, hashes, sets, sorted sets, bitmaps, hyperloglogs

        To get help about Redis commands type:
            "help @<group>" to get a list of commands in <group>
            "help <command>" for help on <command>
            "help <tab>" to get a list of possible help topics
            "quit" to exit      

    group:
        @generic, @string, @list, @...  可以用tab鍵進行不全。

    @string
        SET
        GET
        EXISTS
        INCR    遞增值
        DECR    遞減值
        SETNX   不存在時設定
        SETEX   存在時修改
        INCRBYFLOAT 以浮點數類型向上遞增
        MGET    一次獲取多個建的值
        MSET    一次設定多個鍵的值

    @list   註意棧是先進後出的
        LPUSH   左側入棧
        RPUSH   右側入棧
        LPOP    左邊出棧
        RPOP    右邊出棧
        LPUSHX  棧存在就左入棧
        RPUSHX  棧存在就右入棧
        LRANGE  標定範圍內的元素列表
        LINDEX  以指定索引找元素
        LSET    設定特定索引上的元素的值
        LLEN    顯示指定鍵的元素長度

LREM 刪除元素
@set
SADD 在集合中添加元素,如果集合不存在就創建
SPOP 隨機彈出一個數據
SREM 刪除指定的數據
SRANDMEMBER 從成員中得到一個或者多個隨機成員
SINTER 交集
SUNION 並集

    @sorted_set
        ZADD
        ZCARD
        ZCOUNT
        ZRANK
        ...

    @hash 
        HSET    設定一個hash
        HMSET   一次設定hash的多個字段
        HGET    獲取一個hash
        HMGET   獲取多個hash
        HKEYS   獲取指定hash的所有字段,不列出值
        HVALS   列出一個hash中的所有值,不列出字段
        HDEL    刪除一個hash的指定的鍵值
        HGETALL 獲取一個hash的所有的字段和值
        ...

        members -> {name:jerry, age:17,gender:Female}
            HKEYS
            HVALS

    @pubsub     消息隊列
        PUBLISH
        SUBSCRIBE
        UNSUBSCRIBE
        PSUBSCRIBE
        PUNSUBSCRIBE
        ...

    @geo    

    @hyperloglog         

回顧:

分布式系統兩個基礎理論:CAP/BASE
    CAP:AP
        C、A、P:三者其中之二;
            AP:可用性、分區容錯性、弱一致性;
    BASE:BA,S,E
        BA:基本可用、S:軟狀態、E:最終一致性;

分布式系統:  
    分布式存儲:
        NoSQL:
            kv、document、column families、GraphDB
        分布式文件系統:文件系統接口
            分布式存儲:API,不能掛載;                                 
        NewSQL:
            PingCAP:TiDB(MySQL protocol)... 重構的既能夠支持事務,又能夠支持分布式系統
    分布式運算:mapreduce, ...

redis:REmote DIctionary Server
    數據結構:String, List, Set, sorted_set, Hash, pubsub ...

Redis(2)

redis-cli命令:
    Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]

        -h HOST, 127.0.0.1
        -p PORT, 6379/tcp
        -a PASSWORD
        -n DBID
            0-15

    與Connection相關命令:
        help @connection            
        AUTH <password> 
        ECHO <message>
        PING 
        QUIT
        SELECT dbid

    清空數據庫:
         FLUSHDB:Remove all keys from the current database
            清空當前數據庫;
         FLUSHALL:Remove all keys from all databases
            清空所有數據庫;

配置和使用Redis:
    基本配置項
    網絡配置項
    持久化相關配置
    復制相關的配置
    安全相關配置
    Limit相關的配置
    SlowLog相關的配置
    INCLUDES
    Advanced配置

    通用配置項:
        daemonize, supervised, loglevel, pidfile, logfile, 
        databases:設定數據庫數量,默認為16個,每個數據庫的名字均為整數,從0開始編號,默認操作的數據庫為0;
        切換數據庫的方法:
             SELECT <dbid>
        解釋:

daemonize:是否以守護進程方式運行
supervised:是否接受某個進程的管控
網絡配置項:
bind IP
port PORT
protected-mode
tcp-backlog
unixsocket
timeout:連接的空閑超時時長;

    安全配置:
        requirepass <PASSWORD>
        rename-command <COMMAND> <NEW_CMND_NAME>
            在AOF或Replication環境中,不推薦使用;  防止到另一環境中命令不識別;

    Limits相關的配置:
        maxclients
        maxmemory <bytes>
        maxmemory-policy noeviction
            淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction
         maxmemory-samples 5
            淘汰算法運行時的采樣樣本數;  采樣是看哪個快過期或隨機取等

    SlowLog相關的配置:
        slowlog-log-slower-than 10000   超出10毫秒就記錄為慢日誌,以方便優化
            單位是微秒;
        slowlog-max-len 128
            SlowLog記錄的日誌最大條目;

    ADVANCED配置:
        hash-max-ziplist-entries 512    存儲的最大的鍵值對數
        hash-max-ziplist-value 64   每一個value不能太長,為64字節

            設置ziplist的鍵數量最大值,每個值的最大空間; 

        client-output-buffer-limit normal 0 0 0 正常連接redis服務器復制數據,服務器緩沖

區有多大;
client-output-buffer-limit slave 256mb 64mb 60 redis從服務器復制數據客戶端
client-output-buffer-limit pubsub 32mb 8mb 60 客戶端訂閱了服務器的發行服務
<hard-limit> 最大不能超過此值
<soft-limit> 可以超過此值
<soft-limit seconds> 超過上值最多使用多長時間

redis-cli命令:
    Server相關的命令:
         CLIENT GETNAME 給本次連接設置名字
         *CLIENT KILL
            CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no]
         *CLIENT LIST   列出所有的連接
         CLIENT PAUSE
            CLIENT PAUSE timeout
         CLIENT REPLY               
         CLIENT SETNAME:Set the current connection name

          SHUTDOWN [NOSAVE|SAVE]    設置強制或同步磁盤關閉客戶端

         配置參數可運行時修改:

            CONFIG GET  獲取指定參數的值
            CONFIG RESETSTAT    重置統計計數器
            CONFIG REWRITE  將內存修改寫到磁盤文件
            CONFIG SET  設置內存生效的參數

         INFO:服務器狀態信息查看;分為多個secion;
            INFO [section]

Redis的持久化:
    RDB:snapshotting, 二進制格式;按事先定制的策略,周期性地將數據從內存同步至磁盤;數據文件默認為dump.rdb;
        客戶端顯式使用SAVE或BGSAVE命令來手動啟動快照保存機制;
            SAVE:同步,即在主線程中保存快照,此時會阻塞所有客戶端請求;
            BGSAVE:異步;backgroud
        記錄每次寫操作至指定的文件尾部實現的持久化;當redis重啟時,可通過重新執行文件中的命令在內存中重建出數據庫;
            BGREWRITEAOF:AOF文件重寫;   重寫是直接從內存快照之後進行重構命

令,使得原來的多個重復操作一步到一個值。更加簡化高效
不會讀取正在使用AOF文件,而是通過將內存中的數據以命令的方式保存至臨時文件中,完成之後替換原來的AOF文件; 在重啟服務時將記錄的命令操作執行一遍。優點是不會丟失數據或丟失數據很少,而缺點是如計數器的操作記錄要進行很多次,不如直接設置計數器的值。

    RDB相關的配置:
        *save <seconds> <changes>

            save 900 1
            save 300 10
            save 60 10000
            save 5  200000

            表示:三個策略滿足其中任意一個均會觸發SNAPSHOTTING操作;900s內至少有一個key有變化,300s內至少有10個key有變化,60s內至少有1W個key發生變化;

        stop-writes-on-bgsave-error yes
            dump操作出現錯誤時,是否禁止新的寫入操作請求;快照有錯,禁止用戶寫入操
作;

        rdbcompression yes
        rdbchecksum yes

        dbfilename dump.rdb:指定rdb文件名
        *dir /var/lib/redis:rdb文件的存儲路徑

    AOF相關的配置
        *appendonly no
        appendfilename "appendonly.aof"

        *appendfsync 
            Redis supports three different modes:
                no:redis不執行主動同步操作,而是OS進行;
                everysec:每秒一次;
                always:每語句一次;

        no-appendfsync-on-rewrite no
            是否在後臺執行aof重寫期間不調用fsync,默認為no,表示調用;

        auto-aof-rewrite-percentage 100
        auto-aof-rewrite-min-size 64mb  
            上述兩個條件同時滿足時,方會觸發重寫AOF;與上次aof文件大小相比,其增長量超過100%,且大小不少於64MB; 

        aof-load-truncated yes

    註意:持久機制本身不能取代備份;應該制訂備份策略,對redis庫定期備份;

    RDB與AOF同時啟用: 
        (1) BGSAVE(快照)和BGREWRITEAOF不會同時進行;
        (2) Redis服務器啟動時用持久化的數據文件恢復數據,會優先使用AOF;

復制:
    特點:
        一個Master可以有多個slave主機,支持鏈式復制;
        Master以非阻塞方式同步數據至slave主機;

    配置slave節點:
        redis-cli> SLAVEOF <MASTER_IP> <MASTER_PORT>
        redis-cli> CONFIG SET masterauth <PASSWORD>

    配置參數:
        *slaveof
        *masterauth 

        slave-serve-stale-data yes  是否使用舊的數據響應用戶
        slave-read-only yes     從節點只用於用戶的讀,用戶不能直接在從節點上寫
        *repl-diskless-sync no  網絡不好時基於磁盤慢慢復制
            no, Disk-backed, Diskless

            新的從節點或某較長時間未能與主節點進行同步的從節點重新與主節點通信,需要做“full synchronization",此時其同步方式有兩種style:
                Disk-backend:主節點新創建快照文件於磁盤中,而後將其發送給從節點;網絡慢時使用
                Diskless:主節占新創建快照後直接通過網絡套接字文件發送給從節點;為了實現並行復制,通常需要在復制啟動前延遲一個時間段;

        repl-diskless-sync-delay 5  延遲一會會,準備好並行傳輸
        repl-ping-slave-period 10

        *repl-timeout 60

        repl-disable-tcp-nodelay no 如果復制字節數太少,不延遲等待字節多了發送
        repl-backlog-size 1mb   請求後援隊列

        *slave-priority 100
            復制集群中,主節點故障時,sentinel應用場景中的主節點選舉時使用的優先級;數字越小優先級越高,但0表示不參與選舉; 

        min-slaves-to-write 3:主節點僅允許其能夠通信的從節點數量大於等於此處的值時接受寫操作;
        min-slaves-max-lag 10:從節點延遲時長超出此處指定的時長時,主節點會拒絕寫入操作;數據量相差大

sentinel:
    主要完成三個功能:監控、通知、自動故障轉移   主故障,從變主,依靠sentinel判斷,最

好將sentinel和redis不要放到一臺主機

        選舉:流言協議、投票協議

    配置項:

bind 0.0.0.0 必須寫,不然不能進行故障轉移
port 26379
sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel auth-pass <master-name> <password>

            <quorum>表示sentinel集群的quorum機制,即至少有quorum個sentinel節點同時判定主節點故障時,才認為其真的故障;奇數個
                s_down: subjectively down
                o_down: objectively down

        sentinel down-after-milliseconds <master-name> <milliseconds>
            監控到指定的集群的主節點異常狀態持續多久方才將標記為“故障”;

        sentinel parallel-syncs <master-name> <numslaves>
            指在failover過程中,能夠被sentinel並行配置的從節點的數量;

        sentinel failover-timeout <master-name> <milliseconds>
            sentinel必須在此指定的時長內完成故障轉移操作,否則,將視為故障轉移操作失敗;單位為毫秒;

        sentinel notification-script <master-name> <script-path>
            通知腳本,此腳本被自動傳遞多個參數;

        redis-cli -h SENTINEL_HOST -p SENTINEL_PORT 
            redis-cli> 
                SENTINEL masters
                SENTINEL slaves <MASTER_NAME>
                SENTINEL failover <MASTER_NAME>
                SENTINEL get-master-addr-by-name <MASTER_NAME>
        註意:如果從變成主,主要想成為從,需要加上從的配置;
CLuster:
    集群相關的配置:

先關閉服務,停止主從
cluster-enabled 是否開啟集群配置
cluster-config-file 集群節點集群信息配置文件,每個節點都有一個,由redis生成和更新,配置時避免名稱沖突
cluster-node-timeout 集群節點互連超時的閾值,單位毫秒
cluster-slave-validity-factor 進行故障轉移時,salve會申請成為master。有時slave會和master失聯很久導致數據較舊,這樣的slave不應該成為master。這個配置用來判斷slave是否和master失聯時間過長。

    配置過程:
        (2) 啟動redis後為每個節點分配slots;
            CLUSTER ADDSLOTS
            註意:每個slot要獨立創建;可用範圍是0-16383,共16384個;
            在執行以下分配狹槽的命令執行前必須確保每個節點都沒有數據,也沒有分配過插槽

rm -rf /var/lib/redis/redis-cluster.conf 刪除集群配置文件
rm -rf /var/lib/redis/dump.rdb 刪除節點數據
redis-cli -c -h 192.168.1.100 -p 7000 cluster addslots {0..5000}
(3) 設定集群成員關系;
CLUSTE MEET
註意:只是單純的集群,並沒有對主從復制進行配置; 測試時由於不是智能客戶端,所以需
要在訪問到本地時才能測試成功
set nikey hi
之後再對每個節點單獨做主從就可以了

redis的集群技術:
    客戶端分片
    代理分片:
        豌豆莢:codis
        twitter:twemproxy
    redis cluster
        官方實現

需要redis3.0或者更高版本
優點:
無中心的P2P Gossip分散式模式
更少的來回次數並降低延遲
自動於多個redis節點進行分片
不需要第三方軟件支持協調機制
缺點
依賴於redis3.0或更高版本
沒有後臺界面
需要智能客戶端
redis客戶端必須支持redis cluster架構
較codis有更多的維護升級成本

    博客作業:
        (1) replication, sentinel,cluster
        (2) rdb, aof 

    課外實踐:
        (1) codis
        (2) cerberus

聽課總結:
1、從下到上的工作流程:運維工程師-->DBA-->業務流程-->應用管理;現在的大型站點如京東等,都是一個電商網站上調用了很多的其他服務,這些服務有如支付寶系統、短信發送服務等這些服務通過設計的業務流程進行相互調用,返回結果;
2、結構化數據:關系型數據庫SQL;如mysql等,要數據的改變需要先進行檢查約束條件是否滿
足;這極大的消耗了時間;效率低下;由此引出了半結構化數據;NOSQL數據庫,鍵值數據庫,此數據結構可以進行分布式數據的按片冗余,每個機器放一部分數據,有副本。文檔存儲;非結構化數據使用文件系統存儲數據,掛載或客戶端訪問,分布式文件系統需要借助於FUSE協議模塊進行掛載;網絡分布式文件系統。對象式系統,是將數據和元數據存放到一起的。
3、阿裏倡導的去IOE計劃:I指的是IBM小型機(精簡指令集),O指的是Oracle,E是指EMC公
司(已經被戴爾收購了);
4、malloc:串行的內存分配器;jemalloc:並行的內存分配器,效率高,用於redis;

Redis存儲