redis持久化和主从同步

redis持久化rdb与aof

简介

Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失。

RDB持久化

redis 提供了 RDB持久化 的功能,这个功能可以将 redis 在内存中的状态保存到硬盘中,它将手动执行。

也可以在 redis.conf 中配置,定期执行。

RDB持久化产生的RDB文件是一个经过压缩的二进制文件,这个文件被保存在硬盘中,redis可以通过这个文件还原数据库当时的状态。

实例:

1,启动redis服务端,修改配置文件redis.conf(修改前先备份)

daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379              #定义持久化文件存储位置
dbfilename  dbmp.rdb        #rdb持久化文件
bind 10.0.0.10  127.0.0.1    #redis绑定地址
requirepass 123            #redis登录密码
save 900 1                    #rdb机制 每900秒 有1个修改记录
save 300 10                    #每300秒        10个修改记录
save 60  10000                #每60秒内        10000修改记录

2.启动redis服务端

3.登录redis

redis-cli -a 123

4.此时检查目录,/data/6379底下还没有dbmp.rdb文件

5.通过save触发持久化,将数据写入RDB文件

127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> save
OK

6.此时再查看,发现多了两个文件

AOF持久化

AOF(append-only log file) 记录服务器执行的所有变更操作命令(例如set del等),并在服务器启动时,通过重新执行这些命令来还原数据集 AOF 文件中的命令全部以redis协议的格式保存,新命令追加到文件末尾。 优点:最大程序保证数据不丢 缺点:日志记录非常大

redis-client   写入数据  >  redis-server   同步命令   >  AOF文件

配置参数介绍:

# AOF持久化配置,两条参数

appendonly yes
appendfsync  always  # 总是修改类的操作
                    everysec  # 每秒做一次持久化
                    no  # 依赖于系统自带的缓存大小机制

实例:

1.修改配置文件 redis.conf(先备份)

daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename  dbmp.rdb
requirepass 123
save 900 1
save 300 10
save 60  10000
appendonly yes
appendfsync everysec

2.启动redis服务

redis-server /etc/redis.conf

3.检查redis数据目录/data/6379/是否产生了aof文件

[root@localhost 6379]# ls
appendonly.aof  dbmp.rdb  redis.log

4.登录redis-cli,写入数据,实时检查aof文件信息

[root@localhost 6379]# tail -f appendonly.aof

5.设置新key,检查aof信息,然后关闭redis,检查数据是否持久化

redis-cli -a 123 shutdown

redis-server /etc/redis.conf

redis-cli -a 123

区别:

  rdb:基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能

  aof:以追加的方式记录redis操作日志的文件。可以最大程度的保证redis数据安全,类似于mysql的binlog

 

redis主从同步

原理

  1. 从服务器向主服务器发送 SYNC 命令。
  2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令。
  3. 当主服务器执行完 BGSAVE 命令时,它会向从服务器发送 RDB 文件,而从服务器则会接收并载入这个文件。
  4. 主服务器将缓冲区储存的所有写命令发送给从服务器执行。


=====================================================

  1. 在开启主从复制的时候,使用的是RDB方式的,同步主从数据的
  2. 同步开始之后,通过主库命令传播的方式,主动的复制方式实现
  3. 2.8以后实现PSYNC的机制,实现断线重连

实例

环境准备


1,创建三个文件夹

 mkdir /data/ 6380 6381 6382

2,复制三份 nginx.conf 并修改内容

port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
protected-mode no
6380.conf
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
protected-mode no
6381.conf
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile "/data/6382/redis.log"
dbfilename dump.rdb
dir /data/6382
protected-mode no
6382.conf

3,分别启动三个实例

redis-server /data/6380/redis.conf
redis-server /data/6381/redis.conf
redis-server /data/6382/redis.conf

主从规则:

  主节点: 6380

  从节点: 6381, 6382

4,配置主从同步

# 6381窗口界面命令行
redis-cli -p 6381  # 启动6381客户端
SLAVEOF 127.0.0.1 6380  #指明主的地址

# 6382窗口界面命令行
redis-cli -p 6382  # 启动6382客户端
SLAVEOF 127.0.0.1 6380  #指明主的地址

5,检测主从状态

# 从库
127.0.0.1:6382> info replication
127.0.0.1:6381> info replication

#  主库
127.0.0.1:6380> info replication

6,测试写入数据,主库写入数据,检测从库数据

# 主:
127.0.0.1:6380> set name peng

# 从:
127.0.0.1:6381>get name 

如果主库挂了!

解决方案:

1,手动进行主从复制故障切换

# 关闭主库6380
redis-cli -p 6380
shutdown

2,检查从库主从信息,此时 master_link_status:down

redis-cli -p 6381
info replication

redis-cli -p 6382
info replication

3,既然主库挂,那就在6380和6382之间选一个新的主库

a,关闭6381的从库身份

redis-cli -p 6381
info replication
slaveof no one

b,将6382设为6381的从库

# 6382连接到6381:
[root@localhost ~]# redis-cli -p 6382
127.0.0.1:6382> SLAVEOF no one
127.0.0.1:6382> SLAVEOF 127.0.0.1 6381

c,检查6382,6381的主从信息

 

posted @ 2019-01-15 23:27  温而新  阅读(1091)  评论(0编辑  收藏  举报