前言
我们都知道redis性能很高,单机版的qps(每秒查询率)可以达到10万+,但是即使如此我们也不会在生产环境去搭建单机版本的redis,原因如下:
1、单机版redis,如果进程挂掉或者服务器宕机,redis不可用
2、redis的读和写全在一台机器上,无法满足读多写少的场景。
主从复制架构
Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。分了分担读压力,redis支持主从复制,即主从架构Master/Slave,Master 以写为主,Slave 以读为主,Master 主节点更新后根据配置,自动同步到从机Slave 节点。
接下来我们就来介绍如何进行主从架构的搭建。
这里我是在一台机器上模拟多个Redis服务器,与实际生产环境中相比,基本配置都是一样,仅仅是IP地址和端口号变化。
1、修改配置文件
首先将redis.conf 配置文件复制三份,通过修改端口分别模拟三台Redis服务器。
然后我们分别对这三个redis.conf 文件进行修改。
①、修改 daemonize yes
表示指定Redis以守护进程的方式启动(后台启动)
②、配置PID文件路径 pidfile
表示当redis作为守护进程运行的时候,它会把 pid 默认写到 /var/redis/run/redis_6379.pid 文件里面
③、配置端口 port
④、配置log 文件名字
⑤、配置rdb文件名
接下来,依次将 6380redis.conf 、6381redis.conf 配置一次,则配置完毕。
接下来我们分别启动这三个服务,通过如下命令分别进入到这三个Redis客户端:
通过命令查看Redis是否启动:
2、设置主从关系
①、通过 info replication 命令查看节点角色
我们发现这三个节点都是扮演的 Master 角色。那么如何将 6380 和 6381 节点变为 Slave 角色呢?
②、执行命令:SLAVEOF 127.0.0.1 6379
可以看到,6380和6381两个节点已经变成了从节点。
我们再看 6379 节点信息:
可以看到6379 节点是master节点,它有两个从节点,分别是6380和6381。
3、测试主从关系
①、增量复制
主节点执行 set k1 v1 命令,从节点 get k1 能获取吗?
可以看到,从节点可以读取到主节点写入的值。
②、全量复制
通过执行 SLAVEOF 127.0.0.1 6379,如果主节点 6379 以前还存在一些 key,那么执行命令之后,从节点会将以前的信息也都复制过来吗?
答案也是肯定的,这里我就不贴测试结果了。
③、主从读写分离
主节点能够执行写命令,从节点能够执行写命令吗?
这里的原因是在配置文件 6381redis.conf 中对于 slave-read-only 的配置:
如果我们将其修改为 no 之后,执行写命令是可以的。
但是从节点写命令的数据从节点或者主节点都不能获取的。
④、主节点宕机
主节点 Maste 挂掉,两个从节点角色会发生变化吗?
上图可知主节点 Master 挂掉之后,从节点角色还是不会改变的。
⑤、主节点宕机后恢复
主节点Master挂掉之后,马上启动主机Maste,主节点扮演的角色还是 Master 吗?
也就是说主节点挂掉之后重启,又恢复了主节点的角色。
主从复制总结:
1.如果主机已经运行了一段时间了,并且了已经存储了一些数据了,此时从机连上来,那么从机会将主机上所有的数据进行备份,而不是从连接的那个时间点开始备份。
2.配置了主从复制之后,主机上可读可写,但是从机只能读取不能写入(可以通过修改redis.conf中 slave-read-only 的值让从机也可以执行写操作)。
3.在整个主从结构运行过程中,如果主机不幸挂掉,重启之后,他依然是主机,主从复制操作也能够继续进行。