RedisCluster 集群搭建

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/7008

Hint: 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

 删除成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值