配置
#是否在后台运行
daemonize yes
#pid文件路径
pidfile "/var/run/redis.pid"
#端口
port 26379
#密码
requirepass "pass"
#主(从)节点密码
masterauth "pass"
#
tcp-backlog 511
#客户端连接超时时间
timeout 0
#
tcp-keepalive 0
#log等级,生产环境建议notice
loglevel notice
#logfile路径
logfile "/data/redis/26379.log"
#数据库个数
databases 16
#redis进行数据库镜像的频率
#900秒内有1个key发生变化时(进行备份)
save 900 1
#300秒内有10个key发生变化时(进行备份)
save 300 10
#10000秒内有60个key发生变化时(进行备份)
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "26379.rdb"
#redis路径
dir "/data/redis/redis26379"
slave-serve-stale-data yes
#从库只读
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
#最大同时连接数
maxclients 10000
#redis能够使用的最大内存,当内存满了后,如果还收到set命令,redis将剔除设置过expire信息的key
maxmemory 1G
#最大内存淘汰策略
#volatile-lru:从已设置过期时间的内存数据集中挑选最近最少使用的数据 淘汰
#volatile-ttl: 从已设置过期时间的内存数据集中挑选即将过期的数据 淘汰
#volatile-random:从已设置过期时间的内存数据集中任意挑选数据 淘汰
#allkeys-lru:从内存数据集中挑选最近最少使用的数据 淘汰
#allkeys-random:从数据集中任意挑选数据 淘汰
#no-enviction(驱逐):禁止驱逐数据(默认)
maxmemory-policy volatile-lru
#开启appendonly后,redis会把接收到的每一次写操作都追加到appendonly.aof文件中
appendonly yes
#appendonly.aof的名字
appendfilename "26379.aof"
#同步频率,对写操作进行累积,每秒同步一次
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
#从库不需要密码就能访问
#protected-mode no
#redis-server只接收来自该IP的请求
bind 0.0.0.0
#bind 127.0.0.1
# Generated by CONFIG REWRITE
启动关闭
redis配置和log路径:/data/redis
redis安装路径:/opt/redis
redis启动: redis-server /data/redis/redis26379/26379.conf
redis端口:26379
redis登录:redis-cli -p 26379
127.0.0.1:26379> auth pass
密码:XXX
redis关闭:redis-cli -p 26379 -a pass shutdown(或者登录进redis进行shutdown)
修改最大内存
127.0.0.1:26379> config get maxmemory
1) "maxmemory"
2) "1000000000"
127.0.0.1:26379> config set maxmemory 1000MB
OK
127.0.0.1:26379> config get maxmemory
1) "maxmemory"
2) "1048576000"
Redis迁移和恢复
aof文件会持久化记录redis的所有操作,这一点类似MySQL的binlog,不过恢复过程比MySQL简单很多
eg.迁移
#将线上2.58的aof恢复到172.17.100.130和131的主从测试环境
1.拷贝2.58的aof文件到130和131并改成相应的aof文件名
2.关闭130和131的redis-server
3.改名备份130和131的aof文件
4.将新拷贝的aof文件替换原有的aof文件
5.用redis-check-aof --fix验证新的aof文件是否可用
#验证的结果显示这个aof是可用的
6.重新启动130和131,验证查询结果是否和2.58一致
eg.恢复
#模拟172.17.100.130主库灾难,用172.17.100.131进行恢复
1.清空130上面aof文件的内容
2.停止130和131的redis-server
3.单独启动130,发现aof文件被重建,内容丢失;进入redis刷新数据发现数据为空
4.直接复制131上的aof内容到130的aof里,执行验证
#验证结果显示不能直接复制内容进行恢复
5.拷贝131的aof文件到130,并更改对应文件名
#验证成功
阿里云Redis恢复到线下
阿里云会自动进行备份(手动备份的话,执行save命令即可生成dump.rdb)
线下的130同时开启了aof和rdb,如果直接恢复rdb的话,会因为aof没有同步而导致数据被重新覆盖掉
1.拷贝rdb备份到线下130服务器
2.关闭线下redis-server
3.修改配置文件,将appendonly值由yes改为no
4.将rdb备份拷贝到redis配置的位置,并修改成配置中对应的的dbfilename
5.将配置中的appendonly由yes改为no
6.启动redis,确认数据已经正常恢复
7.热修改appendonly为yes
config set appendonly yes
8.关闭redis,并将配置中的appendonly由no改为yes
9.重启redis,验证数据
#对比一下不执行热修改config set appendonly yes和执行热修改之后aof文件的变化
主从数据不同步
完成线上数据恢复到线下之后,检查线下主库数据已经恢复,但是从库数据却迟迟无法自动同步,难道需要把rdb也放到从库上去执行一遍?
登录redis检查主从库状态分别如上下2图
info replication
首先检查bind,并未设置成127.0.0.1
检查主从库的防火墙,发现主库防火墙里面的26379消失了,回想起来可能是之前改了之后并未执行保存
将26379加入主库防火墙后,问题解决
信息显示如下
检查从库key值已经完全同步
Redis性能测试
使用自带的benchmark对Redis进行测试
参数
-c:并发数
-n:指定请求数
-q:只看最终结果(不写该参数,可以看到详细内容)
对比一下我虚拟机172.17.100.130的redis主从和阿里云搭的2.58的redis主从的性能差异
/opt/redis/src/redis-benchmark -h IP -p 端口 -c 1000 -n 100000 -q
图1是1核1G的虚拟机,图2是2核8G的阿里云ECS,怎么感觉虚拟机好像赢了...