文章目录
什么是Redis主从复制?
主从复制:是指将一台Redis服务的数据,复制到其他Redis服务器上。前者称为主节点(master),后者称为从节点(slave)。数据的复制是单向的,只能从主节点到从节点。默认情况下,每一台Redis服务都是主节点,一个主节点可以有多个从节点(也可以没有),但一个从节点只能有一个主节点。
为什么要使用Redis主从复制?
假设只有一台Redis服务,这就是单机模式。
第一个问题是当服务器宕机,数据丢失,如果数据很重要,那会造成很大的损失。
第二个问题是内存问题,一台服务器的内存是会达到峰值的,一台服务器也不可能无限升级。
针对上述问题,我们需要准备多台服务器,配置主从复制。将数据保存在多台服务器上,并且保证每台服务器的数据是同步的。即使有一台服务器宕机,也不影响用户的使用。redis可以继续实现高可用,同时实现数据的冗余备份。
主从复制的工作原理?
从节点slave 启动时,向 master 发送 sync 命令,以实现增量复制。
mater(主库)接到 sync 请求,会在后台保存快照,也就是实现 RDB 持久化,并将快照
期间接收到命令缓存起来。
快照完成后,master(主库)会将快照文件和所有的缓存的命令发送给 slave(从库)。
slave(从库)接收后,会载入快照文件并执行缓存的命令,从而完成复制的初始化。
在数据库使用阶段,master(主库)会自动把每次收到的写命令同步到从服务器。
Redis 乐观复制策略
Redis 采用乐观复制的策略,允许一定时间内主从数据库的内容不同,当然最终的数据
会相同。此策略保证了 Redis 性能,在进行复制时,master(主库)并不阻塞,继续处理 client的请求。
但是 Redis 同样提供了配置用来限制只有当数据至少同步给指定数量的slave(从库)时,
saster(主库)才可写,否则返回错误。配置是:min-slaves-to-write、min-slaves-max-lag。
基于docker搭建Redis主从复制
编写DockerFile
FROM centos:7
RUN groupadd -r redis && useradd -r -g redis redis
RUN yum -y update && yum -y install epel-release && yum -y install redis && yum -y install net-tools
EXPOSE 6379
将编写好的Dockerfile文件上传到linux服务器
了解docker网络模式(为接下来的主从配置搭建做准备)
docker安装后,默认会创建下面三种网络类型
-
bridge:桥接网络
-
默认情况下启动的docker容器,都是使用 bridge,docker安装时创建的桥接网络,每次docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,docker的IP地址就变了(桥接网络模式也可以,就是通过端口映射访问到容器里面的redis,不过本文选择用下面的自定义网络模式)
-
none:无指定网络
- docker 容器就不会分配局域网的IP
-
host: 主机网络
- docker容器的网络会附属在主机上,两者是互通的。例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中
在启动容器时使用 --network bridge 指定网络类型
指定自定义网络
因为默认的网络不能制定固定的地址,所以我们将创建自定义网络,并指定网段:172.10.0.0/16 并命名为mynetwork,这里选择了172.10.0.0/16网段,当然你也可以指定其他任意空闲的网段。将名字命名为mynetwork,你也可以换成其它的任意名字。具体创建指令如下:
创建一个mynetwork网络 并指定网段(子网)为:172.10.0.0/16(执行这一步,下面要用到该网络
docker network create --subnet=172.10.0.0/16 mynetwork
查看所有的网络
docker network ls
开始搭建Redis主从复制
使用Dockerfile文件构建一个redis镜像(注意后面有一个点)
docker build -t redis .
可以使用docker images查看刚刚构建完成的redis镜像
运行docker容器
docker run -itd --name redis-master --net mynetwork -p 6380:6379 --ip 172.10.0.2 redis
docker run -itd --name redis-slave --net mynetwork -p 6381:6379 --ip 172.10.0.3 redis
参数解释:
-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-d: 后台运行容器,并返回容器ID;
–name: 为创建的容器命名
–net: 指定网络模式(这里指定刚才创建的自定义网络模式)
-p: 端口映射,格式为:主机(宿主)端口:容器端口
–ip: 为容器制定一个固定的ip
redis 镜像名称
运行成功后使用docker ps 查看正在运行中的容器(查看我们上面创建的两个一主一从的redis容器)
可以使用docker network inspect mynetwork命令查看容器的ip地址等相关信息
分别进入主redis容器和从redis容器 修改redis.conf配置文件
格式: docker exec -it 你生成的主redis容器ID 或 容器名字
docker exec -it 5fbbf533c2c0 bash
修改/etc下的配置文件( redis.conf )
进入vim编辑器
vim /etc/redis.conf
# vim 不行的使用vi命令
vi /etc/redis.conf
bind 127.0.0.1 #注释这一行
protected-mode no (#将保护模式修改为no)
daemonize yes #(设置为守护进程,把no改为yes)
退出容器的命令
exit
启用主从模式的三种方式
- 在从服务器的redis.conf配置文件中加入主服务器(本文使用这种方式)
# 格式 slaveof <masterip> <masterport>
slaveof 172.10.0.2 6379
-
启动命令
redis-server启动命令后加入 --slaveof
-
客户端命令
-
Redis服务器启动后,直接通过客户端执行命令:slaveof ,则该Redis实例成为从节点
-
通过 info replication 命令可以看到复制的一些参数信息)
分别启动主从redis容器里面的redis服务
redis-server /etc/redis.conf &
进入redis客户端
redis-cli
在redis客户端内查看主从信息
info replication
在主redis容器中写入key
set name ls
在从redis中查看key
get name
redis可视化连接
服务器公网IP:redis主机端口