Redis进阶:Redis的主从复制机制
主从复制机制介绍
单机版的Redis存在性能瓶颈,Redis通过提高主从复制实现读写分离,提高了了Redis的可用性,另一方便也能实现数据在多个Redis直接的备份。
配置一主多从
准备配置文件
本文示例是在同一台机器上启动3个Redis实例。实现一主多从,多个IP地址方式也一样,只需求修改配置文件的maste的ip地址和端口就行,这里就不在赘述了。
# 复制配置文件Redis6379.conf
[root@localhost redis-5.0.7]# cp redis6379.conf redis6380.conf
[root@localhost redis-5.0.7]# cp redis6379.conf redis6381.conf
至此我们准备了3个配置文件,供后面使用。
修改配置文件
修改主配置文件
# 修改Redis6379配置文件
[root@localhost redis-5.0.7]# vi redis6379.conf
# 修改如下部分增加密码验证
# requirepass foobared
requirepass enjoyitlife
修改从服务配置文件。
# 修改redis6380.conf配置文件
[root@localhost redis-5.0.7]# vi redis6380.conf
# 修改端口
port 6380
# 修改日志文件
logfile "redis6380.log"
# 修改pidfile
pidfile /var/run/redis_6380.pid
# 配置主服务的地址和端口 关键配置
replicaof 127.0.0.1 6379
#主开启密码验证时 从服务器也需要配置验证密码
masterauth enjoyitlife
redis6381.conf 也要按照上面的配置配置一遍。将上面的6380修改为6381即可。
启动服务
# 启动主服务 和 从服务
[root@localhost redis-5.0.7]# src/redis-server redis6379.conf
[root@localhost redis-5.0.7]# src/redis-server redis6380.conf
[root@localhost redis-5.0.7]# src/redis-server redis6381.conf
# 查看进程
[root@localhost redis-5.0.7]# ps -ef | grep redis
root 7684 1 0 10:55 ? 00:00:07 srcredis-server 127.0.0.1:6379
root 7689 1 0 10:55 ? 00:00:07 srcredis-server 127.0.0.1:6380
root 7762 1 0 11:41 ? 00:00:00 srcredis-server 127.0.0.1:6381
root 7767 7721 0 11:44 pts/2 00:00:00 grep --color=auto redis
此时,我们的Redis主从复制服务已经搭建完成,6379为主服务,6380、6381为从服务。这里需要注意是,从服务只支持读操作,只有主服务节点才支持写、更新、删除操作。
这是通过配置的方式,还有一种方式是直接在从节点客户端输入指令:replicaof 127.0.0.1 6379
,这种方式也可以实现主从复制,但是这种方式服务Redis重启后就会失效。
另外之前的Redis的主从复制指令是通过slaveof ,现在已经替换为replicaof ,主要是因为slave有奴隶的意思,Redis的开发者们觉得不大友好,所以用replicaof 来替换了原来的指令。建议以后直接使用replicaof指令。
功能验证
可以通过info relication指令,查看主从配置信息。
# 功能验证 连接主服务客户端 输入如下指令
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2 # 可以看到当前已经上线了2个从服务节点
slave0:ip=127.0.0.1,port=6380,state=online,offset=126,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=126,lag=1
master_replid:76d6f75c4b5a59baf39473dc3f94352bebc9158f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:126
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:126
# 在从节点 输入指令
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:1204
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:76d6f75c4b5a59baf39473dc3f94352bebc9158f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1204
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1204
在主服务节点 设置一个属性,然后在从节点进行查询。
# 主节点设置属性
127.0.0.1:6379> set name "hello Redis Replication"
OK
#从节点 获取属性
127.0.0.1:6380> get name
"hello Redis Replication"
127.0.0.1:6381> get name
"hello Redis Replication"
主从复制关键点
- Redis使用异步复制,主节点和从节点是异步地处理的数据流的同步。
- 一个主服务可以有N个从节点。
- 从节点可以继续有从节点,形成复制链。
- Redis的复制在主节点是非阻塞的,可以在同步的同时处理其他请求。
- 复制在从节点也是非阻塞的,但如果是初次同步大数据量时,从节点会有一个窗口期,此时会阻塞从节点的对其他请求的处理。
- 如果主节点没开启持久化,一旦主节点重启,从节点和主节点都会丢失数据。所以建议主节点和从节点都启用持久化,同时要配置实例防止重置后自动重启。
Redis主从复制工作流程
- 从节点连接上主节点。通PING指令访问主节点。
- 主从节点通过PSYNC指令发送旧的replicationID和偏移量。
- 主节点通过该方式发送从节点需要的增量数据。如果从节点没有历史记录的replicationID和偏移量,就会进行一个全量同步。
全量复制流程:
- 主节点服务启动,开启持久化,产生RDB文件。
- 主节点接受客户端的操作指令,并进行缓冲数据。
- 主节点保存完成数据时, 主节点将数据集文件传输给从节点。
- 从节点将保存接受到的数据集文件在磁盘上,然后加载文件到内存。实现主从复制。
主从复制有一定的窗口期,可以通过下面的参数进行配置:
min-replicas-to-write 复制到写<number of replicas>
min-replicas-max-lag 最小复制最大延迟<number of seconds>
主从复制的数据过期问题
- 从节点不会主动触发过期的Key的删除工作,而是在主节点进行删除过期数据,然后在同步到从节点上。
- 在执行Lua脚本时,不会执行任何Key的过期操作。这可以防止 key 在脚本中间过期,保证将相同的脚本发送到从节点 ,从而在使主从节点的数据集保持一致。
故障转移
当主节点在出现故障后,此时就需要提升从节点升级为主节点,这时就需要手动切换,而且存在较大的风险,同时还要改一堆的程序配置,Redis提供了哨兵机制进行自动故障转移,下期我们在具体介绍。
以上就是Redis中主从复制操作的相关介绍了,更多其他指令可以参考官网,Redis官网,谢谢阅读,希望对你有所帮助。