持久化
数据存储于硬盘
主从:通过从服务器保存和持久化,如monogodb的replication set配置
日志:操作生成日志并通过日志来恢复数据,mysql的主从复制
将内存中的数据存储到硬盘主要是为了之后重用数据,或者为了防止系统故障而将数据备份到远程位置,
RDB快照持久化
快照持久化:将存在某一时刻的所有数据写入硬盘里面。可以做数据备份,拷贝到其他服务器上可以达到数据同步。快照写入dbfilename filename
dir 指定AOF和rdb公用的目录。
持久化选项:
每隔几分钟几次进行操作,
save 60 1000
在写入rdb文件的时候发生错误就停止写入,比如磁盘写满导致写入错误。
stop-writes-on-bgsave-error no
是否进行压缩
rdbcompression yes
rdb保存的文件
dbfilename dump.rdb
存放rdb的目录
dir ./
存储和加载RDB文件时候校验。
rdbchecksum yes
写入RDB文件的条件,如果满足条件进行写入RDB文件。可以将写入条件注释掉,RDB就禁止写入
save 900 1如果在900s有一个change时写入rdb
save 300 10如果在300s有10个change是写入rdb
save 60 10000 如果在60s有10000个change时写入rdb
RDB导出原理:
主进程:redis-server处理客户端请求,在rdb进行导出的时候同时redis-server还能响应客户端请求。
bgsave子进程:rdb导出进程,bgsave进程进行导出,主进程开辟一个子进程。
save命令阻塞redis服务器进程,直到RDB文件创建完毕,在阻塞期间不接受任何请求。
RDB文件载入工作是在服务器启动的时候自动执行的,没有专门的用于载入RDB文件的命令。
执行10000条命令
[root@localhost bin]# ./redis-benchmark -n 10000
注意:如果没有达到RDB保存条件,断电就会导致部分数据来不及存储到RDB文件中。这个在商业系统中是不能出现的,新增一个AOF来进行弥补
个人开发注意点:
把开发环境的设置尽量贴近生产环境,有助于判断快照是否生成得过于频繁或者稀少。
(频繁浪费资源,稀少可能导致数据大量丢失)
根据实际情况来设置save保存条件。
大数据时注意的点
AOF日志持久性
AOF:append only file追加到文件,通过保存redis服务器所执行的写命令来记录数据库状态。会影响一定效率的redis请求。这个根据实际应用场景来决定是否开启。
相关命令:
appendonly no是否打开AOF日志功能
appendfilename /var/rdb/appendonly.aof指定aof存放路径文件名。
appendfsync always 每一个命令立即同步到aof,安全,但是速度慢。
appendfsync everysec 折中方案,每秒写一次。
appendfsync no写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof同步频率低,速度快。
no-appendfsync-on-rewrite yes正在导出rdb快照的过程中,要不要停止同步aof,如果选择停止AOF,避免I/O频繁操作。
如果暂停aof,所有的操作会缓存在内存队列里面,dump完成后,统一写入aof。
auto-aof-rewrite-percentage 100 aof文件大小比起上次重写时的大小,增长率100%时候,重写。
auto-aof-rewrite-min-size 64mb aof文件至少超过64M时候,重写。
持久化注意点
恢复rdb和AOF,rdb恢复的是比较快的。rdb数据是内存的映射直接载入内存比较快。
AOF使用的是命令,需要时间。
如果aof和rdb同时存在的话,会使用aof进行恢复。
redis主从复制
单点故障的防护,搭建集群,主从备份,防止主机宕机。读写分离,分担主服务器的压力,任务分类,如让从服务器分别分担备份工作与计算工作。
星型结构
master---->slave1
|
|
slave2
线型结构
master---->slave1----->slave2
主从通讯过程
1、slave主动发起请求建立连接master
2、master直接dump rdb文件传输给slave,同时缓存aof
3、等slave恢复完rdb文件的时候,master便发送缓存的aof给slave使得数据达到同步。
4、replicationfeedslaves,master一旦发生变动就通知slave。
实验配置过程
在同一台服务器上配置不同的端口运行三个redis服务器,并配置不一样的配置启动文件。采用实验结构星型结构,服务器6379作为master
1、配置从服务器: 跑在6380端口
复制配置文件,修改配置端口信息
[root@localhost bin]# ls
redis6381.conf redis6380.conf redis.conf
修改从服务器配置文件:
[root@localhost bin]# vi redis6380.conf
修改端口
port 6380
修改pid,进程文件。
pidfile /var/run/redis_6380.pid
开启rdb,直接在从服务器上进行rdb备份,主服务器就关闭rdb
dbfilename dump6380.rdb
设置slave:
设置主机的IP地址和端口
slaveof 127.0.0.1 6379
配置另一台从服务器6381
关闭rdb,注释save
关闭aof,appendonley no
注意:主服务器可以关闭RDB快照,开启aof,备份工作可以交给slave从服务器。分担主服务器压力
从服务器配置连接主服务器密码:masterauth password配置主服务器的密码。
配置主服务器密码:
requirepass password设置主服务器密码
客户端进去需要进行auth password进行连接。
缺陷:
如果每次slave断开后,无论是主动断开还是网络故障,
再连接master,都要master全部dump出来RDB,再AOF,即同步的过程都要执行一遍。
所以要记住,多台slave不要一下子启动起来,会使得主服务器I/O飙升。甚至宕机。
运维相关命令
TIME 查看时间戳与微秒数
DBSIZE 查看当前库中的key数量
BGREWRITEAOF 后台进程重写AOF
BGSAVE 后台保存rdb快照
SAVE 保存rdb快照
LASTSAVE 上次保存时间
SLAVEOF 设为slave服务器
FLUSHALL 清空所有db
FLUSHDB 清空当前db
SHUTDOWN[""|save|nosave] 断开连接,关闭服务器
SLOWLOG 显示慢查询
INFO 显示服务器信息
CONFIG GET 获取配置信息
CONFIG SET 设置配置信息
MONITOR 打开控制台
SYNC 主从同步
CLIENT LIST 客户端列表
CLIENT KILL 关闭某个客户端
CLIENT SETNAME 为客户端设置名字
CLIENT GETNAME 获取客户端名字
time 查看时间戳与微秒数
127.0.0.1:6379> time
1) "1489301930"
2) "878970"
dbsize查看当前数据库中的key数量。
127.0.0.1:6379> dbsize
(integer) 1
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> dbsize
(integer) 0
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> dbsize
(integer) 1
bgrewriteaof后台重写aof,后台重写aof
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started
BGSAVE 子进程,后台保存rdb快照
SAVE 当前进程,阻塞型保存rdb快照
127.0.0.1:6379> bgsave
Background saving started
127.0.0.1:6379> save
OK
查看上次保留时间lastsave如果redis崩溃,可以查看上次保存时间。
7.0.0.1:6379> lastsave
(integer) 1489302208
FLUSHALL 清空所有db
FLUSHDB 清空当前db
从服务器不允许使用清空数据。设置slave-read-only从服务器只读
127.0.0.1:6381> flushall
(error) READONLY You can't write against a read only slave.
info返回redis服务器信息
info memory / info cpu / info stat
# Memory
used_memory:842456
used_memory_human:822.71K
used_memory_rss:7852032
used_memory_rss_human:7.49M
used_memory_peak:842456
used_memory_peak_human:822.71K
total_system_memory:1912483840
total_system_memory_human:1.78G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:9.32
mem_allocator:jemalloc-4.0.3
主从复制情况
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=1448,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=1448,lag=1
master_repl_offset:1448
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:1447
持久化信息
# Persistence
loading:0
rdb_changes_since_last_save:3
rdb_bgsave_in_progress:0
rdb_last_save_time:1489302208
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:1
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:0
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
....
fork耗时
# Stats
total_connections_received:3
total_commands_processed:1920
instantaneous_ops_per_sec:1
total_net_input_bytes:69245
total_net_output_bytes:6111955
instantaneous_input_kbps:0.07
.....
查看reids.config的配置文件中的参数信息。
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""
127.0.0.1:6379> config get save
1) "save"
2) ""
127.0.0.1:6379> config get appendonly
1) "appendonly"
2) "yes"
查看慢日志设置情况。
127.0.0.1:6379> config get slowlog-log-slower-than
1) "slowlog-log-slower-than"
2) "10000"
config set 参数名 参数值,用来设置redis的配置参数值。
127.0.0.1:6379> config set slowlog-log-slower-than 100
OK
127.0.0.1:6379> config get slowlog-max-len
1) "slowlog-max-len"
2) "128"
slowlog get N查看获取慢日志。
shutdown [save/nosave]关闭是否保存。