🧑💻作者名称:DaenCode
🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。
😎人生感悟:尝尽人生百味,方知世间冷暖。
📖所属专栏:Redis从头学
🌟基础环境
应用 | 版本/型号 |
---|---|
服务器 | 腾讯云轻量服务器 |
镜像 | Centos 7.6 |
Docker | 1.13.1 |
Redis | redis-6.2.1 |
Docker-Compose | 1.29.2 |
文章目录
- 🌟基础环境
- 🌟概述
- 为什么要搭建Redis主从复制、读写分离?
- 主从复制架构图
- 主从同步流程
- 🌟普通搭建
- Redis安装
- 创建三个节点
- 三个节点配置文件修改
- 启动并查看主从配置信息
- 🌟Docker搭建
- Docker环境准备
- 配置三个节点redis.conf
- 启动三个节点容器并查看节点信息
- 🌟Docker-Compose创建
- Docker-Compose安装
- docker-compose.yml文件编写
- 启动容器
- 🌟写在最后
🌟概述
为什么要搭建Redis主从复制、读写分离?
- Redis发生故障会造成数据丢失,这里就需要从节点对其进行备份来保障数据的安全。
- 开发中,涉及到写少读多的场景,使用主从架构更能减少单节点部署的压力。
主从复制架构图
主从同步流程
全量复制
- 主从节点建立连接
- 主节点fork子进程,备份从客户端写入的数据为rdb文件。(RDB持久化策略)
- 从节点将加载rdb文件到磁盘进行同步。
增量复制
- 主节点将新产生的写命令放入复制积压缓冲区,当从节点重新连接主节点时,可以从复制积压缓冲区中同步尚未复制的命令操作。
加速复制
- ⽀持⽆磁盘的复制,⼦进程直接将RDB通过⽹络发送给从服务器,不使⽤磁盘作为中间存储
- repl-diskless-sync yes (默认是no)
🌟普通搭建
Redis安装
这里我已经安装好了Redis环境,具体操作可以查看【Redis从头学 -1】17张图带你学会Redis多环境(Linux、Windows)安装与配置
创建三个节点
1.创建三个节点存放的目录,master、slave1、slave2。
mkdir -p /data/redis/master/
mkdir -p /data/redis/slave1/
mkdir -p /data/redis/slave2/
2.进入到每个节点文件夹,各自创建3个配置文件redis.conf、日志文件夹log以及持久化文件夹data。
cd /data/redis/master && touch redis.conf && mkdir log && mkdir data
cd /data/redis/slave1 && touch redis.conf && mkdir log && mkdir data
cd /data/redis/slave2 && touch redis.conf && mkdir log && mkdir data
三个节点配置文件修改
1.vim修改master主节点配置文件。vim redis.conf
#任何ip可以访问
bind 0.0.0.0
#端口号
port 6379
#守护进程
daemonize yes
#密码
requirepass "daencode@top"
#日志文件
logfile "/data/redis/master/log/redis_6379.log"
#持久化文件名称
dbfilename "redis_6379.rdb"
#持久化文件存储路径
dir "/data/redis/master/data"
#持久化策略, 10秒内有个1个key改动,执⾏快照
save 10 1
#访问主节点的密码
masterauth "daencode@top"
2.vim修改slave1从节点配置文件
#任何ip可以访问
bind 0.0.0.0
#端口号
port 6380
#守护进程
daemonize yes
#密码
requirepass "daencode@top"
#日志文件
logfile "/data/redis/slave1/log/redis_6380.log"
#持久化文件名称
dbfilename "redis_6380.rdb"
#持久化文件存储路径
dir "/data/redis/slave1/data"
#持久化策略, 10秒内有个1个key改动,执⾏快照
save 10 1
#访问主节点的密码
masterauth "daencode@top"
#指定从哪个主节点复制
replicaof 49.233.48.98 6379
3.vim修改从节点slave2配置文件
#任何ip可以访问
bind 0.0.0.0
#端口号
port 6381
#守护进程
daemonize yes
#密码
requirepass "daencode@top"
#日志文件
logfile "/data/redis/slave2/log/redis_6381.log"
#持久化文件名称
dbfilename "redis_6381.rdb"
#持久化文件存储路径
dir "/data/redis/slave2/data"
#持久化策略, 10秒内有个1个key改动,执⾏快照
save 10 1
#访问主节点的密码
masterauth "daencode@top"
#指定从哪个主节点复制
replicaof 49.233.48.98 6379
启动并查看主从配置信息
1.服务器防火墙允许6379、6380、6381端口
2.进入到bin目录,启动各个节点。
./redis-server /data/redis/master/redis.conf
./redis-server /data/redis/slave1/redis.conf
./redis-server /data/redis/slave2/redis.conf
3.查看是否启动成功。
ps -ef|grep redis
4.进入redis客户端。
./redis-cli -h 49.233.48.98 -p 6379 -a daencode@top
参数解释:
-h redis连接ip地址
-p 端口号
-a redis密码
5.查看redis主从复制信息。info replication
🌟Docker搭建
Docker环境准备
1.Docker安装
yum install docker-io -y
2.启动Docker
systemctl start docker
3.修改Docker镜像仓库。
vim /etc/docker/daemon.json
{
"debug":true,"experimental":true,
"registry-mirrors":
["https://pb5bklzr.mirror.aliyuncs.com"]
}
4.重启查看镜像是否配置成功。
systemctl restart docker
docker info
5.拉取redis镜像。
docker pull redis
配置三个节点redis.conf
1.master节点配置文件。
#任何ip可以访问
bind 0.0.0.0
#端口号
port 6379
#守护进程
daemonize no
#密码
requirepass daencode@top
#日志文件,这里注意是docker容器中的日志目录
logfile /usr/local/etc/redis/log/redis_6379.log
#持久化文件名称
dbfilename redis_6379.rdb
#持久化文件存储路径,这里注意是docker容器中的数据目录
dir /usr/local/etc/redis/data
#持久化策略, 10秒内有个1个key改动,执⾏快照
save 10 1
#访问主节点的密码
masterauth daencode@top
2.slave1节点配置文件。
#任何ip可以访问
bind 0.0.0.0
#端口号
port 6380
#守护进程
daemonize no
#密码
requirepass daencode@top
#日志文件这里注意是docker容器中的日志目录
logfile /usr/local/etc/redis/log/redis_6380.log
#持久化文件名称
dbfilename "redis_6380.rdb"
#持久化文件存储路径这里注意是docker容器中的数据目录
dir /usr/local/etc/redis/data
#持久化策略, 10秒内有个1个key改动,执⾏快照
save 10 1
#访问主节点的密码
masterauth daencode@top
#指定从哪个主节点复制
replicaof 49.233.48.98 6379
3.slave2节点配置文件。
#任何ip可以访问
bind 0.0.0.0
#端口号
port 6381
#守护进程
daemonize no
#密码
requirepass "daencode@top"
#日志文件
logfile "/usr/local/etc/redis/log/redis_6381.log"
#持久化文件名称
dbfilename "redis_6381.rdb"
#持久化文件存储路径
dir "/usr/local/etc/redis/data"
#持久化策略, 10秒内有个1个key改动,执⾏快照
save 10 1
#访问主节点的密码
masterauth "daencode@top"
#指定从哪个主节点复制
replicaof 49.233.48.98 6379
启动三个节点容器并查看节点信息
1.为日志文件目录以及持久化目录赋权。这里很重要!!!否则docker容器启动报错'logfile /usr/local/etc/redis/log/redis_6379.log' Can't open the log file: Permission denied
chmod 777 /data/redis/master/log/redis_6379.log && chmod 777 /data/redis/master/data
chmod 777 /data/redis/slave1/log/redis_6380.log && chmod 777 /data/redis/slave1/data
chmod 777 /data/redis/slave1/log/redis_6380.log && chmod 777 /data/redis/slave1/data
2.指定配置文件的方式启动redis节点容器。这里注意挂载文件时配置文件中的路径映射到宿主机时,宿主机要存在相关路径。
#master节点
docker run -itd --privileged=true --name redis-master -v /data/redis/master/redis.conf:/usr/local/etc/redis/redis.conf -v /data/redis/master/log/redis_6379.log:/usr/local/etc/redis/log/redis_6379.log -v /data/redis/master/data:/usr/local/etc/redis/data -p 6379:6379 redis redis-server /usr/local/etc/redis/redis.conf
#slave1节点
docker run -itd --privileged=true --name redis-slave1 -v /data/redis/slave1/redis.conf:/usr/local/etc/redis/redis.conf -v /data/redis/slave1/log/redis_6380.log:/usr/local/etc/redis/log/redis_6380.log -v /data/redis/slave1/data:/usr/local/etc/redis/data -p 6380:6380 redis redis-server /usr/local/etc/redis/redis.conf
#slave2节点
docker run -itd --privileged=true --name redis-slave2 -v /data/redis/slave2/redis.conf:/usr/local/etc/redis/redis.conf -v /data/redis/slave2/log/redis_6381.log:/usr/local/etc/redis/log/redis_6381.log -v /data/redis/slave2/data:/usr/local/etc/redis/data -p 6381:6381 redis redis-server /usr/local/etc/redis/redis.conf
参数详解:
--privileged=true 容器操作授权root
run:启动容器固定写法
--name:自定义启动容器名称
-v 主机redis.conf 和redis容器做映射。:号左边为宿主机路径地址,右边为容器内的挂载路径地址。
-d 后台启动
-i 交互模式运行容器
-t 为容器分配一个伪终端
-p 端口映射 6379是redis端口
redis 镜像名称
redis-server /usr/local/etc/redis/redis.conf 指定容器内的配置文件启动redis,对应会映射到宿主机地址。
3.查看容器启动情况,若没有启动成功,使用docker logs redis-master
查看日志。
docker ps
4.进入到redis-master容器,查看节点信息。
[root@VM-16-11-centos slave1]# docker exec -it redis-master /bin/bash
root@0adc35ea26c4:/data# redis-cli -h 49.233.48.98 -p 6379 -a daencode@top
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
49.233.48.98:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=49.233.48.98,port=6380,state=online,offset=1568,lag=1
slave1:ip=49.233.48.98,port=6381,state=online,offset=1568,lag=1
master_failover_state:no-failover
master_replid:58d7ab187b3d6ee990ff6f416d6123caca7adc11
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1568
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1568
49.233.48.98:6379>
🌟Docker-Compose创建
Docker-Compose安装
1.前往官网下载压缩包,并上传到服务器的/usr/local/bin路径下。
2.重命名文件为docker-compose。
mv docker-compose-Linux-x86_64 docker-compose
3.进行可执行授权。
chmod +x /usr/local/bin/docker-compose
4.检验是否安装成功。
[root@VM-16-11-centos bin]# docker-compose --version
docker-compose version 1.29.2, build 5becea4c
docker-compose.yml文件编写
1.创建redis主从复制存放目录。
mkdir -p /docker/redis
2.进入到目录,编写docker-compose.yml文件。
cd /docker/redis
3.vim编写docker-compose.yml文件编写如下
docker-compose规范与docker对应版本
Compose 文件格式 | Docker 引擎发布版本 |
---|---|
3.8 | 19.03.0+ |
3.7 | 18.06.0+ |
3.6 | 18.02.0+ |
3.5 | 17.12.0+ |
3.4 | 17.09.0+ |
3.3 | 17.06.0+ |
3.2 | 17.04.0+ |
3.1 | 1.13.1+ |
3.0 | 1.13.0+ |
2.4 | 17.12.0+ |
2.3 | 17.06.0+ |
2.2 | 1.13.0+ |
2.1 | 1.12.0+ |
2.0 | 1.10.0+ |
# 指定了Docker Compose 配置文件的版本
version: '3'
# services:服务定义
services:
# 主节点配置
master:
# redis镜像
image: redis
#设置容器的名称为 redis-master
container_name: redis-master
#restart 设置容器的重启策略为始终重启。
restart: always
# 指定容器启动时要执行的命令,这里我们通过 redis-server 启动 Redis 服务器,并设置端口为 6379,设置访问密码为 daencode@top,以及启用 AOF 持久化。
command: redis-server --port 6379 --requirepass daencode@top --appendonly yes
# 将容器内的 6379 端口映射到主机的 6379 端口
ports:
- 6379:6379
# volumes 将容器内的 /data 目录挂载到主机当前目录下的 ./data/master 目录。
volumes:
- ./data/master:/data
#从节点配置
slave1:
image: redis
#从节点容器名称
container_name: redis-slave-1
restart: always
#指定主节点
command: redis-server --slaveof master 6379 --port 6380 --requirepass daencode@top --masterauth daencode@top --appendonly yes
ports:
- 6380:6380
volumes:
- ./data/slave1:/data
# 从节点配置
slave2:
image: redis
#从节点容器名称
container_name: redis-slave-2
restart: always
# 指定主节点
command: redis-server --slaveof master 6379 --port 6381 --requirepass daencode@top --masterauth daencode@top --appendonly yes
ports:
- 6381:6381
volumes:
- ./data/slave2:/data
启动容器
1.启动容器
[root@VM-16-11-centos redis]# docker-compose up -d
Creating redis-slave-1 ... done
Creating redis-slave-2 ... done
Creating redis-master ... done
2.进入到主节点容器,查看节点信息。
[root@VM-16-11-centos redis]# docker exec -it redis-master /bin/bash
root@3f5fef440d59:/data# redis-cli -a daencode@top
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.18.0.3,port=6381,state=online,offset=280,lag=1
slave1:ip=172.18.0.2,port=6380,state=online,offset=280,lag=1
master_failover_state:no-failover
master_replid:76142f6c4c262771e034421a1f9be364819637ed
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:280
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:280
🌟写在最后
有关于Redis搭建主从复制+读写分离的三种方式(普通搭建、Docker搭建、Docker-Compose搭建)到此就结束了。感谢大家的阅读,安装中出现问题,可以在评论区留言。