一、redis主从复制简介
1、什么是redis的主从复制?
简单来说就是开启多个redis服务,一个master、其他的都是slaver,然后通过命令或配置文件将他们连接起来即可,主库负责写操作,从库负责读操作,从库从主库中实时同步数据。(若是同一台电脑,注意端口号、rdb、aof、日志文件、pid文件等要配置成不同的)。主从复制功能是高可用Redis的基础,之后的哨兵模式和redis集群都是在复制的基础上实现的。默认情况下,每个redis实例都是master节点,只有在主从复制时才分为master和slaver。一个master节点可以对应多个slaver节点,但每个slaver节点只能有一个master节点,且数据只能由master节点流向slaver节点,不能逆转。
2、redis主从复制的作用?
主从复制的主要目的就是实现读写分离和容灾备份。
读写分离的目的就是提高系统访问速度,减轻数据库压力,提升整体性能。
容灾备份的目的是当主库宕机后,可以立马把从库变成主库,不影响用户数据的正常访问。
二、配置主从复制
1、建立连接
ps:redis配置主从复制非常简单,建立主从连接即可
方式一(推荐):redis.conf 中配置主机的ip 和 port(这样从库在启动时会自动的连接上主库,并变成他的从库)
# slaveof <masterip> <masterport> 默认是关闭的
方式二:slaveof host port 命令 例如:127.0.0.1:6380>slaveof 127.0.0.1 6379
方式三:redis-server [可以有其他redis.conf中的配置] --slaveof <masterHost> <masterPort>
1.2传输延迟问题
无论是客户端操作redis,还是redis的主从复制,数据的传输都是靠网络,所以首先要保证的是网络要顺畅。在redis.conf中redis为我们提供了repl-disable-tcp-nodelay参数,用于控制主从复制数据时是否延迟发送,默认为no。当为no时,无论数据量大小都会实时的发送给从节点,适用于网络较好对数据实时性要求较高的场景。当为yes时,主节点会将数据合并成TCP数据小包,一定延迟后再发送给sale节点,节省了带宽但也增加了延迟,延迟时间取决于Linux内核的默认配置,一般为40毫秒。适用于网络环境复杂或大流量的环境下。
2、复制数据
主从建立完连接后,从库会自动的从主库异步复制数据。可以在主节点或者从节点执行info replication命令,查看主从复制的状态。
发生的问题:从库连不上主库?
1)主库设置了密码,导致从库连不上。
解决:去掉密码,或者从库的配置文件中 # masterauth <master-password> 指定主库的密码
2)bind 127.0.0.1 bind是否只允许本机访问。
3)防火墙是否开放了redis服务的端口号。
3、断开主从复制连接
在从节点执行slaveof no one命令,来断开与master的连接。断开复制后并不会删除已经复制过来数据,只是无法再获取master上的数据变化。若想继续连接刚才断开的master时,只需要再用slaveof连接即可,此时slaver节点会进行一次增量复制,将刚才断开的这段时间master的变化数据同步过来。但注意slaveof命令可以实现“切主”操作,若下次slaveof连接的master节点与上一个不一样时,slaver会先将本身的数据清空,再重新从新的master上复制数据(先进行一次全量复制,然后在一点点的同步复制)
二、读写分离
默认情况下,主库可读写,从库只可读(配置文件中有这个配置 slave-read-only yes),在主从复制时,最好master只用来写,slaver只用来读,分工明确,各司其职,协调工作。
三、宕机恢复
1)若主库宕机,从库依然会等待主库恢复,此时从库的数据还是主库宕机前的数据,主机恢复后,从库会继续同步主库的数据。
2)若从库宕机,还需要重新slaveof 一下才能获得主库的数据。除非在配置文件中配置了主库,否则只要重新连接主库,一次全量复制将被执行。(因为主节点和从节点都会维护一个复制的偏移量,根据这个偏移量来决定是进行全量复制还是增量复制)
本文暂时对redis的主从复制进行了基本的配置,对于基本使用来说已经够用了。之后有时间我会将redis主从复制的常用拓扑结构,以及redis主从复制的原理部分,还有一些常见的复制过程中出现的问题,在本文中继续与大家讨论,敬请期待!