redis技术2--主从复制

一.主从复制介绍

在分布式系统中为了解决单点问题,通常会把数据复制多个副本到其他机器,满足故障恢复和负载均衡等要求.
Redis也是如此,提供了复制功能.
复制功能是高可用Redis的基础,后面的哨兵和集群都是在复制的基础上实现高可用的。

二.实验部署

1.建立复制

主库:m01 10.0.0.51
从库:m02 10.0.0.52

1.1 环境准备

主库redis部署见redis技术1
https://editor.csdn.net/md/?articleId=107236279

在主库:
[root@m01 ~]# cat /etc/hosts
10.0.0.51       db01
10.0.0.52       db02
[root@m01 ~]# tar zcvf db01.tar.gz /opt/redis_cluster/
[root@m01 ~]# scp db01.tar.gz db02:/opt/

在从库:
[root@m02 ~]# cat /etc/hosts
10.0.0.51       db01
10.0.0.52       db02
[root@m02 ~]# cd /opt
[root@m02 opt]# tar zxf db01.tar.gz
[root@m02 opt]# mv opt/redis_cluster/ .
[root@m02 opt]# ls
db01.tar.gz  opt  redis_cluster
[root@m02 opt]# rm -fr db01.tar.gz
[root@m02 opt]# rm -fr opt
[root@m02 opt]# ls
redis_cluster
[root@m02 redis_cluster]# cd redis
[root@m02 redis]# make install
[root@m02 redis]# cd 
[root@m02 ~]# mkdir /data/redis_cluster/redis_6379/ -p
[root@m02 ~]# vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf
### 绑定的主机地址
bind 10.0.0.52(修改这一行)
[root@m02 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
[root@m02 ~]# redis-cli -h db02
db02:6379>

1.2 主从复制操作

实验数据可见redis技术1
https://editor.csdn.net/md/?articleId=107236279

每个从节点只能有一个主节点,主节点可以有多个从节点.
配置复制的方式有三种:
1.在配置文件中加入slaveof {
    
    masterHost} {
    
    masterPort} 随redis启动生效.
2.在redis-server启动命令后加入—slaveof {
    
    masterHost} {
    
    masterPort}生效.
3.直接使用命令:slaveof {
    
    masterHost} {
    
    masterPort}生效.
查看复制状态信息命令
Info replication

在主库:
[root@m02 ~]# cd /data/redis_cluster/redis_6379/ 
[root@m01 redis_6379]# rm -fr *
[root@m01 redis_6379]# redis-cli -h db01
db01:6379> keys *(有数据)
在从库:
[root@m02 ~]# cd /data/redis_cluster/redis_6379/ 
[root@m02 redis_6379]# pkill redis
[root@m02 redis_6379]# rm redis_6379.rdb
[root@m02 redis_6379]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
[root@m02 redis_6379]# redis-cli -h db02
db02:6379> keys *
(empty list or set)
db02:6379> SLAVEOF db01 6379(主从复制的语句)
OK
db02:6379> keys *  (同步了主库数据主库数据)

1.3 主从库比较

主从库日志比较:
在从库:
[root@m02 ~]# cat /opt/redis_cluster/redis_6379/logs/redis_6379.log
1831:S 19 Apr 12:15:04.831 * MASTER <-> SLAVE sync started
1831:S 19 Apr 12:15:04.831 * Non blocking connect for SYNC fired the event.
1831:S 19 Apr 12:15:04.833 * Master replied to PING, replication can continue...
1831:S 19 Apr 12:15:04.834 * Partial resynchronization not possible (no cached master)
1831:S 19 Apr 12:15:04.838 * Full resync from master: 70bdacccf5bdd31812119d738eadaeff5560db35:1
1831:S 19 Apr 12:15:04.969 * MASTER <-> SLAVE sync: receiving 27898 bytes from master
1831:S 19 Apr 12:15:04.970 * MASTER <-> SLAVE sync: Flushing old data    #清空老数据
1831:S 19 Apr 12:15:04.970 * MASTER <-> SLAVE sync: Loading DB in memory    #加载主库发送过来的数据到内存里
1831:S 19 Apr 12:15:04.975 * MASTER <-> SLAVE sync: Finished with success    #同步完成

在主库:
[root@m02 ~]# cat /opt/redis_cluster/redis_6379/logs/redis_6379.log
1912:M 19 Apr 12:15:04.826 * Slave 10.0.0.52:6379 asks for synchronization
1912:M 19 Apr 12:15:04.826 * Full resync requested by slave 10.0.0.52:6379
1912:M 19 Apr 12:15:04.826 * Starting BGSAVE for SYNC with target: disk
1912:M 19 Apr 12:15:04.827 * Background saving started by pid 1924
1924:C 19 Apr 12:15:04.857 * DB saved on disk
1924:C 19 Apr 12:15:04.857 * RDB: 6 MB of memory used by copy-on-write
1912:M 19 Apr 12:15:04.957 * Background saving terminated with success
1912:M 19 Apr 12:15:04.960 * Synchronization with slave 10.0.0.52:6379 succeeded

1.4 主从复制流程

在这里插入图片描述

2.断开复制

Slaveof命令不但可以建立复制,还可以在从节点执行slave of no one来断开与主节点复制关系.

断开复制主要流程:
1.断开与主节点复制关系
2.从节点晋升为主节点
从节点断开复制后不会抛弃原有数据,只是无法再获取主节点上的数据变化.
通过slaveof命令还可以实现切主操作,所谓切主是指把当前从节点对主节点的复制切换到另一个主节点.
执行slaveof {
    
    newMasterIp} {
    
    newMasterPort}命令即可.

切主操作流程如下: db02:6379> SLAVEOF no one
1.断开与旧主节点的复制关系
2.与新主节点建立复制关系
3.删除从节点当前所有数据
4.对新主节点进行复制操作
提示: 线上操作一定要小心,因为切主后会清空之前所有的数据.

三.局限性

1.执行主从复制之前,先将主从库数据备份一份,因为执行了主从复制后从库原本的数据会丢失,而主库数据操作错误也会导致丢失。
2.建议将主从复制写入到配置文件中
在从库:
vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf
最后一行加入这条命令:
SLAVEOF db01 6379      重启后主从复制会生效
3.在业务低峰期做主从复制
4.拷贝数据时候会占用带宽
5.不能自动完成主从切换,需要人工介入

猜你喜欢

转载自blog.csdn.net/xiaoleinb/article/details/113886408