Redis分布式集群实战(二)——搭建Redis主从复制(Master&Slave)

一、Redis主从复制

1、概念

主从复制:主机数据更新后,根据配置和策略,自动同步到备机的master/slaver机制Master以写为主,Slave以读为主。

2、可以干什么

  • 读写分离
  • 容灾恢复

3、如何配置

  • 配从(库)不配主(库);
  • 从库配置:slaveof [主库IP] [主库端口]
  • 注意:每次slave与master断开后,都需要重新连接,除非你配置进redis.conf文件;键入info replication
    可以查看redis主从信息。

常用配置:

  • 一仆二主:
    一个Master,两个Slave,Slave只能读不能写;当Slave与Master断开后需要重新slave of连接才可建立之前的主从关系;Master挂掉后,Master关系依然存在,Master重启即可恢复。
  • 薪火相传<级连结构>:
    上一个Slave可以是下一个Slave的Master,Slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个slave的Master,如此可以有效减轻Master的写压力。如果slave中途变更转向,会清除之前的数据,重新建立最新的。
    在这里插入图片描述
  • 反客为主:
    当Master挂掉后,Slave可键入命令 slaveof no one使当前redis停止与其他Master redis数据同步,转成Master redis。哨兵模式(sentinel)就是反客为主的自动版,能够后台监控Master库是否故障,如果故障了根据投票数自动将slave库转换为主库。一组sentinel能同时监控多个Master。

4、主从复制的缺点:

复制的延迟,写操作都在master上,然后同步到slave上,所以会有一定的延迟,同时slave机器数量的增加也会使延迟问题更加严重

5、复制原理

  • Slave启动成功连接到master后会发送一个sync命令;
  • Master接到命令启动后的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步;
  • 全量复制:而slave服务在数据库文件数据后,将其存盘并加载到内存中;
  • 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步;
  • 但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。
  • Redis主从复制原理总结

二、搭建redis主从复制

实验环境

主机名(ip)角色
server1(172.25.2.1)redis-master
server2(172.25.2.2)redis-master
server3(172.25.2.3)redis-slave

1、部署redis

server1(master)上,从真机下载redis的tar包
在这里插入图片描述
redis安装:

tar zxf redis-5.0.3.tar.gz 
cd redis-5.0.3
yum install gcc -y
make
make install

执行redis安装脚本:

cd utils/
./install_server.sh	#一路回车
netstat -antlp   #查看服务开启端口为6379,且监听的是本地

修改端口使其他主机可访问:为所有接口都能访问,然后重启服务

vim /etc/redis/6379.conf 
  70 bind 0.0.0.0

/etc/init.d/redis_6379 restart	#重启redis
netstat -antlp

在这里插入图片描述
server1添加key-value值:

redis-cli
127.0.0.1:6379> set name nigar
OK
127.0.0.1:6379> get name
"nigar"

在这里插入图片描述

2、redis主从复制

server1---master
server2---slave

step1 在server2中安装redis:

scp redis-5.0.3 server2:/root	#在server1中把解压好的目录发给server2

在server2中:

make install

step2 执行redis安装脚本:

cd utils/
./install_server.sh   #执行redis服务脚本
netstat -antlp

step3 修改配置文件: 修改配置文件里的监听端口及在文件最后一行加入master信息

vim /etc/redis/6379.conf 
  70 bind 0.0.0.0    #修改监听端口

1379 slaveof 172.25.254.1 6379   #文件最后一行添加主redis信息

/etc/init.d/redis_6379 restart	#重启redis
netstat -antlp

在这里插入图片描述
step4 测试:
在server2查看:

redis-cli
127.0.0.1:6379> get name	#可以看到刚在server1中添加的信息
"nigar"
127.0.0.1:6379> set age 20	#无法添加信息
(error) READONLY You can't write against a read only replica.
127.0.0.1:6379> 

进入 slave的redis数据库,可以获取value值,但不能删除,新定义value值,即slave不可以进行写操作。
在这里插入图片描述
但是:
Master可以进行写操作,在master上,删除key后

redis-cli
del name 

在这里插入图片描述
slave上面,就得不到了。
在这里插入图片描述

配置好server1和server3之间的主从复制:(和上一步骤相同)

server1---master
server3---slave

step1 在server3中安装redis:

scp redis-5.0.3 server3:/root	#在server1中把解压好的目录发给server3

在server3中:

make install

step2 执行redis安装脚本:

cd utils/
./install_server.sh 
netstat -antlp

step3 修改配置文件:

vim /etc/redis/6379.conf 
    70 bind 0.0.0.0

    1379 slaveof 172.25.254.1 6379

/etc/init.d/redis_6379 restart	#重启redis
netstat -antlp

step4 测试:
在server3查看:

redis-cli
127.0.0.1:6379> get name
"nigar"
127.0.0.1:6379> set age 20
(error) READONLY You can't write against a read only replica.
127.0.0.1:6379> 

在这里插入图片描述
这样三台redis的主从复制就实现了


版权声明:本文为weixin_43936969原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。