文章目录
- redis的主从复制
- 1、配置主1从2
- 1.1、通过配置文件配置
- 1.2、通过命令配置主1从2
- 2、哨兵模式
- 2.1、配置1主2从3个哨兵
- 2.2、springboot整合sentinel
redis的主从复制
redis的主从复制是值主机更新后根据配置和策略,自动同步到备机的master/slave机制,Master以写为主,Slave以读为 主。一个master可以有多个slave。
通过主从复制可以实现:
- 读写分离,性能扩展,降低主服务器的压力
- 容灾,快速恢复,主机挂掉时,从机变为主机
**使用主从复制的原因:**避免单点故障。
单点故障:指由于redis服务器无法正常访问,导致redis存储的数据无法读取
配置了主从复制的redis,主机可以读数据,也可以写入数据,但是从机只能读数据,不能写数据。
1、配置主1从2
此处通过配置不同的端口号来区分主机和从机,实际应用是在不同的服务器上配置ip地址来实现。这里配置3台机器,主1从2。
角色 | 端口 |
master(主 | 6379 |
slave1(从) | 6380 |
slave2(从) | 6381 |
主从复制原理:
- slave启动成功连接到master后,会给master发送数据同步消息(发送sync命令)
- master接收到slave发来的数据同步消息后,把主服务器的数据进行持久化到rdb文件,同时会收集接收到的用于修改数据的命令,master将传rdb文件发送给你slave,完成一次完全同步
- 全量复制:而slave服务在接收到master发来的rdb文件后,将其存盘并加载到内存
- 增量复制:master继续将收集到的修改命令依次传给slave,完成同步 但是只要重新连接master,一次完全同步(全量复制)将会被自动执行
1.1、通过配置文件配置
- 创建工作目录
通过命令创建目录,本次所有操作均在此目录中执行
mkdir /opt/master-slave
cd /opt/master-slave/
- 安装三台redis服务器在master-slave目录中,分别是6379,6380,6381(为了区分是哪台机器),安装过程见redis基本概念及环境配置,使用压缩包安装。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9KMfHuZs-1652319870658)(images\7、redis的主从复制\image-20220429191008541.png)] - 进入redis安装文件目录把redis安装文件里的redis.conf文件复制到master-slave目录
cp redis.conf /opt/master-slave/
- 创建master(主机)的配置文件
redis-6379.cof
,内容如下
# redis.conf是redis原配置文件,内部包含了很多默认的配置,这里使用include将其引用,相当于把redis.conf内容直接贴进来了
include /opt/master-slave/redis.conf
# 使用后台启动
daemonize yes
# 配置ip地址
bind 192.168.170.131
# 配置密码
requirepass 123456
dir /opt/master-slave/
logfile /opt/master-slave/6379.log
# 端口
port 6379
#rdb文件
dbfilename dump_6379.rdb
# pid文件
pidfile /var/run/redis_6379.pid
- 创建slave1(从机)的配置文件
redis-6380.conf
,主要内容和master一致,只是多了从机的配置信息,内容如下
include /opt/master-slave/redis.conf
daemonize yes
bind 192.168.170.131
requirepass 123456
dir /opt/master-slave/
port 6380
dbfilename dump_6380.rdb
pidfile /var/run/redis_6380.pid
logfile /opt/master-slave/6380.log
# 用来指定主机:slaveof 主机ip 端口
slaveof 192.168.170.131 6379
# 主机的密码
masterauth 123456
- 创建slave2(从机)的配置文件
redis-6381.conf
,内容如下
include /opt/master-slave/redis.conf
daemonize yes
bind 192.168.170.131
requirepass 123456
dir /opt/master-slave/
port 6381
dbfilename dump_6381.rdb
pidfile /var/run/redis_6381.pid
logfile /opt/master-slave/6381.log
# 用来指定主机:slaveof 主机ip 端口
slaveof 192.168.170.131 6379
# 主机的密码
masterauth 123456
- 分别进入主从机的bin目录,后台启动主机和从机。
# 启动主机
./redis-server /opt/master-slave/redis-6379.conf
#启动slave1
./redis-server /opt/master-slave/redis-6380.conf
#启动slave2
./redis-server /opt/master-slave/redis-6381.conf
- 查看是否启动成功,如果启动失败说明配置文件出错,查看配置文件配置即可
ps -ef|grep redis
显示如上信息则配置成功。
- 进入任意一个主机的bin目录,使用redis-cli连接上redis主机(master)
./redis-cli -h 192.168.170.131 -p 6379 -a 123456
输入info Replication
查看主机信息
- 存入数据进行验证,登录主机存入的数据在从机上会自动复制
1.2、通过命令配置主1从2
- 主从机的安装和上面通过配置文件配置一样,这里的配置文件里就不需要配置从机的
slaveof
属性而是通过命令完成主从配置。三个配置文件的信息只需要删除从机的下列配置即可
# 用来指定主机:slaveof 主机ip 端口
slaveof 192.168.170.131 6379
# 主机的密码
masterauth 123456
- 分别启动三台机器,同上述第7步。
- 分别登录两台从机(6380和6381),设置master的密码并指定主机
# 登录从机
redis-cli -h 192.168.200.129 -p 6380 -a 123456
#设置主机密码,因为主机是有密码的,所以需要指定masterauth的密码才可以同步数据
config set masterauth 123456
#设置该机器为master的从机
slaveof 192.168.170.131 6379
2、哨兵模式
反客为主的自动版,能够自动监控master是否发生故障,如果故障了会根据投票数从slave中挑选一个 作为master,其他的slave会自动转向同步新的master,实现故障自动转义。
反客为主:当master挂掉之后,我们可以从slave中选择一个作为主机。登录从机执行下列命令即可
slaveof no one
此时slave1就变成主机了,然后再去其他slave上面执行 slaveof 命令将其挂在slave1上。
这种主备切换有个缺点:需要手动去执行命令去操作,不是太方便。
原理:sentinel会按照指定的频率给master发送ping请求,看看master是否还活着,若master在指定时间内未 正常响应sentinel发送的ping请求,sentinel则认为master挂掉了,但是这种情况存在误判的可能,比 如:可能master并没有挂,只是sentinel和master之间的网络不通导致,导致ping失败。 为了避免误判,通常会启动多个sentinel,一般是奇数个,比如3个,那么可以指定当有多个sentinel都 觉得master挂掉了,此时才断定master真的挂掉了,通常这个值设置为sentinel的一半,比如sentinel 的数量是3个,那么这个量就可以设置为2个。当多个sentinel经过判定,断定master确实挂掉了,接下来sentinel会进行故障转移:会从slave中投票选出一个服务器,将其升级为新的主服务器, 并让失效主服务器的其他从服务器slaveof指向新的主服务 器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以 使用新主服务器代替失效服务器。
2.1、配置1主2从3个哨兵
这里演示在同一个机子上配置,通过改端口号来实现1主2从3个哨兵的配置。节点配置信息:
角色 | 端口 |
master | 6379 |
slave1 | 6380 |
slave1 | 6381 |
sentinel1 | 6382 |
sentinel2 | 6383 |
sentinel3 | 6384 |
这里的主机和从机可以使用上面配置好的主从机,直接配置哨兵即可。哨兵也是redis服务器,所以这里还需要安装三个redis,也安装在/opt/master-slave
目录中即可。
- 配置sentinel1的配置文件:sentinel-6382:
# 配置文件目录
dir /opt/master-slave/
# 日志文件位置
logfile "./sentinel-26379.log"
# pid文件
pidfile /var/run/sentinel_26379.pid
# 是否后台运行
daemonize yes
# 端口
port 6382
# 监控主服务器master的名字:mymaster,IP:192.168.170.131,port:6379,最后的数字2表示当Sentinel集群中有2个Sentinel认为master存在故障不可用,则进行自动故障转移
sentinel monitor mymaster 192.168.170.131 6379 2
# master响应超时时间(毫秒),Sentinel会向master发送ping来确认master,如果在20秒内,ping不通master,则主观认为master不可用
sentinel down-after-milliseconds mymaster 60000
# 故障转移超时时间(毫秒),如果3分钟内没有完成故障转移操作,则视为转移失败
sentinel failover-timeout mymaster 180000
# 故障转移之后,进行新的主从复制,配置项指定了最多有多少个slave对新的master进行同步,那可以理解为1是串行复制,大于1是并行复制
sentinel parallel-syncs mymaster 1
# 指定mymaster主的密码(没有就不指定)
sentinel auth-pass mymaster 123456
- sentinel2和sentinel3与sentinel1的配置只有端口号不同,所以直接复制sentinel-6382后修改端口号即可
# sentinel2的配置
cp sentinel-6382.conf sentinel-6383.conf
# sentinel3的配置
cp sentinel-6382.conf sentinel-6384.conf
使用vi命令分别进入sentinel-6383.conf
和sentinel-6384.conf
,修改port
为6383
和6384
。
- 启动3个sentinel
启动sentinel有两种方式
- 方式1:./redis-server sentinel.conf --sentinel
- 方式2:redis-sentinel sentinel.conf
这里使用方式2来启动3个sentinel,分别进入到sentinel的bin目录,执行命令启动
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k0gjqG0J-1652319870662)(images\7、redis的主从复制\image-20220429211621413.png)]
- 查看sentinel的信息,这里以sentinel1为例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sJMzyT3v-1652319870663)(images\7、redis的主从复制\image-20220429212050276.png)] - 验证故障转移:在master中执行命令,停止master
192.168.170.131:6379> shutdown
等待两分钟,让系统完成故障转移。
之后查看slave1的主从信息,可以看到,现在该从机已经成为了主机,但是有的时候是另一个从机变成主机。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oxgoKZCQ-1652319870663)(images\7、redis的主从复制\image-20220429213840843.png)]
- 这时候如果旧的主机(6379)重新恢复工作,那么6379会成为一个从机。
2.2、springboot整合sentinel
导入架包之类的就不说了,只需要在application.yml中配置如下代码:
# redis sentinel主服务名,来源于:sentinel配置文件中sentinelmonitor后面跟的那个名称
spring.redis.sentinel.master=mymaster
# sentinel节点列表(host:port),多个之间用逗号隔开
spring.redis.sentinel.nodes=192.168.170.131:8082,192.168.170.131:8083,192.168.170.131:8084
# sentinel密码
#spring.redis.sentinel.password=
# 连接超时时间(毫秒)
spring.redis.timeout=60000
# Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0
spring.redis.database=0
配置这些信息即可,其他用法和在不同项目中使用redis中springboot中使用一致。