docker安装redis cluster集群
目录
环境
#查看服务器版本信息
cat /etc/centos-release
#查看docker版本
docker -v
搭建
编写redis配置文件
#创建目录
mkdir -p /usr/local/docker-redis/redis-cluster
#切换至指定目录
cd /usr/local/docker-redis/redis-cluster/
#编写 redis-cluster.tmpl 文件
vi redis-cluster.tmpl
port ${PORT}
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 39.98.xx.xx
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
port
:节点端口;requirepass
:添加访问认证;masterauth
:如果主节点开启了访问认证,从节点访问主节点需要认证;protected-mode
:保护模式,默认值 yes,即开启。开启保护模式以后,需配置bind ip
或者设置访问密码;关闭保护模式,外部网络可以直接访问;daemonize
:是否以守护线程的方式启动(后台启动),默认 no;appendonly
:是否开启 AOF 持久化模式,默认 no;cluster-enabled
:是否开启集群模式,默认 no;cluster-config-file
:集群节点信息文件;cluster-node-timeout
:集群节点连接超时时间;cluster-announce-ip
:集群节点 IP,填写宿主机的 IP;cluster-announce-port
:集群节点映射端口;cluster-announce-bus-port
:集群节点总线端口。
每个 Redis 集群节点都需要打开两个 TCP 连接。一个用于为客户端提供服务的正常 Redis TCP 端口,例如 6379。还有一个基于 6379 端口加 10000 的端口,比如 16379。
第二个端口用于集群总线,这是一个使用二进制协议的节点到节点通信通道。节点使用集群总线进行故障检测、配置更新、故障转移授权等等。客户端永远不要尝试与集群总线端口通信,与正常的 Redis 命令端口通信即可,但是请确保防火墙中的这两个端口都已经打开,否则 Redis 集群节点将无法通信
在redis-cluster目录下面执行下面命令,创建7000-7005相关目录和文件
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
#执行tree命令,查看结果
tree /usr/local/docker-redis/redis-cluster
#查看节点配置文件
cat /usr/local/docker-redis/redis-cluster/700{0…5}/conf/redis.conf
创建redis容器
将宿主机的7000~7005
端口与6geredis容器映射,并将宿主机的目录与容器内的目录进行映射(挂载)。使用host
网络模式
for port in $(seq 7000 7005); do \
docker run -di --restart always --name redis-${port} --net host \
-v /usr/local/docker-redis/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /usr/local/docker-redis/redis-cluster/${port}/data:/data \
redis redis-server /usr/local/etc/redis/redis.conf; \
done
备注:命令译为 循环7010 - 7015 运行redis 容器
docker run 运行
-di 守护进程
–restart always 保持容器启动
–name edis- p o r t 容 器 名 称 − − n e t h o s t 使 用 h o s t 网 卡 − v / u s r / l o c a l / d o c k e r − r e d i s / r e d i s − c l u s t e r / {port} 容器名称 --net host 使用host网卡 -v /usr/local/docker-redis/redis-cluster/ port容器名称−−nethost使用host网卡−v/usr/local/docker−redis/redis−cluster/{port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
将宿主机700节点文件挂载到容器/usr/local/etc/redis/redis.conf文件中
-v /usr/local/docker-redis/redis-cluster/${port}/data:/data
将宿主机700/data目录挂载到容器/data目录中
redis redis-server /usr/local/etc/redis/redis.conf;
根据挂载配置启动redis服务端
#使用命令查看是否成功
docker ps -a
创建 Redis Cluster集群
#进入容器
docker exec -it redis-7000 bash
#进入到指定目录下面
cd /usr/local/bin/
#使用redis-cli命令创建集群(需要redis5.0版本以上)
redis-cli -a xx(密码)–cluster create 39.98.xx.xx:7000 39.98.xx.xx:7001 39.98.xx.xx:7002 39.98.xx.xx:7003 39.98.xx.xx:7004 39.98.xx.xx:7005 --cluster-replicas 1
出现提示,输入yes
查看集群状态
#进入容器
docker exec -it redis-7003 bash
#切换至指定目录
cd /usr/local/bin/
#查看集群状态
redis-cli -a xx(密码) --cluster check 39.98.xx.xx:7002
查看集群信息
#连接至集群某个节点
redis-cli -c -a xx(密码) -h 39.98.xx. xx -p 7001
#查看集群信息
cluster info
#查看集群结点信息
cluster nodes
SpringBoot配置Redis集群
在SpringBoot2.x版本中,redis默认的连接池已经更换为Lettuce,而不再是jedis
在pom.xml中引入相关依赖
<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>
配置application.yml
spring:
redis:
timeout: 6000
password: xxx
cluster:
max-redirects: 3 # 获取失败 最大重定向次数
nodes:
- 39.98.xx.xx:7001
- 39.98.xx.xx:7002
- 39.98.xx.xx:7003
- 39.98.xx.xx:7004
- 39.98.xx.xx:7005
- 39.98.xx.xx:7000
lettuce:
pool:
max-active: 1000 #连接池最大连接数(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 5 # 连接池中的最小空闲连接
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
Redis 配置
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
基本测试
@SpringBootTest
public class RedisTest {
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Test
public void test() {
redisTemplate.opsForValue().set("name", "admin");
String name = redisTemplate.opsForValue().get("name");
System.out.println(name); //输出admin
}
}