前言
本文基于:Redis 集群搭建(一):Docker 部署 Redis 以及相关配置信息
配置说明:
redis-master: redis 主库,挂载文件都放在 /data/redis/master
下面,端口号 6379
redis-slave: redis 从库,挂载文件都放在 /data/redis/slave
下面,端口号 6380
原理
Redis主从复制是如何工作的(全量同步)
如果你设置了一个从服务器,在连接时它发送了一个SYNC命令,不管它是第一次连接还是再次连接都没有关系。然后主服务器开始后台存储,并且开始缓存新连接进来的修改数据的命令。当后台存储完成后,主服务器把数据文件发送到从服务器,从服务器将其保存在磁盘上,然后加载到内存中。然后主服务器把刚才缓存的命令发送到从服务器。这是作为命令流来完成的,并且和Redis协议本身格式相同。
部分重新同步(增量同步)
主服务器端为复制流维护一个内存缓冲区。主从服务器都维护一个复制偏移量(replication offset)和master run id ,当连接断开时,从服务器会重新连接上主服务器,然后请求继续复制,假如主从服务器的两个master run id相同,并且指定的偏移量在内存缓冲区中还有效,复制就会从上次中断的点开始继续。如果其中一个条件不满足,就会进行完全重新同步。
master 配置文件
与之前相比并没有什么太多变化,不过从安全考虑,加了个 bind
来限制访问 IP
# RDB 持久化,快照保存频率
# 900秒内,如果超过1个key被修改,则发起快照保存
# 300秒内,如果超过10个key被修改,则发起快照保存
# 60秒内,如果1万个key被修改,则发起快照保存
save 900 1
save 300 10
save 60 10000
# 在进行数据镜像备份时,是否启用rdb文件压缩手段,默认为yes。
rdbcompression yes
# 解决 Redis 被配置为保存数据库快照,但它目前不能持久化到硬盘。用来修改集合数据的命令不能用。
stop-writes-on-bgsave-error no
# 开启 AOF 持久化
appendonly yes
# 设置密码
requirepass 111111
# 限制只接收来自于该IP 地址的请求(安全问题)
bind 0.0.0.0
slave 配置文件
- slaveof: 配置主库的 IP 和端口号
- masterauth: 在主库设置了密码的情况下,从库需要密码进行授权
关于 AOF
,主库开启,从库只需要 1-2 个开启持久化即可
# RDB 持久化,快照保存频率
# 900秒内,如果超过1个key被修改,则发起快照保存
# 300秒内,如果超过10个key被修改,则发起快照保存
# 60秒内,如果1万个key被修改,则发起快照保存
save 900 1
save 300 10
save 60 10000
# 在进行数据镜像备份时,是否启用rdb文件压缩手段,默认为yes。
rdbcompression yes
# 解决 Redis 被配置为保存数据库快照,但它目前不能持久化到硬盘。用来修改集合数据的命令不能用。
stop-writes-on-bgsave-error no
# 开启 AOF 持久化
appendonly yes
# 设置密码
requirepass 111111
# 限制只接收来自于该IP 地址的请求(安全问题)
bind 0.0.0.0
# 指定作为 master 的 redis
slaveof 127.0.0.1 6379
# 设置主库的密码
masterauth 111111
# 设置从库只读
slave-read-only yes
启动容器
挂载文件夹,启动容器
主库启动:
docker run -d --name redis-master -p 6379:6379 -v /data/redis/master/conf/redis.conf:/redis.conf -v /data/redis/master/data:/data redis redis-server /redis.conf
从库启动:
docker run -d --name redis-slave -p 6380:6379 -v /data/redis/slave/conf/redis.conf:/redis.conf -v /data/redis/slave/data:/data redis redis-server /redis.conf
接下来只需要主库新增数据,看看从库是否成功同步即可。
来看一截从库的日志 docker logs 容器ID
关于读写分离
将从库设置为只读后,即为读写分离,可以说这是为后续集群化做铺垫。
集群化后在主从库间进行负载均衡时,由于从库只读,因此写操作只能在主库上进行。
转载:https://blog.csdn.net/qq_37143673/article/details/105435512