Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
有以下三个特点:
支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
支持数据的备份,即master-slave模式的数据备份。
Redis的持久化
RDB:snapshotting
二进制格式;按事先定制的策略,周期性地将数据从内存同步至磁盘;数据文件默认为dump.rdb;
客户端显式使用SAVE或BGSAVE命令来手动启动快照保存机制;
SAVE:同步,即在主线程中保存快照,此时会阻塞所有客户端请求;
BGSAVE:异步,backgroud:后台启动快照线程,服务不受影响
RDB相关的配置
save <seconds> <changes> 触发快照的策略
save 900 1 #第一级匹配
save 300 10 : 达不到第三个就匹配第二级
save 60 10000 : 60秒内有10000个键发生更改就触发快照
#表示:三个策略满足其中任意一个均会触发SNAPSHOTTING操作;
900s内至少有一个key有变化,300s内至少有10个key有变化,
60s内至少有1W个key发生变化;
其他参数
stop-writes-on-bgsave-error yes : dump操作出现错误时,是否禁止新的写入操作请求;
rdbcompression yes :压缩存放,节约I/O
rdbchecksum yes ;校验
dbfilename dump.rdb:指定rdb文件名
dir /var/lib/redis:rdb文件的存储路径
AOF:Append Only File, fsync
记录每次写操作至指定的文件尾部实现的持久化,当redis重启时,可通过重新执行文件中的命令在内存中重建出数据库,
BGREWRITEAOF:AOF文件重写
不会读取正在使用AOF文件,而是通过将内存中的数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件;
AOF相关的配置
appendonly no :默认禁用
appendfilename “appendonly.aof” :
appendfsync :将aof文件的缓冲区数据同步到磁盘,防止故障导致数据丢失,同步频繁会导致I/O负载过大,可以同步方式如下:
no:redis:不执行主动同步操作,而是OS进行;
everysec:每秒一次;
always:每语句一次;
no-appendfsync-on-rewrite no :是否在后台执行aof重写期间不调用fsync,默认为no,表示调用;
auto-aof-rewrite-percentage 100 :对aof文件变化量的控制
auto-aof-rewrite-min-size 64mb :对aof规定大小最小达到64MB才重写
上述两个条件同时满足时,方会触发重写AOF;与上次aof文件大小相比,其增长量超过100%,且大小不少于64MB;
aof-load-truncated yes :装载aof文件时如果有残缺部分则自动修剪(清理掉)
注意:持久机制本身不能取代备份;应该制订备份策略,对redis库定期备份;
两种存储方式最好不要同时启用,RDB与AOF同时启用特点如下
(1) BGSAVE和BGREWRITEAOF不会同时进行;
(2) Redis服务器启动时用持久化的数据文件恢复数据,会优先使用AOF;
俩种方式:
Disk-backend:主节点基于内存创建快照文件于磁盘中,而后将其发送给从节点;从节点收到快照进
行恢复,快照恢复完后接着快照的那一刻随后内容进行复制,主节点每写一行,并直接将语句发送给
从节点(跨网络复制适合)
Diskless:主节占新创建快照后直接通过网络套接字文件发送给从节点;为了实现并行复制,通常需
要在复制启动前延迟一个时间段;(占用网络带宽)
安装配置redis一主多从
各节点安装redis
yum install redis -y
配置master节点
bind 0.0.0.0 #绑定地址 requirepass gudaoyufu #启用密码认证 #默认master节点修改这两项就可以了,也可以进行其他设置
配置各slave节点
bind 0.0.0.0 slaveof 192.168.214.148 6379 #定义master信息 masterauth gudaoyufu #认证
从节点上配置这三项页就可以,其他参数可以根据情况选择调整即可。
修改后记得重启服务,此时登录到master节点查看信息:
[root@master ~]# redis-cli -h 127.0.0.1 -a gudaoyufu 127.0.0.1:6379> CLIENT LIST id=5 addr=192.168.214.149:39804 fd=5 name= age=326 idle=1 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=replconf id=7 addr=127.0.0.1:35262 fd=6 name= age=4 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client #看到第一条记录最后cmd=replconf就说明该节点是从节点
或者使用指令INFO replication指令查看信息:
127.0.0.1:6379> INFO replication # Replication role:master #自己的角色 connected_slaves:1 #从节点数量 slave0:ip=192.168.214.149,port=6379,state=online,offset=995,lag=1 #从节点信息 master_repl_offset:995 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:994
接着将slave-2也配置好,与slave-1配置相同即可,配置好后重启服务,查看master节点信息
127.0.0.1:6379> INFO replication # Replication role:master connected_slaves:2 slave0:ip=192.168.214.149,port=6379,state=online,offset=1793,lag=1 slave1:ip=192.168.214.150,port=6379,state=online,offset=1793,lag=1 master_repl_offset:1793 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:1792
redis主从复制相关配置
下面是redis主从复制场景的一些可调参数,需要根据实际环境调整
slave-serve-stale-data yes : 是否可以把不新鲜的数据服务与客户端
slave-read-only yes : 从节点只读,启用slaveof定义后才生效
repl-diskless-sync no :是否同时向多个从节点同时发数据
repl-diskless-sync-delay 5 :发送的延迟时间
repl-ping-slave-period 10 探测从节点状态
repl-timeout 60 探测节点超时时间
repl-disable-tcp-nodelay no : 启用nodelay
repl-backlog-size 1mb
slave-priority 100 : 从节点优先级,复制集群中,主节点故障时,sentinel应用场景中的主节点选
举时使用的优先级;数字越小优先级越高,但0表示不参与选举;
min-slaves-to-write 3:主节点仅允许其能够通信的从节点数量大于等于此处的值时接受写操作;
min-slaves-max-lag 10:从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作;