为什么要进行读写分离?虽然redis性能已经很优秀,但是当请求的数据量过大、请求过于频繁时,也会达到瓶颈,因此,配置读写分离可以进一步提高redis的性能,master只管写,slave进行读操作
引用《redis实战》中的性能测试:
SUNIONSTORE命令的性能:主频2.4GHz的双核处理器,处理两个分别包含10 000个元素的集合,需要花费7、8毫秒的时间
使用docker搭建主从复制demo
-
拉取镜像
docker pull redis:3.2
-
在本地创建好文件夹,准备好配置文件,docker容器中默认是没有redis.conf配置文件的
mkdir redis cd redis
在redis官网下载redis3.2安装包并解压,将其中的redis.conf文件复制到当前目录一份,并修改其中的几个配置
# 找到bind配置,注释掉是不管用的,一定要改成0.0.0.0 # 之前一直出现 master_link_status:down 就是这个问题 bind 0.0.0.0 # 持久化保存的目录 dir /data/
然后复制两份
cp redis.conf redis-6380.conf cp redis.conf redis-6381.conf
-
启动docker容器(一定要在刚刚创建的redis目录下启动,因为用了$PWD来获取当前路径)
# 启动两个redis docker run -p 6380:6379 --name redis-6380 -v $PWD/redis-6380.conf:/etc/redis/redis.conf -v $PWD/data-6380:/data -d redis:3.2 redis-server /etc/redis/redis.conf docker run -p 6381:6379 --name redis-6380 -v $PWD/redis-6381.conf:/etc/redis/redis.conf -v $PWD/data-6380:/data -d redis:3.2 redis-server /etc/redis/redis.conf
简单介绍参数:
-p 端口映射
-v 目录挂载
-d 后台启动
查看容器IP地址
docker inspect redis-6380
# 在底部会看到 "IPAddress": "172.17.0.3",即该容器的ip地址
# 注意,在docker内部容器之间进行通信的时候,端口号是6379,而不是6380!
-
进入容器,查看两个redis实例的状态
# 进入容器 docker exec -it redis-6380 /bin/bash # 使用redis客户端连接工具 root@c90995ac2b06:/data# redis-cli # 查看当前主从状态 127.0.0.1:6379> info replication role:master connected_slaves:0
另一个也是这样子,就不贴代码了,可以看到,当两个redis单独启动的时候,各自都是
master
-
使用slaveof命令,将redis-6381变成redis-6380的从服务器
# 进入redis-6381容器 docker exec -it redis-6381 /bin/bash # 使用redis客户端连接工具 root@c90995ac2b06:/data# redis-cli # 将当前节点添加为redis-6380的从节点 127.0.0.1:6379> slaveof 172.17.0.3 6379 ok
-
查看一下两个节点状态
redis-6380
127.0.0.1:6379> info replication # Replication role:master connected_slaves:1 slave0:ip=172.17.0.4,port=6379,state=online,offset=4285,lag=1
redis-6381
127.0.0.1:6379> info replication # Replication role:slave master_host:172.17.0.3 master_port:6379 # 注意这个状态如果是down,说明添加不成功 master_link_status:up
-
测试
请自行测试吧,使用redis-cli在redis-6380做一个set操作,然后在redis-6381去get一下,看有没有就好啦
-
附:
上面我们设置主从服务器时,是在从服务器使用命令
slaveof ip port
,但是docker容器在重新启动后,该配置就会失效,所以,我们可以在本地挂载目录修改配置文件redis-6381.conf
,修改slaveof
配置,直接配置上主服务器ip和端口号就好了。slaveof 172.17.0.3 6379
主从复制原理
主从复制的启动过程
步骤 | 主服务器操作 | 从服务器操作 |
---|---|---|
1 | (等待接收命令) | 连接mster,发送SYNC命令 |
2 | 执行bgsave,使用缓冲区记录bgsave之后的所有写命令 | 根据配置决定使用现有数据还是向client返回错误 |
3 | bgsave完毕,向slave发送rdb文件,并继续使用缓冲区记录写命令 | 清空旧数据,载入master发来的rdb文件 |
4 | rdb发送完毕,向slave发送缓冲区中的写命令 | 加载rdb完成,想通常一样接收命令请求 |
5 | 缓冲区的命令发送完毕,此时,每执行一个写命令,向slave发送相同的命令 | 执行缓冲区中发来的命令,此后,接收并执行master传来的写命令 |
注意事项:
- 从服务器在进行数据同步时,会清空自己原本持久化的数据!
- 建议主服务器使用50%-65%的内存,剩余的内存用来执行bgsave命令和创建记录写命令的缓冲区
- redis不支持主主复制