redis叢集新增節點和刪除節點
redis叢集新增節點
1、主節點:如果新增的是主節點,那麼我們需要建立一個空節點,然後將某些雜湊槽移動到這個空節點裡面。
2、從節點:如果新增的是從節點,我們也需要建立一個空節點,然後把這個新節點設定成叢集中某個主節點的複製品。
新增節點:
1、首先把需要新增的節點啟動
建立7006目錄,拷貝7000中的redis.conf到7006中,然後修改埠port為7006,修改好後進入7006目錄啟動這個節點:
redis-server redis.conf
2、執行以下命令,將這個新節點新增到叢集中:
redis-trib.rb add-node 192.168.33.130:7006 192.168.33.130:7000
結果圖示:
3、執行命令檢視剛才新增的節點:
redis-cli -c -p 7000 cluster nodes
4、增加了新的節點之後,這個新的節點可以成為主節點或者是從節點
4.1將這個新增節點變成從節點
前面我們已經把這個新節點新增到叢集中了,現在我們要讓新節點成為192.168.33.130:7001的從節點,只需要執行下面的命令就可以了,命令後面的節點ID就是192.168.33.130:7001的節點ID。(注意,這個從節點雜湊槽必須為空,如果不為空,則需要轉移掉雜湊槽使之為空)
redis-cli -c -p 7006 cluster replicate a246963893faf03c45cc19ef4188f82f5393bfef
使用下面命令來確認一下192.168.33.130:7006是否已經成為192.168.33.130:7001的從節點。
redis-cli -p 7000 cluster nodes | grep slave | grep a246963893faf03c45cc19ef4188f82f5393bfef
4.2、將這個新增節點變成主節點:
使用redis-trib程式,將叢集中的某些雜湊槽移動到新節點裡面,這個新節點就成為真正的主節點了。執行下面的命令對叢集中的雜湊槽進行移動:
redis-trib.rb reshard 192.168.33.130:7000
命令執行後,系統會提示我們要移動多少雜湊槽,這裡移動1000個
然後還需要指定把這些雜湊槽轉移到哪個節點上
輸入我們剛才新增的節點的ID
d113e0f033c98e2f6b88fb93e6e98866256d85c4
然後需要我們指定轉移哪幾個幾點的雜湊槽
輸入all 表示從所有的主節點中隨機轉移,湊夠1000個雜湊槽
然後再輸入yes,redis叢集就開始分配雜湊槽了。
至此,一個新的主節點就新增完成了,執行命令檢視現在的叢集中節點的狀態
redis-cli -c -p 7000 cluster nodes
結果圖示:
Redis叢集刪除節點
1、如果刪除的節點是主節點,這裡我們刪除192.168.33.130:7006節點,這個節點有1000個雜湊槽
首先要把節點中的雜湊槽轉移到其他節點中,執行下面的命令:
redis-trib.rb reshard 192.168.33.130:7000
系統會提示我們要移動多少雜湊槽,這裡移動1000個,因為192.168.33.130:7006節點有1000個雜湊槽。
然後系統提示我們輸入要接收這些雜湊槽的節點的ID,這裡使用192.168.33.130:7001的節點ID
然後要我們選擇從那些節點中轉出雜湊槽,這裡一定要輸入192.168.33.130:7006這個節點的ID
最後輸入done表示輸入完畢。
最後一步,使用下面的命令把這個節點刪除
如果是從節點,直接刪除即可。
redis-trib.rb del-node 192.168.33.130:7000 d113e0f033c98e2f6b88fb93e6e98866256d85c4 //最後一個引數為需要刪除節點的ID
java操作redis叢集
向Redis叢集中存入鍵值:
程式碼示例:
import java.util.HashSet;
//需要再pom.xml中引入jedis依賴
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class RedisCluster {
public static void main(String[] args) {
//初始化集合,用於裝下面的多個主機和埠
HashSet<HostAndPort> nodes = new HashSet<HostAndPort>();
//建立多個主機和埠例項
HostAndPort hostAndPort = new HostAndPort("192.168.33.130", 7000);
HostAndPort hostAndPort1 = new HostAndPort("192.168.33.130", 7001);
HostAndPort hostAndPort2 = new HostAndPort("192.168.33.130", 7002);
HostAndPort hostAndPort3 = new HostAndPort("192.168.33.130", 7003);
HostAndPort hostAndPort4 = new HostAndPort("192.168.33.130", 7004);
HostAndPort hostAndPort5 = new HostAndPort("192.168.33.130", 7005);
//新增多個主機和埠到集合中
nodes.add(hostAndPort);
nodes.add(hostAndPort1);
nodes.add(hostAndPort2);
nodes.add(hostAndPort3);
nodes.add(hostAndPort4);
nodes.add(hostAndPort5);
//建立config
JedisPoolConfig poolConfig = new JedisPoolConfig();
//通過config建立叢集例項
JedisCluster jedisCluster = new JedisCluster(nodes,poolConfig);
//獲取叢集中的key為name鍵的值
String str = jedisCluster.get("name");
System.out.println(str);
}
}
列印結果:
Alice