Redis集群-主从复制

一:Redis主从模式的由来

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

在这里插入图片描述

二:主从模式优缺点

优点:

  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 基本命令

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

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

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

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

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

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相关配置。
在这里插入图片描述

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

从服务器默认情况下只能读不能写,但是如果非要写可以设置参数replica-read-only no来开启, 注册模式下从服务器写没有多大意义,而且写到从服务器上的数据又不能反向同步到主服务器。
在这里插入图片描述

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

redis默认是使用rdb方式进行持久化操作的,如果想取消持久化操作可以使用 config set save "" 来设置。
在这里插入图片描述

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

主节点设置一个key, 两个从节点都可以获取到值,在主节点执行shutdown命令来关闭主节点, 此时再从从节点获取仍然能获取到。
在这里插入图片描述

重新启动master服务,然后连上master服务器,再获取age值,此时为nil而且两个从服务器中的age值都丢失了。
在这里插入图片描述

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

六: 手动切换主从服务器

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

在这里插入图片描述

七:三主三从

配置文件的目录:/usr/local/etc/redis/
redis-6379.conf

bind 127.0.0.1
port 6379
dir /usr/local/var/db/redis/
logfile "redis-6379.log"
dbfilename "dump-6379.rdb"
pidfile /var/run/redis_6379.pid
daemonize yes
rdbcompression yes

appendonly yes
appendfsync everysec
appendfilename "appendonly-6379.aof"

# cluster
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 10000

# 密码
#requirepass 123456
#masterauth 123456

redis如果需要开启密码需要打开密码配置,如果打开密码所有节点都要配置密码。


redis-6380.conf

bind 127.0.0.1
port 6380
dir /usr/local/var/db/redis/
logfile "redis-6380.log"
dbfilename "dump-6380.rdb"
pidfile /var/run/redis_6380.pid
daemonize yes
rdbcompression yes

appendonly yes
appendfsync everysec
appendfilename "appendonly-6380.aof"

cluster-enabled yes
cluster-config-file nodes-6380.conf
cluster-node-timeout 10000


redis-6381.conf

bind 127.0.0.1
port 6381
dir /usr/local/var/db/redis/
logfile "redis-6381.log"
dbfilename "dump-6381.rdb"
pidfile /var/run/redis_6381.pid
daemonize yes
rdbcompression yes

appendonly yes
appendfsync everysec
appendfilename "appendonly-6381.aof"

cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 10000


redis-6382.conf

bind 127.0.0.1
port 6382
dir /usr/local/var/db/redis/
logfile "redis-6382.log"
dbfilename "dump-6382.rdb"
pidfile /var/run/redis_6382.pid
daemonize yes
rdbcompression yes

appendonly yes
appendfsync everysec
appendfilename "appendonly-6382.aof"


cluster-enabled yes
cluster-config-file nodes-6382.conf
cluster-node-timeout 10000


redis-6383.conf

bind 127.0.0.1
port 6383
dir /usr/local/var/db/redis/
logfile "redis-6383.log"
dbfilename "dump-6383.rdb"
pidfile /var/run/redis_6383.pid
daemonize yes
rdbcompression yes

appendonly yes
appendfsync everysec
appendfilename "appendonly-6383.aof"

cluster-enabled yes
cluster-config-file nodes-6383.conf
cluster-node-timeout 10000


redis-6384.conf

bind 127.0.0.1
port 6384
dir /usr/local/var/db/redis/
logfile "redis-6384.log"
dbfilename "dump-6384.rdb"
pidfile /var/run/redis_6384.pid
daemonize yes
rdbcompression yes

appendonly yes
appendfsync everysec
appendfilename "appendonly-6384.aof"


cluster-enabled yes
cluster-config-file nodes-6384.conf
cluster-node-timeout 10000

# 创建集群,--cluster-replicas 1指定从库数量1,创建顺序三主-三从。即主-主-主-从-从-从
# -a 密码,如果设置里密码需要此参数, 如 -a 123456 
redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 
	127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1
# kill所有redis-server 
ps -ef|grep redis-server|awk '{print $2}'|xargs kill -9

# 清空/usr/local/var/db/redis/目录下的所有文件,最主要的是*.aof,*.rdb,
# 重启所有redis服务

在这里插入图片描述

# -a Redis密码, -h指定IP, -p端口, -c表示集群模式
# 注意:可能会redirected进入到其它server
redis-cli -h 127.0.0.1 -p 6379 -c
redis-cli -a 123456 -h 127.0.0.1 -p 6379 -c

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风流 少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值