redis操作 AOF RDB 主从复制 集群

Redis操作

1.Redis的持久化
Redis提供了2个不同方式的持久化方式
RDB
RDB是指在指定的时间间隔将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时将快照文件直接读到内存中
备份是如何进行的?
Redis会单独创建一个子进程来进行持久化,同时先将数据写入到一个临时文件中,等待持久化过程都结束了,再用临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,对于数据的恢复不是非常敏感,那RDB方式比AOF方式更加的高效,RDB的缺点是最后一次持久化的数据可能会丢失。
关于fork
在Linux中,fork()会产生一个和父进程完全相同的子进程,但子进程此后会有一个exec系统调用,出于效率考虑,Linux中引入“写时复制技术”,一般情况下父进程跟子进程会公用共同的一段物理内存,只有进程空间的各段发生变化时候,才会将父进程内容复制给子进程。
关于redis.conf配置 贴图
默认为dump.rdb
redis操作 AOF RDB 主从复制 集群
rdb文件的保存路径,也可以修改。默认Redis启动的命令在所在的目录下
redis操作 AOF RDB 主从复制 集群
RDB的保存策略 重点 默认 15分钟 1次、6分钟 10次、1分钟 10000次
redis操作 AOF RDB 主从复制 集群
进行rdb保存时,将文件压缩,默认是开启的
redis操作 AOF RDB 主从复制 集群
rdbchecksum yes
在存储快照后,还可以让Redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能
redis操作 AOF RDB 主从复制 集群
stop-writes-on-bgsave-error yes 当Redis无法写入磁盘的话,直接关掉Redis的写操作
redis操作 AOF RDB 主从复制 集群
rdb如果想备份的话,只需要将rdb文件拷贝到某一个地方,等到恢复的时候自动加载它即可。
rdb的优点:
恢复速度快 单独开fork线程
节省磁盘空间 进行压缩了
rdb的缺点:
虽然使用了fork技术,但当数据量特别大时候,还是会消耗性能。同时它是周期备份,当Redis意外down掉时候,就会丢失最后一次快照的
AOF
以日志的形式来记录每个写操作,将redis的指令记录下来(不记录读操作),只许追加文件但不可以修改文件,Redis启动的时候会将文件构建数据。
AOF默认是不开启的,需要手动配置。
redis操作 AOF RDB 主从复制 集群
如果AOF跟RDB同时开启是听AOF的。
同时,如果AOF文件损坏,可以通过 redis-check-aof --fix appendonly.aof 进行恢复
AOF同步的频率设置分为3中
redis操作 AOF RDB 主从复制 集群
1、始终同步,每次将Redis的写入都立刻记录日志
2、每秒同步,每秒记录,本秒的数据可能会丢失
3、不主动进行同步,将同步时机交给操作系统
AOF采用的是文件追加的方式,文件会越来越大,为了避免这种情况,增加了AOF重写机制
这么做肯定是为了提高读写效率,减少磁盘IO,通常通过3个手段、
1)进程内已经超时的数据不再写文件。
2)旧的AOF文件含有无效命令,如del key1、 hdel key2、srem keys、set a 111、set a 222等。重写使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令。
3) 多条写命令可以合并为一个,如lpush list a、lpush list b、 lpush list c 可以转化为:lpush list a b c。为了防止但挑明了过大造成客户端缓冲区溢出,对于list、set、hash、zset等类型曹组,以64个元素为界拆分为多条。
触发AOF合并的条件有两个,都要满足
redis操作 AOF RDB 主从复制 集群
简单来说就是大于64M后,是原来阈值的一倍就可。
AOF的优点
备份机制更稳健,丢失数据概率更低
可读的日志文本,通过操作AOF稳健,可以处理误操
AOF的缺点
比起RDB占用更多的磁盘空间。
恢复备份速度要慢
每次读写都同步的话,有一定的性能压力
存在个别Bug,造成恢复不能
项目中如何使用?
官网是两个都推荐
如果数据不敏感,单独用RDB
不建议单独用AOF,可能会出现BUG
就缓存数据的话,都不开也行
Redis主从复制
主从复制,就是主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主
redis操作 AOF RDB 主从复制 集群
好处是读写分离,性能扩展 容灾快速恢复
拷贝多个redis.conf文件include
开启daemonize yes
Pid文件名字pidfile
指定端口port
Log文件名字
Dump.rdb名字dbfilename
Appendonly 关掉或者换名字
这个就不详细介绍了,因为现在用的更多的是Redis集群
Redis集群主要解决的是第一个是容量不足,redis进行扩容,第二个并发写操作,redis难分探。
Redis集群的安装
1、安装ruby环境
执行yum install ruby
执行yum install rubygems
2、执行redis-3.2.0.gem 执行命令 gem install --local redis-3.2.0.gem
3、创建至少6个实例 测试的话 在用一台服务器 不同端口,正常的话至少6台服务器
拷贝多个redis.conf文件
开启daemonize yes
Pid文件名字
指定端口
Log文件名字
Dump.rdb名字
Appendonly 关掉或者换名字
安装redis cluster配置修改
cluster-enabled yes 打开集群模式
cluster-config-file nodes-6379.conf 设定节点配置文件名
cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换
最后进行合体
下面是IP地址
./redis-trib.rb create --replicas 1 202.204.124.134:6379 202.204.124.134:6380 202.204.124.134:6381 202.204.124.134:6389 202.204.124.134:6390 202.204.124.134:6391
登录进来之后,可以通过cluster nodes命令来查询集群信息
redis操作 AOF RDB 主从复制 集群
Redis集群中一个很重要的概念是slots
一个Redis集群一个有16384个插槽(hash slot),数据库中的每一个键都属于16384个插槽的其中一个。集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
有几个常见的Redis集群问题
1、如果主节点下线?从节点能否自动升为主节点?
自动的
2、主节点恢复后,主从关系会如何?
down掉后,自动变成从机了
3、如果所有某一段插槽的主从节点都宕掉,redis服务是否还能继续?
如果数据很重要,全覆盖都用不了,如果数据无所谓,可以用
cluster-require-full-coverage