您的位置:首页 > 数据库 > Redis

redis实战-数据安全与性能保障

2017-03-12 19:45 1171 查看

持久化

数据存储于硬盘

主从:通过从服务器保存和持久化,如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
4000
上次保存时间
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]关闭是否保存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis 性能 数据安全