redis哨兵集群+spring boot 2.×
Ubuntu集群构建篇
redis-cli:不跟参数,默认访问localhost:6379端口,无密码登陆
redis-cli -h ${host} -p ${port} -a ${password}
redis-server ${redis.conf}:这里注意配置文件
配置文件redis.conf,相关目录需提前创建,否则报错 No such file or directory
配置参数,按需配置。
设备有限,案例基于Ubuntu单机,多端口构建redis实例。
解压:
tar zxvf redis-3.0.2.tar.gz
安装:
make
redis.conf配置文件
初始主节点配置文件:
# 后台启动 即启动守护进程 daemonize yes # 守护进程运行,Redis默认将pid写入某路径下 pidfile /home/redis/redis/redisRun/redis_6381.pid # 指定端口 port 6381 # 客户端闲置多久后关闭连接,为0则关闭该功能 timeout 0 tcp-keepalive 0 # 指定日志级别,支持dubug、verbose、notice、warning,默认verbose loglevel notice # 日志文件路径 logfile /home/redis/redislog/redis.log # 数据库数量 databases 16 # 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合 # 满足以下条件将会同步数据: # 900秒(15分钟)内有1个更改 # 300秒(5分钟)内有10个更改 # 60秒内有10000个更改 # 注:可以把所有save行注释掉,即取消同步操作 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes # 指定存储至本地数据库时是否压缩数据,默认为yes # Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大 rdbcompression yes rdbchecksum yes # 指定本地数据库文件名 dbfilename dump.rdb # 工作目录,即指定本地数据库存放目录,文件名由dbfilename指定 dir /home/redis/redisdb # 如果做故障切换,不论主从节点都要填写密码且要保持一致 masterauth 123456 slave-serve-stale-data yes slave-read-only yes repl-disable-tcp-nodelay no slave-priority 98 # 当前redis密码 requirepass 123456 # 指定是否在每次更新操作后进行日志记录,默认为no appendonly yes # 指定更新日志条件,共有3个可选值: # no:表示等操作系统进行数据缓存同步到磁盘(快) # always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) # everysec:表示每秒同步一次(折衷,默认值) # appendfsync always appendfsync everysec # appendfsync no no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 # 指定是否激活重置哈希,默认为开启 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes
初始从节点配置文件:
daemonize yes #pid---- pidfile /home/redis/redis/redisRun/redis_6391.pid port 6391 timeout 0 tcp-keepalive 0 loglevel notice #日志 ---- logfile /home/redis/redislog/redis1.log databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes #本地数据库文件名 ------ dbfilename dump1.rdb dir /home/redis/redisdb #主节点密码 masterauth 123456 slave-serve-stale-data yes slave-read-only yes repl-disable-tcp-nodelay no slave-priority 98 requirepass 123456 appendonly yes # appendfsync always appendfsync everysec # appendfsync no no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes # Generated by CONFIG REWRITE #配置主节点信息 slaveof *.*.*.* 6381
sentinel.conf哨兵配置文件
port 26381 #1表示在sentinel集群中只要有两个节点检测到redis主节点出故障就进行切换,单sentinel节点无效(自己测试发现的) #如果3s内mymaster无响应,则认为mymaster宕机了 #如果10秒后,mysater仍没活过来,则启动failover sentinel monitor mymaster *.*.*.* 6381 1 sentinel down-after-milliseconds mymaster 3000 sentinel failover-timeout mymaster 10000 daemonize yes #指定工作目录 dir /home/redis/sentinel-work protected-mode no logfile /home/redis/sentinellog/sentinel.log #redis主节点密码 sentinel auth-pass mymaster 123456 # Generated by CONFIG REWRITE
启动集群
主从节点redis后台启动 redis-server redis.conf 哨兵启动 redis-sentinel sentinel.conf
登陆验证
登陆 redis-cli -h *.*.*.* -p 6381 -a 123456 验证主从关联 info Replication
查看哨兵日志sentinel.log
主节点宕机,slaves重新选举master
原主节点重启,成为新的从节点
基于SpringBoot整合哨兵集群
引入pom依赖
<!-- redis启动依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- 对象池化组件 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.0</version> </dependency>
application.yml配置
spring: redis: database: 2 password: 123456 lettuce: pool: max-active: 8 min-idle: 0 max-wait: -1 sentinel: master: mymaster nodes: *.*.*.*:26381,*.*.*.*:26391,*.*.*.*:26392,*.*.*.*:26393 host: *.*.*.* port: 6381
测试即可:
@RestController public class TestRedisController { @Autowired private StringRedisTemplate stringRedisTemplate; @RequestMapping(value = "/set") public void set(){ stringRedisTemplate.opsForValue().set("tom","jerry"); } @RequestMapping(value = "/get") public String get(){ return stringRedisTemplate.opsForValue().get("tom"); } }