redis相关(搭建和数据落盘)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis相关(搭建和数据落盘)相关的知识,希望对你有一定的参考价值。
一、 redis的编译安装
1、依赖的系统包
yum install -y wget gcc make tcl
2、下载包地址
1、各个版本redis的下载地址
http://download.redis.io/releases/
2、本文安装最新版本4.0.9
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
3、编译安装
1、解压:tar xf redis-4.0.9.tar.gz && cd redis-4.0.9
2、编译:make
3、编译测试:make test
4、安装:make PREFIX=/usr/local/redis install
5、拷贝配置文件到配置文件夹:mkdir /usr/local/redis/etc && cp redis-4.0.9/redis.conf /usr/local/redis/etc/
?
二、 redis的配置参数
必要的参数设置
将“daemonize”属性设置为“yes”,表示我们会以后台进程形式启动Redis服务;
将“port”属性设置为指定的端口,这里默认为“6379”;
将“logfile”属性设置为指定的日志路径;
将“dir”设置为指定的工作目录
将“requirepass”设定为本机连接的密码
其余的属性可以保持默认。
其他参数设置
bind:指定redis只接收来自该IP的请求,如果不设置,那么将处理所有请求,在生产环节中最好设置该项
protected-mode:保护模式,默认是开启状态,只允许本地客户端连接, 可以设置密码或添加bind来连接
port:指定 redis 运行的端口,默认是 6379
tcp-backlog:TCP监听的最大容纳数量,在高并发的环境下,你需要把这个值调高以避免客户端连接缓慢的问题。Linux 内核会把这个值缩小成 /proc/sys/net/core/somaxconn对应的值,要提升并发量需要修改这两个值才能达到目的;默认是511
timeout:指定在一个 client 空闲多少秒之后关闭连接(0表示永不关闭)
tcp-keepalive:单位是秒,表示将周期性的使用SO_KEEPALIVE检测客户端是否还处于健康状态,避免服务器一直阻塞,官方给出的建议值是300s,如果设置为0,则不会周期性的检测
daemonize:默认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 yes。当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面
supervised:可以通过upstart和systemd管理Redis守护进程,默认为no,没有启动互动
supervised no - 没有监督互动
supervised upstart - 通过将Redis置于SIGSTOP模式来启动信号
supervised systemd - signal systemd将READY = 1写入$ NOTIFY_SOCKET
supervised auto - 检测upstart或systemd方法基于 UPSTART_JOB或NOTIFY_SOCKET环境变量
pidfile:配置PID文件路径,当redis作为守护进程运行的时候,它会把 pid 默认写到 /var/redis/run/redis_6379.pid 文件里面
loglevel:定义日志级别,可以是下面的这些值:
debug(记录大量日志信息,适用于开发、测试阶段)
verbose(较多日志信息)
notice(适量日志信息,使用于生产环境)
warning(仅有部分重要、关键信息才会被记录)
logfile:日志文件的位置
syslog-enabled:要想把日志记录到系统日志,就把它改成 yes,也可以可选择性的更新其他的syslog 参数以达到你的要求
syslog-ident:设置系统日志的ID
syslog-facility:指定系统日志设置,必须是 USER 或者是 LOCAL0-LOCAL7 之间的值
databases:设置数据库的数目。默认的数据库是DB 0 ,可以在每个连接上使用select <dbid> 命令选择一个不同的数据库,dbid是一个介于0到databases - 1 之间的数值
always-show-logo:redis启动时是否显示login
save <间隔时间(秒)> <写入次数>:根据给定的时间间隔和写入次数将数据保存到磁盘
save 900 1:900 秒内如果至少有 1 个 key 的值变化,则保存
save 300 10:300 秒内如果至少有 10 个 key 的值变化,则保存
save 60 10000:60 秒内如果至少有 10000 个 key 的值变化,则保存
stop-writes-on-bgsave-error:如果用户开启了RDB快照功能,那么在redis持久化数据到磁盘时如果出现失败,默认情况下,redis会停止接受所有的写请求
rdbcompression:对于存储到磁盘中的快照,可以设置是否进行压缩存储,如果是的话,redis会采用LZF算法进行压缩
rdbchecksum:在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能
dbfilename:设置快照的文件名
dir:设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名
requirepass:本机连接的密码
slaveof <masterip> <masterport>:主从复制,使用 slaveof 来让一个 redis 实例成为另一个reids 实例的副本,默认关闭
masterauth <master-password>:如果 master 需要密码认证,就在这里设置,默认不设置
slave-serve-stale-data:当一个 slave 与 master 失去联系,或者复制正在进行的时候,slave 可能会有两种表现
1) 如果为 yes ,slave 仍然会应答客户端请求,但返回的数据可能是过时,或者数据可能是空的在第一次同步的时候
2) 如果为 no ,在你执行除了 info he salveof 之外的其他命令时,slave 都将返回一个 "SYNC with master in progress" 的错误
slave-read-only:你可以配置一个 slave 实体是否接受写入操作
appendonly: 默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入appendonly.aof文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件
appendfilename:aof文件名
appendfsync:aof持久化策略的配置
appendfsync always,表示每次写入都执行fsync,以保证数据同步到磁盘
appendfsync everysec,表示每秒执行一次fsync,可能会导致丢失这1s数据
appendfsync no,表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快
no-appendfsync-on-rewrite:指定是否在后台aof文件rewrite期间调用fsync,默认为no,表示要调用fsync(无论后台是否有子进程在刷盘);Redis在后台写RDB文件或重写afo文件期间会存在大量磁盘IO,此时,在某些linux系统中,调用fsync可能会阻塞
auto-aof-rewrite-percentage:指定redis重写aof文件的条件,默认为100,表示与上次rewrite的aof文件大小相比,当前aof文件增长量超过上次afo文件大小的100%时,就会触发background rewrite。若配置为0,则会禁用自动rewrite
auto-aof-rewrite-min-size:指定触发rewrite的aof文件大小。若aof文件小于该值,即使当前文件的增量比例达到auto-aof-rewrite-percentage的配置值,也不会触发自动rewrite。即这两个配置项同时满足时,才会触发rewrite
aof-rewrite-incremental-fsync:aof rewrite过程中,是否采取增量文件同步策略,默认为“yes”。 rewrite过程中,每32M数据进行一次文件同步,这样可以减少aof大文件写入对磁盘的操作次数
slowlog-log-slower-than:slog log是用来记录redis运行中执行比较慢的命令耗时
?
三、 redis的单实例启动
启动
1、cd /usr/local/redis
2、./bin/redis-server ./etc/redis.conf
客户端命令行进入
1、cd /usr/local/redis
2、./bin/redis-cli -h 127.0.0.1 -p 6379 -a 123456
127.0.0.1:6379> set name ‘beijing‘
OK
127.0.0.1:6379> get name
"beijing"
关闭
1、cd /usr/local/redis
2、./bin/redis-cli -h 127.0.0.1 -p 6379 -a 123456 shutdown
?
四、 redis的主从配置启动
1、master,配置文件修改
port 6379
logfile "/data/redis/data6379/redis.log"
pidfile /var/run/redis_6379.pid
dir /data/redis/data6379
requirepass 123456
主redis一般配置为不使用RDB和AOF持久化到硬盘
#save 900 1
#save 300 10
#save 60 10000
appendonly no
2、slave,配置文件修改
port 6380
logfile "/data/redis/data6380/redis.log"
pidfile /var/run/redis_6380.pid
dir /data/redis/data6380
requirepass 123456
slaveof 127.0.0.1 6379
masterauth 123456
slave-read-only yes
从redis可以配置为RDB和AOF持久化到硬盘
save 900 1
save 300 10
save 60 10000
appendonly yes
3、启动master和slave
1、cd /usr/local/redis
2、./bin/redis-server ./etc/redis6379.conf
3、./bin/redis-server ./etc/redis6380.conf
4、验证主从写入数据同步
master
[[email protected] redis]# ./bin/redis-cli -h 127.0.0.1 -p 6379 -a 123456
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> set name "beijing"
OK
127.0.0.1:6379> get name
"beijing"
slave
[[email protected] redis]# ./bin/redis-cli -h 127.0.0.1 -p 6380 -a 123456
127.0.0.1:6380> get name
"beijing"
?
五、 数据落盘RDB和AOF的区别
RDB的回写方式
同步回写即SAVE命令,主进程直接向磁盘回写数据。在数据大的情况下会导致系统假死很长时间,所以一般不是推荐的
异步回写即BGSAVE命令,主进程fork后,复制自身并通过这个新的进程回写磁盘,回写结束后新进程自行关闭。由于这样做不需要主进程阻塞,系统不会假死
RDB的特点
* RDB就是Snapshot快照存储,是默认的持久化方式
* 可理解为半持久化模式,即按照一定的策略周期性的将数据保存到磁盘,save <间隔时间(秒)> <写入次数>:根据给定的时间间隔和写入次数将数据保存到磁盘
* 对应产生的数据文件为dump.rdb,通过配置文件中的save参数来定义快照的周期
* Redis的RDB文件不会坏掉,因为其写操作是在一个新进程中进行的
* 当生成一个新的RDB文件时,Redis生成的子进程会先将数据写到一个临时文件中,然后通过原子性rename系统调用将临时文件重命名为RDB文件,这样在任何时候出现故障,Redis的RDB文件都总是可用的
AOF的特点
* AOF(Append-Only File)比RDB方式有更好的持久化性
* 由于在使用AOF持久化方式时,Redis会将每一个收到的写命令都通过Write函数追加到文件中,类似于mysql的binlog
* 当Redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容
* 对应的设置参数为:
* appendonly yes,启用AOF持久化方式
* appendfilename appendonly.aof,AOF文件的名称,默认为appendonly.aof
* appendfsync always,每次收到写命令就立即强制写入磁盘,是最有保证的完全的持久化,但速度也是最慢的,一般不推荐使用
* appendfsync everysec,每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,是受推荐的方式
* appendfsync no,完全依赖OS的写入,一般为30秒左右一次,性能最好但是持久化最没有保证,不被推荐
* AOF的完全持久化方式同时也带来了另一个问题,持久化文件会变得越来越大,为了压缩AOF的持久化文件,Redis提供了bgrewriteaof命令,收到此命令后Redis将使用与快照类似的方式将内存中的数据以命令的方式保存到临时文件中,最后替换原来的文件,以此来实现控制AOF文件的增长
按照以下优先级进行数据的恢复
1、如果只配置AOF,重启时加载AOF文件恢复数据
2、如果同时配置了RDB和AOF,启动时只加载AOF文件恢复数据
3、如果只配置RDB,启动是将加载RDB文件恢复数据
(需要注意的为:使用AOF备份数据进行恢复数据时需要主库开启appendonly yes,才会恢复数据;使用RDB备份数据进行恢复数据时,不需要主库开启对应参数)
?
六、主库宕机后的处理
1、主库出现宕机
此处模拟主库宕机
1、cd /usr/local/redis
2、./bin/redis-cli -h 127.0.0.1 -p 6379 -a 123456 shutdown
2、将slave上的同步状态取消,避免主库在未完成数据恢复前就重启,进而直接覆盖掉从库上的数据,导致所有的数据丢失
127.0.0.1:6380> slaveof no one
3、拷贝从机数据到主机上
1、拷贝AOF数据用于恢复
cp data6380/appendonly.aof data6379/appendonly.aof
主库./etc/redis6379.conf开启appendonly yes
2、拷贝RDB数据用于恢复
127.0.0.1:6380> BGSAVE
cp data6380/dump.rdb data6379/dump.rdb
4、主库重新启动
1、cd /usr/local/redis
2、./bin/redis-server ./etc/redis6379.conf
5、重新进行主从同步的配置,这个时候就不用再指定密码了,有原始记录
127.0.0.1:6380> slaveof 127.0.0.1 6379
以上是关于redis相关(搭建和数据落盘)的主要内容,如果未能解决你的问题,请参考以下文章
spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段