记录一下使用
搭建redis主从哨兵
先搭建3台主从redis
--slaveof redis-9955 6379
如果放在不同的机器上使用--slaveof ip prot
建一个docker-compose.yml ,然后docker-compose up -d
version: '3.1'
services:
master:
image: redis
container_name: redis-9955
ports:
- 9955:6379
volumes:
- $PWD/redis-9955/data:/data
slave1:
image: redis
container_name: redis-9956
ports:
- 9956:6379
volumes:
- $PWD/redis-9956/data:/data
command: redis-server --slaveof redis-9955 6379
slave2:
image: redis
container_name: redis-9957
ports:
- 9957:6379
volumes:
- $PWD/redis-9957/data:/data
command: redis-server --slaveof redis-9955 6379
接下来搭建哨兵服务
- 准备3个sentinel.conf文件(启动容器时要用)
3个文件只要改个端口,其他的不用动
哨兵会自己更新你的master ip和端口
# 端口
port 26379
# 是否后台启动
daemonize yes
# pid文件路径
pidfile /var/run/redis-sentinel.pid
# 日志文件路径
logfile "/var/log/sentinel.log"
# 定义工作目录
dir /tmp
# mymster名字可自定义,java连接要用。ip如果不是一台机器就换docker外的ip吧。至少2个Sentinel认为主Redis挂了才换别的slave,
sentinel monitor mymaster 172.17.0.3 6379 2
# 如果mymaster 10秒内没有响应,则认为其主观失效
sentinel down-after-milliseconds mymaster 10000
# 如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。
sentinel parallel-syncs mymaster 1
# 该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
sentinel failover-timeout mymaster 180000
# 不允许使用SENTINEL SET设置notification-script和client-reconfig-script。
sentinel deny-scripts-reconfig yes
再来个docker-compose.yml启动容器
version: '3.1'
services:
sentinel1:
image: redis
container_name: sentinel-26379
ports:
- 26379:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel-26379.conf:/usr/local/etc/redis/sentinel.conf
sentinel2:
image: redis
container_name: sentinel-26380
ports:
- 26380:26380
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel-26380.conf:/usr/local/etc/redis/sentinel.conf
sentinel3:
image: redis
container_name: sentinel-26381
ports:
- 26381:26381
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel-26381.conf:/usr/local/etc/redis/sentinel.conf
springboot连接
就是使用redis作者提出的Redlock算法,Redisson是redlock算法的java实现
Redisson支持单机、主从、哨兵、集群。(就是全部都支持)
依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.3.2</version>
</dependency>
配置连接类
@Configuration
public class RedisLockCluster {
/*//第一种使用java类配置redis集群连接
@Bean
public Config redisConfig(){
Config config =new Config();
config.useSentinelServers().addSentinelAddress("哨兵的ip和port,不要写成了redis的")
.setMasterName("mymaster")
.setDatabase(0);
return config;
}
@Bean
public RedissonClient redissonClient(){
return Redisson.create(redisConfig());
}*/
//使用配置文件yml来连接redis集群
@Autowired
private Environment env;
@Bean(destroyMethod = "shutdown")
public RedissonClient redissonClient() throws IOException {
return Redisson.create(
Config.fromYAML(new ClassPathResource("redisson.yml").getInputStream())
);
}
}
第二种配置文件的方式连接就建一个redisson.yml,也需要上面下半部分的代码
sentinelServersConfig:
idleConnectionTimeout: 10000
pingTimeout: 1000
connectTimeout: 10000
timeout: 3000
retryAttempts: 3
retryInterval: 1500
reconnectionTimeout: 3000
failedAttempts: 3
subscriptionsPerConnection: 5
clientName: null
loadBalancer: !<org.redisson.connection.balancer.RoundRobinLoadBalancer> {}
slaveSubscriptionConnectionMinimumIdleSize: 1
slaveSubscriptionConnectionPoolSize: 50
slaveConnectionMinimumIdleSize: 10
slaveConnectionPoolSize: 64
masterConnectionMinimumIdleSize: 10
masterConnectionPoolSize: 64
readMode: "SLAVE"
sentinelAddresses:
- "redis://1.1.1.1:26379"
- "redis://1.1.1.1:26380"
- "redis://1.1.1.1:26381"
# 这个mymaster就是你自己取的名字
masterName: "mymaster"
database: 0
threads: 0
nettyThreads: 0
codec: !<org.redisson.codec.JsonJacksonCodec> {}
useLinuxNativeEpoll: false
然后就完了呗