一、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服务在数据库文件数据后,将其存盘并加载到内存中;
扫描二维码关注公众号,回复: 9248090 查看本文章 -
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步;
-
但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。
二、搭建redis主从复制
实验环境
主机名(ip) | 角色 |
---|---|
server1(172.25.2.1) | redis-master |
server2(172.25.2.2) | redis-slave |
server3(172.25.2.3) | redis-slave |
1、在server1(master)
上,从真机下载redis的tar包
2、下载GNU编译器套件gcc
yum install -y gcc -y
3、解压redis安装包,并进入目录
tar zxf redis-5.0.3.tar.gz
cd redis-5.0.3
4、编译并安装,这里不用configure
make && make install
5、进入/root/redis-5.0.3/until
目录下,执行redis服务安装脚本
cd /root/redis-5.0.3/until
./install_server.sh
## 默认选项,一直回车
6、查看服务开启端口为6379,且监听的是本地
7、编辑配置文件/etc/redis/6379.conf
,修改端口,为所有接口都能访问,然后重启服务
vim /etc/redis/6379.conf
70 bind 0.0.0.0 #修改监听端口
/etc/init.d/redis_6379 restart
8、把redis拷贝到server2和server3上
[root@server1 ~]# scp -r redis-5.0.3 root@172.25.2.2:
[root@server1 ~]# scp -r redis-5.0.3 root@172.25.2.3:
9、在server2和server3上(slave)
,修改配置文件里的监听端口及在文件最后一行加入master信息
cd redis-5.0.3 #进入解压目录
cd utils/
./install_server.sh #执行redis服务脚本
vim /etc/redis/6379.conf #编辑配置文件
bind 0.0.0.0 #修改监听端口
slaveof 172.25.2.1 6379 #文件最后一行添加主redis信息
/etc/init.d/redis_6379 start #开启redis
netstat -antlp #查看开启端口
10、测试:
我们进入 master的redis数据库redis-cli
,set name ranran
定义key值为name,value值为ranran,get name
可以获取value值。
我们再进入 slave的redis数据库,可以获取value值,但不能删除,新定义value值,即**slave不可以进行写操作。**
Master可以进行写操作,在master上,删除key后
slave上面,就得不到了。