集群规划
机器ip
节点角色
安装目录
10.211.55.7
7001 主
/home/redis/7001
10.211.55.7
7002 主
/home/redis/7002
10.211.55.7
7003 主
/home/redis/7003
10.211.55.7
7004 从
/home/redis/7004
10.211.55.7
7005 从
/home/redis/7005
10.211.55.7
7006 从
/home/redis/7006
下载安装
#进入目录下载
[root@ki1 ~]# cd /usr/local/src/
[root@ki1 src]# wget http://download.redis.io/releases/redis-5.0.5.tar.gz
#创建解压目录并解压
[root@ki2 src]# mkdir /home/redis -p
[root@ki2 src]# tar -zxvf redis-5.0.5.tar.gz -C /home/redis/
#创建安装目录并编译安装
[root@ki2 src]# mkdir /home/redis/7001 -p
[root@ki2 src]# cd /home/redis/redis-5.0.5/src
[root@ki2 src]# make install PREFIX=/home/redis/7001
配置redis.conf
[root@ki2 src]# cp /home/redis/redis-5.0.5/redis.conf /home/redis/7001
[root@ki2 src]# vim /home/redis/7001/bin/redis.conf
#配置如下内容,注意每台机器的端口
#解决只能特定网段连接的限制
#bind 127.0.0.1
#关闭保护模式,不然会阻止远程访问
protected-mode no
port 7001
#这样启动时就在后台启动
daemonize yes
cluster-enabled yes
#从节点需要配置,表示当前从服务器对应的主服务器的ip 端口,可以不配置,后面会通过命令来创建集群
#replicaof 192.168.127.129 6379
启停命令
[root@ki2 src]# cd /home/redis/7001/bin
[root@ki2 bin]# ./redis-server redis.conf
其他节点操作如上,本台机器可进行拷贝
#本台机器拷贝,自行修改配置文件的端口
[root@ki2 src]# cp -r /home/redis/7001/ /home/redis/7002
集群批量启动
vim /home/redis/start-cluster.sh
cd 7001/bin
./redis-server redis.conf
cd ../..
cd 7002/bin
./redis-server redis.conf
cd ../..
cd 7003/bin
./redis-server redis.conf
cd ../..
cd 7004/bin
./redis-server redis.conf
cd ../..
cd 7005/bin
./redis-server redis.conf
cd ../..
cd 7006/bin
./redis-server redis.conf
cd ../..
创建redis集群
#一共六台,配置一主一从,--cluster-replicas 1表示一从机,即前三台是主,后三台是从,对应关系是自动配对的,任意节点执行 # cluster-replicas : 1 表示1个从节点
./redis-cli --cluster create 10.211.55.7:7001 10.211.55.7:7002 10.211.55.7:7003 10.211.55.7:7004 10.211.55.7:7005 10.211.55.7:7006 --cluster-replicas 1
查看集群信息
vim /home/redis/7001/bin/nodes.conf #每个节点上都可以看到,是一样的
或者进入redis cli
#-c表示以集群的方式启动
./redis-cli -p 7001 -c
127.0.0.1:7001> cluster nodes
8de81cd7b782ca6e81d83cb2470c94ae8d8439dd 10.211.55.7:7003@17003 master - 0 1597133105064 3 connected 12194-16383
26dc93f891e4530eb2877ef400b35abafb3d1dd7 10.211.55.7:7002@17002 master - 0 1597133107078 2 connected 6734-10922
dfecc2bd96326858829de8c54d1a6b9b11f792c0 10.211.55.7:7006@17006 slave 875c4eca628555591a0a503f04552c475dcd0ad3 0 1597133108083 6 connected
12bc2a6923c08bb36701897b55ced39e87d98dbc 10.211.55.7:7008@17008 slave 78723e1c4b609dd79d969609af776a49fc55cf03 0 1597133104000 7 connected
e0df8c1abf174cf12a0d895939b7149d92413d38 10.211.55.7:7005@17005 slave 8de81cd7b782ca6e81d83cb2470c94ae8d8439dd 0 1597133107000 5 connected
d2f57eccdb277f1803baf66e470f2137c30c5e92 10.211.55.7:7010@17010 slave dce0bb96c246a6f5bec078bcb029b806895c65ec 0 1597133106000 8 connected
875c4eca628555591a0a503f04552c475dcd0ad3 10.211.55.7:7001@17001 myself,master - 0 1597133104000 1 connected 1272-5460
dce0bb96c246a6f5bec078bcb029b806895c65ec 10.211.55.7:7009@17009 master - 0 1597133110096 8 connected 0-182 999-1271 6462-6733 11922-12193
174d01ed37d24e3633c832a95a13c3e3f3fab31b 10.211.55.7:7004@17004 slave 26dc93f891e4530eb2877ef400b35abafb3d1dd7 0 1597133109000 4 connected
78723e1c4b609dd79d969609af776a49fc55cf03 10.211.55.7:7007@17007 master - 0 1597133109091 7 connected 183-998 5461-6461 10923-11921
操作命令观察分槽-moved重定向
分片,客户端路由,moved重定向,在任一节点set或del的时候,如果不在当前节点,都会看到重定向的信息。
每个redis安装好后,会初始化每个节点分配得槽信息slots。对key进行哈希分配到对应的槽上。
查看key对应的槽信息
#在客户端中输入命令
cluster keyslot key
扩容-添加主节点
#编译安装,节点无数据,不要复制
make install PREFIX=/home/redis/7007
#配置文件同上
#添加新节点,在前面的集群主节点上10.211.55.7:7001操作如下命令
cd /home/redis/7001/bin
./redis-cli --cluster add-node 10.211.55.7:7007 10.211.55.7:7001
#可以通过如下命令查看节点信息
cluster nodes
给刚添加进来的节点添加槽
添加完主节点需要对主节点进行hash槽分配,这样该主节才可以存储数据。
redis集群有16384个槽,集群中的每个结点分配自已槽,通过查看集群结点可以看到槽占用情况。
给刚添加的7007结点分配槽
第一步:连接上集群(连接集群中任意一个可用结点都行)
/redis-cli --cluster reshard 10.211.55.7:7009
>>> Performing Cluster Check (using node 127.0.0.1:7007)
M: 50b073163bc4058e89d285dc5dfc42a0d1a222f2 127.0.0.1:7007
slots: (0 slots) master
S: 51c3ebdd0911dd6564040c7e20b9ae69cabb0425 127.0.0.1:7004
slots: (0 slots) slave
replicates af559fc6c82c83dc39d07e2dfe59046d16b6a429
S: 78dfe773eaa817fb69a405a3863f5b8fcf3e172f 127.0.0.1:7006
slots: (0 slots) slave
replicates d277cd2984639747a17ca79428602480b28ef070
S: e7b1f1962de2a1ffef2bf1ac5d94574b2e4d67d8 127.0.0.1:7005
slots: (0 slots) slave
replicates 068b678923ad0858002e906040b0fef6fff8dda4
M: af559fc6c82c83dc39d07e2dfe59046d16b6a429 127.0.0.1:7001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 068b678923ad0858002e906040b0fef6fff8dda4 127.0.0.1:7002
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: d277cd2984639747a17ca79428602480b28ef070 127.0.0.1:7003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration. >>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
第二步:输入要分配的槽数量
How many slots do you want to move (from 1 to 16384)? 3000
输入:3000,表示要给目标节点分配3000个槽
第三步:输入接收槽的结点id
What is the receiving node ID?
输入:50b073163bc4058e89d285dc5dfc42a0d1a222f2
PS:这里准备给7007分配槽,通过cluster nodes查看7007结点id为: 50b073163bc4058e89d285dc5dfc42a0d1a222f2
第四步:输入源结点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.
输入:all
第五步:输入yes开始移动槽到目标结点id
使用cluster nodes查看信息
扩容-添加从节点
#查看7007节点的id
vim /home/redis/7007/bin/nodes.conf
#添加从节点
dce0bb96c246a6f5bec078bcb029b806895c65ec是节点7007的id,也可以通过cluster nodes查看
./redis-cli --cluster add-node 10.211.55.7:7008 10.211.55.7:7007 --cluster-slave --cluster-master-id dce0bb96c246a6f5bec078bcb029b806895c65ec
缩容
./redis-cli --cluster del-node 192.168.127.128:7008 6be94480315ab0dd2276a7f70c82c578535d6666
删除已经占有hash槽的结点会失败,报错如下:
[ERR] Node 192.168.127.128:7008 is not empty! Reshard data away and try again.
需要将该结点占用的hash槽分配出去。
使用jedisCluster连接redisCluster
创建一个工程,导入依赖
redis.clients
jedis
2.9.0
compile
创建一个测试类
![image-20200811165532059](/Users/lewis/Library/Application Support/typora-user-images/image-20200811165532059.png)
package com.deepinblog.jedisdemo;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
import java.util.HashSet;
import java.util.Set;
public class JedisDemoApplication {
static JedisCluster jedisCluster;
static {
JedisPoolConfig config = new JedisPoolConfig();
Set jedisClusterNode = new HashSet();
jedisClusterNode.add(new HostAndPort("10.211.55.7", 7001));
jedisClusterNode.add(new HostAndPort("10.211.55.7", 7002));
jedisClusterNode.add(new HostAndPort("10.211.55.7", 7003));
jedisClusterNode.add(new HostAndPort("10.211.55.7", 7004));
jedisClusterNode.add(new HostAndPort("10.211.55.7", 7005));
jedisClusterNode.add(new HostAndPort("10.211.55.7", 7006));
jedisClusterNode.add(new HostAndPort("10.211.55.7", 7007));
jedisClusterNode.add(new HostAndPort("10.211.55.7", 7008));
jedisClusterNode.add(new HostAndPort("10.211.55.7", 7009));
jedisClusterNode.add(new HostAndPort("10.211.55.7", 7010));
jedisCluster = new JedisCluster(jedisClusterNode, config);
}
public static void main(String[] args) {
String key = "name:008";
set(key,"i am iron man");
get(key);
}
public static void set(String key, String val) {
jedisCluster.set(key, val);
System.out.println("=========================Key:" + key + " set val :" + val + "=======================");
}
public static void get(String key) {
String val = jedisCluster.get(key);
System.out.println("=========================Val from redis :" + val + "=======================");
}
}