栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

redis进阶使用(二)—— Redis主从复制、哨兵模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

redis进阶使用(二)—— Redis主从复制、哨兵模式

redis主从复制 简介

Redis主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower) ; 数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主。

默认情况下,每台Redis服务器都是主节点 ;

且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

redis主从复制流程:

  1. 从库发起同步请求
  2. 主库收到请求后执行bgsave保存当前内存里的数据到磁盘
  3. 主库将持久化的数据发送给从库的数据目录
  4. 从库收到主库的持久化数据之后,先清空自己当前内存中的所有数据
  5. 从库将主库发过来的持久化数据文件加载到自己内存
安装配置

准备2台机器,配置可以参考:https://blog.csdn.net/weixin_43719988/article/details/120696830?spm=1001.2014.3001.5501

#进行配置redis2
[root@redis2 redis]# vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf
###以守护进程模式启动
daemonize yes
###绑定的主机地址
bind 10.0.0.32
###监控端口
port 6379
###pid文件和log文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
###设置数据库的数量,默认数据库为0
databases 16
###制定本地持久化文件的文件名,默认是dump.rdb
dbfilename redis_6379.rdb
###触发条件
save 900 1
save 300 10
save 60 10000
###本地数据库的目录
dir /data/redis_cluster/redis_6379
appendonly yes
#每1个命令,都立即同步到aof
appendfsync always
##每秒写1次
appendfsync everysec
#写入工作交给操作系统,由操作系统判断缓冲区的大小,统一写入aof
appendfsync no
appendfilename "appendonly.aof"

#进行启动
[root@redis2 redis]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf 
#配置主从,进行连接
[root@redis2 redis]# redis-cli -h 10.0.0.32
10.0.0.32:6379> SLAVEOF 10.0.0.31 6379
OK
#断开连接
10.0.0.32:6379> SLAVEOF no one
OK
#先连接回来
10.0.0.32:6379> SLAVEOF 10.0.0.31 6379
OK

#进行验证
#主库写
[root@redis1 conf]# redis-cli -h 10.0.0.31
10.0.0.31:6379> set k13 v33
OK
#从库读
10.0.0.32:6379> get k13
"v33"
Redis哨兵模式

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

哨兵主要功能
Redis的Sentinel系统用于管理多个Redis服务器。该系统执行以下三个任务:

  1. 监控:Sentinel会不断地定期检查你的主服务器和从服务器是否工作正常
  2. 提醒:当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知
  3. 自动故障迁移:当一个服务器不能正常工作的时候,Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的服务器,当客户端试图连接失效服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器

安装环境:

主机名角色IP端口
redis1master10.0.0.316379
redis1Sentinel0110.0.0.3126379
redis2master10.0.0.326379
redis1Sentinel0210.0.0.3226379
redis3master10.0.0.336379
redis1Sentinel0310.0.0.3326379
redis哨兵模式安装配置

3台机器都做同样操作,修改redis_26379.conf就把ip换成各自的ip

[root@redis1 ~]# mkdir -p /data/redis_cluster/redis_26379
[root@redis1 ~]# mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}
#把ip换成3台机器的ip
[root@redis1 ~]# vim /opt/redis_cluster/redis_26379/conf/redis_26379.conf
bind 10.0.0.31
port 26379
daemonize yes
logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log
dir /data/redis_cluster/redis_26379
#mymaster主节点别名 主节点ip 和端口,判断主节点失败,2个sentinel节点同意
sentinel monitor mymaster 10.0.0.31 6379 2
###选项指定了Sentinel认定服务器已经断线所需的毫秒数
sentinel down-after-milliseconds mymaster 3000
###向新的主节点发起复制的从节点个数,1轮询发起复制
sentinel parallel-syncs mymaster 1
###故障转移超时时间
sentinel failover-timeout mymaster 18000
#进行启动服务
[root@redis1 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf 
[root@redis2 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf 
[root@redis3 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf 

配置主从关系
redis2和redis3配置主从关系

[root@redis2 redis]# redis-cli -h 10.0.0.32 slaveof 10.0.0.31 6379
OK
[root@redis3 redis]# redis-cli -h 10.0.0.33 slaveof 10.0.0.31 6379
OK

3台机器都启动哨兵命令

[root@redis1 ~]# redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf 
[root@redis2 ~]# redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf
[root@redis3 ~]# redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf

Sentinel命令使用

[root@redis1 ~]# redis-cli -h 10.0.0.31 -p 26379
#Sentinel信息
10.0.0.31:26379> INFO Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.0.0.31:6379,slaves=2,sentinels=3

#主节点信息
10.0.0.31:26379> Sentinel masters
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "10.0.0.31"
    5) "port"
    6) "6379"
    7) "runid"
    8) "b19b909a6b5d45a683797ad92eab356921ad3b59"
    9) "flags"
   10) "master"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "8"
   19) "last-ping-reply"
   20) "8"
   21) "down-after-milliseconds"
   22) "3000"
   23) "info-refresh"
   24) "3669"
   25) "role-reported"
   26) "master"
   27) "role-reported-time"
   28) "264695"
   29) "config-epoch"
   30) "0"
   31) "num-slaves"
   32) "2"
   33) "num-other-sentinels"
   34) "2"
   35) "quorum"
   36) "2"
   37) "failover-timeout"
   38) "18000"
   39) "parallel-syncs"
   40) "1"

#整个组的信息
10.0.0.31:26379> Sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "10.0.0.31"
 5) "port"
 6) "6379"
 7) "runid"
 8) "b19b909a6b5d45a683797ad92eab356921ad3b59"
 9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "209"
19) "last-ping-reply"
20) "209"
21) "down-after-milliseconds"
22) "3000"
23) "info-refresh"
24) "6495"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "367884"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "18000"
39) "parallel-syncs"
40) "1"

#查看从节点信息
10.0.0.31:26379> Sentinel slaves mymaster
1)  1) "name"
    2) "10.0.0.33:6379"
    3) "ip"
    4) "10.0.0.33"
    5) "port"
    6) "6379"
    7) "runid"
    8) "ab69c7b2a9397f0ced1814b80bb19ea18f93e798"
    9) "flags"
   10) "slave"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "233"
   19) "last-ping-reply"
   20) "233"
   21) "down-after-milliseconds"
   22) "3000"
   23) "info-refresh"
   24) "4858"
   25) "role-reported"
   26) "slave"
   27) "role-reported-time"
   28) "456489"
   29) "master-link-down-time"
   30) "0"
   31) "master-link-status"
   32) "ok"
   33) "master-host"
   34) "10.0.0.31"
   35) "master-port"
   36) "6379"
   37) "slave-priority"
   38) "100"
   39) "slave-repl-offset"
   40) "35630"
2)  1) "name"
    2) "10.0.0.32:6379"
    3) "ip"
    4) "10.0.0.32"
    5) "port"
    6) "6379"
    7) "runid"
    8) "cb8939628719123b6769440be045742016e71945"
    9) "flags"
   10) "slave"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "233"
   19) "last-ping-reply"
   20) "233"
   21) "down-after-milliseconds"
   22) "3000"
   23) "info-refresh"
   24) "4858"
   25) "role-reported"
   26) "slave"
   27) "role-reported-time"
   28) "456490"
   29) "master-link-down-time"
   30) "0"
   31) "master-link-status"
   32) "ok"
   33) "master-host"
   34) "10.0.0.31"
   35) "master-port"
   36) "6379"
   37) "slave-priority"
   38) "100"
   39) "slave-repl-offset"
   40) "35630"

#获取当前主节点信息
10.0.0.31:26379> Sentinel get-master-addr-by-name mymaster
1) "10.0.0.31"
2) "6379"

故障测试
#把redis1停了
[root@redis1 ~]# pkill redis
[root@redis1 ~]# ps -ef |grep redis
root      73291  32916  0 16:21 pts/0    00:00:00 grep --color=auto redis
#发生了主库转移
[root@redis2 ~]# redis-cli -h 10.0.0.32 -p 26379
10.0.0.32:26379> Sentinel get-master-addr-by-name mymaster
1) "10.0.0.32"
2) "6379"
#重新吧redis1开起来,发现redis变成从库
[root@redis1 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf 
[root@redis1 ~]# redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf

Redis Sentinel 存在多个从节点时,如果想要将指定的节点变为主节点,可以将其它节点的slaveprority配置为0,但是需要注意failover后,将slave-priority调回原值

1.查询命令:ConFIG GET slave-priority
2. 设置命令:ConFIG SET slave-priority 0
3. 主从切换:sentinel failover mymaster

#查询权重
[root@redis1 ~]# redis-cli -h 10.0.0.31
10.0.0.31:6379> ConFIG GET slave-priority
1) "slave-priority"
2) "100"
#redis2和redis3进行设置slave-priority为0
[root@redis2 ~]# redis-cli -h 10.0.0.32
10.0.0.32:6379> ConFIG SET slave-priority 0
OK
[root@redis3 ~]# redis-cli -h 10.0.0.33 
10.0.0.33:6379> ConFIG SET slave-priority 0
OK
#进行重新选举
[root@redis1 ~]# redis-cli -h 10.0.0.31 -p 26379
10.0.0.31:26379> sentinel failover mymaster
OK
#主节点切换成最高那个权重的了
10.0.0.31:26379> Sentinel get-master-addr-by-name mymaster
1) "10.0.0.31"
2) "6379"

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/319192.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号