redis-cluster主從搭建
阿新 • • 發佈:2020-12-23
1. 環境軟體版本
環境&軟體 | 版本 |
---|---|
虛擬機器&VMware Workstation Pro | VMwareworkstation15.5.6 |
伺服器&Centos | CentOS-7-x86_64-DVD-1503-01.iso |
redis | redis-5.0.10 |
遠端連線&Xshell | 5 |
遠端檔案傳輸&Xftp | 5 |
2. 環境架構設計
機器名稱 | IP:port | 角色 |
---|---|---|
redis | 192.168.5.136:7001 | redis節點 |
redis | 192.168.5.136:7002 | redis節點 |
redis | 192.168.5.136:7003 | redis節點 |
redis | 192.168.5.136:7004 | redis節點 |
redis | 192.168.5.136:7005 | redis節點 |
redis | 192.168.5.136:7006 | redis節點 |
redis | 192.168.5.136:7007 | redis節點 |
redis | 192.168.5.136:7008 | redis節點 |
3.搭建步驟
- 解壓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.客戶端向目標節點發送命令,獲取命令執行結果
- 擴容
#新建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);
}
}