redis集群扩容和缩容_搭建RedisCluster的安装、部署、扩容、缩容和Java客户端调用基于LinuxCentos7...

本文详细介绍了如何在Linux Centos7环境下搭建Redis Cluster,包括集群规划、安装、配置、启动、扩容、缩容的步骤,并提供了Java客户端JedisCluster的连接配置示例。
摘要由CSDN通过智能技术生成

集群规划

机器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 + "=======================");

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值