1. 程式人生 > >Redis 常見運維操作

Redis 常見運維操作

檢視當前redis版本 redis-cli -v

啟動redis例項 redis-server conf/redis.conf 
停止redis例項 redis-cli -h <ip地址> –p <埠號> shutdown
登陸redis例項 redis-cli -h <ip地址> -p <埠號> -a <密碼>

檢視redis例項相關資訊:
    當前已經使用記憶體    info memory
    當前有多少個Key    info keyspace 或者 dbsize
    查詢所有的key    keys *
    檢視某key內容    get <key>
    檢視當前是主節點還是從節點        info replication  
    查詢最大可連線數    config get maxclients
    設定最大可連線數    config set maxclients
    檢視redis最大記憶體        config get maxmemory
    修改redis最大記憶體        config set maxmemory
    將對當前redis的修改儲存到redis.conf中    config rewrite
    當前已連線客戶端    client list
    手動本地持久化    bgsave
    刪除所有現有的資料庫    flushall 高危
    檢視redis慢日誌    SLOWLOG subcommand [argument]
    設定redis例項密碼        redis.conf中設定requirepass xxx
 

    redis資料備份:
        Redis有兩種資料持久化模式,第一種是rdb模式,第二種是aof模式,可同時使用。
        (1)  rdb模式:
            預設模式,15分鐘內有一條記錄改變;5分鐘內有10條記錄改變;60秒內有10000條記錄改變,則會做一次本地持久化操作。
            cp data/data.rdb /backup/data.rdb.xxx.bak 
        (2)  aof模式:
            此模式下預設為appendfsync everysec,每隔一秒會增量持久化一次記憶體中的資料。
            cp data/appendonly.aof /backup/appendonly.aof.xxx.bak

    redis資料還原:----》未通過??
        將備份資料檔案aof(rdb)拷貝到redis的資料目錄下。並將資料檔名改的和redis.conf中的xxfilename一致,啟動該redis例項

Redis-Replication:

    為已有redis例項增加一個從節點:
        從節點redis.conf最後一行增加slaveof <master ip> <master port>,並啟動
    從節點僅作為備份節點使用:
        從節點設定slave-priority 0,使該從redis永不會被選主
    
    刪除redis例項的從節點:
        停掉從節點例項

    主從redis密碼設定:
        主:requirepass XXX
        從:masterauth XXX     配置master的密碼

Redis-Sentinel:
    
    Redis複製、Sentinel原理 https://www.cnblogs.com/zhoujinyi/p/5570024.html

    部署架構圖
    https://static.oschina.net/uploads/space/2018/0404/121400_IKz2_3371837.png
    http://blog.ipengtao.com/blog/2017-09-16-121233.jpg-ipengtao
    http://nos.netease.com/knowledge/f66a5bfe-51e3-4c75-b694-2c6e1d1b2e4b
        每個Sentinel節點通過定時監控發現主節點出現故障(主關下線)
        多個Sentinel節點對主節點故障達成一致,選出一個領導者負責故障轉移
        轉移資料過程同上面「人工干預」邏輯一致,只是是自動化的。
        轉移完成後,節點slave-1(或者slave-2)變為主節點,原來的master 變為從節點

    主從+Sentinel模式下密碼設定:
        主:requirepass XXX
            masterauth XXX
        從:requirepass XXX
            masterauth XXX
        哨兵:sentinel auth-pass <master_name> XXX

    Sentinel重要配置:
        port 26379
        sentinel monitor mymaster 127.0.0.1 6379 2  # 監視主伺服器的ip和埠,當2個sentinel例項都認為master失效時,正式失效
        sentinel auth-pass mymaster 012_345^678-90
        sentinel down-after-milliseconds mymaster 30000
        sentinel can-failover mymaster yes # 故障轉移是否允許sentinel修改slave->master. 如為no,則只能監控,無權修改) 
        sentinel parallel-syncs mymaster 1 # 一次性修改幾個slave指向新的new master.
        sentinel client-reconfig-script mymaster /var/redis/reconfig.sh # 在重新配置new master,new slave過程,可以觸發的指令碼

    啟動sentinel例項 redis-server sentinel.conf --sentinel 或者 redis-sentinel sentinel.conf
    停止sentinel例項 redis-cli -h <ip地址> –p <埠號> shutdown

    sentinel例項:
        檢視監控的redis例項    info sentinel
        查詢所有被監視的master節點資訊        sentinel masters  
        查詢監控的某個主節點的所有從節點及從節點狀態    sentinel slaves <master name>
        在sentinel中通過mastername查詢主節點的 IP 地址和埠號    sentinel get-master-addr-by-name <master name>
        重置sentinel中叢集名為mymaster的redis監控策略    sentinel reset <pattern> (可以剔除掉redis叢集中失效的從節點)

    sentinel叢集:

        刪除sentinel叢集中的一個sentinel
            (1)  停止要刪除的sentinel程序
            (2)  分別登入到另外兩個sentinel的客戶端執行sentinel reset *

    一個無中心的分散式Redis儲存架構

Redis Cluster:

    部署架構圖
    http://album.sina.com.cn/pic/0029C0wjgy7081iLsBJ1b 
    https://images0.cnblogs.com/blog2015/609710/201504/082248582749859.jpg
    架構細節:
    (1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.
    (2)節點的fail是通過叢集中超過半數的節點檢測失效時才生效.
    (3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可
    (4)redis-cluster把所有的物理節點對映到[0-16383]slot上,cluster 負責維護node<->slot<->value

    參考http://www.cnblogs.com/gomysql/p/4395504.html搭建一個 redis cluster

    啟動cluster node例項    redis-server redis.conf
    停止cluster node例項    redis-cli -h <ip地址> –p <埠號> shutdown

    檢視redis叢集基本資訊和執行狀況    cluster info
    列出叢集當前已知的所有節點(node),以及這些節點的相關資訊    cluster nodes
    將當前節點設定為 node_id 指定的節點的從節點        cluster replicate <node_id>
    將節點的配置檔案儲存到硬盤裡面    cluster saveconfig
    計算鍵 key 應該被放置在哪個槽上 cluster keyslot <key>
    檢查當前redis叢集各節點slots分配情況    redis-trib.rb check 任意節點ip:port
    返回槽 slot 目前包含的鍵值對數量 cluster countkeysinslot <slot>
    返回 count 個 slot 槽中的鍵     cluster getkeysinslot <slot> <count>
    返回一個master節點的slaves 列表 cluster slaves node-id
    將 ip 和 port 所指定的節點新增到叢集當中    cluster meet <ip> <port>
    從叢集中移除 node_id 指定的節點    cluster forget <node_id>

    動態給redis cluster增加一個從節點
        (1) 啟動新例項
        (2) 執行redis-trib.rb中add-node 將新例項新增到叢集中。
            redis-trib.rb add-node 新節點IP:PORT 叢集任意節點IP:PORT
        (3) 確認新例項的master node的node id:
            redis-cli -h xx -c -p xx cluster nodes
        (4) 在新例項互動介面輸入cluster replicate <master node id>
        (5) 通過cluster node命令檢視是否新增成功

    動態給redis cluster增加一個主節點
    (1) 啟動新例項
    (2) 執行redis-trib.rb中add-node 將新例項新增到叢集中。
        redis-trib.rb add-node 新節點IP:PORT 叢集任意節點IP:PORT
    (3) 使用redis-trib reshared,為新節點分分配slots
        redis-trib.rb reshard 叢集任意節點IP:PORT
            clustercheck....獲取cluster中的節點資訊
            how many slots do you want to move? 輸入一個數(將叢集中的某些雜湊槽移動到新節點裡面以成為真正的主節點)
            what is the reveiving node id? 輸入新節點IP
            source node:all(表示從叢集所有master隨機分配slots到新的master節點)
            yes
    (4) cluster node命令檢查這個新節點slots情況
 

    動態移除redis cluster一個從節點
    (1) 找到要移除的redis cluster從節點的node id
    (2) redis-trib.rb del-node 叢集任一節點IP:PORT 待刪除的node id
    (3) 通過cluster nodes命令檢查執行結果

    動態改變從節點的master節點
    (1) 檢視從節點當前的node id以及對應的master的node id
    (2) 進入從節點的控制檯,指向新的master: cluster replicate <新的master node id>
    (3) 通過cluster nodes命令檢查執行結果

    動態移除redis cluster一個主節點(縮容)
    (1) 將該主節點的從節點移出叢集
    (2) 移走這個主節點上的所有slots
        redis-trib.rb reshard 叢集任意節點IP:PORT
            how many slots do you want to move? 輸入主節點slots數目
            what is the reveiving node id? 輸入接收這些slots的node id
            source node:要刪除的主節點node id
        並通過cluster nodes檢查移動結果
    (3)刪除節點:redis-trib.rb del-node 叢集任意節點IP:PORT <要刪除的node id>