Redis集群搭建&JedisCluster客户端连接
文章目录
概述
- 搭建Redis5.0集群,要求三主三从,记录安装步骤
- 添加一主一丛(Master4和Slaver4),记录安装步骤
- 能够通过JedisCluster向RedisCluster添加数据和取出数据
1.1 搭建Redis5.0集群
三主三从
第一步:安装 C 语言需要的 GCC 环境
yum install -y gcc-c++
yum install -y wget
第二步:下载并解压缩 Redis 源码压缩包
#到/var目录下
cd /var
#下载redis-5.0.5.tar.gz
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
#解压redis-5.0.5.tar.gz
tar -zxf redis-5.0.5.tar.gz
第三步:集群搭建
RedisCluster最少需要三台主服务器,三台从服务器。
端口号分别为:7001~7006
1、编译 Redis 源码,进入 redis-5.0.5 目录,执行编译命令
cd /var
mkdir -p redis-cluster/Master1
cd /var/redis-5.0.5/src
make install PREFIX=/var/redis-cluster/Master1
cp /var/redis-5.0.5/redis.conf /var/redis-cluster/Master1/bin
常规修改redis.conf
cd /var/redis-cluster/Master1/bin
vim redis.conf
#将daemonize
由no
改为yes
daemonize yes
#默认绑定的是回环地址,默认不能被其他机器访问
#bind 127.0.0.1
#是否开启保护模式,由yes该为no
protected-mode no
(1)创建Master1实例,并编辑redis.conf文件,修改port为7001。
注意:创建实例,即拷贝单机版安装时,生成的bin目录,为Master1目录。
(2)修改redis.conf配置文件,打开cluster-enable yes
2、复制Master1,创建Master2、Master3、slaver1~slaver3实例,注意端口修改。
cp -r /var/redis-cluster/Master1/* /var/redis-cluster/Master2
cp -r /var/redis-cluster/Master1/* /var/redis-cluster/Master3
cp -r /var/redis-cluster/Master1/* /var/redis-cluster/slaver1
cp -r /var/redis-cluster/Master1/* /var/redis-cluster/slaver2
cp -r /var/redis-cluster/Master1/* /var/redis-cluster/slaver3
3、创建start.sh,启动所有的实例
vim start.sh
#添加如下内容
cd Master1/bin
./redis-server redis.conf
cd ..
cd ..
cd Master2/bin
./redis-server redis.conf
cd ..
cd ..
cd Master2/bin
./redis-server redis.conf
cd ..
cd ..
cd slaver1/bin
./redis-server redis.conf
cd ..
cd ..
cd slaver2/bin
./redis-server redis.conf
cd ..
cd ..
cd slaver3/bin
./redis-server redis.conf
cd ..
cd ..
chmod u+x start.sh (赋写和执行的权限)
./start.sh(启动RedisCluster)
4、创建Redis集群(创建时Redis里不要有数据)
#cluster-replicas : 1 1从机 前三个为主
#采用机器ip而不采用127.0.0.1 不然外界无法访问
cd /var/redis-cluster/Master1/bin/
[root@localhost bin] ./redis-cli --cluster create 192.168.80.121:7001 192.168.80.121:7002 192.168.80.121:7003 192.168.80.121:7004 192.168.80.121:7005 192.168.80.121:7006 --cluster-replicas 1
运行如下,过程中Can I set the above configuration? (type ‘yes’ to accept):
输入yes
命令客户端连接集群
命令:./redis-cli -h 127.0.0.1 -p 7001 -c
1.2 添加一主一丛(Master4和Slaver4),安装步骤
第一步:添加主节点
先创建Master4节点 (无数据,需要重新安装,不能复制集群中节点)
cd /var/redis-cluster
mkdir redis-cluster/Master4
cd /var/redis-5.0.5/src
make install PREFIX=/var/redis-cluster/Master4
cp /var/redis-5.0.5/redis.conf /var/redis-cluster/Master4/bin
修改redis.conf见集群搭建中第三步-1,注意修改端口为7007
第二步:添加从节点
复制Master4
cd /var/redis-cluster
mkdir redis-cluster/Slaver4
cp -r /var/redis-cluster/Master4/* /var/redis-cluster/Slaver4
第三步:添加Master4结点作为新节点,并启动
启动
cd /var/redis-cluster/Master4/bin
./redis-cli redis.conf
执行命令:
cd /var/redis-cluster/Master4/bin
[root@localhost bin] ./redis-cli --cluster add-node 192.168.80.121:7007
192.168.80.121:7001
如下添加成功
第四步:hash槽重新分配(数据迁移)
添加完主节点需要对主节点进行hash槽分配,这样该主节才可以存储数据。
给刚添加的Master4结点分配槽
1、查看集群中槽占用情况
cluster nodes
2、连接上集群(连接集群中任意一个可用结点都行)
cd /var/redis-cluster/Master4/bin
[root@localhost bin] ./redis-cli --cluster reshard 127.0.0.1:7007
2.1 输入要分配的槽数量
How many slots do you want to move (from 1 to 16384)? 3000
输入:3000,表示要给目标节点分配3000个槽
2.2 输入接收槽的结点id
What is the receiving node ID?
输入:a9761d0855499514384b37d0638a5bcff9689a33
PS:这里准备给7007分配槽,通过cluster nodes查看Master4结点id为:
a9761d0855499514384b37d0638a5bcff9689a33
2.3 输入源结点id
输入:all
2.4 输入yes开始移动槽到目标结点id
输入:yes
第五步:添加从节点(Slaver4)
先启动Slaver4
cd /var/redis-cluster/Slaver4/bin
./redis-cli redis.conf
添加Slaver4从结点,将Slaver4作为Master4的从结点
命令:
./redis-cli --cluster add-node 新节点的ip和端口 旧节点ip和端口 --cluster-slave
–cluster-master-id 主节点id
./redis-cli --cluster add-node 192.168.80.121:7008 192.168.80.121:7007 --cluster-slave --cluster-master-id a9761d0855499514384b37d0638a5bcff9689a33
a9761d0855499514384b37d0638a5bcff9689a33是Master4结点的id,可通过cluster nodes查看。
如下添加成功:
1.3 通过JedisCluster向RedisCluster添加数据和取出数据
第一步 创建maven项目,导入依赖
pom.xml
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.3</version>
</dependency>
</dependencies>
第二步 创建连接类JedisClusters.java
package com.lagou.redis;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
public class JedisClusters{
public static void main(String[] args) {
JedisPoolConfig config = new JedisPoolConfig();
Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
//添加集群节点
jedisClusterNodes.add(new HostAndPort("192.168.80.121", 7001));
jedisClusterNodes.add(new HostAndPort("192.168.80.121", 7002));
jedisClusterNodes.add(new HostAndPort("192.168.80.121", 7003));
jedisClusterNodes.add(new HostAndPort("192.168.80.121", 7004));
jedisClusterNodes.add(new HostAndPort("192.168.80.121", 7005));
jedisClusterNodes.add(new HostAndPort("192.168.80.121", 7006));
jedisClusterNodes.add(new HostAndPort("192.168.80.121", 7007));
jedisClusterNodes.add(new HostAndPort("192.168.80.121", 7008));
//获取集群连接
JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, config);
//设置值
jedisCluster.set("name:001","zhaoyun");
//获取值
String value = jedisCluster.get("name:001");
System.out.println(value);
//关闭连接
try {
jedisCluster.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}