redis主从同步和数据持久化详解

一 主从同步
1 主从复制工作原理:
–slave向master发送sync命令
–master启动后台存盘进程,并收集所有修改数据命令 //处理客户端请求的进程与处理从服务器请求同步的进程不一样
–master完成后台存盘后,传送整个数据文件到slave
–slave接受数据文件,加载到内存中完成首次完全同步
–后续有新数据产生时,master继续将新的数据收集到的修改命令依次传给slave,完成同步

2 主从复制的缺点:
当网络或者系统繁忙时,会造成数据同步延时

3 配置主从同步结构
1)默认一个独立的数据库开启后,它自己就是master
2)将52配自为数据库51的从

192.168.4.52:6352> slaveof 192.168.4.51 6351  
192.168.4.52:6352> info replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6351
master_link_status:up

3)主从结构模式下,访问从库时,可以正常查询,为只读模式,不可以写入

slave_repl_offset:14
slave_priority:100
slave_read_only:1

4)当重启redis服务后,主从模式消失,因为之前为手动配置,之前同步的数据被存入磁盘

4 永久配置从库:修改主配置文件
先关闭redis服务

[root@mysql52 ~]# vim /etc/redis/6379.conf  //永久生效
 282 slaveof 192.168.4.51 6351

启动redis服务,查看信息:

192.168.4.52:6352> info replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6351
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:1162
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:800f18261e0fe311310132e824216c0a4903fe32
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1162
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1121
repl_backlog_histlen:42

5 临时不做从库,反客为主:

192.168.4.52:6352> slaveof no one

6 当主库有密码时,设置从库:
修改从库配置文件

 288 masterauth 123456
  重启redis服务

7 在登录状态下,可以临时修改配置文件选项:

192.168.4.53:6353> slaveof no one
OK
192.168.4.53:6353> config set  masteranth="123456"   //只对当前进程有效,服务重启后,设置失效
OK
192.168.4.53:6353> slaveof 192.168.4.51 6351
OK
192.168.4.53:6353> info replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6351
master_link_status:up

8 主从从结构:

52做51的从,53做52的从。
直接在53的配置文件修改

282 slaveof 192.168.4.52 6352

查看52的复制状态:(52现在为双重身份,既为主又为从)

 192.168.4.52:6352> info replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6351
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:1568
slave_priority:100
slave_read_only:1
connected_slaves:1
slave0:ip=192.168.4.53,port=6353,state=online,offset=1568,lag=1                 //表示有一个从库53
master_replid:799b5472c74f57b29859779bbfbd620ebf172aa6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1568
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:43
repl_backlog_histlen:1526

9 将54配置为51的从库,在配置之前存放在本机54的数据如何保存

 192.168.4.54:6354> keys *
1) "q2"
2) "q1"
3) "q3"
 192.168.4.54:6354> config set masterauth "123456"                    //只对当前进程有效,服务重启后,设置失效
192.168.4.54:6354> slaveof 192.168.4.51 6351
OK
192.168.4.54:6354> info replication

 Replication
role:slave
master_host:192.168.4.51
master_port:6351
master_link_status:up
master_last_io_second

192.168.4.54:6354> keys *        //之前保存的数据消失了 51将数据同步时,将54上的数据给覆盖来了!!!!
1) "r"
2) "y"
3) "t"
4) "x"
5) "w"

10 哨兵模式:(哨兵服务器提供redis主从同步服务的高可用)
1)将55主机设为主库,命令行添加密码,临时生效

192.168.4.55:6355> config set requirepass "123456"
 OK

退出后再次用密码登录

 192.168.4.55:6355> info replication
NOAUTH Authentication required.

2)56主机设为55的从库,命令行设置临时生效

192.168.4.56:6356> config set masterauth "123456"
OK
192.168.4.56:6356> slaveof 192.168.4.55 6355
OK
192.168.4.56:6356> info replication
# Replication

role:slave
master_host:192.168.4.55
master_port:6355
master_link_status:up

3)主机54停止redis服务,配置哨兵服务器,runtest-sentinel是redis软件内的服务程序 (另外配置54为主,55为从)
监视当前的主库。当主库宕机后,自动将从库提升为master服务器
在源码包内有一个模板文件

[root@mysql54 redis-4.0.8]# ls
00-RELEASENOTES  CONTRIBUTING  deps     Makefile   README.md   runtest          runtest-sentinel  src    utils
BUGS             COPYING       INSTALL  MANIFESTO  redis.conf  runtest-cluster  sentinel.conf     tests
[root@mysql54 redis-4.0.8]# cat sentinel.conf 

也可以直接编辑一个文件:

[root@mysql54 ~]# vim /etc/sentinel.conf
bind 0.0.0.0                //本机所有地址
sentinel monitor  mysql55 192.168.4.55 6355 1                  格式:sentinel monitor +主机名 + 需要监控主库的IP地址 + 端口号 + 次数
sentinel auth-pass mysql55 123456                                       次数:表示有多少台哨兵服务器发现主库宕机了才确定主库真正宕机了,再执行提升slave为master

4)启动哨兵程序

[root@mysql54 ~]# redis-sentinel /etc/sentinel.conf               //运行哨兵程序
3656:X 03 Dec 15:20:18.099 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3656:X 03 Dec 15:20:18.099 # Redis version=4.0.8, bits=64, commit=00000000, modified=0, pid=3656, just started
3656:X 03 Dec 15:20:18.099 # Configuration loaded
3656:X 03 Dec 15:20:18.099 * Increased maximum number of open files to 10032 (it was originally set to 1024).


             _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.8 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 3656
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

3656:X 03 Dec 15:20:18.101 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
3656:X 03 Dec 15:20:18.147 # Sentinel ID is 5d38dea86f2d1a8325530c07699ad9d64749c6bf
3656:X 03 Dec 15:20:18.147 # +monitor master mysql55 192.168.4.55 6355 quorum 1
3656:X 03 Dec 15:20:18.148 * +slave slave 192.168.4.56:6356 192.168.4.56 6356 @ mysql55 192.168.4.55 6355

5)测试:
将55主库的redis服务停止:测试哨兵服务器的功能

[root@mysql55 ~]# redis-cli -h 192.168.4.55 -p 6355 -a 123456 shutdown

在56上查看复制状态:(已经变为主库)

192.168.4.56:6356> info replication
# Replication
role:master
connected_slaves:0

再开一个[终端查看哨兵配置文件:(配置文件已经被自动修改)

root@mysql54 ~]# vim /etc/sentinel.conf
bind 0.0.0.0
sentinel myid 5d38dea86f2d1a8325530c07699ad9d64749c6bf
sentinel monitor mysql55 192.168.4.56 6356 1
# Generated by CONFIG REWRITE
port 26379
dir "/root"
sentinel auth-pass mysql55 123456
sentinel config-epoch mysql55 1
sentinel leader-epoch mysql55 1
sentinel known-slave mysql55 192.168.4.55 6355
sentinel current-epoch 1

将55恢复redis服务,此时55会自动变为56的从库:

192.168.4.55:6355> info replication

# Replication
role:slave
master_host:192.168.4.56
master_port:6356
master_link_status:up

注意:哨兵服务器可以配置在从库的主机上,节省资源

二 redis持久化:
1 rdb介绍:
1) redis数据库文件,全称 Redis DataBase
–数据持久化方式之一
–按照指定时间间隔,将内存中的数据集快照写入硬盘 //定期时间间隔为配置文件设置
–术语叫Snapshot快照
–恢复时,将快照文件直接读入内存

2)相关配置参数:
文件名:
–dbfilename “dump.rdb” //文件名
–save “” //禁用RDB
从内存保存到硬盘的频率
–save 900 1 //900秒即15分钟内且有1次修改
–save 300 10 //300秒即5分钟内且有10次修改
–save 60 10000 //60秒即1分钟内且有10000次修改
配置文件里定义数据库文件名
[root@mysql50 ~]# vim /etc/redis/6379.conf
253 # The filename where to dump the DB
254 dbfilename dump.rdb
压缩
–rdbcompression yes|no (节省空间,耗费cpu)
在存储快照后,使用crc16算法做数据校验
–rdbchecksum yes|no (保证数据完整性)
bgsave出错时停止写操作
–stop-writes-on-bgsave-error yes|no

3)手动立刻存盘
–save //阻塞写存盘
–bgsave //不阻塞写存盘

4) 使用RDB文件恢复数据
备份数据: 备份dump.rdb 文件到其他位置

[root@mysql50 ~]# cp /var/lib/redis/6379/dump.rdb /root

恢复数据: 拷贝文件到数据库目录,重启redis服务

[root@mysql50 ~]# /etc/init.d/redis_6379 stop   //先停止服务
[root@mysql50 ~]# rm -rf /var/lib/redis/6379/dump.rdb  //删除数据库文件[
[root@mysql50 ~]# cp /root/dump.rdb /var/lib/redis/6379/      //备份
[root@mysql50 ~]# ls /var/lib/redis/6379/
dump.rdb
[root@mysql50 ~]#/etc/init.d/redis_6379 start
[root@mysql50 ~]# redis_cli
192.168.4.50:6350> keys *              //完成数据恢复
1) "a"
2) "w"
3) "d"
4) "q"
5) "f"
192.168.4.50:6350>

4)RDB的优点和缺点
RDB优点
–高性能的持久化实现 —>创建一个子进程来执行持久化,先将数据写入临时文件,持久化过程介乎后,再用这个临时文件替换上次持久化号的完呢键; 过程中主进程不做任何IO操作(处理客户端请求的进程和负责存盘的进程不是同一个进程)
–比较适合大规模数据恢复,且对数据完整性要求不是很高
RDB的缺点
–意外宕机时,最后一次持久化的数据会丢失

2 持久化之AOF(类似与Mysql里的binlog日志)
1 )只做追加操作的文件,Append Only File
–记录redis服务的所有写操作
–不断的将新的写操作追加到文件末尾
–使用cat命令可以查看文件内容

2) 相关配置参数
文件名
–appendfilename “appendonly.aof” //指定文件名
–appendonly yes //启用aof ,默认为no
AOF文件记录写操作的方式
–appendfsync always //有新写操作立即记录
–appendfsync everysec //每秒记录一次
–appendfsync no //只记录SQL命令到AOF文件,不写入dump.rdb
日志文件会不断增大,何时触发日志重写?
–redis会记录上次重写时AOF文件的大小
–默认配置当AOF文件是上次rewrite后大小的1倍且文件大于64M时触发
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
当aof文件达到64mb时,对其进行重写,达到压缩空间的目的。比如说重写后的AOF文件的大小为40mb,当文件大小到达80mb(增加大小为原文件大小的100%)时对文件再次进行重写。

3)修复AOF文件
–把文件恢复到最后一次的正确操作
[root@mysql50 6379]# redis-check-aof --fix appendonly.aof
注意:这个修复方式只限于将AOF文件的最后一个记录改错的情况下有效,如果时中间的记录被修改错了,那么这个命令不起作用。

[root@mysql50 ~]# vim /etc/redis/6379.conf
 673 appendonly yes                 //启用AOF文件,默认为no。
 674 
 675 # The name of the append only file (default: "appendonly.aof")
 676 //appendonly.aof 这个文件是可以编辑的,根据你的需要进行操作。
 677 appendfilename "appendonly.aof"          //默认文件名

注意:如果之前使用的是RDB,而且数据库里有数据,此时在配置文件开启AOF ,重启服务后,redis数据库会优先读取AOF的数据,此时AOF里没有数据,那么当登录数据库查询时,之前的所有数据将查询不到。所以配置时最好将RDB和AOF一起启用。
如果要解决这个问题,在登录数据库后利用config set 修改AOF配置项即可。
appendfsync no //记录SQL命令到aof文件,不写入磁盘

4)备份和恢复AOF数据:方式和RDB一样

5)AOF优点和缺点
AOF优点:
– 可以灵活设置持久化方式,同步持久化方式有三种,同步持久化appendfsync always或异步持久化appendfsync everysec
–出现以外宕机时,仅肯能丢失1秒的数据

AOF缺点
–持久化文件的体积通常会大于RDB的体积
–执行fsync策略时的速度可能会比RDB方式慢

猜你喜欢

转载自blog.csdn.net/weixin_42104231/article/details/84778508