编程时要保持这种心态:就好像将来要维护你这些代码的人是一位残暴的精神病患者,而且他知道你住在哪。-Martin Golding
Docker三剑客之Compose搭建Redis伪分布式集群(3)
image来源:Docker官方文档
Docker Compose
更对精彩内容请关注我的公众号(看相声也要敲代码)
负责实现对基于Docker容器的多应用服务的快速编排,定义并运行多个Docker容器的应用,允许用户编写yaml文件关联容器,Compose默认管理对象是服务栈,通过子命令对栈中多个服务进行便捷生命周期管理。
关键概念:
-
任务:一个容器被称为一个任务,任务是独一无二的id,同一个服务多个任务序号递增
-
服务:某个相同应用镜像的容器副本集合,一个服务可以横向扩展为多个实例
-
服务栈:由多个服务组成,配合完成特定业务
Docker Compose安装Redis伪分布式集群详细步骤
1、安装docker-compose
# 下载
$ curl -L github对应版本
# 确认安装是否完成
$ docker-compose -v
docker-compose version 1.28.5, build c4eb3a1f
2、拉取Redis镜像
docker pull redis:latest
3、编写redis-cluster.template模板
port ${PORT}
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.28.1 # 宿主机IP即可
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
4、创建本地conf文件
for port in `seq 7001 7006` ; do \
mkdir -p . redis-cluster/${port}/conf \
&& PORT=${port} envsubst < redis-cluster.template > redis-cluster/${port}/conf/redis.conf \
&& mkdir -p ./redis-cluster/${port}/data; \
done
5、编写redis-cluster.yml
version : '3.7'
services:
redis7001:
image: 'redis'
container_name: redis7001
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
volumes:
- /F/ideaProject/metaapp-materialplatform/redis-cluster/redis-cluster/7001/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /F/ideaProject/metaapp-materialplatform/redis-cluster/redis-cluster/7001/data:/data
ports:
- "7001:7001"
- "17001:17001"
environment:
- TZ=Asia/Shanghai
redis7002:
image: 'redis'
container_name: redis7002
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
volumes:
- /F/ideaProject/metaapp-materialplatform/redis-cluster/redis-cluster/7002/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /F/ideaProject/metaapp-materialplatform/redis-cluster/redis-cluster/7002/data:/data
ports:
- "7002:7002"
- "17002:17002"
environment:
- TZ=Asia/Shanghai
redis7003:
image: 'redis'
container_name: redis7003
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
volumes:
- /F/ideaProject/metaapp-materialplatform/redis-cluster/redis-cluster/7003/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /F/ideaProject/metaapp-materialplatform/redis-cluster/redis-cluster/7003/data:/data
ports:
- "7003:7003"
- "17003:17003"
environment:
- TZ=Asia/Shanghai
redis7004:
image: 'redis'
container_name: redis7004
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
volumes:
- /F/ideaProject/metaapp-materialplatform/redis-cluster/redis-cluster/7004/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /F/ideaProject/metaapp-materialplatform/redis-cluster/redis-cluster/7004/data:/data
ports:
- "7004:7004"
- "17004:17004"
environment:
- TZ=Asia/Shanghai
redis7005:
image: 'redis'
container_name: redis7005
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
volumes:
- /F/ideaProject/metaapp-materialplatform/redis-cluster/redis-cluster/7005/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /F/ideaProject/metaapp-materialplatform/redis-cluster/redis-cluster/7005/data:/data
ports:
- "7005:7005"
- "17005:17005"
environment:
- TZ=Asia/Shanghai
redis7006:
image: 'redis'
container_name: redis7006
command:
["redis-server", "/usr/local/etc/redis/redis.conf"]
volumes:
- /F/ideaProject/metaapp-materialplatform/redis-cluster/redis-cluster/7006/conf/redis.conf:/usr/local/etc/redis/redis.conf
- /F/ideaProject/metaapp-materialplatform/redis-cluster/redis-cluster/7006/data:/data
ports:
- "7006:7006"
- "17006:17006"
environment:
- TZ=Asia/Shanghai
6、执行yml文件
docker-compose -f redis-cluster.yml up -d
7、启动redis集群
docker exec -it redis7001 redis-cli -p 7001 --cluster create 192.168.28.1:7001 192.168.28.1:7002 192.168.28.1:7003 192.168.28.1:7004 192.168.28.1:7005 192.168.28.1:7006 --cluster-replicas 1
8、测试
docker exec -it redis7001 redis-cli -h 192.168.28.1 -p 7005 ping
docker exec -it redis7001 redis-cli -h 192.168.28.1 -p 7005 -c # 集群启动需要添加-c
9、简单搭建Springboot服务使用Redis伪分布式集群
1. maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
yaml文件配置
spring:
redis:
connect-timeout: 6000
cluster:
max-redirects: 3
nodes:
- 192.168.28.1:7001
- 192.168.28.1:7002
- 192.168.28.1:7003
- 192.168.28.1:7004
- 192.168.28.1:7005
- 192.168.28.1:7006
lettuce:
pool:
max-active: 1000
max-idle: 10
min-idle: 5
max-wait: -1
image.gif
redis配置Bean
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfigurer {
@Bean
public RedisTemplate<String,Object> redisClusterTemplate(LettuceConnectionFactory factory){
RedisTemplate<String,Object> template = new RedisTemplate<>();
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setConnectionFactory(factory);
return template;
}
}
代码测试
@RestController
public class RedisClusterController {
private final RedisTemplate<String,Object> redisTemplate;
@Autowired
public RedisClusterController(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
@GetMapping("/clusterOperate")
public String clusterOperate(){
redisTemplate.opsForValue().set("www.kxscode.com","看相声也要敲代码");
return String.valueOf(redisTemplate.opsForValue().get("www.kxscode.com"));
}
}
远程仓库
参考
基于docker-compose搭建redis集群
网友评论