redis学习-28- Redis Cluster主从模式

31.Cluster主从模式

  • 在软件的架构中,主从模式(Master-Slave)是使用较多的一种架构。主(Master)和从(Slave)分别部署在不同的服务器上,当主节点服务器写入数据时,根据配置和策略,同时也会将数据同步至从节点服务器,通常情况下,主节点负责写入数据,而从节点负责读取数据。

  • 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/reader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

  • 电商网站上的商品,一般都是一次上传,无数次浏览的,说专业点也就是"多读少写”。
    对于这种场景,我们可以使如下主从模式的架构:
    在这里插入图片描述

  • 主从复制的作用主要包括:
    1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据沉余方式。
    2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复:实际上是一种服务的冗余。
    3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载:尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
    4、高可用(指集群)基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

  • Redis 主机会一直将自己的数据复制给 Redis 从机,从而实现主从同步。在这个过程中,只有 master 主机可执行写命令,其他 salve 从机只能执行读命令,这种读写分离的模式可以大大减轻 Redis 主机的数据读取压力,从而提高了Redis 的效率,并同时提供了多个数据备份。主从模式是搭建 Redis Cluster 集群最简单的一种方式。最低配的redis集群配置1主2从结构。

  • 架构中经常使用:主从复制,读写分离,线上项目80%的情况下都是在进行读操作,用来减缓服务器的压力!只要在公司中,主从复制就是必须要使用的,因为在真实的项目中不可能单机使用Redis。

  • 注意:

一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的(存在宕机故障),原因如下:
1、从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;
2、从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有内存用作Redis存储内存,一般来说,单台Redisi最大使用内存不应该超过20G。

31.1 主从模式实现
  • Redis 提供了两种实现主从模式的方法,都遵循只配置从库,主库不用配置。为了方便演示,我们只从一台机器上搭建主从模式。
3.1.1 使用命令实现
  • 使用命令在服务端搭建主从模式(暂时),其语法格式如下:
redis-server --port <slave-port> --slaveof <master-ip> <master-port>
  • 在win平台进行该测试,执行以下命令:
#开启开启一个port为6300的从机,它依赖的主机port=6379
$ redis-server --port 6300 --slaveof 127.0.0.1 6379
  • 主机日志/从机启动同步日志,输出结果如下图:
    在这里插入图片描述在这里插入图片描述
  • 接下来开启客户端,并执行查询命令,如下所示:
CNCLUKZK@LAPTOP-HGE63E13 MINGW64 /e/software/Redis
$ redis-cli -p 6300
#查看所有key
keys *
user:1
myresult
counter:__rand_int__
height
myset:__rand_int__
mylist
key:__rand_int__
height1
listocntext
course
title
lesson
#查看key为title的值
get title
redis
#不能执行写命令
set title redis-slave
READONLY You can't write against a read only replica.

注意:此时 port=6300 的服务端界面不能关闭。从上述命令可以看出,port =6300 的从机,完全备份了主机的数据,它可以执行查询命令,但是不能执行写入命令。

  • 观察服务端的话,会看到以下提示:
$ redis-server --port 6300 --slaveof 127.0.0.1 6379
[20440] 16 Dec 23:09:26.939 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
[20440] 16 Dec 23:09:26.939 # Redis version=5.0.14.1, bits=64, commit=ec77f72d, modified=0, pid=20440, just started
[20440] 16 Dec 23:09:26.939 # Configuration loaded
[20440] 16 Dec 23:09:26.943 * Running mode=standalone, port=6300.
#服务初始化
[20440] 16 Dec 23:09:26.943 # Server initialized
[20440] 16 Dec 23:09:26.943 * DB loaded from disk: 0.000 seconds
#准备连接
[20440] 16 Dec 23:09:26.943 * Ready to accept connections
#连接到主服务器
[20440] 16 Dec 23:09:26.943 * Connecting to MASTER 127.0.0.1:6379

#启动副本同步
[20440] 16 Dec 23:09:26.943 * MASTER <-> REPLICA sync started

#自动触发SYNC命令,请求同步数据
[20440] 16 Dec 23:09:26.944 * Non blocking connect for SYNC fired the event.
[20440] 16 Dec 23:09:26.944 * Master replied to PING, replication can continue...
[20440] 16 Dec 23:09:26.945 * Partial resynchronization not possible (no cached master)
[20440] 16 Dec 23:09:26.951 * Full resync from master: 8c2948da7b782fc7b042d374379d2722757cd5df:0

#从主机接受了数据,并将其存在于磁盘
[20440] 16 Dec 23:09:27.122 * MASTER <-> REPLICA sync: receiving 2099 bytes from master

#清空原有数据
[20440] 16 Dec 23:09:27.124 * MASTER <-> REPLICA sync: Flushing old data

#将磁盘中数据载入内存
[20440] 16 Dec 23:09:27.124 * MASTER <-> REPLICA sync: Loading DB in memory

 #同步数据完成
[20440] 16 Dec 23:09:27.125 * MASTER <-> REPLICA sync: Finished with success

  • 可以看出主从模式下,数据的同步是自动完成的,这个数据同步的过程,又称为全量复制。

  • 也可以使用下面的命令来创建主从模式。启动一个服务端,并指定端口号:

#指定端口号为6400,不要关闭
redis-server --port 6400
  • 打开一个客户端,连接服务器,如下所示:
CNCLUKZK@LAPTOP-HGE63E13 MINGW64 /e/software/Redis
#连接port=6400的服务器
$ redis-cli -p 6400
#现在处于主机模式下,所以允许读写数据
keys *
height
lesson
user3
course
user7
mylist
counter:__rand_int__
key:__rand_int__
listocntext
myresult
user4

#修改key为title的值
set title redis-slave
OK

#设置连接主机密码
config set 127.0.0.1 master-password	
#将当前服务器设置成从服务器,从属于6379。之后会进行主从库数据同步操作
slaveof 127.0.0.1 6379
OK
#在从机模式下
keys *
user:1
myresult
listocntext
height
title
mylist
myset:__rand_int__
counter:__rand_int__
lesson
key:__rand_int__
course
height1

#写入命令执行失败
set title redis
READONLY You can't write against a read only replica.

#查看当前从库信息命令。
127.0.0.1:6400> info replication
# Replication
role:slave		#从机
master_host:127.0.0.1	#主机地址
master_port:6379	#主机端口
master_link_status:down
...
repl_backlog_histlen:0
(1.62s)

#查看之前主库信息
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
#从库地址端口信息
slave0:ip=127.0.0.1,port=6400,state=online,offset=154,lag=0
master_replid:fcc54fdef7377fed0fad8076d2d54b339004193f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:154
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:154

#再次切换为主机模式,执行下面命令
slaveof no one
OK
#写入成功
set title redis
OK

#返回主机查看服务连接消息

  • 在主从复制的集群种查看当前库信息命令。每次与master断开以后,都须要从新链接,除非你配置进redis.conf文件。
127.0.0.1:6379> info replication
# Replication
role:master			#角色
connected_slaves:0	#连接从机个数
master_failover_state:no-failover
master_replid:bebcedc3f1a0a8fa4e82427bf1ef79ccf72db19e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

  • 上述示例中,主要使用了以下几个命令,如下所示:
slaveof IP PORT #设置从服务器
slaveof no one  #使服务器切换为独立主机
info replication	#查看当前库信息
  • 问题:用一份redis.conf分别启动了两个redis节点,在不编辑配置文件的情况下,使用redis命令,例如slaveof,来动态配置redis节点。

如果 redis 节点没有 ‘auth’,即 redis.conf 中没有“requirepass”,则从 redis 节点上的以下命令将起作用:

#win平台
#方式1:
redis-server --port <slave-port> --slaveof <master-ip> <master-port>
#方式2:
redis-server --port 6400		#另启动服务,无密码
redis-cli -p 6400				#开启客户端
slaveof 127.0.0.1 6379			#主从连接命令

但是如果 master 是加密的,这将不起作用:解决方法:

在启动redis服务后设置masterauth配置来指定主机密码。

  1. 开始redis-cli连接到从属实例。
  2. 设置masterauth配置:config set masterauth master-password
  3. 设置主机: slaveof redis-master master-port
3.1.2 修改配置文件实现
  • 默认情况下每台redis服务器都是主节点。每个 Redis 服务器都有一个与其对应的配置文件,通过修改该配置文件也可以实现主从模式(永久),下面在 centos环境下对该方法进行演练。

注意: 如果redis配置了requirepass,配置主从复制的时候会失败,一定要设masterauth;或者注销掉密码。

[root@localhost RedisBloom-2.2.9]# cd /usr/local/redis/conf
#新建 redis_6302.conf 文件
[root@VM-0-3-centos conf]# cp redis.conf redis_6500.conf

#添加以下配置信息:
[root@VM-0-3-centos conf]# vi redis_6500.conf
#指定主机的ip与port,此例是配置的本机,可以配置别的远程服务器
replicaof 127.0.0.1 6379
#指定从机的端口,若配置别的远程服务器,那端口可以不用改
port 6302 
#连接主服务器的密码
masterauth <master-password> 

#不同的主从机需要对以下内容进行区别
port	6379 #端口号
pidfile	 /var/run/redis_6379.pid		#对应自己端口的pid
logfile  “6379.log”	#日志文件需要重命名
dbfilename dumo6400.rdb	 #持久化文件名需要重命名
appendfilename "appendonly.aof"		#若打开aof持久化模式
#启动 Redis 服务器,执行以下命令:
[root@VM-0-3-centos conf]# redis-server redis_6500.conf

#客户端连接服务器,并进行简单测试。执行以下命令:
[root@VM-0-3-centos conf]# redis-cli -p 6500
127.0.0.1:6500> ping
(error) NOAUTH Authentication required.
127.0.0.1:6500> auth xxxxxxx
OK
127.0.0.1:6500> keys *
 1) "mybit"
 2) "height1"
 3) "u1:name"
 4) "myhash"
 5) "us:name"
 6) "counter:__rand_int__"
 7) "user"
 8) "height"
 9) "lesson"
10) "height2"
11) "url"
12) "key:__rand_int__"
13) "city"
14) "user:1"
15) "mylist"
16) "weight"
17) "value"
18) "num"
19) "course"
127.0.0.1:6500> get num
"63"
#写入失败
127.0.0.1:6500> set num 100
(error) READONLY You can't write against a read only replica.


#关闭redis从服务器,在linux控制行输入
redis-cli -a <slave-password> shutdown
#或在redis命令行输入
shutdown

**提示:**通过命令搭建主从模式,简单又快捷,所以不建议使用修改配置文件的方法。

**注意:**上述测试是在redis服务器本机上执行,若想通过客户端工具远程链接redis从服务器,则需要在服务器的防火墙开启6500端口,若是云服务器还需在安全组开启6500端口

3.1.1 层级链路结构
  • 从节点的主节点是上一个主节点的从节点,如下图所示6500是6600的主节点,但又是6379的从节点,最后其本质还是个从节点,只能读数据,无法写数据,但数据会从6379传递到6500,在从6500传递到6600.这样可以进行主从复制。

  • Slave一样能够接收其余slaves的链接和同步请求,那么该slave做为了链条中下一个的master,能够有效减轻master的写压力(去中心化)。中途变动转向:会清除以前的数据,从新创建拷贝最新的。
    在这里插入图片描述

  • 如果主机6379断开了连接,可以使用SLAVEOF no one让某台从机变成主机!其他的节点就可以手动连接到最新的这个主节点(手动)。如果这个时候原主机修复了,那就重新连接!(在哨兵模式前手动恢复主机设置)

31.2 主从数据同步
  • 主机断开连接,从机是依旧连接到主机的,但是没有写操作,这个时候,主机恢复了,从机依旧可以直接获取到主机写的信息!
  • 如果是使用命令行配置的主从,这个时候如果从机重启了,就会变回主机,无法读取主机数据。只有变为从机,立马就会从主机中获取值!
  • slave启动功连接到master以后会发送一个Sync同步命令,master接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完华之后,master将传送整个数据库快照传送到slave,完成一次完全同步,等从机载入完,再发缓存区的命令给从机执行。
  • 全量复制:第一次同步slave服务在接受到主库文件数据后,将其存盘并加载到内存中。
  • 增量复制:之后Master继续将新的所有收集到的修改命令依次传给slave,完成同步,即从切入点进程复制不需要从头复制。
  • 只要是重新连接master,一次完全网步(全量复别)将被自动执行
31.3 主从模式不足
  • 主从模式并不完美,它也存在许多不足之处,下面做了简单地总结:
    • 1) Redis 主从模式不具备自动容错和恢复功能,如果主节点宕机,Redis 集群将无法工作,此时需要人为干预,将从节点提升为主节点。
    • 2) 如果主机宕机前有一部分数据未能及时同步到从机,即使切换主机后也会造成数据不一致的问题,从而降低了系统的可用性。
    • 3) 因为只有一个主节点,所以其写入能力和存储能力都受到一定程度地限制。
    • 4) 在进行数据全量同步时,若同步的数据量较大可能会造卡顿的现象。
  • 虽然主从模式存在上述不足,但它仍是实现分布式集群的基础,
下一篇:redis学习-29- Redis Sentinel哨兵模式
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值