Redis安装
第一步:安装 C 语言需要的 GCC 环境
yum install -y gcc-c ++
yum install -y wget
第二步:下载并解压缩 Redis 源码压缩包
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar -zxf redis-5.0.5.tar.gz
第三步:编译 Redis 源码,进入 redis–5.0.5 目录,执行编译命令
cd redis-5.0.5/src
make
第四步:安装 Redis ,需要通过 PREFIX 指定安装路径
mkdir /usr/redis -p
make install PREFIX = /usr/redis
集群搭建
RedisCluster最少需要三台主服务器,三台从服务器
端口号分别为:7001~7006
第一步:创建6个文件夹
mkdir /opt/lagou/redisCluster/7001 (这样创建6个)
第二步:创建7001实例,并复制redis.conf 到7001/bin目录下
cd redis-5.0.5/src
make install PREFIX=/opt/lagou/redisCluster/7001
cd ..
cp redis.conf /opt/lagou/redisCluster/7001/bin
第三步:修改redis.conf配置文件
vi /opt/lagou/redisCluster/7001/bin/redis.conf
# 将`daemonize`由`no`改为`yes` daemonize yes # 默认绑定的是回环地址,默认不能被其他机器访问 # bind 127.0.0.1 # 是否开启保护模式,由yes该为no protected-mode no # 打开cluster-enable cluster-enable yes #port设为7001 port 7001
第三步:复制7001,创建7002~7006实例,注意端口修改
[root@test1 redisCluster]# cp -r /opt/lagou/redisCluster/7001/* /opt/lagou/redisCluster/7002
[root@test1 redisCluster]# cp -r /opt/lagou/redisCluster/7001/* /opt/lagou/redisCluster/7003
[root@test1 redisCluster]# cp -r /opt/lagou/redisCluster/7001/* /opt/lagou/redisCluster/7004
[root@test1 redisCluster]# cp -r /opt/lagou/redisCluster/7001/* /opt/lagou/redisCluster/7005
[root@test1 redisCluster]# cp -r /opt/lagou/redisCluster/7001/* /opt/lagou/redisCluster/7006例如 7003下的redis.conf
第四步:创建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 ..
chmod u+x start.sh(赋写和执行的权限)
sh start.sh
第五步:创建Redis 集群(创建时Redis里不要有数据)
# cluster-replicas : 1 1个从机 前三个为主
# 采用机器ip而不采用127.0.0.1 不然外界无法访问
[root@localhost 7001]# ./redis-cli –cluster create 192.168.229.121:7001 192.168.229.121:7002 192.168.229.121:7003 192.168.229.121:7004 192.168.229.121:7005 192.168.229.121:7006 –cluster-replicas 1
命令客户端连接集群
./redis-cli -h 127.0.0.1 -p 7001 -c
注意:-c表示是以redis集群方式进行连接
查看集群的命令
·查看集群状态
cluster info
·查看集群中的节点:
cluster nodes
JedisCluster
JedisCluster是Jedis根据RedisCluster的特性提供的集群智能客户端
JedisCluster为每个节点创建连接池,并跟节点建立映射关系缓存(Cluster slots)
JedisCluster将每个主节点负责的槽位一一与主节点连接池建立映射缓存
JedisCluster启动时,已经知道key,slot和node之间的关系,可以找到目标节点
JedisCluster对目标节点发送命令,目标节点直接响应给JedisCluster
如果JedisCluster与目标节点连接出错,则JedisCluster会知道连接的节点是一个错误的节点 此时节点返回moved异常给JedisCluster
JedisCluster会重新初始化slot与node节点的缓存关系,然后向新的目标节点发送命令,目标命令执行 命令并向JedisCluster响应 如果命令发送次数超过5次,则抛出异常"Too many cluster redirection!"
JedisPoolConfig config = new JedisPoolConfig();
Set jedisClusterNode = new HashSet();
jedisClusterNode.add(new HostAndPort("192.168.127.134", 7001));
jedisClusterNode.add(new HostAndPort("192.168.127.134", 7002));
jedisClusterNode.add(new HostAndPort("192.168.127.134", 7003));
jedisClusterNode.add(new HostAndPort("192.168.127.134", 7004));
jedisClusterNode.add(new HostAndPort("192.168.127.134", 7005));
jedisClusterNode.add(new HostAndPort("192.168.127.134", 7006));
JedisCluster jcd = new JedisCluster(jedisClusterNode, config);
jcd.set("name:001","zhangfei");
String value = jcd.get("name:001");
扩容
添加主节点
-
先创建7007节点(无数据)
mkdir redisCluster/7007
cd ../software/redis-5.0.5/src/
make install PREFIX=/opt/lagou/redisCluster/7007
- 添加7007 节点作为新节点,并启动
复制7001的redis.conf到7007,并修改port,并启动7007
[root@test1 bin]# cd /opt/lagou/redisCluster/7001/bin
[root@test1 bin]# cp redis.conf /opt/lagou/redisCluster/7007/bin
[root@test1 bin]# cd /opt/lagou/redisCluster/7007/bin/
[root@test1 bin]# vi redis.conf
[root@test1 bin]# ./redis-server redis.conf
37809:C 29 Apr 2021 21:32:37.941 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
37809:C 29 Apr 2021 21:32:37.941 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=37809, just started
37809:C 29 Apr 2021 21:32:37.941 # Configuration loaded
执行命令:
./redis-cli –cluster add-node 192.168.229.121:7007 192.168.229.121:7001
- 查看集群结点发现7007已添加到集群中 cluster nodes
- hash槽重新分配(数据迁移)
添加完主节点需要对主节点进行hash槽分配,这样该主节才可以存储数据。
给刚添加的7007结点分配槽
第一步:连接上集群(连接集群中任意一个可用结点都行)
./redis-cli –cluster reshard 192.168.229.121:7007
第二步:输入要分配的槽数量
输入:3000,表示要给目标节点分配3000个槽
第三步:输入接收槽的节点id
第四步:输入源节点id
Type 'all' to use all the nodes as source nodes for the hash slots. #从其他每个master上取一些哈希槽移动到目标节点,选择“all”
Type 'done' once you entered all the source nodes IDs. #指定要从哪些节点取哈希槽,输入各节点ID,以回车键分隔,完成后输入“done”指示节点指定完成
Source node #1:d1ce7d9db6086c41f13ef0ce3753f82a3bfc420f
Source node #2:5055b631a9b310417fa75948a5e473e2e2e1cfee
Source node #3:done
第五步:输入yes开始移动槽到目标节点id
查看结果
添加从节点
添加7008从结点,将7008作为7007的从结点
创建实例
[root@test1 bin]# cd /opt/lagou/software/redis-5.0.5/src
[root@test1 src]# make install PREFIX=/opt/lagou/redisCluster/7008Hint: It's a good idea to run 'make test' ;)
INSTALL install
INSTALL install
INSTALL install
INSTALL install
INSTALL install
[root@test1 src]# cd /opt/lagou/redisCluster/7001/bin
[root@test1 bin]# cp redis.conf /opt/lagou/redisCluster/7008/bin
[root@test1 bin]# cd /opt/lagou/redisCluster/7008/bin
[root@test1 bin]# vi redis.conf
[root@test1 bin]# ./redis-server redis.conf
37923:C 29 Apr 2021 21:46:19.138 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
37923:C 29 Apr 2021 21:46:19.138 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=37923, just started
37923:C 29 Apr 2021 21:46:19.138 # Configuration loaded
./redis-cli –cluster add-node 新节点的ip和端口 主节点ip和端口 –cluster-slave — cluster-master-id 主节点id
./redis-cli –cluster add-node 192.168.229.121:7008 192.168.229.121:7007 –cluster-slave –cluster-master-id 95347e9e9214bc985f934e4ea4f14b84278f3d60
注意:如果原来该节点在集群中的配置信息已经生成cluster-config-file指定的配置文件中(如果cluster-config-file没有指定则默认为nodes.conf) ,这时可能会报错:
[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
解决方法是删除生成的配置文件nodes.conf,删除后执行./redis-cli –cluster add-node 指令
缩容
删除的顺序是先删除Slave从节点,然后在删除Master主节点
删除7008节点,7008是7007节点的从节点
指定删除节点的IP地址和Port端口号,同时还要提供该从节点ID名
./redis-cli –cluster del-node 192.168.229.121:7008 b4634afbabab85dd421b3d3b9b6a5f5546ba02b0
要想删除Master主节点,可能要繁琐一些。因为在Master主节点上有数据槽(slots),为了保证数据的不丢失,必须把这些数据槽迁移到其他Master主节点上,然后在删除主节点。
./redis-cli --cluster reshard 192.168.229.121:7007
移除多少槽如图:创建输入3000,这里要输入2999,因为计数是从0开始的,切记。
接受槽的Master主节点ID:这个节点可以是任意一个主节点都可以,我选择7002,ID是:571a15faab579e8a0578060bb4ff75023517a5b1
从哪个主节点移除,该主节点是7007,ID是:95347e9e9214bc985f934e4ea4f14b84278f3d60
执行分区计划,选择yes。分区完成
当前7007主节点已经没有数据槽了。
删除7007主节点
./redis-cli –cluster del-node 192.168.229.121:7007 95347e9e9214bc985f934e4ea4f14b84278f3d60
删除成功
原文链接:https://blog.csdn.net/Laozizuiku/article/details/116269864
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/16377