目录
Redis主从复制
1、概念
2、Redis 主从复制特点
3、基本操作命令
4、主从复制流程
5、主从复制问题
6、slaveof 命令指定主从服务器
7、关闭主从关系
Redis主从复制是一种数据复制机制,用于在多个Redis服务器之间同步数据。在主从复制中,有一个主服务器(Master)和一个或多个从服务器(Slave)。master以写为主,Slave以读为主,当master数据变化的时候,自动将新的数据异步同步到其它slave数据库。
优点:
1、数据备份:从节点复制主节点的数据,可以作为主节点数据的备份,以应对主节点故障或数据丢失情况。
2、扩展读性能:从节点可以处理读请求,从而减轻主节点的负载,提高整体系统的读性能。
3、故障恢复:当主节点发生故障时,可以将一个从节点升级为主节点,继续提供服务,从而实现快速的故障恢复。
4、读写分离:从节进行读操作,主节点进行写操作。
缺点:
1、延迟:主从复制存在一定的延迟,因为从节点需要异步复制主节点的数据。如果应用对于读取延迟非常敏感,可能会影响用户体验。
2、一致性:主从复制并不能保证强一致性。在主节点写入数据后,数据会异步复制到从节点,期间可能存在数据的不一致性。对于需要强一致性的应用场景,需要额外的措施来处理。
3、单点故障:虽然主从复制提供了高可用性,但主节点仍然是一个单点故障。当主节点宕机时,需要通过手动或自动的方式将从节点切换为新的主节点,这可能引入一定的维护成本和机制。
info replication | 可以查看复制节点的主关系和配置信息 |
REPLICAOF |
用于将当前 Redis 服务器设置为指定主服务器的副本。其中 是主服务器的 IP 地址, 是主服务器的端口号 |
SLAVEOF |
用于将当前 Redis 服务器设置为指定主服务器的从服务器。 是主服务器的 IP 地址, 是主服务器的端口号。如果该数据库已经是某个主数据库的从数据库,那么会停止和原主数据库的同步关系转而和新的主数据库同步。 |
slaveof no one | 用于将当前 Redis 服务器从一个主服务器的从服务器身份转换为独立的主服务器。执行这个命令后,Redis 服务器将不再作为任何主服务器的从服务器,而是成为一个独立的 Redis 服务器。 |
在docker里创建了三个redis容器,端口号分别为6379,6380,6381,以6379为主库
1、修改6379端口的配置文件,找到开启daemonize改为 yes 后台运行,如果命令里带-d参数就不用需改了
2、注释掉bind 127.0.0.1
3、protected-mode修改为 no,当protected-mode为yes时,只允许本地访问,并且拒绝来自外部网络的连接。
4、指定端口号
5、指定当前工作目录,dir
6、 pid文件名字,pidfile
7、Redis的logfile选项用于指定Redis服务器日志文件的路径和文件名。
8、requirepass修改密码
9、dbfilename
是 Redis 配置文件中的一个重要选项,用于指定持久化数据文件的名称。
10、aof文件,appendfilename 非必选,appendfilename
是用于设置增量文件(AOF,Append-Only File)的文件名的选项。AOF 是一种持久化方式,它会记录每个写操作,以便在服务器重启时重新执行这些写操作来恢复数据。主机到第十步即可
11、replicaof
是 Redis 配置文件中的一个重要选项,用于配置主从复制(master-slave replication)。在 Redis 中,主从复制允许一个 Redis 服务器(称为主服务器)将其数据实时地复制到一个或多个其他 Redis 服务器(称为从服务器)上。
从机前面与主机相同,加一个访问主机的通行密码masterauth和主机IP:replicaof
docker run -d \
-p 6380:6380 \
-v /usr/local/redis/data6380:/data \
-v /usr/local/redis/conf6380/redis6380.conf:/etc/redis/redis.conf \
-v /usr/local/redis/6380log:/var/log/redis \
--name redis6380 \
--restart=always \
redis:7.2 redis-server /etc/redis/redis.conf --logfile /var/log/redis/redis.log
docker run -d \
-p 6381:6381 \
-v /usr/local/redis/data6381:/data \
-v /usr/local/redis/conf6381/redis6381.conf:/etc/redis/redis.conf \
-v /usr/local/redis/6381log:/var/log/redis \
--name redis6381 \
--restart=always \
redis:7.2 redis-server /etc/redis/redis.conf --logfile /var/log/redis/redis.log
docker run -d \
-p 6382:6382 \
-v /usr/local/redis/data6382:/data \
-v /usr/local/redis/conf6382/redis6382.conf:/etc/redis/redis.conf \
-v /usr/local/redis/6382log:/var/log/redis \
--name redis6382 \
--restart=always \
redis:7.2 redis-server /etc/redis/redis.conf --logfile /var/log/redis/redis.log
配置好后分别启动
如果 报以下错误通常是由于Redis进程在容器中没有足够的权限来写入指定的日志文件路径而引起的。
*** FATAL CONFIG FILE ERROR (Redis 7.2.3) *** Can't open the log file: Permission denied
使用以下命令来更改目录权限:
sudo chmod -R 777 /usr/local/redis/6380log
进入6379进程使用命令查看是否存在主从关系
#在Redis容器中执行交互
docker exec -it redis6379 bash
redis-cli -a 123456
或者
docker exec -it redis6379 redis-cli -a 123456
#查看主从关系
info replication
进入从机查看关系
docker exec -it redis6380 redis-cli -a 112233 -p 6380
从机可以执行写的命令吗?
答:不能
从机宕机后是从头开始复制还是从切入点开始复制?
答:从头开始复制
主机宕机后,从机可以上位吗?
答:从机不动,原地待命,从机数据可以正常使用;等待主机重启动归来
主机宕机后,重启后主从关系还在吗?从机还能否顺利复制?
答:在的可以顺利复制
先注释掉监听的端口
然后重启redis容器
结果他们3个都是主机
使用slaveof 命令指定主从服务器
slaveof 新主库IP 新主库端口
slaveof 192.168.200.129 6379
重新启动6380
结果不再有主从关系
即当主机又当从机
上一个从机可以是下一个从机的主机,从机同样可以接收其他从机的连接和同步请求,那么该从机作为了链条中下一个的主机,可以有效减轻主主机的写压力。例如A是B的主机,B又是C的主机
中途变更转向:会清除之前的数据,重新建立拷贝最新的
slaveof 新主库IP 新主库端口
slaveof 192.168.200.129 6379
slaveof no one