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>