Redis学习-读写分离(主从复制)

为什么要进行读写分离?虽然redis性能已经很优秀,但是当请求的数据量过大、请求过于频繁时,也会达到瓶颈,因此,配置读写分离可以进一步提高redis的性能,master只管写,slave进行读操作

引用《redis实战》中的性能测试:

SUNIONSTORE命令的性能:主频2.4GHz的双核处理器,处理两个分别包含10 000个元素的集合,需要花费7、8毫秒的时间

使用docker搭建主从复制demo

  1. 拉取镜像

    docker pull redis:3.2
    
  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
    
  1. 启动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 后台启动

  2. 查看容器IP地址

docker inspect redis-6380
# 在底部会看到  "IPAddress": "172.17.0.3",即该容器的ip地址
# 注意,在docker内部容器之间进行通信的时候,端口号是6379,而不是6380!
  1. 进入容器,查看两个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

  2. 使用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
    
  3. 查看一下两个节点状态

    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
    
  4. 测试

    请自行测试吧,使用redis-cli在redis-6380做一个set操作,然后在redis-6381去get一下,看有没有就好啦

  5. 附:

    上面我们设置主从服务器时,是在从服务器使用命令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传来的写命令

注意事项:

  1. 从服务器在进行数据同步时,会清空自己原本持久化的数据!
  2. 建议主服务器使用50%-65%的内存,剩余的内存用来执行bgsave命令和创建记录写命令的缓冲区
  3. redis不支持主主复制

你可能感兴趣的:(Redis学习-读写分离(主从复制))