1、什么是主从复制?
就是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master)
,后者称为从节点(slave)
,数据的复制是单向
的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点,且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。简单的说就是主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主
。
2、主从复制有什么作用?
- 数据冗余:主从复制实现了数据的
热备份
,是持久化之外的一种数据冗余方式。 - 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。简单的说就是
主服务器挂掉了,从服务器顶上去
。 - 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写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。
使用slaveof [ip] [port]:
- 直接登录redis,执行
slaveof [master-ip] [master-port]
,如:slaveof 172.50.0.2 6379,这种方式如果容器停止后会失效。 - 将
slaveof [master-ip] [master-port]
写入redis.conf
文件中使其永久生效。
经过如上操作后,如下所示就说明成功了,可以进行测试了
说明:这里两个容器的端口都为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 命令会出错,因为从节点只允许读,不能写。
总结下步骤:
- docker安装好并拉去redis镜像。
- 配置docker的
自定义网络
。 - 获取
redis.conf
文件,并按上述第四点配置redis.conf文件后,然后放入挂载点即可。 - 启动主从节点redis容器,命令按上述。
- 使用
slaveof [master-ip] [master-port]
配置主从节点。 - 使用
info replication
查看主从情况,最后测试。