一、本次环境使用到了docker、docker-compose、redis
二、我们搭建的主从集群结构如图:
共包含三个节点,一个主节点,两个从节点。
这里我们会在同一台虚拟机中开启3个redis实例,模拟主从集群,信息如下:
IP | PORT | 角色 |
192.168.60.129 | 6379 | master |
192.168.60.129 | 6380 | slave |
192.168.60.129 | 6381 | slave |
三、准备实例和配置
要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。
1)创建目录
我们创建三个文件夹,名字分别叫master、slave1、slave2:
# 创建三个目录
mkdir -p /redis/redis-node/master
mkdir -p /redis/redis-node/slave1
mkdir -p /redis/redis-node/slave2
如图:
2)因为docker启动redis是默认没有配置文件的。我们可以去github下载对应版本的redis.conf配置文件,配置文件内容:这是花费20分钟清除所有注释后的配置文件,建议去直接下载。
bind 0.0.0.0
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes
3)将我们下载好的redis.conf配置文件分别复制到 master slave1 slave2 这三个文件
cp redis.conf /redis/redis-node/master
cp redis.conf /redis/redis-node/slave1
cp redis.conf /redis/redis-node/slave2
4)修改redis.conf一下配置文件
# 修改复制好的这三个配置文件,只需要修改一下配置即可
# 三个配置文件要修改的除了端口(port),其他部分一样
bind 0.0.0.0
protected-mode no
# 三个结点端口分别改成6379(主) 6380(从) 6381(从)
port 6379
logfile "6379.log"
# 注意三个节点的redis.conf配置文件都需要修改,
5)在redis-node文件下创docker-compose.yml文件
6编写docker-compose.yml 文件
version: "3.0" # docker-compose的版本号
networks: #网络配置
redis-sentinel-1:
driver: bridge
services: #所有服务的入口 固定写法
redis-master: #自定义服务名
image: redis:6.2.7 #我们所需要运行的镜像,没有的话,会自定为我们下载
container_name: redis-master #镜像运行后的容器名,自定义
ports:
- 6379:6379 #宿主机的6379映射容器内部的6379端口
volumes: #目录挂载分号 : 右边代表容器内部的目录,分号左边表示宿主机的目录,
- /redis/redis-node/master/redis.conf:/etc/redis/redis.conf
- /redis/redis-node/master/data:/data
command: bash -c "redis-server /etc/redis/redis.conf" #容器启动后,运行的命令
networks:
- redis-sentinel-1
redis-slave-1:
image: redis:6.2.7
container_name: redis-slave-1
ports:
- 6380:6380
volumes:
- /redis/redis-node/slave1/redis.conf:/etc/redis/redis.conf
- /redis/redis-node/slave1/data:/data
# 从主节点同步数据到从节点
command: bash -c "redis-server /etc/redis/redis.conf --slaveof 47.94.85.176 6379"
depends_on:
- redis-master
networks:
- redis-sentinel-1
redis-slave-2:
image: redis:6.2.7
container_name: redis-slave-2
ports:
- 6381:6381
volumes:
- /redis/redis-node/slave2/redis.conf:/etc/redis/redis.conf
- /redis/redis-node/slave2/data:/data
command: bash -c "redis-server /etc/redis/redis.conf --slaveof 47.94.85.176 6379"
depends_on:
- redis-master
networks:
- redis-sentinel-1
7)使用docker-compose up -d启动文件
四、测试
1,查看节点信息(执行info replication查看节点信息)
1)6379主节点信息
2)6380、6381从节点信息
2.进行读写操作
1)主节点
2)从节点
我们可以发现从节点同步了上面主节点添加的数据,同时发现主节点可以进行查询和添加的操作,从节点只能进行查询的操作,进行添加的操作会给出“你没有写入权限”的提示。
五、总结
通过以上的步骤,我们就使用docker-compose搭建了一主两从的redis主从复制的结构,主机用来写,从机用来读。想详细了解其中原理的同学可以去研究研究,主从之间是如何进行建立连接的,全量复制和增量复制又是怎么回事,这种结构有什么优缺点,后面的哨兵模式又是怎么回事?集群如何搭建等等。