redis开发与运维
2019-12-30 10:54:58 117 举报
AI智能生成
redis开发与运维阅读笔记
作者其他创作
大纲/内容
初识redis
盛赞redis
键值对NoSql数据库
很多数据结构
满足很多应用场景
redis特性
速度快
10万/秒
键值对的数据结构服务器
丰富的功能
键过期
发布订阅功能
Lua脚本功能
简单事务功能
Pipeline功能
发布订阅功能
Lua脚本功能
简单事务功能
Pipeline功能
客户端语言多
持久化
主从复制
高可用与分布式
redis使用场景
redis可以做什么
缓存
排行榜系统
计数器应用
社交网络
消息队列系统
redis不可以做什么
存储大数据成本高
冷数据放redis浪费资源
用好redis的建议
切勿当做黑盒使用,开发与运维同样重要
阅读源码
正确安装并启动redis
linux、windows下安装
配置、启动、操作、关闭redis
redis-server 启动redis
redis-cli redis命令行客户端
redis-benchmark redis基准测试工具
redis-check-aof redis aof 持久化文件检测和修复工具
redis-check-dump redis rdb 持久化文件检测和修复工具
redis-sentinel 启动redis sentinel
redis-cli redis命令行客户端
redis-benchmark redis基准测试工具
redis-check-aof redis aof 持久化文件检测和修复工具
redis-check-dump redis rdb 持久化文件检测和修复工具
redis-sentinel 启动redis sentinel
重大版本
第二位是奇数表示开发版本
第二位是偶数表示稳定版本
API的理解和使用
预备
全局命令
查看所有key
key *
时间复杂度为O(n)
键总数
dbsize
时间复杂度为O(1)
检查键是否存在
exists key
存在返回1 否则返回0
删除键
del key [key...]
可以同时删除多个key
时间复杂度:O(k),k为键的个数
键过期
expire key seconds
单位为秒
键的数据结构类型
type key
数据结构和内部编码
string
内部编码
raw
int
embstr
hash
内部编码
hashtable
ziplist
list
内部编码
linkedlist
ziplist
set
内部编码
hashtable
intset
zset
内部编码
skiplist
ziplist
通过object encoding查看内部编码
改变内部编码对外无任何感知
不同的编码可以在不同的场景中使用
单线程架构
redis使用单线程架构和IO多路复用模型
客户端执行命令
发送命令
执行命令
返回结果
为什么单线程还能这么快?
纯内存访问
非阻塞IO
IO多路复用
自身事件模型
单线程避免了线程切换和竞态产生的消耗
字符串
最基础的数据结构,其他几种数据类型在它基础上构建的
值可以是字符串、数字、二进制
值最大是512M
命令
常用命令
设置值
set key value [ex seconds] [px milliseconds] [nx|xx]
ex seconds 为键设置的秒级过期时间
px milliseconds 为键设置毫秒级过期时间
nx 键必须不存在才可以设置成功,用于添加
xx 与nx相反,键必须存在才可以设置成功,用于更新
px milliseconds 为键设置毫秒级过期时间
nx 键必须不存在才可以设置成功,用于添加
xx 与nx相反,键必须存在才可以设置成功,用于更新
setex key seconds value
setnx key value
setnx key value
时间复杂度:O(1)
获取值
get key
时间复杂度:O(1)
批量设置值
mset key value [key value ...]
时间复杂度:O(k),k为键的个数
批量获取值
mget key [key ...]
时间复杂度:O(k),k为键的个数
计数
自增
incr key
时间复杂度:O(1)
自减
decr key
时间复杂度:O(1)
自增指定数字
incrby key increment
时间复杂度:O(1)
自减指定数字
decrby key decrement
时间复杂度:O(1)
自增浮点数
incrbyfloat key increment
时间复杂度:O(1)
不常用命令
追加值
append key value
时间复杂度:O(1)
字符串长度
strlen key
时间复杂度:O(1)
设置并返回原值
getset key value
设置指定位置的字符
setrange key offeset value
时间复杂度:O(1)
获取部分字符串
getrange key start end
时间复杂度:O(n),n表示字符串长度
内部编码
int
8个字节的长整型
embstr
小于等于39个字节的字符串
raw
大于39个字节的字符串
会根据当前值的长度和类型来决定使用哪个编码
典型使用场景
缓存功能
计数
共享session
限速
哈希
在redis中hash是指value又是键值对结构
格式:{{key1,value1},...{keyn,valuen}}
命令
设置值
hset key field value
时间复杂度:O(1)
获取值
hget key field
时间复杂度:O(1)
删除field
hdel key field [field...]
时间复杂度:O(k) k为field个数
计算field个数
hlen key
时间复杂度:O(1)
批量设置或获取field-value
hmget key field [field ...]
hmset key field value [field value]
hmset key field value [field value]
时间复杂度:O(k) k为field个数
判断field是否存在
hexists key field
时间复杂度:O(1)
获取所有field
hkeys key
时间复杂度:O(n) n为field总数
获取所有value
hvals key
时间复杂度:O(n) n为field总数
获取所有的field-value
hgetall key
时间复杂度:O(n) n为field总数
hincrby hincrbyfloat
hincrby key field
hincrbyfloat key field
hincrbyfloat key field
时间复杂度:O(1)
计算value的字符串长度(3.2以上)
hstrlen key value
时间复杂度:O(1)
内部编码
ziplist(压缩列表)
优先使用该编码,不满足条件之后会使用hashtable
hashtable(哈希表)
使用场景
相比字符串,使用哈希会让结构变得更加直观,而且更新便捷
列表
前言
用来存储多个有序的字符串
列表中的元素是有序的
列表中的元素是可以重复的
命令
添加操作
从右边插入
rpush key value [value ...]
时间复杂度O(k),k是元素个数
从左边插入
lpush key value [value ...]
时间复杂度O(k),k是元素个数
向某个元素前或者后插入
linsert key before|after pivot value
时间复杂度O(n),n是pivot距离列表头或尾的距离
查找
获取指定范围内的元素列表
lrange key start end
end包含自身
从左到右0到N-1
从右到左-1到-N
时间复杂度O(s+n),s是start偏移量,n是start到end的范围
获取列表指定索引下标的元素
lindex key index
时间复杂度O(n),n是索引的偏移量
获取列表长度
llen key
时间复杂度:O(1)
删除
从列表左侧弹出元素
lpop key
时间复杂度:O(1)
从列表右侧弹出
rpop key
时间复杂度:O(1)
删除指定元素
lrem key count value
时间复杂度O(n),n是列表的长度
按照索引范围修剪列表
ltrim key start end
时间复杂度O(n),n是要裁剪的元素总数
修改
lset key index newValue
时间复杂度O(n),n是索引的偏移量
阻塞操作
blpop key [key ...] timeout
brpop key [key ...] timeout
brpop key [key ...] timeout
timeout:阻塞时间,单位秒
时间复杂度:O(1)
内部编码
ziplist(压缩列表)
linkedlist(链表)
当元素个数较少且没有大元素时,内部编码为ziplist
当元素个数超过512个,内部编码变为linkedlist
当某个元素超过64字节,内部编码使用linkedlist
当元素个数超过512个,内部编码变为linkedlist
当某个元素超过64字节,内部编码使用linkedlist
使用场景
消息队列
文章列表
集合
前言
保存多个字符串元素
与列表不同的是不能有重复元素,无序的
命令
集合内操作
添加元素
sadd key element [element ...]
时间复杂度:O(k) k是元素个数
删除元素
srem key element [element ...]
时间复杂度:O(k) k是元素个数
计算元素个数
scard key
时间复杂度:O(1)
判断元素是否在集合中
sismember key element
时间复杂度:O(1)
随机从集合返回指定个数元素
srandmember key [count]
时间复杂度:O(count)
从集合随机弹出元素
spop key
时间复杂度:O(1)
获取所有元素
smembers key
时间复杂度:O(k) k是元素总数
集合间操作
求多个集合的交集
sinter key [key ...]
时间复杂度:O(m*k) k是多个集合中元素最少的个数,m是键个数
求多个集合的并集
suinon key [key ...]
时间复杂度:O(k) k是多个集合元素个数和
求多个集合的差集
sdiff key [key ...]
时间复杂度:O(k) k是多个集合元素个数和
将交集、并集、差集的结果保存
sinterstore destination key [key ...]
时间复杂度:O(m*k) k是多个集合中元素最少的个数,m是键个数
suionstore destination key [key ...]
时间复杂度:O(k) k是多个集合元素个数和
sdiffstore destination key [key ...]
时间复杂度:O(k) k是多个集合元素个数和
内部编码
intset(整数集合)
hashtable(哈希表)
当元素个数较少且都为整数时,内部编码为intset
当元素个数超过512个,内部编码变为hashtable
当某个元素不为整数时,内部编码使用hashtable
当元素个数超过512个,内部编码变为hashtable
当某个元素不为整数时,内部编码使用hashtable
使用场景
标签功能
给用户添加标签
给标签添加用户
删除用户下的标签
删除标签下的用户
有序集合
给每个元素设置分数,用来作为排序
应用场景
排行榜
社交
点赞功能
命令
集合内
添加成员
zadd key score member [score member ...]
时间复杂度:O(k*log(n)) k成员个数 n集合成员个数
计算成员个数
zcard key
时间复杂度:O(1)
计算某个成员的分数
zscore key member
时间复杂度:O(1)
计算成员排名
zrank key member
zrevrank key member
zrevrank key member
时间复杂度:O(log(n))
删除成员
zrem key member [member ...]
时间复杂度:O(k*log(n)) k成员个数 n集合成员个数
增加成员的分数
zincrby key increment member
时间复杂度:O(log(n))
返回指定排名范围的成员
zrange key start end [withscores]
zrevrange key start end [withscores]
zrevrange key start end [withscores]
时间复杂度:O(log(n)+k)
返回指定分数范围的成员
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]
时间复杂度:O(log(n)+k)
返回指定分数范围成员个数
zcount key min max
时间复杂度:O(log(n))
删除指定排名内的升序元素
zremrangebyrank key start end
时间复杂度:O(log(n)+k)
删除指定分数范围的成员
zremrangebyscore key min max
时间复杂度:O(log(n)+k)
集合间
交集
zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
destination:交集计算结果保存到这个键
numkeys:需要做交集计算键的个数
key [key ...]:需要做交集计算的键
weights weight [weight ...]:每个键的权重,每个member的分数乘以这个权重,默认是1
aggregate sum|min|max:计算成员交集后,按照和、最小值、最大值做汇总,默认是sum
numkeys:需要做交集计算键的个数
key [key ...]:需要做交集计算的键
weights weight [weight ...]:每个键的权重,每个member的分数乘以这个权重,默认是1
aggregate sum|min|max:计算成员交集后,按照和、最小值、最大值做汇总,默认是sum
时间复杂度:O(n*k)+O(m*log(m)) n是成员数最小的集合成员个数,k是有序集合的个数,m是结果及中成员个数
并集
zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
时间复杂度:O(n)+O(m*log(m)) n是所有集合成员个数和,m是结果集中成员个数
内部编码
ziplist
skiplist
键管理
单个键管理
键重命名
rename key newkey
随机返回一个键
randomkey
键过期
expire key seconds/timestamp
迁移键
move key db
dump key
restore key tll value
restore key tll value
migrate
遍历键
全量遍历键
keys pattern
渐进式遍历
scan
scan cursor [match pattern] [count number]
数据库管理
切换数据库
select dbindex
flushdb/flushall
小功能大用处
慢查询分析
记录超过阈值的命令
慢查询的两个配置参数
slowlog-log-slower-than:预设阈值,单位微妙 默认10000
slowlog-max-len:最多存储多少条
获取慢查询日志
slowlog get [n]
n指定条数
获取慢查询日志列表当前的长度
slowlog len
慢查询日志重置
slowlog reset
最佳实践
slowlog-max-len建议调大
slowlog-log-slower-than根据OPS来定,高OPS建议设置为1毫秒
定期记录慢查询日志
redis shell
redis-cli
-r
命令执行多次
-i
每隔几秒执行一次命令,必须以-r一起使用
-c
连接redis cluster使用,防止moved和ask异常
-a
设置密码需要使用
--scan和--pattern
扫描指定模式的键
--slave
把客户端模拟成redis的从节点
--rdb
发送RDB持久化文件,保存在本地
--pipe
将命令封装到通道中
--bigkeys
找出内存中比较大的键值
--eval
执行lua脚本
--stat
实时获取redis重要统计信息
--raw --no-raw
--no-raw返回结果原始格式,--raw返回格式化后的结果
命令执行多次
-i
每隔几秒执行一次命令,必须以-r一起使用
-c
连接redis cluster使用,防止moved和ask异常
-a
设置密码需要使用
--scan和--pattern
扫描指定模式的键
--slave
把客户端模拟成redis的从节点
--rdb
发送RDB持久化文件,保存在本地
--pipe
将命令封装到通道中
--bigkeys
找出内存中比较大的键值
--eval
执行lua脚本
--stat
实时获取redis重要统计信息
--raw --no-raw
--no-raw返回结果原始格式,--raw返回格式化后的结果
redis-server
--test-memory
检测当前系统能否稳定分配指定容量内存给redis
检测当前系统能否稳定分配指定容量内存给redis
redis-benchmark
-c
客户端并发数量
-n
客户端请求总量
-q
显示QPS
-r
插入更多随机的键
-P
每个请求pipeline的数据量
-k <boolean>
客户端是否使用keepalive,1使用,0不使用,默认为1
-t
指定命令进行基准测试
--csv
结果按照csv格式输出
客户端并发数量
-n
客户端请求总量
-q
显示QPS
-r
插入更多随机的键
-P
每个请求pipeline的数据量
-k <boolean>
客户端是否使用keepalive,1使用,0不使用,默认为1
-t
指定命令进行基准测试
--csv
结果按照csv格式输出
pipeline
将命令组装一次性发给redis,结果按顺序返回
最佳实践
组装数量需要考虑,不易太多
事务与lua
事务
可以保证多个命令组合使用的原子性
事务表示一组动作,要么全部执行,要么全部不执行
redis是将一组命令放到multi和exec两个命令之间,multi表示事务开始,exec表示事务结束
discard可以停止事务执行
命令错误
会导致整个事务无法执行
运行时错误
部分命令执行成功,redis没办法自动回滚,需要手动处理
可以使用watch来处理key被更改过的问题
lua用法简介
eval
eval 脚本内容 key个数 key列表 参数列表
evalsha
会把lua脚本加载到redis服务端
evalsha 脚本SHA1值 key个数 key列表 参数列表
redis.call使用lua命令
redis.pcall会忽略错误进行执行
好处
原子执行,过程中不会插入其他命令
可以定制命令,并得到复用
打包多条命令,减少网络开销
如何管理lua
script load
将脚本加载到redis内存中
script load 脚本
script exists
script exists sha1 [sha1 ...]
判断sha1是否在内存中
script flush
清除所有加载到内存的脚本
script kill
杀掉正在执行的脚本
bitmaps
数据结构模型
计算机以二进制来存储信息
本身不是数据结构,其实是字符串
单独提供一套命令,有别于字符串命令
命令
设置值
setbit key offset value
获取值
setbit key offset
获取bitmaps指定范围值为1的个数
bitcount [start] [end]
bitmaps间的运算
bitop op destkey key [key....]
可以做并集、交集、非、异或
计算bitmaps中第一个值为targetBit的偏移量
bitpos key targetBit [start] [end]
分析
集合类型:64位(每个用户id占用空间)*50000000(需要存储的用户量) = 400MB
Bitmaps:1位(每个用户id占用空间)*100000000(需要存储的用户量)=12.5MB
Bitmaps:1位(每个用户id占用空间)*100000000(需要存储的用户量)=12.5MB
但是如果大部分用户不活跃,那么使用集合类型占用的内存更小
HyperLogLog
实际类型为字符串类型
可以使用极少的内存完成总数的统计
添加
pfadd key element [element ...]
计算独立用户数
pfcount key [key ...]
合并
pfmerge destkey sourcekey [sourcekey]
存在0.81%的误差
发布订阅
命令
发布消息
publish channel message
订阅消息
subscribe channel [channel ...]
取消订阅
unsubscribe channel [channel ...]
按照模式订阅和取消订阅
psubscribe pattern [pattern...]
punsubscribe [pattern [pattern ...]]
punsubscribe [pattern [pattern ...]]
查阅订阅
查看活跃的频道
pubsub channels [pattern]
查看频道订阅数
pubsub numsub [channel ...]
查看模式订阅数
pubsub numpat
使用场景
系统之间需要解耦
GEO
redis 3.2及以上
地理信息定位
增加地理位置信息
geoadd key longitude latitude member [longitude latitude member ...]
longitude:经度
latitude:纬度
member:成员
latitude:纬度
member:成员
获取地理位置信息
geopos key member [member ...]
获取两个地址位置的距离
geodist key member1 member2 [unit]
unit:返回结果的单位,m:米,km:公里,mi:英里,ft:尺
获取指定位置范围内的地理信息位置集合
georadius key longitude latitude radiusm|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]
georadiusbymember key member radiusm|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]
withcoord:结果包含经纬度
withdist:结果包含离中心节点位置的距离
withhash:结果包含geohash
COUNT count:结果的数量
asc|desc:升序或降序
store key:结果保存到指定键
storedist key:结果离中心节点的距离保存到指定键
withdist:结果包含离中心节点位置的距离
withhash:结果包含geohash
COUNT count:结果的数量
asc|desc:升序或降序
store key:结果保存到指定键
storedist key:结果离中心节点的距离保存到指定键
获取geohash
geohash key member [member ...]
删除地理位置信息
zrem key member
客户端
发送命令格式
*<参数数量> \r\n
$<参数1的字节数量> \r\n
<参数1> \r\n
...
$<参数N的字节数量> \r\n
<参数N> \r\n
$<参数1的字节数量> \r\n
<参数1> \r\n
...
$<参数N的字节数量> \r\n
<参数N> \r\n
set hello world
*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n
*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n
返回结果格式
状态回复:第一个字节为+
错误回复:第一个字节为-
整数回复:第一个字节为:
字符串回复:第一个字节为$
多条字符串回复:第一个字节为*
错误回复:第一个字节为-
整数回复:第一个字节为:
字符串回复:第一个字节为$
多条字符串回复:第一个字节为*
java客户端jedis
maxActive:最大连接数,默认8
maxIdle:最大空闲的连接数,默认8
minIdle:最少空闲的连接数,默认0
maxWaitMillis:资源用尽后,调用者最大等待时间,单位为毫秒,默认-1,永远不超时,一直等
jmxEnabled:是否开启jmx监控,默认为true
minEvictableIdleTimeMillis:连接的最小空闲时间,默认30分钟
numTestsPerEvictionRun:做空闲连接检测时,每次的采样数,默认3
testOnBorrow:向连接池借用连接时是否做连接有效性检测,无效连接会被移除,默认false
testOnReturn:向连接池归还连接时是否做连接有效性检测,无效连接会被移除,默认false
testWhileIdle:向连接池借用连接时是否做连接空闲检测,空闲超时的连接会被移除,默认false
timeBetweenEvictionRunsMillis:空闲连接的检测周期,单位为毫秒,默认-1,表示不做检测
blockWhenExhausted:当连接池用尽后,调用者是否要等待,为true时maxWaitMills才会生效,默认true
maxIdle:最大空闲的连接数,默认8
minIdle:最少空闲的连接数,默认0
maxWaitMillis:资源用尽后,调用者最大等待时间,单位为毫秒,默认-1,永远不超时,一直等
jmxEnabled:是否开启jmx监控,默认为true
minEvictableIdleTimeMillis:连接的最小空闲时间,默认30分钟
numTestsPerEvictionRun:做空闲连接检测时,每次的采样数,默认3
testOnBorrow:向连接池借用连接时是否做连接有效性检测,无效连接会被移除,默认false
testOnReturn:向连接池归还连接时是否做连接有效性检测,无效连接会被移除,默认false
testWhileIdle:向连接池借用连接时是否做连接空闲检测,空闲超时的连接会被移除,默认false
timeBetweenEvictionRunsMillis:空闲连接的检测周期,单位为毫秒,默认-1,表示不做检测
blockWhenExhausted:当连接池用尽后,调用者是否要等待,为true时maxWaitMills才会生效,默认true
持久化
RDB
当前进程数据生成一份快照保存在硬盘的过程
触发机制
手动触发
save
阻塞redis服务器,直到持久化完成
bgsave
fork一个子进程,由子进程完成持久化
自动触发
满足save n m条件 就会自动触发,即m秒内数据集发生n次改变
debug reload
流程说明
1、执行bgsave命令,没有子进程在执行,才会创建成功
2、父进程执行fork操作创建子子进程,fork过程会阻塞,通过info stats命令查看最佳一个fork耗时
3、父进程fork完后,bgsave命令返回background saving started信息,并不在阻塞父进程,响应其他命令
4、子进程创建RDB文件,生成临时快照文件,替换原来的文件
5、进程发送信号给父进程表示完成,父进程更新统计信息
2、父进程执行fork操作创建子子进程,fork过程会阻塞,通过info stats命令查看最佳一个fork耗时
3、父进程fork完后,bgsave命令返回background saving started信息,并不在阻塞父进程,响应其他命令
4、子进程创建RDB文件,生成临时快照文件,替换原来的文件
5、进程发送信号给父进程表示完成,父进程更新统计信息
文件保存在dir配置下
优点
紧凑的二进制文件,适合用于备份,全量复制等场景
加载数据远远快于AOF
加载数据远远快于AOF
缺点
没办法做到实时持久化/秒级持久化
老版本redis无法兼容新版RDB格式
老版本redis无法兼容新版RDB格式
AOF
以独立日志方式记录每次写命令,重启时再重新执行AOF文件中的命令来恢复数据的目的,解决数据持久化的实时性。
开启配置:appendonly yes;默认不开启
流程
1、所有写入命令会追加到aof_buf缓冲区中
2、AOF缓冲区根据对应的策略向硬盘做同步操作
3、AOF超过配置最大值,会进行重写
4、redis重启时,会加载AOF文件进行数据恢复
2、AOF缓冲区根据对应的策略向硬盘做同步操作
3、AOF超过配置最大值,会进行重写
4、redis重启时,会加载AOF文件进行数据恢复
命令写入
set hello world
在aof文件中是以下格式
*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n
在aof文件中是以下格式
*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n
文件同步
提供多种缓冲区文件同步策略
由appendfsync参数配置
always:每一个命令调用fsync把缓存同步到aof文件
everysec:每秒调用一次fsync把缓存同步到aof文件
no:不对AOF文件做fsync,交给操作系统来同步,通常周期最长30秒
everysec:每秒调用一次fsync把缓存同步到aof文件
no:不对AOF文件做fsync,交给操作系统来同步,通常周期最长30秒
重写机制
为了防止文件过大
手动触发
bgrewriteaof
自动触发
auto-aof-rewrite-min-size和auto-aof-rewrite-percentage
流程
1、执行AOF重写请求
2、父进程执行fork创建子进程
3、父进程fork完后继续响应其他命令
4、子进程根据内存快照,按照命令合并规则写入到新的AOF文件
5、新AOF文件写入完成后,子进程发送信号给父进程,父进程更新统计信息,父进程把AOF重写缓冲区的数据写入到新的AOF文件,使用新AOF文件替换老文件,完成AOF重写
2、父进程执行fork创建子进程
3、父进程fork完后继续响应其他命令
4、子进程根据内存快照,按照命令合并规则写入到新的AOF文件
5、新AOF文件写入完成后,子进程发送信号给父进程,父进程更新统计信息,父进程把AOF重写缓冲区的数据写入到新的AOF文件,使用新AOF文件替换老文件,完成AOF重写
重启加载
流程
1、AOF持久化开启且存在AOF文件时,优先加载AOF文件
2、AOF关闭或者AOF文件不存在时,加载RDB文件
3、加载AOF/RDB文件成功后,redis启动成功
4、AOF/RDB文件存在错误时,redis启动失败并打印错误信息
2、AOF关闭或者AOF文件不存在时,加载RDB文件
3、加载AOF/RDB文件成功后,redis启动成功
4、AOF/RDB文件存在错误时,redis启动失败并打印错误信息
文件检验
如果文件损坏会进行校验
redis-check-aof --fix命令进行文件修复
复制
配置
建立复制
1、配置文件中加入slaveof {masterHost} {masterPort}
2、redis-server启动命令后加入--slaveof {masterHost} {masterPort}
3、使用命令 slaveof {masterHost} {masterPort}
2、redis-server启动命令后加入--slaveof {masterHost} {masterPort}
3、使用命令 slaveof {masterHost} {masterPort}
断开复制
1、断开与主节点复制关系
2、从节点晋升为主节点
2、从节点晋升为主节点
切主操作流程
1、断开与旧主节点复制关系
2、与新主节点建立复制关系
3、删除从节点当前所有数据
4、对新主节点进行复制操作
2、与新主节点建立复制关系
3、删除从节点当前所有数据
4、对新主节点进行复制操作
安全性
主节点设置了密码,那么从节点必须使用auth来连接
只读
默认情况下,从节点是开启只读模式
传输延迟
主从部署在不同机器上,存在网络延迟
拓扑
一主一从
一主多从
树状主从结构
原理
流程
1、保存主节点信息
2、从节点内部通过每秒运行的定时任务维护复制相关逻辑
3、发送ping命令
4、权限验证
5、同步数据集
6、命令持续复制
2、从节点内部通过每秒运行的定时任务维护复制相关逻辑
3、发送ping命令
4、权限验证
5、同步数据集
6、命令持续复制
数据同步
全量复制
部分复制
心跳判断机制
1、主从节点彼此都要心跳检测机制
2、主节点默认每隔10秒对从节点发送ping命令,判断从节点的存活性和连接状态
3、从节点在主线程中每隔1秒发送replconf ack {offset}命令,给主节点上报自身当前的复制偏移量
2、主节点默认每隔10秒对从节点发送ping命令,判断从节点的存活性和连接状态
3、从节点在主线程中每隔1秒发送replconf ack {offset}命令,给主节点上报自身当前的复制偏移量
存在问题
读写分离存在延迟
读到过期的数据
主从配置不一致
规避全量复制
规避复制风暴
redis的噩梦:阻塞
发现阻塞
出现jedisConnectionException异常
发现异常进行通知
内在原因
API或数据结构使用不合理
发现慢查询slowlog get {n}
如何发现大对象
redis-cli -h {ip} -p {port} bigkeys
CPU饱和的问题
单线程只能使用一个CPU
CPU饱和指CPU接近100%
持久化相关的阻塞
fork阻塞
AOF刷盘阻塞
HugePage写阻塞
外在原因
CPU竞争
进程竞争
绑定CPU
内存交换
网络问题
redis连接拒绝
网络闪断
连接溢出
网络延迟
网络软中断
理解内存
内存消耗
内存使用统计
info memory
内存消耗划分
对象内存
缓冲内存
内存碎片
子进程内存消耗
内存管理
设置内存上限
动态调整内存上限
内存回收策略
删除过期键策略
惰性删除
定时任务删除
内存溢出控制策略
内存优化
redisObject对象
缩减键值对象
共享对象池
字符串优化
编码优化
了解编码
控制编码类型
ziplist编码
intset编码
控制键的数量
哨兵
概念
主节点:redis主服务
从节点:redis从服务
redis数据节点:主节点和从节点
sentinel节点:监控redis数据节点
sentinel节点集合:若干sentinel节点的抽象组合
redis sentinel:redis高可用实现方案
应用方:泛指一个或多个客户端
从节点:redis从服务
redis数据节点:主节点和从节点
sentinel节点:监控redis数据节点
sentinel节点集合:若干sentinel节点的抽象组合
redis sentinel:redis高可用实现方案
应用方:泛指一个或多个客户端
是redis的高可用方案
主从复制的问题
从节点的作用
可以将主节点的数据到从节点
从节点可以作为主节点的备份
从节点可以扩展主节点的读能力
存在的问题
主节点出现问题,需要手动操作
主节点的写能力受单机限制
主节点的存储能力受单机限制
主从复制没办法达到高可用
redis sentinel
当主节点出现故障,sentinel会自动进行故障切换
sentinel本身也是分布式的
sentinel会对主节点和从节点进行监控
故障转移处理逻辑
1、主节点出现故障,从节点与主节点失去连接,主从复制失败
2、每个sentinel节点通过定期监控发现主节点出现了故障
3、多个sentinel节点对主节点的故障达成一致,选举出某个sentinel节点作为领导者负责故障转移
4、sentinel领导者节点执行了故障转移
有以下功能
监控
通知
主节点故障转移
配置提供者
若干sentinel节点好处
多个sentinel节点判断是否故障,防止误判
提供健壮性
部署技巧
sentinel不应该部署在同一台物理机器上
部署至少3个且奇数个节点
一套sentinel
优点:降低维护成本
缺点:sentinel不可用影响多个redis数据节点,产生过多的网络连接
多套sentinel
优点:相互隔离,不影响
缺点:浪费资源
API
sentinel masters
展示所有被监控的主节点状态以及相关的统计信息
sentinel master <master name>
展示指定master name的主节点状态以及相关的统计信息
sentinel slaves <master name>
展示指定master name的从节点状态以及相关的统计信息
sentinel sentinels <master name>
展示指定<master name>的sentinel节点集合
sentinel get-master-addr-by-name <master name>
返回指定<master name>主节点的IP地址和端口
sentinel reset <pattern>
当前sentinel节点对符合<pattern>主节点的配置进行重置
sentinel failover <master name>
对指定<master name>主节点进行强制故障转移
sentinel ckquorum <master name>
检测当前可达的sentinel节点总数是否达到<quorum>的个数
sentinel flushconfig
将sentinel节点的配置强制刷到磁盘上
sentinel remove <master name>
取消当前sentinel节点对于指定<master name>主节点的监控
sentinel monitor <master name> <ip> <port> <quorum>
这个命令和配置文件中的含义是完全一样的
sentinel set <master name>
动态修改sentinel节点配置选项
sentinel is-master-down-by-addr
sentinel节点之间用来交换对主节点是否下线的判断
实现原理
三个定时监控任务
每隔10秒,每个sentinel节点会向主节点和从节点发送info命令获取最新的拓扑结构
每个2秒,每个sentinel节点会向redis数据节点的__sentinel__:hello频道上发送主节点、从节点、sentinel节点的信息
每个1秒,sentinel节点、主节点、从节点之前发送一条ping命令做一次心跳检测,确认这些节点是否可达
主观下线
超过down-after-milliseconds没有有效回复,sentinel会判断该节点失败
客观下线
当超过<quorum>个数,sentinel节点认为主节点确实有问题,sentinel节点认为客观下线
领导者sentinel节点选举
sentinel之间会选出一个领导,来进行故障转移
故障转移
1、从节点列表中选出一个节点作为新的主节点
过滤不健康的从节点,超过down-after-milliseconds*10秒
选择slave-priority最高的从节点列表
选择复制偏移量最大的从节点
选择runid最小的从节点
2、sentinel领导者会对第一步选出来的从节点执行slaveof no one命令让其成为主节点
3、sentinel领导者会向剩余的从节点发送命令,让它们成为新主节点的从节点
4、sentinel节点集合会将原来的主节点更新为从节点
集群
数据分布
数据分布理论
把数据集按照分区规则映射到多个节点上
节点取余分区
使用特定的数据,在对hash(keys)%N算出hash值。
数据丢失较多
一致性hash分区
为系统每个节点分配一个token,范围在0~2 32,这些token构成一个hash环,查找节点的时候顺时针找到第一个节点。
丢失1/3数据
数据不均匀
虚拟槽分区
把所有数据映射到一个固定范围的数据集合中,槽范围为0~16383。
redis数据分区
slot=CRC16(key)&16384
特点
解耦数据和节点之间的关系
节点自身维护槽的映射关系
支持槽、节点、键之间的映射查询
集群功能限制
key批量操作支持有限
key事件操作支持有限
key作为数据分区最小粒度,大的键值对象不能映射到不同的节点
不支持多数据库空间
复制结构只支持一层
搭建集群
准备节点
至少6个节点可以保证高可用
cluster-enabled yes
查看节点状态:cluster nodes
节点握手
通gossip进行通信
cluster meet {ip} {port}
获取集群当前状态:cluster info
分配槽
redis把所有数据都映射到16384个槽中
添加槽:cluster addslots
用redis-trib.rb搭建集群
用Ruby实现的集群管理工具
Ruby环境准备
准备节点
创建集群
集群完整性检查
节点通信
通信流程
采用gossip协议来维护元数据
每个节点都会开辟一个TCP通道
每个节点在特定时间内通知其他节点
接收到ping消息的节点会返回pong消息
gossip消息
主要职责是信息交换
ping消息
集群内交换最频繁的消息
pong消息
当接收到ping、meet消息后作出回应
meet消息
用于通知新节点加入
fail消息
判断某个节点下线会发生该类型消息
节点选择
选择发送消息的节点数量
定时任务每秒执行10次
找出5个最久没通信的节点
消息数据量
过大的集群会使消息数量变大
集群伸缩
灵活的节点扩容和收缩方案,主要得益于槽的灵活变动
扩容集群
准备新节点
加入集群
迁移槽和数据
收缩集群
下线迁移槽
忘记节点
请求路由
请求重定向
请求节点是否为目标节点,不是则返回目标节点地址
计算槽
槽节点查找
smart客户端
smart客户端原理
内部维护slot-node映射关系
如果报错,那么重新维护关系
故障转移
故障发现
主观下线
一个节点认为某个节点挂了
客观下线
大部分节点都认为某个节点挂了
故障恢复
资格检查
是否符合竞选条件
准备选举时间
条件越好的越早竞选
发起选举
选举投票
替换主节点
故障转移时间
整个故障转移花了多少时间
failover-time<=cluster-node-timeout+cluster-node-timeout/2 +1000
故障转移演练
kill -9关闭某个主节点进行演练
集群运维
集群完整性
16384个槽只要有一个没有指定到节点中,那么整个集群不可用
带宽消耗
gossip本身会有带宽消耗
官方建议集群最大在1000以内
Pub/Sub广播问题
加重带宽
集群间会频繁广播
集群倾斜
节点间数据量和请求量出现明显差异
数据倾斜
节点和槽分配严重不均
不同槽对应键数量差异过大
集合对象包含大量元素
内存相关配置不一致
不同槽对应键数量差异过大
集合对象包含大量元素
内存相关配置不一致
请求倾斜
合理设计键
不要使用热键作为hash_tag
客户端可使用本地缓存减少热键调用
不要使用热键作为hash_tag
客户端可使用本地缓存减少热键调用
集群读写分离
只读连接
从节点不接收任何读写请求
readonly开启读
读写分离
手动故障转移
数据迁移
redis-trib.rb的import功能
缓存设计
缓存的收益
加速读写
降低后端负载
缓存的成本
数据不一致性
代码维护成本
运维成本
缓存使用场景
开销大的复杂计算
加速请求响应
缓存更新策略
LRU LFU FIFO算法剔除
使用场景:量超过预值,对值进行剔除
一致性:开发人员没办法控制
维护成本:开发不需要实现算法,只需要配置策略
超时剔除
使用场景:设置过期时间,到时间之后自动删除
一致性:一定时间窗口内数据不一致
维护成本:不高,只需设置expire过期时间
主动更新
使用场景:真实数据更新之后立刻更新缓存数据
一致性:最高,建议结合超时剔除一起使用
维护成本:比较高
最佳实践
低一致性业务:配置最大内存和淘汰策略
高一致性业务:超时剔除和主动更新
缓存粒度控制
通用性
缓存全部数据:高
缓存部分数据:低
空间占用
全部数据造成内存浪费
网络开销大,耗时大
系列化和反序列化的CPU开销大
缓存全部数据:大
缓存部分数据:小
代码维护
缓存全部数据:简单
缓存部分数据:较为复杂
穿透优化
过程分析
缓存层不命中
存储层不命中,不将空结果写回缓存
返回空结果
缓存空对象
存储层不命中缓存空对象
布隆过滤器拦截
判断用户是否存在,不存在就不访问数据
无底洞优化
问题分析
客户端批量操作涉及多次网络开销,节点越多,耗时增大
网络连接数变多,对节点性能有影响
常见IO优化思路
命令本身优化
减少网络通信次数
降低接入成本
串行命令
逐次执行n个get命令+n次网络请求
网络IO:O(keys)
串行IO
使用mget或者Pipeline命令,node次网络时间+n次命令时间
网络IO:O(nodes)
并行IO
对串行IO中的第二步使用多线程
网络IO:O(max_slow(nodes))
hash_tag实现
多个key强制分配到一个节点,1次网络时间+n次命令时间
网络IO:O(1)
雪崩优化
保证缓存层高可用
对后端限流并降级
提前演练
热点key重建优化
存在问题
key为热点key,并发很大
重建缓存需要很长时间
互斥锁
允许一个线程重建缓存,其他线程等待该线程执行完在去获取缓存
永远不过期
没有设置过期时间
存在逻辑过期时间,使用单独的线程重建缓存
开发运维的“陷阱”
linux配置优化
内存分配控制
vm.overcommit_memory=1
获取:cat /proc/sys/vm/overcommit_memory
设置:
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1
最佳实践
设置合理maxmemory,保证机器有20%-30%闲置内存
集中化管理AOF重写和RDB的bgsave
vm.overcommit_memory=1,防止不能fork
swappiness
内存不足时,将一部分内页进行swap操作,已解燃眉之急
不同操作系统值不一样
值越低:表示操作系统更加倾向于使用物理内存
值越高:表示使用swap概率越高
设置:
echo {bestvalue} > /proc/sys/vm/swappiness
echo vm.swappiness={bestvalue} >> /etc/sysctl.conf
echo {bestvalue} > /proc/sys/vm/swappiness
echo vm.swappiness={bestvalue} >> /etc/sysctl.conf
如何监控swap
free -m
vmstat 1
cat /proc/{pid}/smaps
THP-Transparent Huge Pages
建议redis中关闭该配置
OOM killer
权值越高被杀掉的概率越高
降低该值,可以有效防止被杀掉
NTP-Network Time Protocol
保证不同机器时间一致性的服务
ulimit
查看当前用户进程资源数
ulimit -a
TCP backlog
默认为511
查看:cat /proc/sys/net/core/somaxconn
设置:echo 511 > /proc/sys/net/core/somaxconn
flushall/flushdb误操作
缓存与存储
缓存可以从数据库中再次获取
作为存储影响就比较大
借助AOF机制恢复
去掉flushall命令
调大AOF重写参数
RDB恢复
没有开启也没有执行save,bgsave命令,那么就没有数据被保存
开启了,可能数据有延迟
优先选择AOF来恢复数据
从节点数据也被清除
快速恢复数据
1、防止AOF重写
config set auto-aof-rewrite-percentage 1000
config set auto-aof-rewrite-min-size 1000000000000
config set auto-aof-rewrite-percentage 1000
config set auto-aof-rewrite-min-size 1000000000000
2、去掉文件中的flush相关命令
3、重启主节点服务
安全的redis
被攻击redis特点
redis所在机器有外网ip
端口为6379并对外网开放
以root用户启动
没有设置密码
bind设置为0.0.0.0或者""
redis密码机制
简单密码机制
运维建议
密码必须足够复杂
从节点也需要配置密码
auth是明文传输,也需要注意
伪装危险命令
rename-command
对危险的命令进行重命名
导致一些功能失败
AOF和RDB包含这些命令导致其他redis启动失败
最佳实践
对危险命令一律使用
第一次启动就配置
一定要保持主从配置一致性
防火墙
限制ip输入和输出
bind
redis和哪个网卡进行绑定
建议
建议使用内网ip
redis与客户端在一台机器上,可以使用回环地址
不支持config set 建议第一次进行配置
定期备份数据
不使用默认端口
减少被发现的可能
使用非root启动
处理bigkey
key对应的value占用内存空间非常大
bigkey的危害
内存空间不均匀
超时阻塞
网络拥塞
如何发现
redis-cli --bigkeys
被动收集
主动检测(推荐)
如何删除
删除会阻塞redis
string:使用del不会阻塞
hash\list\set\sorted set
hscan获取部分数据
hdel删除每个属性
最佳实践
使用监控系统监控bigkey
设计的时候需要注意数据量
寻找热点key
对发现热点key对整体系统都比较重要
客户端
维护一份key的调用次数
不知道有多少key,存在内存泄漏风险
有侵入性
无法做到通用
代理端
Twemproxy、Codis可以用来做统计
不通用,不是所有架构都会有代理层
redis服务端
monitor命令来统计热点key
redis-faina
存在影响性能的风险
只能统计一个redis的热点key,对于集群需要做汇总
机器
对所有redis端口的TCP数据包进行抓取完成热点key的统计
需要开发成本,开源:ELK的packetbeat插件
需要了解集群需要做汇总
无侵入性
解决方案
拆分复杂数据结构
迁移热点key
本地缓存加通知机制
redis监控运维云平台CacheCloud
CacheCloud是什么
现有问题
部署成本
实例碎片化
监控、统计和管理不完善
运维、经济成本
CacheCloud基本功能
监控统计
一键开启
Failover
可伸缩性
方便的客户端
元数据管理
流程化
一键导入
迁移数据
快速部署
环境要求
JDK7+
Maven3
MySQL5.5+
redis 2.8+
机器部署
使用SSH协议与redis所在机器进行交互
部署脚本
创建SSH用户
创建CacheCloud相关目录
安装最新的release版本的redis
执行脚本
sh cachecloud-init.sh {ssh_name}
添加机器
修改机器相关的系统配置
添加配置
机器信息收集
接入应用
加入机器后可以利用自动化部署功能来部署redis应用
总体流程
申请账户
创建应用
接入应用
账户申请和审批
应用申请和审批
客户端接入
REST接口
Java客户端
用户功能
应用统计信息
全局信息
命令统计
统计报表
实例列表
运行状态
内存使用情况
对象数
连接数
命中率
碎片化
角色
应用详情
应用详情
用户管理
应用报警配置
命令曲线
命令调用总次数倒排序
慢查询
每个节点近2天的慢查询
应用拓扑
redis所有机器的拓扑信息
运维功能
应用运维
应用上下线
Redis Sentinel运维
Redis Cluster运维
配置管理
垂直扩容和水平扩容
接入已存在的redis
管理员用户命令下拉菜单中导入应用链接
填写导入应用表单
redis配置模板
对每次开启的reids添加配置模板
迁移工具
可以对AOF、RDB等文件进行数据迁移
redis-migrate-tool
监控报警
报警功能
应用申请和审批
配置申请和审批
扩容申请和审批
用户注册和审批
应用日报、异常统计
redis实例心跳
应用内存、连接数阈值
机器性能阈值
配置申请和审批
扩容申请和审批
用户注册和审批
应用日报、异常统计
redis实例心跳
应用内存、连接数阈值
机器性能阈值
监控报警
应用日报
异常统计报警
redis实例心跳
应用内存和客户端连接数
机器性能报警
系统配置管理
机器相关
ssh用户名
ssh密码
ssh端口
CacheCloud根目录
ssh密码
ssh端口
CacheCloud根目录
登录
admin用户名
admin密码
超级管理员组
admin密码
超级管理员组
机器报警
cpu报警阈值
内存报警阈值
负载报警阈值
内存报警阈值
负载报警阈值
管理员报警和接口
管理员邮件列表
管理员手机列表
邮件报警接口
短信报警接口
管理员手机列表
邮件报警接口
短信报警接口
客户端版本
可用客户端版本
警告客户端版本
不可用客户端版本
警告客户端版本
不可用客户端版本
登录相关
用户登录状态保存方式
cookie登录方式所需要的域名
LDAP接口地址
cookie登录方式所需要的域名
LDAP接口地址
其他
应用连接数报警阈值
redis-migrate-tool安装路径
文档地址
Maven仓库地址
appkey密码基准key
redis-migrate-tool安装路径
文档地址
Maven仓库地址
appkey密码基准key
客户端上报
客户端的耗时、值范围、异常
redis配置统计字典
info系统状态说明
info
info all
info section 如info memory
info all
info section 如info memory
section可选值
server:服务器信息
clients:客户端信息
memory:内存信息
persistence:持久化信息
stats:全局统计信息
replication:复制信息
cpu:CPU消耗信息
commandstats:命令统计信息
cluster:集群信息
keyspace:数据库键统计信息
clients:客户端信息
memory:内存信息
persistence:持久化信息
stats:全局统计信息
replication:复制信息
cpu:CPU消耗信息
commandstats:命令统计信息
cluster:集群信息
keyspace:数据库键统计信息
standalone配置说明和分析
总体配置
daemonize 是否是守护进程
port 端口号
loglevel 日志级别
logfile 日志文件名
databases 可用的数据库数
unixsocket unix套接字
unixsocketperm unix套接字权限
pidfile redis运行的进程pid文件
lua-time-limit lua脚本超时时间
tcp-backlog tcp-backlog
watchdog-period 用户诊断redis的延迟问题
activerahashing 指定是否激活重置哈希
dir 工作目录
port 端口号
loglevel 日志级别
logfile 日志文件名
databases 可用的数据库数
unixsocket unix套接字
unixsocketperm unix套接字权限
pidfile redis运行的进程pid文件
lua-time-limit lua脚本超时时间
tcp-backlog tcp-backlog
watchdog-period 用户诊断redis的延迟问题
activerahashing 指定是否激活重置哈希
dir 工作目录
最大内存及策略
maxmemory 最大可用内存
maxmemory-policy 内存不够时,淘汰策略
maxmemory-samples 检测LRU采样数
maxmemory-policy 内存不够时,淘汰策略
maxmemory-samples 检测LRU采样数
AOF相关配置
appendonly 是否开启AOF持久化模式
appendfsync AOF同步磁盘频率
appendfilename AOF文件名
aof-load-truncated 加载AOF文件时是否忽略文件不完整的情况
no-appendfsync-on-rewrite 设置为yes表示rewrite期间对新写操作不fsync,暂时存在缓冲区中,等rewrite完成后再写入
auto-aof-rewrite-min-size 触发rewrite的AOF文件最小阈值(单位:兆)
auto-aof-rewrite-percentage 触发rewrite的AOF文件的增长比例条件
aof-rewrite-incremen-tal-fsync AOF重写过程中,是否采取增量文件同步策略
appendfsync AOF同步磁盘频率
appendfilename AOF文件名
aof-load-truncated 加载AOF文件时是否忽略文件不完整的情况
no-appendfsync-on-rewrite 设置为yes表示rewrite期间对新写操作不fsync,暂时存在缓冲区中,等rewrite完成后再写入
auto-aof-rewrite-min-size 触发rewrite的AOF文件最小阈值(单位:兆)
auto-aof-rewrite-percentage 触发rewrite的AOF文件的增长比例条件
aof-rewrite-incremen-tal-fsync AOF重写过程中,是否采取增量文件同步策略
RDB相关配置
save RDB保存条件
dbfilename RDB文件名
rdbcompression RDB文件是否压缩
rdbchecksum RDB文件是否使用校验和
stop-writes-on-bgsave-error bgsave执行错误,是否停止redis接受写请求
dbfilename RDB文件名
rdbcompression RDB文件是否压缩
rdbchecksum RDB文件是否使用校验和
stop-writes-on-bgsave-error bgsave执行错误,是否停止redis接受写请求
慢查询配置
slowlog-log-slower-than 慢查询被记录的阈值(单位微妙)
slowlog-max-len 最多纪录慢查询的条数
latency-monitor-threshold redis服务内存延迟监控
slowlog-max-len 最多纪录慢查询的条数
latency-monitor-threshold redis服务内存延迟监控
数据结构优化配置
hash-max-ziplist-entries hash数据结构优化参数
hash-max-ziplist-value hash数据结构优化参数
list-max-ziplist-entries list数据结构优化参数
list-max-ziplist-value list数据结构优化参数
set-max-intset-entries set数据结构优化参数
zset-max-ziplist-entries zset数据结构优化参数
zset-max-ziplist-value zset数据结构优化参数
hll-sparse-max-bytes HyperLogLog数据结构优化参数
hash-max-ziplist-value hash数据结构优化参数
list-max-ziplist-entries list数据结构优化参数
list-max-ziplist-value list数据结构优化参数
set-max-intset-entries set数据结构优化参数
zset-max-ziplist-entries zset数据结构优化参数
zset-max-ziplist-value zset数据结构优化参数
hll-sparse-max-bytes HyperLogLog数据结构优化参数
复制相关配置
slaveof 指定当前从节点复制哪个主节点
repl-ping-slave-period 主节点定期向从节点发送ping命令的周期,用于判断从节点是否存活,单位秒
repl-timeout 主从节点复制超时时间,单位秒
repl-backlog-size 复制积压缓冲区大小
repl-backlog-ttl 主节点在没有从节点的情况下多长时间后释放复制积压缓存区空间
slave-priority 从节点的优先级
min-slaves-to-write、min-slaves-max-lag 当主节点发现从节点数量小于min-slaves-to-write且延迟小于等于min-slaves-max-lag时,master停止写入操作
slave-serve-stale-data 从节点与主节点连接中断时,如果为yes,从节点可以继续处理客户端的请求,否则拒绝所有请求,除了info、slaveof命令
slave-read-only 从节点是否开启只读模式,集群架构下从节点默认读写都不可用,需要调用readonly命令开启只读模式
repl-disable-tcp-nodelay 是否开启主从复制socket的NO_DELAY选项
repl-diskless-sync 是否开启无盘复制
repl-diskless-sync-delay 开启无盘复制后,需要延迟多少秒后进行创建RDB操作
repl-ping-slave-period 主节点定期向从节点发送ping命令的周期,用于判断从节点是否存活,单位秒
repl-timeout 主从节点复制超时时间,单位秒
repl-backlog-size 复制积压缓冲区大小
repl-backlog-ttl 主节点在没有从节点的情况下多长时间后释放复制积压缓存区空间
slave-priority 从节点的优先级
min-slaves-to-write、min-slaves-max-lag 当主节点发现从节点数量小于min-slaves-to-write且延迟小于等于min-slaves-max-lag时,master停止写入操作
slave-serve-stale-data 从节点与主节点连接中断时,如果为yes,从节点可以继续处理客户端的请求,否则拒绝所有请求,除了info、slaveof命令
slave-read-only 从节点是否开启只读模式,集群架构下从节点默认读写都不可用,需要调用readonly命令开启只读模式
repl-disable-tcp-nodelay 是否开启主从复制socket的NO_DELAY选项
repl-diskless-sync 是否开启无盘复制
repl-diskless-sync-delay 开启无盘复制后,需要延迟多少秒后进行创建RDB操作
客户端相关配置
maxclients 最大客户端连接数
client-output-buffer-limit 客户端输出缓冲区限制
timeout 客户端闲置多少秒后关闭连接 ,单位秒
tcp-keepalive 检测TCP连接活性的周期,单位秒
client-output-buffer-limit 客户端输出缓冲区限制
timeout 客户端闲置多少秒后关闭连接 ,单位秒
tcp-keepalive 检测TCP连接活性的周期,单位秒
安全相关配置
requirepass 密码
bind 绑定ip
masterauth 从节点需要配置的主节点密码
bind 绑定ip
masterauth 从节点需要配置的主节点密码
sentinel配置说明和分析
sentinel monitor 定义监控的主节点名、ip、port、主观下线票数
sentinel down-after-milliseconds sentinel判定节点不可达的毫秒数
sentinel parallel-syncs 在执行故障转移时,最多有多少个从服务器同时对新的主服务器进行
sentinel failover-timeout 故障转移超时时间
sentinel auth-pass 主节点密码
sentinel notifi-cation-script <script-path>故障转移期间脚本通知
sentinel client-reconfig-script <script-path> 故障转移成功后脚本通知
sentinel down-after-milliseconds
sentinel parallel-syncs
sentinel failover-timeout
sentinel auth-pass
sentinel notifi-cation-script
sentinel client-reconfig-script
cluster配置说明和分析
cluster-node-timeout集群节点超时时间,单位毫秒
cluster-migration-barrier主从节点切换需要从节点数最小个数
cluster-slave-validity-factor从节点有效性判定因子,当从节点与主节点最后通信时间超过(cluster-node-timeout*slave-validity-factor)+repl-ping-slave-period时,对应从节点不具备故障转移资格
cluster-require-full-coverage集群是否需要所有的slot都分配给在线节点,才能正常访问
cluster-enabled是否开启集群模式
cluster-config-file 集群配置文件名称
cluster-migration-barrier主从节点切换需要从节点数最小个数
cluster-slave-validity-factor从节点有效性判定因子,当从节点与主节点最后通信时间超过(cluster-node-timeout*slave-validity-factor)+repl-ping-slave-period时,对应从节点不具备故障转移资格
cluster-require-full-coverage集群是否需要所有的slot都分配给在线节点,才能正常访问
cluster-enabled是否开启集群模式
cluster-config-file 集群配置文件名称
更多文章:地址
0 条评论
下一页