持久化
数据存储于硬盘
主从:通过从服务器保存和持久化,如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]
注意:如果没有达到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
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
主从复制情况
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
持久化信息
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耗时
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]关闭是否保存。