redis 之 redis主从复制
Redis集群中的数据库复制是通过主从同步来实现的
主节点(Master)把数据分发给从节点(Slave)
主从同步的好处在于高可用,Redis节点有冗余设计
主从复制的原理:
1. 从服务器向主服务器发送 SYNC 命令。
2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令。
3. 当主服务器执行完 BGSAVE 命令时,它会向从服务器发送 RDB 文件,而从服务器则会接收并载入这个文件。
4. 主服务器将缓冲区储存的所有写命令发送给从服务器执行。
-------------
1、在开启主从复制的时候,使用的是RDB方式的,同步主从数据的
2、同步开始之后,通过主库命令传播的方式,主动的复制方式实现
3、2.8以后实现PSYNC的机制,实现断线重连
一.实现一主两从的redis主从同步
1.环境准备
首先两台服务器都已经编译安装好redis了(由于开的是虚拟机开不了那么多,所有将一个从库部署在主库同个服务器上,注意生产中主从不会在同一台服务器的)
ip:192.168.1.209
一台服务器上做一主一从的redis配置
ip:192.168.1.208
一台服务器上做一个从redis配置
2.主库从库配置
(1)192.168.1.209 主库配置
首先创建一个主库端口6379的redis配置文件
配置文件redis-6379.conf 内容为:
# 声明端口 port 6379 # 表示后台启动 daemonize yes # 将pid文件放到某目录下 pidfile /data/6379/redis.pid # 日志级别和日志目录 loglevel notice logfile "/data/6379/redis.log" # 持久化相关 # dir /data/6379 # 安全模式 protected-mode no
# 密码设置,redis一般不要密码
# requirepass hsz
配置完成后,创建一个这个redis的数据存放目录(数据包括日志,pid)
# mkdir /data/6379/
启动redis服务
# redis-server redis-6379.conf
# 查看是否有进程
下截图说明程序已经启动:
进入redis中
# redis-cli -p 6379
(2)192.168.1.209 从库配置
首先创建一个主库端口6380的redis配置文件
配置文件redis-6380.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
配置完成后,创建一个这个redis的数据存放目录(数据包括日志,pid)
# mkdir /data/6380/
启动redis服务
# redis-server redis-6380.conf
# 查看是否有进程
下截图说明程序已经启动:
进入redis中
# redis-cli -p 6380
因为是从库在配置文件上加一台配置:
# 主库ip 主库端口
slaveof 192.168.1.209 6379
添加后重启数据库
kill -9 从库进程号
redis-server /opt/redis_conf/redis-6379.conf
(3)192.168.1.208 从库配置
与(2)192.168.1.209 从库配置配置相同,就端口不一样
直到进入redis中:
# ps aux|grep redis
#redis-cli -p 6381
因为是从库在配置文件上加一台配置:
# 主库ip 主库端口
slaveof 192.168.1.209 6379
添加后重启数据库
pkill redis
redis-server /opt/redis_conf/redis-6381.conf
3.查看主从数据库状态
# 主服务上运行
redis-cli -p 6379 info
redis-cli -p 6381 info replication
以下截图分别为两台服务器的ip,端口,状态等
# 从服务器上运行
# 下面端口为从数据库自己的端口
# redis-cli -p 6380 info replication
截图参数分别表示:role为角色,redis主库ip,主库端口,已经连接主库状态
4.验证从库只读
数据写不进去,如下图
主库写入数据验证从库是同步验证
从库数据查询,可以查到数据
5.手动进行主从复制故障切换
现在将主库关闭,一主两从现在只有两个主库,都写入不了
这样的话,redis就写入不了
所有这时候需要将一个从库升级为主库(一般是自动升级,但是我们现在来学习手动设置一个)
将一个从库取消从库身份,这时候从库变为主库
127.0.0.1:6381> slaveof no one
127.0.0.1:6381> info replication
但是呢,别的从库不知道,此库变为主库,所以需要将另外一个从库认定这个库为主库,才能进行主从复制的功能
127.0.0.1:6380> slaveof no one
127.0.0.1:6380> slaveof 192.168.1.208 6381
查看主库与从库状态:
127.0.0.1:6380> info replication
在从库查看来看,已经有新的主库了,而且连接状态正常,下面是主库的信息
这样的修改只能实现临时主从状态,如果要将永久设置需要将配置文件中的主从修改为现在的主库的ip的端口
原来的主库作为从库操作
指定现在从库的信息,在数据库设置只是临时的
127.0.0.1:6379> slaveof 192.168.1.208 6381
127.0.0.1:6379> info replication
如果这时候将主库关闭,再起来,从库不会识别,所有这时候我们就引出一个哨兵模式,可以解决主库挂掉,数据还能正常存储的问题解决==>请见redis-sentinel主从复制高可用