redis-cluster主從搭建

weixin_44115365發表於2020-12-22

1. 環境軟體版本

環境&軟體版本
虛擬機器&VMware Workstation ProVMwareworkstation15.5.6
伺服器&CentosCentOS-7-x86_64-DVD-1503-01.iso
redisredis-5.0.10
遠端連線&Xshell5
遠端檔案傳輸&Xftp5

2. 環境架構設計

機器名稱IP:port角色
redis192.168.5.136:7001redis節點
redis192.168.5.136:7002redis節點
redis192.168.5.136:7003redis節點
redis192.168.5.136:7004redis節點
redis192.168.5.136:7005redis節點
redis192.168.5.136:7006redis節點
redis192.168.5.136:7007redis節點
redis192.168.5.136:7008redis節點

3.搭建步驟

  1. 解壓redis壓縮包,進入redis目錄,進行編譯,安裝
make  #編譯
#編譯完進入src目錄,將redis安裝到指定的資料夾下
make install PREFIX=/var/redis-cluster/7001
#並且將redis解壓目錄下的redis.conf拷貝到/var/redis-cluster/7001/bin
#編輯redis.conf
port 7001 #修改埠
cluster-enabled yes #開啟cluster
#bind 127.0.0.1  #註釋該行,允許遠端訪問
protected-mode no #關閉保護模式

接著拷貝7001到其他節點目錄下,並修改redis.conf裡的埠配置

#拷貝
cp -r /var/redis-cluster/7001/* /var/redis-cluster/7002 
cp -r /var/redis-cluster/7001/* /var/redis-cluster/7003 
cp -r /var/redis-cluster/7001/* /var/redis-cluster/7004 
cp -r /var/redis-cluster/7001/* /var/redis-cluster/7005 
cp -r /var/redis-cluster/7001/* /var/redis-cluster/7006

在redis-cluster建立啟動指令碼start.sh

cd 7001/bin
./redis-server redis.conf
cd ..
cd ..

cd 7002/bin
./redis-server redis.conf
cd ..
cd ..

cd 7003/bin
./redis-server redis.conf
cd ..
cd ..

cd 7004/bin
./redis-server redis.conf
cd ..
cd ..

cd 7005/bin
./redis-server redis.conf
cd ..
cd ..

cd 7006/bin
./redis-server redis.conf
cd ..
cd ..

修改start.sh執行許可權,啟動redis節點

chmod u+x start.sh

啟動好redis節點後,進入其中一個的bin目錄,建立cluster叢集

./redis-cli --cluster create 192.168.5.136:7001 192.168.5.136:7002 192.168.5.136:7003 192.168.5.136:7004 192.168.5.136:7005 192.168.5.136:7006 --cluster-replicas 1
# cluster-replicas : 1   1從機 前三個為主

可以看到效果:
在這裡插入圖片描述
連線叢集

./redis-cli -h 127.0.0.1 -p 7001 -c
# -c:以叢集方式連線

重定向

moved重定向
1.每個節點通過通訊都會共享Redis Cluster中槽和叢集中對應節點的關係
2.客戶端向Redis Cluster的任意節點傳送命令,接收命令的節點會根據CRC16規則進行hash運算與
16384取餘,計算自己的槽和對應節點
3.如果儲存資料的槽被分配給當前節點,則去槽中執行命令,並把命令執行結果返回給客戶端
4.如果儲存資料的槽不在當前節點的管理範圍內,則向客戶端返回moved重定向異常
5.客戶端接收到節點返回的結果,如果是moved異常,則從moved異常中獲取目標節點的資訊
6.客戶端向目標節點傳送命令,獲取命令執行結果

在這裡插入圖片描述

  1. 擴容
#新建7007目錄,安裝一個新的redis(無資料)到7007目錄下,拷貝7001中的redis.conf到7007的bin下,複製7007到7008
mkdir /var/redis-cluster/7007
#進入redis的src目錄下進行安裝
make install PREFIX=/var/redis-cluster/7007
#進入/var/redis-cluster目錄,拷貝
cp 7001/bin/redis.conf 7007/bin/

啟動7007節點,進入7007/bin

#啟動7007
./redis-server redis.conf
#將7007加入cluster叢集
./redis-cli --cluster add-node 192.168.5.136:7007 192.168.5.136:7001

cluster nodes檢視節點資訊
在這裡插入圖片描述
可見7007目前是沒有分配槽位,分配槽位

./redis-cli --cluster reshard 192.168.5.136:7007

在這裡插入圖片描述

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表示從其他節點平均分配到目標節點
#done是指,可以選擇提供槽位的節點,最後輸入done結束,進行分配

新增節點7008作為7007的從節點,啟動7008節點,將7008掛載到7007下

./redis-cli --cluster add-node 新節點的ip和埠 舊節點ip和埠 --cluster-slave -- cluster-master-id 主節點id

最後節點分佈效果
在這裡插入圖片描述

4.jedisCluster連線redis-cluster

依賴

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>
public class JedisClusterDemo {
    public static void main(String[] args) {
        JedisPoolConfig config = new JedisPoolConfig();
        Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
        jedisClusterNode.add(new HostAndPort("192.168.5.136", 7001));
        jedisClusterNode.add(new HostAndPort("192.168.5.136", 7002));
        jedisClusterNode.add(new HostAndPort("192.168.5.136", 7003));
        jedisClusterNode.add(new HostAndPort("192.168.5.136", 7004));
        jedisClusterNode.add(new HostAndPort("192.168.5.136", 7005));
        jedisClusterNode.add(new HostAndPort("192.168.5.136", 7006));
        jedisClusterNode.add(new HostAndPort("192.168.5.137", 7006));
        jedisClusterNode.add(new HostAndPort("192.168.5.138", 7006));
        JedisCluster jcd = new JedisCluster(jedisClusterNode, config);
        jcd.set("name:003","wangwu");
        String value = jcd.get("name:003");
        System.out.println(value);
    }
}

在這裡插入圖片描述

相關文章