docker搭建redis主从复制

1、什么是主从复制?

就是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点,且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。简单的说就是主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主

主从复制

2、主从复制有什么作用?
  1. 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  2. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。简单的说就是主服务器挂掉了,从服务器顶上去
  3. 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
3、配置容器自定义网络
  • docker netwoek ls 可以看到 docker 有三种网络类型:bridge(桥接网络)、host(主机网路)、none(无指定网络)
  • 为什么要配置容器自定义网络呢?因为我用的是docker部署,如果不自定义,容器重启之后网络IP就会发生变化,会导致构建的主从配置失效,所以我们需要自定义网络。
  • 自定义网络,下面为创建自定义网络的过程


    自定义网络
4、配置redis.conf文件
  • 首先是获取docker镜像,docker pull redis:6.0.10,然后需要到这里获取对应版本的redid.conf
  • 修改默认redis.conf配置文件:
1、bind 0.0.0.0 //修改为允许所有的ip都能访问,默认是:127.0.0.1 因为我们要主节点和从节点不是同一个ip。
2、proctected-mode no //默认yes,开启保护模式,这里便于测试不设密码,生产就必须为yes。
3、daemonize no //默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程(可选),改为yes会使以配置文件方式启动redis失败。
4、dir ./ //输入本地redis数据库存放文件夹(可选)。
5、appendonly yes //redis持久化(可选)。
5、启动容器

前提:将master下的redis.conf文件复制一份给从节点使用,如果你在同一个主机本地中运行,必改的标签为:pidfile、port、dbfilename,因为我这里docker运行,所以可不修改。

// master主节点
docker run -d --name redis-master --net redis-network --ip 172.50.0.2 -p 6379:6379 -v /home/gavin/qxf/redis-docker/master/conf/redis.conf:/etc/redis/redis.conf -v /home/gavin/qxf/redis-docker/master/data/:/data redis:6.0.10 redis-server /etc/redis/redis.conf --appendonly yes

// 从节点
docker run -d --name redis-slave1 --net redis-network --ip 172.50.0.3 -p 6380:6379 -v /home/gavin/qxf/redis-docker/slave1/conf/redis.conf:/etc/redis/redis.conf -v /home/gavin/qxf/redis-docker/slave1/data/:/data redis:6.0.10 redis-server /etc/redis/redis.conf --appendonly yes
说明:
  • --name redis-master:容器名。
  • --net redis-network:自定义网络。
  • --ip 172.50.0.2:ip地址。
  • -p 6379:6379:端口映射。
  • -v /home/gavin/qxf/redis-docker/master/conf/redis.conf:/etc/redis/redis.conf:把宿主机配置好的redis.conf放到容器内部的这个位置中 。
  • -v /home/gavin/qxf/redis-docker/master/data/:/data:把redis持久化的数据在宿主机内显示,做数据备份。
  • redis:6.0.10:镜像名。
  • redis-server /etc/redis/redis.conf:让redis不是无配置启动,而是按照容器内部的这个redis.conf的配置启动。
  • –appendonly yes:redis启动后数据持久化。
6、主从配置

上述中启动了2个redis的实列,进入容器后用redis-cli 登录redis可以使用 info replication查看主从信息,发现所有的redis,role都为master。

image.png

使用slaveof [ip] [port]:
  1. 直接登录redis,执行 slaveof [master-ip] [master-port],如:slaveof 172.50.0.2 6379,这种方式如果容器停止后会失效。
  2. slaveof [master-ip] [master-port]写入 redis.conf文件中使其永久生效。

经过如上操作后,如下所示就说明成功了,可以进行测试了


image.png

说明:这里两个容器的端口都为6379,是因为docker容器之间都是隔离的所以不影响。

容器名称                容器IP地址           映射端口号              服务运行模式
redis-master           172.50.0.2         6379 -> 6379              master
redis-slave1           172.50.0.3         6380 -> 6379              slave1
redis-slave1           172.50.0.4         6381 -> 6379              slave2
7、测试
简单测试

从上看出slave执行 set k v 命令会出错,因为从节点只允许读,不能写。

总结下步骤:
  1. docker安装好并拉去redis镜像。
  2. 配置docker的自定义网络
  3. 获取redis.conf文件,并按上述第四点配置redis.conf文件后,然后放入挂载点即可。
  4. 启动主从节点redis容器,命令按上述。
  5. 使用slaveof [master-ip] [master-port]配置主从节点。
  6. 使用info replication 查看主从情况,最后测试。

你可能感兴趣的:(docker搭建redis主从复制)