Redis集群-主从复制

一:Redis主从模式的由来

Redis是一种内存数据库,内存读写都非常的快,一般都是写少读多,但是内存再快也扛不住大量用户同时访问,因此Redis在2.8版本之前推出了主从模式用于解决读的性能问题。和MySQL主从复制一样,Redis也支持主从复制,Redis主从模式通常是一个主服务器Master和多个从服务器Slaver,每个从服务器上还可以再挂从服务器,一般主服务器用于写,从服务器用于读。Redis主从复制分为全量同步和增量同步,全量复制一般发生在slaver初始化时如第一次启动或者master服务器宕机后重新连接上master服务器。

Redis集群-主从复制_第1张图片

二:主从模式优缺点

优点:

  1. 解决数据备份的问题。
  2. 做到了读写分离,大大提高了读的性能。
  3. 故障恢复:当master出现问题时,由slaver提供服务,实现快速故障恢复

缺点:
4. 如果主节点故障下线,那么需要显式的手动将某个从服务器升级为主服务器。
5. 因为只有主服务器可以进行同时读写操作,所以客户端只能连接主服务器,在创建redis实例的时候需要指定主服务器的ip地址和端口号,一旦主服务器宕机被切换成别的从服务器时那么必须手动修改master服务器的ip和端口,然后重新启动项目。

  1. 主服务器的内存大小是有限制的,当内存块耗尽时不能动态的扩容。

三:Redis主从复制流程

Redis全量复制一般发生在Slaver初始化阶段,这时Slave需要将Master上的所有数据都复制一份,具体步骤如下:

  1. 从服务器连接主服务器,发送SYNC同步命令。
  2. 主服务器收到从服务器发送的SYNC命令后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有命令。
  3. 主服务器执行完BGSAVE命令后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令。
  4. 从服务器收到快照文件后丢弃所有的旧数据,将快照文件重新加载进来。
  5. 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲器的写命令。

Redis集群-主从复制_第2张图片

四:Redis 基本命令

# 查看redis的版本号
redis-server -v

# 查看redis的配置
info
# 查看redis配种中的集群相关配置
info replication

# 关闭redis服务并退出客户端
shutdown

五:单台计算机主从模式配置

这里是使用的一台计算机启动多个redis实例的方式来实现主从模式的,所以需要创建多个配置文件,并且需要修改每个配置文件的端口号、日志文件名、数据库文件名等参数,如果使用三台虚拟机来配置主从模式这些参数都不需要修改,只需要在从服务器配置中增加slaveof 这一项配置即可实现主从复制功能。

1. redis-master-6379.conf

bind 0.0.0.0
port 6379
logfile "6379.log"
dbfilename "dump-6379.rdb"
# 是否以守护线程方式启动,yes表示是,no表示否即前台启动。
daemonize yes
# 是否压缩文件
rdbcompression yes
# redis 密码
requirepass 123456

# 设置复制缓冲区大小
repl-backlog-size 1mb

2. redis-slaver-6380.conf

bind 0.0.0.0
port 6380
logfile "6380.log"
dbfilename "dump-6380.rdb"
daemonize yes
rdbcompression yes
# 主从复制对应的命令
slaveof 192.168.1.5 6379
masterauth 123456

3. redis-slaver-6381.conf

bind 0.0.0.0
port 6381
logfile "6381.log"
dbfilename "dump-6381.rdb"
daemonize yes
rdbcompression yes
slaveof 192.168.1.5 6379
masterauth 123456

4. 分别启动一主两从服务器

redis-server /usr/local/etc/redis/redis-master-6379.conf
redis-server /usr/local/etc/redis/redis-slaver-6380.conf
redis-server /usr/local/etc/redis/redis-slaver-6381.conf

ps -ef | grep redis

5. 分别启动三个客户端

# 如果是三台虚拟机就需要指定每个ip地址, -a表示密码
redis-cli -h 127.0.0.1 -p 6379 -a 123456
redis-cli -h 127.0.0.1 -p 6380
redis-cli -h 127.0.0.1 -p 6381

6. 在master服务器上设置一个键在从服务器上获取

在这里插入图片描述
info replication 命令用于查看info配置中的集群replication相关配置。
Redis集群-主从复制_第3张图片

7. 从服务器默认只能读不能写

从服务器默认情况下只能读不能写,但是如果非要写可以设置参数replica-read-only no来开启, 注册模式下从服务器写没有多大意义,而且写到从服务器上的数据又不能反向同步到主服务器。
Redis集群-主从复制_第4张图片

8. redis默认使用rdb方式持久化

redis默认是使用rdb方式进行持久化操作的,如果想取消持久化操作可以使用 config set save "" 来设置。
Redis集群-主从复制_第5张图片

9. 主节点必须持久化,否则会丢失数据

主节点设置一个key, 两个从节点都可以获取到值,在主节点执行shutdown命令来关闭主节点, 此时再从从节点获取仍然能获取到。
Redis集群-主从复制_第6张图片

重新启动master服务,然后连上master服务器,再获取age值,此时为nil而且两个从服务器中的age值都丢失了。
Redis集群-主从复制_第7张图片

slaver服务器为什么会丢失数据呢?当master服务器挂掉重启之后,从服务器会丢掉所有数据,然后从master服务器以全量同步方式重新加载一份最新的数据,因master服务器上的数据没有做持久化操作master上就直接丢掉了数据这也导致从服务器上的数据丢失。所以主从模式主服务器必须设置成持久化以防数据丢失

六: 手动切换主从服务器

# 从服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃
> slaveof no one
> 
# 将当前服务器设置为指定服务器的从属服务器(slave server)。
slaveof 192.168.200.108 6379

Redis集群-主从复制_第8张图片

你可能感兴趣的:(Redis)