redis持久化部署
redis持久化部署
Redis简介
软件说明
Redis是一款开源的,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品。 Redis采用内存(In-Memory)数据集(DataSet) 。 支持多种数据类型。 运行于大多数POSIX系统,如Linux、*BSD、OS X等。
软件特性
1)透明性:分布式系统对用户来说是透明的,一个分布式系统在用户面前的表现就像一个传统的单处理机分时系统,可让用户不必了解内部结构就可以使用。
2)扩展性:分布式系统的最大特点就是可扩展性,他可以根据需求的增加而扩展,可以通过横向扩展使集群的整体性能得到线性提升,也可以通过纵向扩展单台服务器的性能使服务器集群的性能得到提升。
3)可靠性:分布式系统不允许单点失效的问题存在,它的基本思想是:如果一台服务器坏了,其他服务器接替它的工作,具有持续服务的特性。
4)高性能:高性能是人们设计分布式系统的一个初衷,如果建立了一个透明,灵活,可靠的分布式系统,但他运行起来像蜗牛一样慢,那这个系统就是失败的。
相关站点
软件功能
1)高速读写
2)数据类型丰富
3)支持持久化
4)多种内存分配及回收策略
5)支持事物
6)消息队列、消息订阅
7)支持高可用
8)支持分布式分片集群
缓存数据库
- Redis
- ETCD
- MongoDB
- Memcache
- Tair
1.Memcached:多核的缓存服务,更加适合于多用户并发访问次数(访问次数较少的应用场景)。
2.Redis:单核缓存服务,在单节点情况下,更加适合少量用户,多次访问的应用场景。
redis一般在企业中,是单机多实例架构
Redis安装
- yum安装
- 源码安装
# 1.下载Redis
[root@db01 ~]# wget https://download.redis.io/redis-stable.tar.gz
# 2.解压
[root@db01 ~]# tar xf redis-stable.tar.gz
# 3.编译
[root@db01 redis-stable]# make
# 4.安装
[root@db01 redis-stable]# make install
# 5.查看版本
[root@db01 redis-stable]# redis-server --version
# 6.启动Redis服务
[root@db01 redis-stable]# redis-server &
# 7.检查端口
[root@db01 redis-stable]# netstat -lntup|grep 6379
# 8.连接Redis
[root@db01 ~]# redis-cli
# 9.退出Redis终端
[root@db01 ~]# redis-cli
127.0.0.1:6379> exit
[root@db01 ~]# redis-cli
127.0.0.1:6379> quit
# 10.查看进程
[root@db01 ~]# ps -ef|grep redis
# 11.停止Redis
[root@db01 redis-stable]# redis-cli
127.0.0.1:6379> shutdown
[root@db01 redis-stable]# redis-cli shutdown
# 12.Redis启动读取指定配置文件
[root@db01 ~]# redis-server /root/redis-stable/redis.conf &
# 13.Redis指定端口连接
[root@db01 redis-stable]# redis-cli -p 6380
127.0.0.1:6380>
# 14.修改Redis配置文件
[root@db01 redis-stable]# vim redis.conf
daemonize yes // redis守护进程模式
# 修改后,放到后台守护进程启动,不需要加'&'
[root@db01 redis-stable]# redis-server /root/redis-stable/redis.conf
Redis基本操作
# Redis的库
Redis总共有16个库
# 切换数据库
127.0.0.1:6379> select 1
OK
# 创建数据
127.0.0.1:6379[1]> set name wc
OK
127.0.0.1:6379[1]> set age 18
OK
# 查看所有数据
127.0.0.1:6379[1]> KEYS *
1) "age"
2) "name"
# 查看数据是否存在
127.0.0.1:6379[1]> KEYS name
1) "name"
127.0.0.1:6379[1]> KEYS xxx
(empty array)
# 查看key的值
127.0.0.1:6379[1]> get name
"wc"
# 危险命令:推荐使用优化命令(全部清除)
127.0.0.1:6379[15]> flushdb
OK
127.0.0.1:6379[15]> flushall
OK
Redis安装配置
# 1.允许指定IP连接
bind 10.0.0.51 172.16.1.51 127.0.0.1
# 2.关闭protected mode
[root@db01 redis-stable]# vim redis.conf
protected-mode no
# 3.测试远程连接
[root@web01 redis-stable]# redis-cli -h 10.0.0.51
10.0.0.51:6379> KEYS *
1) "age"
2) "name"
# 4.给Redis设置密码
[root@db01 redis-stable]# vim redis.conf
requirepass 123
# 5.连接时使用密码
[root@db02 ~]# redis-cli -h 10.0.0.51
10.0.0.51:6379> KEYS *
(error) NOAUTH Authentication required.
10.0.0.51:6379> AUTH 123
OK
10.0.0.51:6379> KEYS *
1) "name"
10.0.0.51:6379> quit
[root@db02 ~]# redis-cli -h 10.0.0.51 -a 123
10.0.0.51:6379> KEYS *
1) "name"
开启Redis日志
# 修改配置文件
[root@db01 redis-stable]# vim /root/redis-stable/redis.con
logfile "/var/log/redis/redis.log"
# 创建目录
[root@db01 redis-stable]# mkdir /var/log/redis/
# 重启
[root@db01 redis-stable]# redis-cli shutdown
[root@db01 redis-stable]# redis-server /root/redis-stable/redis.conf
在Redis库内查看Redis配置
# 1.查看所有配置
127.0.0.1:6379> config get *
# 2.查看指定配置
127.0.0.1:6379> CONFIG get bind
# 3.修改Redis配置(临时生效)
127.0.0.1:6379> CONFIG set requirepass 456
OK
127.0.0.1:6379> AUTH 456
OK
Redis多实例
# 1.创建多实例目录
[root@db01 ~]# mkdir -p /data/638{0..2}/data
[root@db01 ~]# ll /data/
total 0
drwxr-xr-x 3 root root 18 Sep 2 11:50 6380
drwxr-xr-x 3 root root 18 Sep 2 11:51 6381
drwxr-xr-x 3 root root 18 Sep 2 11:51 6382
# 6380配置
[root@db01 redis-stable]# vim /data/6380/data/redis.conf
port 6380
bind 127.0.0.1 10.0.0.51 172.16.1.51
logfile /data/6380/data/redis.log
protected-mode no
daemonize yes
# 6381配置
[root@db01 redis-stable]# vim /data/6381/data/redis.conf
port 6381
bind 127.0.0.1 10.0.0.51 172.16.1.51
logfile /data/6381/data/redis.log
protected-mode no
daemonize yes
# 6382配置
[root@db01 redis-stable]# vim /data/6382/data/redis.conf
port 6382
bind 127.0.0.1 10.0.0.51 172.16.1.51
logfile /data/6382/data/redis.log
protected-mode no
daemonize yes
# 启动
[root@db01 redis-stable]# redis-server /data/6380/data/redis.conf
[root@db01 redis-stable]# redis-server /data/6381/data/redis.conf
[root@db01 redis-stable]# redis-server /data/6382/data/redis.conf
[root@db01 redis-stable]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 172.16.1.51:6379 0.0.0.0:* LISTEN 19484/redis-server
tcp 0 0 10.0.0.51:6379 0.0.0.0:* LISTEN 19484/redis-server
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 19484/redis-server
tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 17789/redis-server
tcp 0 0 172.16.1.51:6381 0.0.0.0:* LISTEN 19644/redis-server
tcp 0 0 10.0.0.51:6381 0.0.0.0:* LISTEN 19644/redis-server
tcp 0 0 127.0.0.1:6381 0.0.0.0:* LISTEN 19644/redis-server
tcp 0 0 172.16.1.51:6382 0.0.0.0:* LISTEN 19650/redis-server
tcp 0 0 10.0.0.51:6382 0.0.0.0:* LISTEN 19650/redis-server
tcp 0 0 127.0.0.1:6382 0.0.0.0:* LISTEN 19650/redis-server
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 7560/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 7731/master
tcp 0 0 127.0.0.1:32000 0.0.0.0:* LISTEN 11676/java
tcp6 0 0 :::9000 :::* LISTEN 12136/java
tcp6 0 0 127.0.0.1:9001 :::* LISTEN 11696/java
tcp6 0 0 :::3306 :::* LISTEN 7598/mysqld
tcp6 0 0 ::1:6380 :::* LISTEN 17789/redis-server
tcp6 0 0 :::22 :::* LISTEN 7560/sshd
tcp6 0 0 ::1:25 :::* LISTEN 7731/master
tcp6 0 0 127.0.0.1:44896 :::* LISTEN 12367/java
# 连接
[root@db01 redis-stable]# redis-cli -p 6380
[root@db01 redis-stable]# redis-cli -p 6381
[root@db01 redis-stable]# redis-cli -p 6382
Redis持久化
什么是持久化?
持久化:就是将内存中的数据,写入到磁盘上,并且永久存在的。
持久化方式
RDB持久化
RDB持久化优点:
1)RDB是一种表示某个即时点的Redis数据的紧凑文件。RDB文件适合用于备份。例如,你可能想要每小时归档最近24小时的RDB文件,每天保存近30天的RDB快照。这允许你很容易的恢复不同版本的数据集以容灾。
2)RDB非常适合于灾难恢复,作为一个紧凑的单一文件,可以被传输到远程的数据中心。
3)RDB最大化了Redis的性能,因为Redis父进程持久化时唯一需要做的是启动(fork)一个子进程,由子进程完成所有剩余工作。父进程实例不需要执行像磁盘IO这样的操作。
4)RDB在重启保存了大数据集的实例时比AOF要快。
RDB持久化缺点
1)当你需要在Redis停止工作(例如停电)时最小化数据丢失,RDB可能不太好。你可以配置不同的保存点(savepoint)来保存RDB文件(例如,至少5分钟和对数据集100次写之后,但是你可以有多个保存点)。然而,你通常每隔5分钟或更久创建一个RDB快照,所以一旦Redis因为任何原因没有正确关闭而停止工作,你就得做好最近几分钟数据丢失的准备了。
2)RDB需要经常调用fork()子进程来持久化到磁盘。如果数据集很大的话,fork()比较耗时,结果就是,当数据集非常大并且CPU性能不够强大的话,Redis会停止服务客户端几毫秒甚至一秒。AOF也需要fork(),但是你可以调整多久频率重写日志而不会有损(trade-o)持久性(durability)。
RDB持久化优缺点总结
优点:速度快,适合于用作备份,主从复制也是基于RDB持久化功能实现的。
缺点:会有数据丢失、导致服务停止几秒
RDB持久化核心配置参数
# 编辑配置文件
dbfilename hl.rdb
#900秒(15分钟)内有1个更改
save 900 1
#300秒(5分钟)内有10个更改
save 300 10
#60秒(1分钟)内有10000个更改
save 60 10000
AOF持久化
AOF(append only le)只追加文件,记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。
AOF持久化缺点:
1)对同样的数据集,AOF文件通常要大于等价的RDB文件。
2)AOF可能比RDB慢,这取决于准确的fsync策略。通常fsync设置为每秒一次的话性能仍然很高,如果关闭fsync,即使在很高的负载下也和RDB一样的快。不过,即使在很大的写负载情况下,RDB还是能提供能好的最大延迟保证。
3)在过去,我们经历了一些针对特殊命令(例如,像BRPOPLPUSH这样的阻塞命令)的罕见bug,导致在数据加载时无法恢复到保存时的样子。这些bug很罕见,我们也在测试套件中进行了测试,自动随机创造复杂的数据集,然后加载它们以检查一切是否正常,但是,这类bug几乎不可能出现在RDB持久化中。为了说得更清楚一点:Redis AOF是通过递增地更新一个已经存在的状态,像MySQL或者MongoDB一样,而RDB快照是一次又一次地从头开始创造一切,概念上更健壮。但是,
1)要注意Redis每次重写AOF时都是以当前数据集中的真实数据从头开始,相对于一直追加的AOF文件(或者一次重写读取老的AOF文件而不是读内存中的数据)对bug的免疫力
更强。
2)我们还没有收到一份用户在真实世界中检测到崩溃的报告。
AOF持久化优缺点总结
优点:可以最大程度保证数据不丢失
缺点:日志记录量级比较大
AOF持久化核心配置参数
#修改配置文件
[root@db01 redis]# vim /etc/redis/6379/redis.conf
#是否打开AOF日志功能
appendonly yes/no
#每一条命令都立即同步到AOF
appendfsync always
#每秒写一次
appendfsync everysec
#写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到AOF
appendfsync no
AOFhe RDB应该选哪个
1)一般来说,如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能。
2)如果你非常关心你的数据,但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化。
3)有很多用户单独使用AOF,但是我们并不鼓励这样,因为时常进行RDB快照非常方便于数据库备份,启动速度也较之快,还避免了AOF引擎的bug。
4)个人感触:在企业中,通常都使用RDB来做持久化,因为一般redis是在做MySQL的缓存,就算缓存数据丢失,真实的数据还是在MySQL中,之所以用缓存是为了速度,性能而考虑,所以还是建议使用RDB持久化,相对来说会好一些,除非专门用redis来做一个key:value的数据库,而且数据很重要,那么可以考虑使用AOF
注意:基于这些原因,将来我们可能会统一AOF和RDB为一种单一的持久化模型(长远计划)。
RDB快照工作方式
1)默认情况下,Redis保存数据集快照到磁盘,名为dump.rdb的二进制文件。你可以设置让Redis在N秒内至少有M次数据集改动时保存数据集,或者你也可以手动调用SAVE或者BGSAVE命令。
2)在上文中我们已经在配置文件中做过对应的配置: 例如,这个配置会让Redis在每个60秒内至少有1000次键改动时自动转储数据集到磁盘: save 60 1000
3)当 Redis 需要保存 dump.rdb 文件时,服务器执行以下操作:
Redis 调用 fork() ,同时拥有父进程和子进程。子进程将数据集写入到一个临时的 RDB 文件中。当子进程完成对新 RDB 文件的写入时, Redis 用新RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。
4)这种方式使得 Redis 可以从写时复制机制中获益。
AOF重写功能
1)因为 AOF 的运作方式是不断地将命令追加到文件的末尾,所以随着写入命令的不断增加, AOF 文件的体积也变得越来越大。举个例子,如果你对一个计数器调用了 100 次 INCR ,那么仅仅是为了保存这个计数器的当前值,AOF 文件就需要使用 100 条记录。然而在实际上,只使用一条 SET 命令已经足以保存计数器的当前值了,其余 99条记录实际上都是多余的。
2)为了处理这种情况, Redis 支持一种有趣的特性:可以在不断服务客户端的情况下,对 AOF 文件进行重建。执行BGREWRITEAOF 命令, Redis 将生产一个新的 AOF 文件,这个文件包含重建当前数据集所需的最少命令。
AOF有多持久
你可以配置 Redis 多久才将数据 fsync 到磁盘一次。 有三个选项:
每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全。
每秒 fsync 一次:足够快(和使用 RDB 持久化差不多,)并且在故障时只会丢失1秒钟的数据。
从不 fsync :将数据交给操作系统来处理。更快,也更不安全的选择。
推荐(并且也是默认)的措施为每秒 fsync 一次,这种 fsync 策略可以兼顾速度和安全性。
总是 fsync 的策略在实际使用中非常慢,即使在 Redis2.0 对相关的程序进行了改进之后仍是如此。频繁调用 fsync注定了这种策略不可能快得起来。
AOF文件出错怎么办?
服务器可能在程序正在对AOF文件进行写入时停机,如果停机造成了AOF文件出错,那么 Redis 在重启时会拒绝载入
这个 AOF 文件,从而确保数据的一致性不会被破坏。
当发生 AOF 文件出错时,可以用以下方法来修复出错的 AOF 文件:
1、为现有的 AOF 文件创建一个备份。
2、使用 Redis 附带的 redis-check-aof 程序,对原来的AOF 文件进行修复。redis-check-aof --x
3、使用 di -u 对比修复后的 AOF 文件和原始 AOF 文件的备份,查看两个文件之间的不同之处。
4、重启 Redis 服务器,等待服务器载入修复后的 AOF 文件,并进行数据恢复。
RDB和AOF的相互作用
1)在版本号大于等于 2.4 的 Redis 中, BGSAVE 执行的过程中,不可以执行 BGRWRITEAOF 。 反过来说,在BGRWRITEAOF 执行的过程中,也不可以执行 BGSAVE 。
2)这可以防止两个 Redis 后台进程同时对磁盘进行大量的 I/O 操作。如果 BGSAVE 正在执行,并且用户显示地
调用 BGRWRITEAOF 命令,那么服务器将向用户回复一个 OK 状态,并告知用户, BGRWRITEAOF 已经被预定执行; 一旦 BGSAVE 执行完毕, BGRWRITEAOF 就会正式开始。
3)当 Redis 启动时,如果 RDB 持久化和 AOF 持久化都被打开了,那么程序会优先使用 AOF 文件来恢复数据集,因为 AOF 文件所保存的数据通常是最完整的。
备份redis数据
1)Redis 对于数据备份是非常友好的,因为你可以在服务器运行的时候对 RDB 文件进行复制: RDB 文件一旦被创建,就不会进行任何修改。
2)当服务器要创建一个新的 RDB 文件时,它先将文件的内容保存在一个临时文件里面,当临时文件写入完毕时,程序才使用临时文件替换原来的 RDB 文件。
3)这也就是说,无论何时, 复制 RDB 文件都是绝对安全的。
以下是我们的建议:
1)创建一个定期任务(cron job), 每小时将一个 RDB 文件备份到一个文件夹, 并且每天将一个 RDB 文件备份到另一个文件夹。
2)确保快照的备份都带有相应的日期和时间信息, 每次执行定期任务脚本时, 使用 nd 命令来删除过期的快照:比如说, 你可以保留最近 48 小时内的每小时快照, 还可以保留最近一两个月的每日快照。
3)至少每天
持久化额外配置
## rdb
#编辑配置文件
[root@db01 redis]# vim /etc/redis/6379/redis.conf
#后台备份进程出错时,主进程停不停止写入? 主进程不停止容易造成数据不一致
stop-writes-on-bgsave-error yes
#导出的rdb文件是否压缩 如果rdb的大小很大的话建议这么做
rdbcompression yes
#导入rbd恢复时数据时,要不要检验rdb的完整性 验证版本是不是一致
rdbchecksum yes
## aof
#编辑配置文件
[root@db01 redis]# vim /etc/redis/6379/redis.conf
#正在导出rdb快照的过程中,要不要停止同步aof
no-appendfsync-on-rewrite yes/no
#aof文件大小比起上次重写时的大小,增长率100%时重写,缺点:业务开始的时候,会重复重写多次
auto-aof-rewrite-percentage 100
#aof文件,至少超过64M时,重写
auto-aof-rewrite-min-size 64mb