Redis的主从复制
一、redis的主从复制
1.主从复制的原理(全量复制+增量复制):
全量复制:
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。
1)从服务器连接主服务器,发送SYNC命令;
2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写名令;
3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
增量复制:
Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
2.redis主从复制策略:
主从刚刚连接的时候,进行全量同步;全量同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
3.redis的复制机制:
对于slave端来说,主从复制主要经历四个阶段:(1)与master建立连接;(2)向master发起同步请求(SYNC);(3)接受master发来的RDB数据;(4)载入RDB文件
二、实验环境(rhel7.3版本)
1.selinux和firewalld状态为disabled
2.各主机信息如下:
主机 | ip |
---|---|
server4(主机) | 172.25.63.4 |
server3(从机) | 172.25.63.3 |
三、redis主从复制的部署
1.配置server4(主机):
<1>安装redis
(1)下载安装包:redis-5.0.3.tar.gz,并解压
[root@server4 ~]# tar zxf redis-5.0.3.tar.gz
[root@server4 ~]# cd redis-5.0.3 #进入解压目录
(2)下载编译依赖的软件gcc
[root@server4 redis-5.0.3]# yum install gcc -y
(3)cd redis-5.0.3进行编译
[root@server4 redis-5.0.3]# make
[root@server4 redis-5.0.3]# make install
(4)cd utils执行./install_server.sh
,一路敲回车。会生成配置文件,端口信息等。
[root@server4 redis-5.0.3]# cd utils/
[root@server4 utils]# ./install_server.sh
至此redis的安装,也就完成了。当redis安装完成之后,redis服务就已经开启。可以来用查看端口的方法(redis服务的端口是6379),来查看redis服务是否开启。
<2>配置redis
(1)修改配置文件
[root@server4 utils]# vim /etc/redis/6379.conf
70 bind 0.0.0.0 #将70行的bind这行改掉,监听所有IP网段
(2)修改完配置文件后,重启redis服务(因为执行完./install_server.sh脚本之后,redis服务已经开启,所以这里是重启redis服务,而不是开启redis服务)
[root@server4 utils]# /etc/init.d/redis_6379 restart
至此redis的配置也就完成了。此时再次查看redis的端口信息,可以看到,redis监控的端口信息是0.0.0.0:6379和127.0.0.1:6379,而并不再只是127.0.0.1:6379。
2.配置server3(从机):
<1>安装redis,安装过程同server4
或者直接将server4上安装好的目录发送给server3,然后再在server3上执行剩下的操作,过程如下:
(1)将server4上安装好的目录发送给server3:
[root@server4 ~]# scp -r redis-5.0.3 root@172.25.63.3:/root/
(2)在server3上执行剩下的操作:
[root@server3 ~]# ls
redis-5.0.3
[root@server3 ~]# cd redis-5.0.3/
[root@server3 redis-5.0.3]# make install
<2>配置redis
(1)修改配置文件
[root@server3 utils]# vim /etc/redis/6379.conf
bind 0.0.0.0 #将70行的bind这行改掉,监听所有IP网段
slaveof 172.25.63.4 6379 #在配置文件的最后一行指定主机的IP和端口(slaveof IP port做一主多从就在每台从机的配置文件中加上这行参数即可)
<3>重启redis服务
修改完配置文件后,重启redis服务(因为执行完./install_server.sh脚本之后,redis服务已经开启,所以这里是重启redis服务,而不是开启redis服务)
[root@server3 utils]# /etc/init.d/redis_6379 restart
3.测试:
<1>主机设定key-value
在server4:
[root@server4 utils]# redis-cli
127.0.0.1:6379> set name dd
OK
127.0.0.1:6379> get name
"dd"
可以设定键和value,那么当然也可以删除键及其对应的value。对应的命令就是"del name"
<2>查看从机能否获取到value值
[root@server3 utils]# redis-cli
127.0.0.1:6379> get name
"dd"
结论:
在主机设定的key-value,在从机可以看到,表示redis的主从配置成功。
值的注意的是:从库默认是只读的,是不可以写的。
但是从机并不能写入: