一.搭建方式之常规方式
1.安装redis
- 参考我博客:“https://blog.csdn.net/weixin_43934607/article/details/100537733” 的Redis安装
2.搭建节点
-
在redis安装目录下新建redis_cluster
-
在redis_cluster下新建六个端口号的文件夹(7000、7001、7002、7003、7004、7005)
-
先给7000的文件夹下复制一份redis.conf
-
编辑7000文件夹下的redis.conf:
daemonize yes //redis后台运行 port 端口号 //端口7000,7002,7003,7004,7005 cluster-enabled yes //开启集群 把注释#去掉 cluster-node-timeout 5000 //请求超时 设置5秒够了 appendonly yes //aof日志开启,它会操作日志 bind 127.0.0.1 192.168.56.129 //后面这个Redis安装的这台机的内网IP(命令:ip addr),添加一个内网IP,这部不操作的话会导致内网其他节点无妨访问你的集群 pidfile:/var/run/redis_端口号.pid //用来保存进程 每个端口号的pidfile要不同 dbfilename dump_端口号.rdb //以rdb形式来保存数据 每个端口号的dbfilename要不同 appendfilename "appendonly_端口号.aof" //以aof形式来保存数据 每个端口号的appendfilename 要不同 cluster-config-file nodes_端口号.conf //集群的配置,首次启动自动生成 配置文件名要不同 #requirepass foobared //有密码的话必须要要注释掉 取消密码
-
把这个redis.conf复制到其他几个端口的文件夹下 并修改下面不同端口下面这些配置
-
各个节点启动成功
-
把redis带每个配置文件启动一次 并使用ps -ef|grep redis 查看是否所有进程启动成功
./redis-server ../redis_cluster/7000/redis.conf ./redis-server ../redis_cluster/7001/redis.conf ./redis-server ../redis_cluster/7002/redis.conf ./redis-server ../redis_cluster/7003/redis.conf ./redis-server ../redis_cluster/7004/redis.conf ./redis-server ../redis_cluster/7005/redis.conf
-
启动成功之后 在src目录下会生成(白色字体那些文件)
- 每个节点设置的"cluster-config-file"对应的.conf文件
- 每个节点设置的"dbfilename"对应的.rdb文件
- 每个节点设置的"appendfilename"对应的.aof文件
-
3.组建集群
redis版本<5.0
-
安装Ruby(redis版本>=5.0的话不是下面的方式):
yum -y install ruby ruby-devel rubygems rpm-build
gem install redis注意:如果显示ruby版本低于3.0“https://blog.csdn.net/Gushiyuta/article/details/90770681”(在步骤3之前 使用命令: source /etc/profile.d/rvm.sh 就可以启用rvm)
-
开启集群
cd /usr/local/redis/src
./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
注意:
- 我这里设置了127.0.0.1绑定我的虚拟机ip所以可以用127.0.0.1
- 不是本机的注意开端口
redis版本>=5.0
-
使用redis-cli
cd /usr/local/redis/src
./redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
搭建截图:
-
过程
-
成功
-
测试是否成功
./redis-cli -c -p 7000
4.redis-trib.rb的其他几个命令:
重新分片:./redis-trib.rb reshard 集群任一节点
如:./redis-trib.rb reshard 127.0.0.1:7000
增加节点(主):./redis-trib.rb add-node 要增加的节点 集群任一节点
如:./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
增加节点(从):./redis-trib.rb add-node --slave 要增加的节点 集群任一节点
如:./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000)
- 如果报错 [ERR] Node is not empty. Either the node already knows other nodes (check with C…)
-
进入src备份 .aof、.rdb数据文件
cp -f {appendonly_7000.aof,appendonly_7001.aof,appendonly_7002.aof,appendonly_7003.aof,appendonly_7004.aof,appendonly_7005.aof,dump_7000.rdb,dump_7001.rdb,dump_7002.rdb,dump_7003.rdb,dump_7004.rdb,dump_7005.rdb} /tmp/redis-cluster-data
-
删除所有节点 .aof、.rdb、.conf (但是会数据丢失 最好先备份所有.aof、.rdb文件)
rm -f appendonly_7000.aof appendonly_7001.aof appendonly_7002.aof appendonly_7003.aof appendonly_7004.aof appendonly_7005.aof dump_7000.rdb dump_7001.rdb dump_7002.rdb dump_7003.rdb dump_7004.rdb dump_7005.rdb nodes_7000.conf nodes_7001.conf nodes_7002.conf nodes_7003.conf nodes_7004.conf nodes_7005.conf
-
杀掉所有的redis进程 重新按步骤启动
-
二.搭建方式之Docker
1.docker安装和配置
- 请参考我的博客:https://blog.csdn.net/weixin_43934607/article/details/100141057
2.安装redis
#拉取镜像
docker pull redis:5.0.2
3.创建容器
docker create --name redis-node01 --net host \
-v /data/redis-data/node01:/data redis:5.0.2 \
--cluster-enabled yes \
--cluster-config-file nodes-node-01.conf \
--port 6379
docker create --name redis-node02 --net host \
-v /data/redis-data/node02:/data redis:5.0.2 \
--cluster-enabled yes \
--cluster-config-file nodes-node-02.conf \
--port 6380
docker create --name redis-node03 --net host \
-v /data/redis-data/node03:/data redis:5.0.2 \
--cluster-enabled yes \
--cluster-config-file nodes-node-03.conf \
--port 6381
- 参数解释
- –name:容器名称
- –net:docker的网络模型(默认是桥接模式)
- -v:映射的外面存储路径
- 其他 "–"的参数都是上面redis集群搭建时用到的 就不解释了
4.启动容器
docker start redis-node01 redis-node02 redis-node03
5.进入redis-node01进行操作
docker exec -it redis-node01 /bin/bash
6.组建集群
- cluster-replicas:每个节点有几个复制集
上面搭建集群时设置为1 可以看见3个M 3个S,这里只有3个节点 所以就不设置复制集了 将cluster-replicas设置为0 可以看见只有3个M
redis-cli --cluster create 192.168.56.129:6379 192.168.56.129:6380 192.168.56.129:6381 --cluster-replicas 0
- 注意:因为使用的网络模式是host模式 所以这里可以直接使用虚拟机ip
- 如果安装出错要删除的话使用以下命令
- 关闭容器:docker stop redis-node01 redis-node02 redis-node03
- 删除容器:docker rm redis-node01 redis-node02 redis-node03
- 删除数据:rm -rf /data/redis-data
- 如果同样报错 [ERR] Node is not empty. Either the node already knows other nodes (check with C…)
- 删掉 -v 指定的redis数据目录下的每个节点的 conf、rdb、aof文件
rm -rf /data/redis-data
- 删掉 -v 指定的redis数据目录下的每个节点的 conf、rdb、aof文件
三.SpringBoot整合redis集群
1.依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
2.application.properties:
# redis集群
#最大连接数据库连接数,设 0 为没有限制
spring.redis.jedis.pool.maxActive=50
#最大建立连接等待时间 如果超过此时间将接到异常 设为-1表示无限制 单位为 ms
spring.redis.jedis.pool.max-wait = 5000
#最大最大空闲数,设 0 为没有限制
spring.redis.jedis.pool.max-Idle = 5
#连接超时时间
spring.redis.timeout = 10
#所有节点地址
spring.redis.cluster.nodes = 192.168.56.129:7000,192.168.56.129:7001,192.168.56.129:7002,192.168.56.129:7003,192.168.56.129:7004,192.168.56.129:7005
#连接失败最大重连次数
spring.redis.cluster.max-redirects=5
3.读取配置中cluster相关配置
@Component
@ConfigurationProperties(prefix = "spring.redis.cluster")
@Data
public class ClusterConfigurationProperties {
private List<String> nodes;
private Integer maxRedirects;
}
4.设置并重新注入RedisTemplate
@Configuration
public class RedisClusterConfig {
@Autowired
private ClusterConfigurationProperties clusterProperties;
@Bean
public RedisConnectionFactory connectionFactory() {
//集群的项目配置
RedisClusterConfiguration configuration = new
RedisClusterConfiguration(clusterProperties.getNodes());
configuration.setMaxRedirects(clusterProperties.getMaxRedirects());
//设置 客户端Jedis的连接
return new JedisConnectionFactory(configuration);
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String, String> redisTemplate = new RedisTemplate<String,String>();
//使用刚才设置好的ConnectionFactory
redisTemplate.setConnectionFactory(factory);
/**
* 定义好三种序列化方式:Jackson序列化、Jdk序列化、String序列化
*/
/**Jackson序列化 json占用的内存最小 */
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
/**Jdk序列化 JdkSerializationRedisSerializer是最高效的*/
// JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
/**String序列化*/
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
/**
* 设置不同数据类型的序列化方式
* /
/**将key value 进行stringRedisSerializer序列化*/
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(stringRedisSerializer);
/**将HashKey HashValue 进行序列化*/
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
注意
- 重启集群 只需要关闭每个节点 再次重新启动每个节点就可以 不用再执行一次创建集群的命令