在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
为什么需要持久化Redis是基于内存的NoSQL数据库,读写速度自然快,但内存是瞬时的,在redis服务关闭或重启之后,redis存放在内存的数据就会丢失,为了解决这个问题,redis提供了两种持久化方式,以便在发生故障后恢复数据。 持久化选项redis提供了两种不同的持久化方式来将数据存储到硬盘中。一种是快照方式(也叫RDB方式),它可以将莫一时刻存在于redis中的所有数据存储到硬盘;另一种叫只追加文件(AOF)方式,它会定时的复制redis执行的所有写命令到硬盘。这两种持久化方式各有千秋,既可以同时使用,也可以独立使用,在某些情况下甚至可以两种都不使用。 RDB方式 RDB方式也称快照方式,通过创建快照来保存某个时间点上的数据副本(.rdb)到硬盘。在重启服务器后,redis会加载这个rdb文件来还原数据。先来看一下rdb持久化配置。 save 900 1 save 300 10 save 60 10000 …… dbfilename dump.rdb dir ./ 说明
创建快照 BGSAVE:
SAVE: RDB方式的优劣 优势: 仅用一个文件备份数据,灾后易于恢复相比于aof,rdb文件更小,并且加载rdb文件恢复数据也更快 劣势: 如果redis服务因故障关闭或重启,会丢失最近一次快照创建后写入的数据当数据量很大的时候,创建子进程会导致redis较长时间的停顿 AOF方式 简单来说,AOF持久化会将被执行的写命令写到aof文件的末尾,以此来记录数据发生的变化。因此,redis只要从头到尾重新执行一遍aof文件中包含的所有写命令,就可以恢复数据。 打开redis配置文件可以看到: # 是否开启aof持久化,默认为关闭(no) appendonly yes # 设置对aof文件的同步频率 # 每接收到一条写命令就进行一次同步,数据保障最有力,但对性能影响十分严重 appendfsync always # 每秒进行一次同步,推荐 appendfsync everysec # 由操作系统来决定何时进行同步 appendfsync no # 重写aof相关 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb 重写/压缩aof文件 由于aof持久化会不断地记录redis的写命令,随着redis的运行,aof文件会越来越大,占用过多的硬盘空间,并增加redis进行数据还原操作的时间。因此,必须要有避免aof文件体积过大的控制方案。 redis提供了 当然, AOF持久化的优劣 优势 可以将丢失数据的时间窗口降低至1秒,并且不会对性能在成太大影响aof对于日志文件采用的是追加模式,因此在写入过程中即使出现宕机,也不会破坏日志文件中已经存在的内容;若只写入一半数据就宕机,在redis下次启动时,可通过 劣势 aof文件的体积一直是AOF持久化最大的缺陷,即使有重写aof文件的机制存在载入aof文件恢复数据的过程会比载入rdb文件耗时更长 主从复制尽管redis性能十分优秀,但还是会遇到无法快速处理请求的问题,为了抗高并发带来的数据库性能问题,redis可以像关系型数据库一样进行主从复制、读写分离。即向主服务器写入数据,从服务器实时收到更新,并使用从服务器处理所有的读请求,而不是像以前一样将所有读请求都发送给主服务器,造成主服务器压力过大,通常读请求会随机地选择使用哪一个从服务器,从而使负载均衡地分配到每一个从服务器上。下图是一个简单的redis主从架构。 主从复制配置首先在你的redis目录下执行 include /usr/local/redis-4.0.13/redis.conf port 6380 pidfile /var/run/redis_6380.pid logfile 6380.log dbfilename dump6380.rdb 说明:
经过上述操作,一个新的主服务器就配置好了,接下来配置从服务器,同样在当前目录下创建一个redis配置文件起名redis6382 include /usr/local/redis-4.0.13/redis.conf port 6382 pidfile /var/run/redis_6382.pid logfile 6382.log dbfilename dump6382.rdb slaveof 127.0.0.1 6380 masterauth 主服务器的密码 其中有一些从服务器额外的配置:
其他的从服务器配置也都类似,注意分配端口号,我这里又配置了一个6384。 root 2625 1 0 16:15 ? 00:00:00 ./redis-server *:6380 root 2630 1 0 16:15 ? 00:00:00 ./redis-server *:6382 root 2636 1 0 16:15 ? 00:00:00 ./redis-server *:6384 在主从服务器都启动好了以后,进入主服务器的客户端 127.0.0.1:6380> info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6382,state=online,offset=336,lag=1 slave1:ip=127.0.0.1,port=6384,state=online,offset=336,lag=1 master_replid:b5c68a979b28d2a9ef53476510758b5d1795418b master_replid2:0000000000000000000000000000000000000000 master_repl_offset:336 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:336 同样,在从服务器客户端中执行上述命令,也能够得到信息 127.0.0.1:6384> info replication # Replication role:slave master_host:127.0.0.1 master_port:6380 master_link_status:up master_last_io_seconds_ago:2 master_sync_in_progress:0 slave_repl_offset:686 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:b5c68a979b28d2a9ef53476510758b5d1795418b master_replid2:0000000000000000000000000000000000000000 master_repl_offset:686 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:15 repl_backlog_histlen:672 至此,一个一主两从、读写分离的redis架构已经配置好并成功启动了。 主从复制的启动过程
上图是旧版主从Redis的启动过程,需要特殊说明的几点是:
部分重同步 为了弥补旧版复制的缺陷,Redis从2.8版本开始使用PSYNC命令代替SYNC命令。PSYNC有完整重同步和部分重同步两种模式,其中完整重同步和上述的旧版同步差不多,也是得发个rdb。但是部分重同步很牛X了:它可以只将断线期间的写入主服务器的写命令发送给从服务器,耗费资源更少,速度也快的多。如下图。
部分重同步的实现原理并不复杂,由三部分构成:复制偏移量(offset)、复制积压缓冲区和服务器运行id(runid) 复制偏移量 复制积压缓冲区
由于复制积压缓冲区是一个固定长度的队列,所以它只会保存最近一段时间内执行的写命令,并为队列中的每个字节记录对应的复制偏移量。在从服务器发送PSYNC命令时,会携带上自己的复制偏移量,主服务器拿着这个偏移量去自己的复制积压缓冲区中查看offset+1(即断线后执行的下一个命令)还在不在队列中。如果还在,表示可以执行部分重同步,后面会将从offset+1到队尾的所有数据发送给从服务器;如果不在,那从服务器只能老老实实的去做完全重同步。 服务器运行Id 在之前执行 综上,一个新版redis复制的同步过程大致如下: 到此这篇关于Redis持久化与主从复制的实践的文章就介绍到这了,更多相关Redis持久化与主从复制内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论