一.主从复制介绍
在分布式系统中为了解决单点问题,通常会把数据复制多个副本到其他机器,满足故障恢复和负载均衡等要求.
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.不能自动完成主从切换,需要人工介入