linux 配置redis叢集
阿新 • • 發佈:2018-12-25
redis 安裝
安裝redis
$ wget http://download.redis.io/releases/redis-3.2.3.tar.gz
$ tar xzf redis-3.2.3.tar.gz
$ cd redis-3.2.3
$ make (需要安裝gcc |yum install gcc)
檢測是否安裝成功
$ cd src/
$ redis-server ../redis.conf(啟動服務)
$ redis-cli (開啟客戶端)
$ set key value
$ get key
部分配置檔案說明(redis.conf)
- port 6379 預設埠6379
- bind 127.0.0.1 允許連結的IP ,註釋掉,可以任意遠端機器連結
- protected-mode yes 預設是yes ,設定為 no(為了支援無密碼的任意機器訪問)
- pidfile /var/run/redis_6379.pid 服務啟動時用到。需要和port 的值一致
持久化
RDB 方式
# RDB方式的持久化是通過快照(snapshotting)完成的,當符合一定條件時Redis會自動將記憶體中的所有資料進行快照並存儲在硬碟上。進行快照的條件可以由使用者在配置檔案中自定義,由兩個引數構成:時間和改動的鍵的個數。當在指定的時間內被更改的鍵的個數大於指定的數值時就會進行快照。RDB是Redis預設採用的持久化方式,在配置檔案中已經預置了3個條件:
$ save 900 1 # 900秒內有至少1個鍵被更改則進行快照
$ save 300 10 # 300秒內有至少10個鍵被更改則進行快照
$ save 60 10000 # 60秒內有至少10000個鍵被更改則進行快照
# 通過配置dir和dbfilename兩個引數分別指定快照檔案的儲存路徑和檔名
# Redis實現快照的過程
Redis使用fork函式複製一份當前程序(父程序)的副本(子程序);
父程序繼續接收並處理客戶端發來的命令,而子程序開始將記憶體中的資料寫入硬碟中的臨時檔案;
當子程序寫入完所有資料後會用該臨時檔案替換舊的RDB檔案,至此一次快照操作完成。
AOF 方式
$ appendonly no #預設情況下Redis沒有開啟AOF(append only file)方式的持久化
$ appendfilename appendonly.aof (檔名)
# 配置redis自動重寫AOF檔案的條件
$ auto-aof-rewrite-percentage 100 # 當目前的AOF檔案大小超過上一次重寫時的AOF檔案大小的百分之多少時會再次進行重寫,如果之前沒有重寫過,則以啟動時的AOF檔案大小為依據
$ auto-aof-rewrite-min-size 64mb # 允許重寫的最小AOF檔案大小
# 配置寫入AOF檔案後,要求系統重新整理硬碟快取的機制
$ appendfsync always # 每次執行寫入都會執行同步,最安全也最慢
$ appendfsync everysec # 每秒執行一次同步操作
$ appendfsync no # 不主動進行同步操作,而是完全交由作業系統來做(即每30秒一次),最快也最不安全
# 開啟AOF持久化後每執行一條會更改Redis中的資料的命令,Redis就會將該命令寫入硬碟中的AOF檔案,比RDB較慢,不過可以避免RDB 最後一次快照丟失的問題。具體根據業務需求配置。
Redis服務安裝
$ cd utils/
$ ./install_server.sh(根據提示部署 服務)
$ service redis_6379 start(啟動服務)
注:redis 的 相關shell寫的還是比較基礎易懂的,有興趣深入學習shell的可以觀摩一下
redis 叢集配置
配置檔案(redis.conf)
註冊服務後,redis啟動的配置檔案,實際上是/etc/redis/6379.conf。具體的配置檔案,可以去看一下redis服務啟動指令碼(/etc/init.d/redis_6379)
daemonize yes # redis預設不是後臺啟動,這裡修改成後臺啟動
cluster-enabled yes # 允許redis支援叢集模式
cluster-config-file nodes.conf # 節點配置檔案
cluster-node-timeout 15000 # 節點超時毫秒
appendonly yes
#port 7000 #如果你需要自定義埠可以用這個選項
搭建redis叢集(在其中任意一個節點操作就可以了)
通過使用 Redis 叢集命令列工具 redis-trib 建立叢集, redis-trib 位於 Redis 原始碼的 src 資料夾中, 它是一個 Ruby 程式, 這個程式通過向例項傳送特殊命令來完成建立新叢集, 檢查叢集, 或者對叢集進行重新分片(reshared)等工作.
$ cd src
$ ./redis-trib.rb create --replicas 1 xxx.xxx.xxx.1:6379 xxx.xxx.xxx.2:6379 xxx.xxx.xxx.3:6379 xxx.xxx.xxx.4:6379 xxx.xxx.xxx.5:6379 xxx.xxx.xxx.6:6379
# 最少6個結點,可以在同一臺機器上
第一次操作會提醒你缺少ruby,等其他一些的程式
$ yum install ruby
$ yum install rubygems
#再次執行命令,還會報錯,提示不能載入redis,是因為缺少redis和ruby的介面,使用gem 安裝
$ gem install redis
執行成功後,可以看到nodes.conf中已經有結點的配置資訊
337606b1919b6fa1993e8050dc7cf6376b7cdfc8 172.23.65.216:6380 master - 0 1472127722259 3 connected 10923-16383
a8871039bf89119782774af60294f1f7e990f384 172.23.65.216:6379 slave 337606b1919b6fa1993e8050dc7cf6376b7cdfc8 0 1472127725968 6 connected
含義
- 節點ID
- IP:埠
- 標誌: master, slave, myself, fail, …
- 如果是個從節點, 這裡是它的主節點的NODE ID
- 叢集最近一次向節點發送 PING 命令之後, 過去了多長時間還沒接到回覆。
- 節點最近一次返回 PONG 回覆的時間。
- 節點的配置紀元(configuration epoch):詳細資訊請參考 Redis 叢集規範 。
- 本節點的網路連線情況:例如 connected 。
- 節點目前包含的槽:例如 127.0.0.1:7001 目前包含號碼為 5960 至 10921 的雜湊槽。
測試叢集
$ redis-cli -c -h xxx.xxx.xxx.1(叢集中任意一個ip) -p 6379
$ CLUSTER INFO 列印叢集資訊
叢集操作
客戶端檢視叢集資訊
CLUSTER INFO 列印叢集的資訊
CLUSTER NODES 列出叢集當前已知的所有節點(node),以及這些節點的相關資訊。
節點
CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節點新增到叢集當中,讓它成為叢集的一份子。
CLUSTER FORGET <node_id> 從叢集中移除 node_id 指定的節點。
CLUSTER REPLICATE <node_id> 將當前節點設定為 node_id 指定的節點的從節點。
CLUSTER SAVECONFIG 將節點的配置檔案儲存到硬盤裡面。
槽(slot)
CLUSTER ADDSLOTS <slot> [slot ...] 將一個或多個槽(slot)指派(assign)給當前節點。
CLUSTER DELSLOTS <slot> [slot ...] 移除一個或多個槽對當前節點的指派。
CLUSTER FLUSHSLOTS 移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。
CLUSTER SETSLOT <slot> NODE <node_id> 將槽 slot 指派給 node_id 指定的節點,如果槽已經指派給另一個節點,那麼先讓另一個節點刪除該槽>,然後再進行指派。
CLUSTER SETSLOT <slot> MIGRATING <node_id> 將本節點的槽 slot 遷移到 node_id 指定的節點中。
CLUSTER SETSLOT <slot> IMPORTING <node_id> 從 node_id 指定的節點中匯入槽 slot 到本節點。
CLUSTER SETSLOT <slot> STABLE 取消對槽 slot 的匯入(import)或者遷移(migrate)。
鍵
CLUSTER KEYSLOT <key> 計算鍵 key 應該被放置在哪個槽上。
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的鍵值對數量。
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個 slot 槽中的鍵。
叢集操作
檢視叢集狀態
$ redis-trib.rb check 172.23.65.204:6380
加入空master結點
$ redis-trib.rb add-node 172.23.65.214:6386 172.23.65.204:6379
# 第一個IP:PORT為新新增的master redis結點,第二個為叢集中已經存在的結點
# 新節點沒有包含任何資料, 因為它沒有包含任何slot。新加入的加點是一個主節點, 當叢集需要將某個從節點升級為新的主節點時, 這個新節點不會被選中
為新節點分配slot
$ redis-trib.rb reshard 10.10.34.14:6386
#根據提示選擇要遷移的slot數量(ps:這裡選擇500)
How many slots do you want to move (from 1 to 16384)? 500
#選擇要接受這些slot的node-id
What is the receiving node ID? f51e26b5d5ff74f85341f06f28f125b7254e61bf
#選擇slot來源:
#all表示從所有的master重新分配,
#或者資料要提取slot的master節點id,最後用done結束
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:all
#列印被移動的slot後,輸入yes開始移動slot以及對應的資料.
#Do you want to proceed with the proposed reshard plan (yes/no)? yes
#結束
新增新的slave節點
- 前兩步同上
- redis-cli連線上新節點shell,輸入命令:cluster replicate 對應master的node-id
$ cluster replicate 2b9ebcbd627ff0fd7a7bbcc5332fb09e72788835
# 線上新增slave 時,需要dump整個master程序,並傳遞到slave,再由 slave載入rdb檔案到記憶體,rdb傳輸過程中Master可能無法提供服務,整個過程消耗大量io,小心操作.
刪除一個slave節點
# redis-trib del-node ip:port '<node-id>'
$ redis-trib.rb del-node 10.10.34.14:7386 'c7ee2fca17cb79fe3c9822ced1d4f6c5e169e378'
刪除一個master節點
- 刪除master節點之前首先要使用reshard移除master的全部slot,然後再刪除當前節點(目前只能把被刪除
master的slot遷移到一個節點上)
#把10.10.34.14:6386當前master遷移到10.10.34.14:6380上
redis-trib.rb reshard 10.10.34.14:6380
#根據提示選擇要遷移的slot數量(ps:這裡選擇500)
How many slots do you want to move (from 1 to 16384)? 500(被刪除master的所有slot數量)
#選擇要接受這些slot的node-id(10.10.34.14:6380)
What is the receiving node ID? c4a31c852f81686f6ed8bcd6d1b13accdc947fd2 (ps:10.10.34.14:6380的node-id)
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:f51e26b5d5ff74f85341f06f28f125b7254e61bf(被刪除master的node-id)
Source node #2:done
#列印被移動的slot後,輸入yes開始移動slot以及對應的資料.
- 刪除空master節點
redis-trib.rb del-node 10.10.34.14:6386 'f51e26b5d5ff74f85341f06f28f125b7254e61bf'
重啟叢集
刪除生成的nodes.conf
重啟所有redis server
重新執行上文的部署命令