环境:
(1)Centos7
(2)JDK1.8
(3)docker
(4)redis6.0
集群模式:
主从+哨兵,一个主节点,两个从节点,三个哨兵
概念:
哨兵 sentinel
主要功能:
监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否运作正常。
通知(Notification):当被监控的某个 Redis 服务器出现问题时, Sentinel可以通过API向管理员或者其他应用程序发送通知。
故障迁移:当主服务器不能正常工作时,Sentinel会自动进行故障迁移,也就是主从切换。
统一的配置管理:连接者询问sentinel取得主从的地址。
持久化方式
有两种,RDB和AOF
RDB :英文是Redis DataBase 把当前数据生成快照持久化成dump.rdb文件,类似于mysql备份输入成.sql文件。可以用save和bgsave(Background save)命令手动触发持久化,前者是同步的会阻塞客户端命令,后者是异步的开启子进程去io操作备份持久化,不会阻塞客户端命令。除了手动输入命令进行备份也可以在redis.conf配置文件中配置触发条件:
// rdb快照的触发条件格式:save m n 可以配置多个,满足任一条件都会被触发,触发执行的是异步bgsave命令而不是同步save命令,虽然配置的时候叫做save
save 900 1 // 900秒内至少有一个key发生改动就保存一次数据
save 300 10 // 300秒内至少有10个key发生改动就保存一次数据
save 60 10000 // 60秒内有10000个key发生改动就保存一次数据
# 指定本地数据库文件名,默认值为 dump.rdb
dbfilename dump.rdb
AOF:英文是 Append-Only-File(只允许追加不允许修改的文件之意) 把每次的操作都追加到文件中记录,类似于mysql的binlog,这个文件一般会比rdb的文件大,可以在redis.conf配置文件中进行配置。
默认的 AOF 持久化策略是每秒钟 fsync 一次(fsync 是指把缓存中的写指令记录到磁盘中),因为在这种情况下,redis 仍然可以保持很好的处理性能,即使 redis 故障,也只会丢失最近 1 秒钟的数据。
# 开启aof持久化 默认是关闭的
appendonly yes
# AOF文件的名字
appendfilename "appendonly.aof"
# 持久化策略 默认everysec
# no:表示等操作系统进行数据缓存同步到磁盘(快)
# always:表示每次更新操作后手动调用 fsync() 将数据写到磁盘(慢,安全)
# everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec
建议:
(1)服务器建议3台
只有两台的话一般是搭建一主一从两个哨兵,一旦有一个服务器宕机了,那么其所在redis和哨兵都没了,就只剩下另外一个,相当于单机版了。
部署:
1、手动新建redis配置文件 redis.conf
分别在三台服务器 /home/docker/redis/conf目录下 创建redis.conf文件,从节点配置文件需要配置
replicaof
cd /home/docker
mkdir redis
cd redis
mkdir conf
cd conf
vi redis.conf
内容如下
# 绑定ip 允许所有ip访问
bind 0.0.0.0
# 端口
port 6379
# 是否开启保护模式 yes开启的情况下,只能通过设置bind绑定的ip或者密码验证访问
protected-mode no
# 以守护进程的方式运行
daemonize no
# 日志存放地址
logfile ./redis.log
# 密码验证
requirepass 123456
# 主节点访问密码 当master服务设置了密码保护时,slav服务连接master的密码
masterauth 123456
# 开启aof持久化 类似于mysql的binlog
appendonly yes
# 从节点需要设置主节点的IP和端口
#replicaof 192.168.8.49 6379
2、手动新建哨兵配置文件sentinel.conf
cd /home/docker
mkdir redis
cd redis
mkdir conf
cd conf
vi sentinel.conf
内容如下:
# 端口
port 26379
# 是否开启保护模式
protected-mode no
# 以守护进程的方式运行
daemonize no
# 日志存放地址
logfile ./sentinel.log
# 哨兵sentinel监控的redis主节点的 ip port quorum
# 配置多少个sentinel哨兵统一认为master主节点失联 那么这时客观上认为主节点失联了
sentinel monitor mymaster 192.168.8.49 6379 2
# 密码认证
sentinel auth-pass mymaster 123456
# master在连续多长时间无法响应PING指令后,就会主观判定节点下线
sentinel down-after-milliseconds mymaster 3000
# 主备切换时最多可以有多少个slave同时对新的master进行同步
sentinel parallel-syncs mymaster 1
# 故障转移的超时时间
sentinel failover-timeout mymaster 180000
3、获取镜像
docker pull redis:6.0
4、启动redis
三台服务器的启动命令都是一样
启动顺序:先主后从再哨兵
docker run -d -p 6379:6379 \
-v /home/docker/redis/data:/data \
-v /home/docker/redis/conf/redis.conf:/etc/redis/redis.conf \
--name redis \
--network=host \
--restart=always \
-d redis redis-server /etc/redis/redis.conf
5、启动哨兵sentinel
docker run -p 26379:26379 \
--name sentinel-26379 \
--network=host \
--restart=always \
-v /home/docker/redis/conf/sentinel.conf:/etc/redis/sentinel.conf \
-v /home/docker/redis/data/sentinel:/data \
-d redis redis-sentinel /etc/redis/sentinel.conf
遇到的问题:
1、docekr 的网络模式 需要选择为host ,不然哨兵有时候无法连通
所以我们启动命令中使用了–network=host
参考博客及资料:
https://www.redis.com.cn/redis-persistence.html
https://www.redis.com.cn/redis-configuration.html
https://blog.csdn.net/succing/article/details/121265307?spm=1001.2014.3001.5506
https://blog.csdn.net/IT_rookie_newbie/article/details/120430807?spm=1001.2014.3001.5506