Docker 搭建Redis Cluster 集群
单纯使用Docker创建Redis-Cluster集群,并使用Spring-Data-Redis连接集群
首先,先在/home目录下创建名为redis-cluster的文件夹
进入redis-cluster文件夹
创建一个名为redis-cluster.tmpl并写入如下内容
port ${PORT}
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.47.100
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes
requirepass 123456
上面的内容依次对应(分开写的原因是为了方便复制,在配置文件中有中文可能会出现问题)
- 节点端口
- 是否开启集群模式
- 是否开启cluster集群模式
- 集群配置文件名
- 超时时间
- 填写当前自己虚拟机的地址,云服务器就填公网地址,以免Spring-Data连接不了
- 节点映射端口
- 节点总线端口
- 持久化模式
- 密码
由于我们是要创建六个容器,那我就需要六个不同的文件夹,六份不同的配置文件。下面有如下的脚本快速创建
for port in `seq 7000 7005`; do \
mkdir -p ./${port}/conf \
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
&& mkdir -p ./${port}/data; \
done
端口从7000到7005一共六个,可以根据自己的喜好修改,后面保持对应就行
执行脚本,查看redis-cluster文件夹是否有如下六个文件夹
之后我们为这六个Redis服务创建单独的网络
docker network create --subnet 192.169.0.0/16 --gateway 192.169.0.1 redis-net
这里创建了一个名为redis-net的子网
下面开始使用如下脚本创建六个Redis容器
for port in $(seq 7000 7005); do
\
r=$((port - 6998))
docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \
-v /home/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /home/redis-cluster/${port}/data:/data \
--restart always --name redis-${port} --net redis-net --ip 192.169.0.${r}\
--sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf
\
done
这里我们指定了每个容器的IP为192.169.0.(端口号-6998),也就是从192.169.0.2到192.169.0.7的六个容器,并且指定端口映射和目录挂载
使用docker ps
命令查看当前六个容器是否已经启动
下面就是配置集群了
使用docker exec -it redis-7000 bash
进入端口为7000的Redis容器
输入如下命令(如果没有设置密码则不需要 -a 123456)
redis-cli --cluster create
192.169.0.2:7000 192.169.0.3:7001
192.169.0.4:7002 192.169.0.5:7003
192.169.0.6:7004 192.169.0.7:7005
--cluster-replicas 1 -a 123456
输入yes
出现如下界面则表示成功
(如果其他都没问题,一直在Waiting for the cluster to join处等待,可以尝试将上面配置的节点总线端口添加到防火墙)
下面测试一下
redis-cli -c -p 7000 -a 123456
进入redis-cli
-c 表示集群
-p 指定端口
-a 输入密码,没有配置可以不要
插入一个值并获取一个值试试
此时我们三主三从的Redis-Cluster集群就搭建完毕
Spring-Data-Redis 连接集群
创建一个Spring Boot项目
选择Spring-Data-Redis依赖
在配置文件中配置如下内容
spring.redis.cluster.nodes=192.168.47.100:7000,\ 192.168.47.100:7001,\ 192.168.47.100:7002,\ 192.168.47.100:7003,\ 192.168.47.100:7004,\ 192.168.47.100:7005 spring.redis.password=123456 spring.redis.timeout=500ms
##(2021.6.6更新,此处需要加上单位,Springboot2.5.0)
配置一下Redis
@Configuration
public class RedisConfiguration {
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionfactory) {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionfactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
写个测试类进行测试
@SpringBootTest
class SpringbootRedisClusterApplicationTests {
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Test
public void setValue() {
redisTemplate.opsForValue().set("name", "panxianhao");
}
@Test
public void getValue() {
System.out.println(redisTemplate.opsForValue().get("name"));
}
}
set 之后 再get 发现都没有问题
这是本人初学Docker所写的博客,如有不对或有更好的方法,请大家指出
下面还会使用docker-compose进行搭建集群