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
配置来指定主机密码。
- 开始
redis-cli
连接到从属实例。- 设置
masterauth
配置:config set masterauth master-password
- 设置主机:
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) 在进行数据全量同步时,若同步的数据量较大可能会造卡顿的现象。
- 虽然主从模式存在上述不足,但它仍是实现分布式集群的基础,