vlambda博客
学习文章列表

Redis搭建主从同步读写分离实战

前面我们介绍了主从同步基础,今天我们动手来搭建一个Redis的主从服务器,然后到读写分离

注意:我们的操作和展示都是在Windows操作系统下进行的,想在Linux操作系统下玩的同学不要慌,虽然有些许的不同,但是思路和配置都是一样的。

配置服务器IP和端口

我们把Redis复制到这三个文件夹下,不多解释看名字就能知道我是要做一主多从的结构。

我们进到这个文件夹里面找到【redis.windows.conf】这个文件,建议通过notepad打开,这里我们修改主服务器的ip和端口号

#修改ipbind 192.168.1.219#修改端口port 6000

保存后后我们运行这个【redis-server.exe】,启动服务后发现端口号木有变,这里我教大家一招,直接选中redis.windows.conf然后拖到redis-server.exe上,这时运行的redis服务端口就变成了6000。

按照此步骤我们把从服务器A的端口号配置成7001,从服务器B的端口配置成7002

然后在RedisManage工具上登录这两个服务器,此时我们做完了基本的准备工作,下面我们正式进入。

配置主从同步

从服务器A配置同步服务器信息,此配置项为:slaveof [主ip] [主端口]

slaveof 192.168.1.219 6000
配置好了后我们重启从服务器A,然后在主服务器中添加一个key
>set name mango
然后检测主从是否完成同步

添加子节点

接着我们把从服务器B也配置slaveof启动,此处在原理篇讲过,添加子节点,主服务器会启动子线程保存一个快照,通过socket同步共享到子节点。

读写分离

我们先想一个问题,前面在主服务器添加一个name,然后很快就同步到其他的从服务器,那么如果我在从服务器写一个新的key是不是也得同步到其他服务器上?这样会导致几个问题,如果从服务器写一个key还没来得及同步到其他服务器就挂掉了,重启后我们发现从服务器和主服务器上的key不同;又比如每台服务器都可以写,那么我们的服务器非常混乱,不是在同步的过程中就是在同步的路上,这样加重了服务器的压力和IO读写的性能消耗。

为了降低这样的复杂性问题,在设计的时候我们只允许一个服务器做一件事情,也就是主服务器负责写数据,从服务器负责提供读数据,所以读写分离就出来了。

#从服务器配置只读slave-read-only yes

配置完后我们来写一个key试试

>set name li"READONLY You can't write against a read only replica."

配置日志文件

如果Redis异常了我们如何排查问题呢?对了,这里我们需要配置上日志文件,异常信息一个都不落下

#日志级别loglevel notice#日志文件logfile "redis.log"
配置增量同步

如果我们的从服务器掉线重启,从服务器会和主服务器对比数据,如果没有写key,那么就不会执行同步,反之会同步整个缓存快照,数据量如果非常大,那么同步快照简直就是地狱,所以Redis提供一个复制缓冲区

这个结构是一个环状结构,用来保存最新复制的命令。这样在从服务器离线的时候,不需要完全复制主服务器的数据,如果可以执行部分同步,只需要把缓冲区的部分数据复制给从服务器,就能恢复正常复制状态。缓冲区的大小越大,从服务器离线的时间可以更长,复制缓冲区只有在有slave连接的时候才分配内存。没有从服务器的一段时间,内存会被释放出来,默认1m

repl-backlog-size 1mb

配置本地压缩

随着运行时间越来越长,Redis的本地磁盘上的数据库越来越大,所以我们可以对数据库进行压缩数据,Redis采用LZF压缩方式,但占用了一点CPU的时间。

rdbcompression yes

到这里差不多把主从同步和读写分离的系统搭建完成了,还有一些细节性的配置需要小伙伴们自行尝试了,整个配置环节时间不是很长,但是里面的原理还得需要搞清楚,主从主要是防止单机Redis挂掉了,数据请求直接到数据库,导致服务器不可用。


一名正在抢救的coder

笔名:mangolove