Redis进阶:Redis的主从复制机制

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主从复制工作流程

  1. 从节点连接上主节点。通PING指令访问主节点。
  2. 主从节点通过PSYNC指令发送旧的replicationID和偏移量。
  3. 主节点通过该方式发送从节点需要的增量数据。如果从节点没有历史记录的replicationID和偏移量,就会进行一个全量同步。

全量复制流程:

  1. 主节点服务启动,开启持久化,产生RDB文件。
  2. 主节点接受客户端的操作指令,并进行缓冲数据。
  3. 主节点保存完成数据时, 主节点将数据集文件传输给从节点。
  4. 从节点将保存接受到的数据集文件在磁盘上,然后加载文件到内存。实现主从复制。

主从复制有一定的窗口期,可以通过下面的参数进行配置:

min-replicas-to-write 复制到写<number of replicas>
min-replicas-max-lag 最小复制最大延迟<number of seconds>

主从复制的数据过期问题

  • 从节点不会主动触发过期的Key的删除工作,而是在主节点进行删除过期数据,然后在同步到从节点上。
  • 在执行Lua脚本时,不会执行任何Key的过期操作。这可以防止 key 在脚本中间过期,保证将相同的脚本发送到从节点 ,从而在使主从节点的数据集保持一致。

故障转移

当主节点在出现故障后,此时就需要提升从节点升级为主节点,这时就需要手动切换,而且存在较大的风险,同时还要改一堆的程序配置,Redis提供了哨兵机制进行自动故障转移,下期我们在具体介绍。

以上就是Redis中主从复制操作的相关介绍了,更多其他指令可以参考官网,Redis官网,谢谢阅读,希望对你有所帮助。

posted @ 2019-12-03 18:01  进击的大兵  阅读(434)  评论(0编辑  收藏  举报