系统:centos7.6
docker:18.06.1-ce
redis:3.0.7
一、安装单节点redis
1、拉取镜像
docker pull redis:3.0.7
2、创建目录,docker/redis/{conf,data}
mkdir -p /docker/redis
cd /docker/redis
mkdir {conf,data}
3、准备配置文件,redis.conf
从redis官网:https://redis.io/topics/config,找到对应版本的配置,copy下来;本次版本3.0
安装过程中遇到问题:容器起不起来,查看日志:
*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 94
>>> 'protected-mode no'
Bad directive or wrong number of arguments
原因:在网上down了一个redis.conf的配置,和3.0.7的不匹配,一直报配置错误;最后替换了官网上的3.0的配置,就成功了。
需要注意的配置:
bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问
daemonize no#默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程,改为yes会使配置文件方式启动redis失败
4、启动
docker run --name redis -p 6379:6379 -v /docker/redis/conf/redis.conf:/etc/redis/redis.conf -v /docker/redis/data:/data -d redis:3.0.7 /usr/local/bin/redis-server /etc/redis/redis.conf
说明:
-v /docker/redis/conf/redis.conf:/etc/redis/redis.conf 挂载目录,指定挂载的配置文件路径
/usr/local/bin/redis-server /etc/redis/redis.conf 指定配置文件启动redis-server
Redis持久化:
RDB快照(snapshop):redis默认将内存数据库快照保存在名为dump.rdb的二进制文件中。
# save 60 1000 redis在满足60秒内有超过1000个键被改动,自动保存一次数据集。
也可以通过save或者bgsave命令,手动生成dump.rdb文件。每次新的rdb文件会覆盖原有的快照文件。
bgsave:写是复制,借助操作系统提供的写时复制技术(COW,copy-on-write),在生成快照的同时,依然可以正常处理写命令。bgsave子进程是由主进程fork生成的,可以共享主线程所有内存数据。save阻塞客户端,bgsave不阻塞客户端。
AOF(append-only file)
快照功能不耐久会丢数据,redis完全耐久的持久化方式:AOF持久化,将修改的每一条指令记录进文件appendonly.aof中(先写入os cache,每隔一段时间fsync到磁盘)
appendonly yes 配置打开AOF功能
appendfsync always : 每次有新命令都追加到AOF文件时就执行一次fsync,非常安全也很慢。
appendfsync everysec :每秒fsync一次,故障时,只丢失1秒数据。
appendfsync no :从不fsync,将数据交给操作系统来处理。最快,也最不安全。
AOF重写,AOF会定期根据内存最新数据生成aof文件,手动重写bgrewriteaof。
redis4.0混合持久化:AOF重写时,将这一刻之前的内存做RDB快照处理,且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件。
二、安装redis主从
1、主节点同安装单节点redis步骤一样端口默认6379
2、修改从节点配置redis.conf,关键配置slaveof、slave-read-only;redis5.0之后slave替换成replica即可。
# 端口
port 11001
pidfile /var/run/redis-11001.pid # 吧pid进程号写入pidfile配置的文件
logfile "11001.log"
# 配置主从复制
slaveof 192.168.0.60 6379 # 从192.168.0.60的6379的redis实例复制数据
slave-read-only yes # 配置从节点只读
3、启动容器
docker run --name redis-11001 -p 11001:11001 -v /docker/redis-11001/conf/redis.conf:/etc/redis/redis.conf -v /docker/redis-11001/data:/data -d redis:3.0.7 /usr/local/bin/redis-server /etc/redis/redis.conf
重复2、3步骤,可以配置多个从节点
Redis主从工作原理:
如果你为master配置了一个slave,不管这个slave是不是第一次连接上master,它都会发送一个PSYNC命令给master请求复制数据;
master收到PSYNC命令后,会在后台通过bgsave生成最新的rdb快照文件,持久化期间,master收到客户端的请求,缓存在内存中,当持久化完毕,master先将rdb快照发送给slave,slave先将收到的数据持久化成rdb,再加载到内存。最后master将缓存在内存中的命令发送给slave。
当slave和master之间断开时,slave能够自动重连master,如果master收到多个slave连接请求,只会持久化一次,然后分别发送给每个slave。
当有很多从节点时,为了缓解主从复制风暴(多个从节点同时复制主节点,导致主节点压力过大),可以做如下架构
三、哨兵模式
sentinel哨兵是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。
哨兵架构下client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会每次都通过sentinel代理访问redis的主节点,当redis主节点发生变化,哨兵会第一时间感知到,且将新的redis主节点通知给client端(这里redis的client端一般都实现了订阅功能,订阅sentinel发布的节点变动消息)
基于二redis主从架构升级成哨兵模式的redis主从
每个redis节点redis-1100*,*代表从0到2,共三个节点。在各自目录/conf/下进行sentinel2100*.conf ,内容如下:
port 21000
daemonize yes
sentinel monitor mymaster 8.140.176.246 11000 2
三个节点的端口号分别为:21000、21001、21002
对应三个节点的启动命令改为:
docker run --name redis-11000 -p 11000:11000 -v /docker/redis-11000/conf/redis.conf:/etc/redis/redis.conf -v /docker/redis-11000/conf/sentinel-21000.conf:/etc/redis/sentinel-21000.conf -v /docker/redis-11000/data:/data -d redis:3.0.7 /usr/local/bin/redis-server /etc/redis/redis.conf
修改点:新增 映射sentinel配置文件 -v
/docker/redis-11000/conf/sentinel-21000.conf:/etc/redis/sentinel-21000.conf
容器启动后,进入容器,启动哨兵sentinel
# 进入容器,各自容器名称注意对应
docker exec -it redis-11000 /bin/bash
# 进入sentinel.conf配置所在目录
cd /etc/redis/
# 启动哨兵
redis-sentinel sentinel-21000.conf
# 连接哨兵
redis-cli -p 21000
# 查看信息
info
配置各节点过程中,结尾的slaves从0开始直至2,sentinels从1开始直至3
ps -ef
可以看到redis-server进程和sentinel进程都已启动。
四、redis可视化界面安装:redis-manager
# 获取最新镜像
docker pull reasonduan/redis-manager
# 启动容器,端口号是8182,映射到外部端口20000
docker run -d --name redis-manager \
-p 20000:8182 \
-e DATASOURCE_URL='jdbc:mysql://116.62.207.166:10000/redis-manager?characterEncoding=UTF-8&useUnicode=true&serverTimezone=Asia/Shanghai' \
-e DATASOURCE_USERNAME='root' \
-e DATASOURCE_PASSWORD='123456' \
reasonduan/redis-manager
访问:http://ip:20000,登录admin/admin
添加集群:
最终看到集群的监控信息: