目录
前言
好记性不如烂笔头
docker操作redis随笔
如有错误请指出 谢谢
一、Redis
配置
配置简介
主从配置 | |||
---|---|---|---|
节点 | 简写 | 端口 | docker名称 |
主机 | master | 6379 | redis |
从机 | slave | 6380 | redisA |
从机 | slave | 6380 | redisB |
哨兵配置 | |||
节点 | 简写 | 端口 | docker名称 |
哨兵 | sentinel | 26379 | redisS |
redis.conf
master 6379配置如下
# 保护模式,有bind和requirepass开启
protected-mode no
# 启动端口号
port 6379
# 可以访问的IP
# bind 0.0.0.0
# 以守护进程在后台运行
# daemonize yes
# daemonize开启时进程号写入文件
pidfile /var/run/redis_6379.pid
# 日志级别, 选项有debug, verbose, notice, warning
loglevel notice
# 日志写入文件, 用相对路径会在工作目录dir下生成
# logfile redis.log
# 快照文件
dbfilename dump.rdb
# 工作目录 默认./
dir ./
# 开启aof日志, 默认no
appendonly yes
# aof日志文件
appendfilename "appendonly.aof"
# 每秒钟调用一次fsync函数将AOF日志强制从内核缓存刷到磁盘, always是每条修改指令都调用, no从不
appendfsync everysec
# Redis4.0后RDB AOF混合持久化, 将快照文件写入AOF文件的开头部分
aof-use-rdb-preamble yes
# 慢日志执行时间, 10000 microseconds = 10 milliseconds
slowlog-log-slower-than 10000
# 提升master时的优先级, 默认100, 0:永远不会提升为master
replica-priority 100
# master写数据 未达到以下俩个要求不允许写入
# 至少1个节点正常工作
min-replicas-to-write 1
# 10s内接受到响应
min-replicas-max-lag 10
# 保存数据到磁盘 按照下列条件
save 3600 1
save 300 100
save 60 10000
# 密码
requirepass ssx123
#连接master密码
masterauth ssx123
slave-serve-stale-data yes
#对外ip
replica-announce-ip 47.xx.xx.xx1
#slave连接master
#replicaof <master ip> <master port>
slave 6380、6381配置与master差异如下
# 启动端口号 6380 6381
port 6380
#slave连接master
replicaof 47.xx.xx.xx1 6379
sentinel.conf
哨兵sentinel.conf 配置文件如下
# 自定义集群名 ip 端口 多哨兵时哨兵最少投票数
sentinel monitor mymaster 4x.xx.xx.xx1 6379 1
# redis master 密码
sentinel auth-pass mymaster "ssx123"
# sentinel密码
requirepass "ssx123"
最终文件结构
[root@ssxyyds redis]# ls
6379 6380 6381 sentinel.conf
[root@ssxyyds redis]# ls 6379 6380 6381
6379:
redis.conf
6380:
redis.conf
6381:
redis.conf
启动
docker启动一主俩从
# 6379 master
docker run -d -p 6379:6379 --name redis -v /redis/6379:/usr/local/etc/redis redis redis-server /usr/local/etc/redis/redis.conf
# 6380 slave
docker run -d -p 6380:6380 --name redisA -v /redis/6380:/usr/local/etc/redis redis redis-server /usr/local/etc/redis/redis.conf
# 6381 slave
docker run -d -p 6381:6381 --name redisB -v /redis/6381:/usr/local/etc/redis redis redis-server /usr/local/etc/redis/redis.conf
启动成功
[root@ssxyyds redis]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
7bcb7641ab05 redis "docker-entrypoint.s…" 4 seconds ago Up 2 seconds 6379/tcp, 0.0.0.0:6381->6381/tcp, :::6381->6381/tcp redisB
1ea3124a6835 redis "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 6379/tcp, 0.0.0.0:6380->6380/tcp, :::6380->6380/tcp redisA
3fc2f4676fe6 redis "docker-entrypoint.s…" 13 seconds ago Up 12 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
进入redis(master)查看详情
# docker进入容器
docker exec -it redis redis-cli -a ssx123
# 查看节点详情
info replication
可以看到有两个从机 6380和 6381
[root@ssxyyds redis]# docker exec -it redis redis-cli -a ssx123
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
min_slaves_good_slaves:2
slave0:ip=47.xx.xx.xx1,port=6380,state=online,offset=70,lag=0
slave1:ip=47.xx.xx.xx1,port=6381,state=online,offset=70,lag=0
master_failover_state:no-failover
master_replid:7b07d5960c1eae10dcc12548465050fa61ac68db
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:70
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:70
输入三个key进行测试
127.0.0.1:6379> set t1 test1
OK
127.0.0.1:6379> set t2 test2
OK
127.0.0.1:6379> set t3 test3
OK
127.0.0.1:6379> keys *
1) "t1"
2) "t3"
3) "t2"
退出master进入从机redisA(6380)查看数据
[root@ssxaly ~]# docker exec -it redisA redis-cli -p 6380 -a ssx123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6380> keys *
1) "t2"
2) "t1"
3) "t3"
set k1 kk 出错是因为从机不能写入值 只能读取
127.0.0.1:6380> set k1 kk
(error) READONLY You can't write against a read only replica.
查看节点信息
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:4x.xx.xx.xx1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_read_repl_offset:3311
slave_repl_offset:3311
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
min_slaves_good_slaves:0
master_failover_state:no-failover
master_replid:7b07d5960c1eae10dcc12548465050fa61ac68db
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3311
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3311
redisB(6381)测试结果一致 就不赘述了
docker启动redis哨兵
docker run -it -p 26379:26379 --name redisS -v /redis/sentinel.conf:/usr/local/etc/redis/sentinel.conf r
edis redis-sentinel /usr/local/etc/redis/sentinel.conf
查看启动状态
[root@ssxaly ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
230a8d6f8a97 redis "docker-entrypoint.s…" About a minute ago Up About a minute 6379/tcp, 0.0.0.0:26379->26379/tcp, :::26379->26379/tcp redisS
7bcb7641ab05 redis "docker-entrypoint.s…" 17 hours ago Up 17 hours 6379/tcp, 0.0.0.0:6381->6381/tcp, :::6381->6381/tcp redisB
1ea3124a6835 redis "docker-entrypoint.s…" 17 hours ago Up 17 hours 6379/tcp, 0.0.0.0:6380->6380/tcp, :::6380->6380/tcp redisA
3fc2f4676fe6 redis "docker-entrypoint.s…" 17 hours ago Up 17 hours 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
哨兵启动后打印出从机信息
二、SpringBoot配置Redis
引入maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
yml配置
spring:
redis:
lettuce:
pool:
max-active: 8
max-wait: -1
max-idle: 8
min-idle: 0
timeout: 10000
database: 0
sentinel:
master: mymaster #哨兵(sentinel.conf)文件中自定义集群名
nodes: 4x.xx.xx.xx1:26379 #哨兵ip 端口
password: ssx123 #哨兵密码
password: ssx123 #redis密码
测试类测试
@Controller
@RequestMapping("/redis")
@Log4j2
public class RedisController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@GetMapping("/test")
@ResponseBody
public String test() {
Set<String> keys = stringRedisTemplate.keys("*");
assert keys != null;
log.info(keys.toString());
return keys.toString();
}
}
访问接口测试
重启master(6379)测试哨兵自动切换功能
哨兵自动切换6380为主机
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:2
min_slaves_good_slaves:2
slave0:ip=4x.xx.xx.xx1,port=6381,state=online,offset=848462,lag=0
slave1:ip=4x.xx.xx.xx1,port=6379,state=online,offset=848462,lag=0
master_failover_state:no-failover
master_replid:1fb85facaa163fc5728ebd7eb10a7ff9d9d6e012
master_replid2:7b07d5960c1eae10dcc12548465050fa61ac68db
master_repl_offset:848462
second_repl_offset:183732
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:848462
控制台自动输出连接信息
再次访问接口测试结果
成功!
注:主机掉线后哨兵切换主从期间操作redis的数据可能会丢