美文网首页
redis 主从复制、哨兵、Redis-cluster

redis 主从复制、哨兵、Redis-cluster

作者: 好好学习天天输出 | 来源:发表于2020-12-07 23:04 被阅读0次

1. 主从复制

主从复制
从从复制

1.1 增量同步

buffer环形数组(环形覆盖)

1.2 快照同步

master上bgsave
replicas接收完成后,全量加载(清空,加载)
replicas通知master增量同步

  • 死循环
    快照同步时间太长
    buffer过小

1.3 增加从节点

先快照同步,再增量同步。

1.4 无盘复制

master一边遍历内存,一边通过网络发送给replicas。

1.5 wait指令

> wait 1 0

param1:wait之前的指令同步给 param1 个节点之前,都阻塞。(param1必须<= master成功直连的replicas节点数,否则永远阻塞)
param2:最多等待多少毫秒,0 表示无限。

1.6 搭建

redis.conf

//设置为从节点并指定master的IP和port  
replicaof <masterip> <masterport> 

//从节点只读(默认yes)
replica-read-only yes 
//master需要最少可用的replica节点数,才表示master可用。
//0表示不限制
min-replicas-to-write 3

//10秒没收到replica节点反馈,表示此replica节点不可用。
min-replicas-max-lag 10
//查看当前节点角色和连接信息
redis_cmd> role
1) "master"
2) (integer) 490
3) 1) 1) "127.0.0.1"
      2) "6381"
      3) "490"
   2) 1) "127.0.0.1"
      2) "6382"
      3) "476"
//查看主从详细信息-replication
linux_cmd>src/redis-cli -p 6381 info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6383
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:208888
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:6c6185f361f935305a40f95e6bd15691652163bf
master_replid2:898b0df2004678be70a350436ed35fea76406d93
master_repl_offset:208888
second_repl_offset:836
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:208888

//查看主从详细信息-master
src/redis-cli -p 6383 info replication
# Replication
role:master
connected_slaves:3
slave0:ip=127.0.0.1,port=6382,state=online,offset=228782,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=228915,lag=1
slave2:ip=127.0.0.1,port=6379,state=online,offset=228915,lag=1
master_replid:6c6185f361f935305a40f95e6bd15691652163bf
master_replid2:898b0df2004678be70a350436ed35fea76406d93
master_repl_offset:229048
second_repl_offset:836
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:290
repl_backlog_histlen:228759

2. 哨兵集群

2.1 搭建

  • 哨兵配置文件

<details>
<summary>sentinel-26381.conf</summary>

port 26381
logfile "26381.log"
daemonize yes
dir "/home/libo/apps/redis/sentinel/sentinel1"
sentinel myid a837eb331213341f833ca7ddbc7a1eb44ff51f36
sentinel deny-scripts-reconfig yes
//默认2个哨兵即可判断是否切换主从
sentinel monitor mymaster 192.168.19.129 6379 2 
sentinel failover-timeout mymaster 15000
bind 127.0.0.1
protected-mode no

</details>

<details>
<summary>sentinel-26382.conf</summary>

port 26381
logfile "26381.log"
daemonize yes
dir "/home/libo/apps/redis/sentinel/sentinel1"
//设置哨兵id,没有此配置会自动添加随机id
sentinel myid 98a17affcd5a2edb286271b2d14da7d56187c336
sentinel deny-scripts-reconfig yes
//默认2个哨兵即可判断是否切换主从
sentinel monitor mymaster 192.168.19.129 6379 2
sentinel failover-timeout mymaster 15000
bind 127.0.0.1
protected-mode no

</details>

<details>
<summary>sentinel-26382.conf</summary>

port 26381
logfile "26381.log"
daemonize yes
dir "/home/libo/apps/redis/sentinel/sentinel1"
////设置哨兵id,没有此配置会自动添加随机id
sentinel myid db4577dcac31c1f2d74c46a36237bb2f4c74aa23
sentinel deny-scripts-reconfig yes
//默认2个哨兵即可判断是否切换主从
sentinel monitor mymaster 192.168.19.129 6379 2
sentinel failover-timeout mymaster 15000
bind 127.0.0.1
protected-mode no

</details>

  • 启动哨兵
src/redis-sentinel sentinel-26381.conf
src/redis-sentinel sentinel-26382.conf
src/redis-sentinel sentinel-26383.conf
  • 查看故障转移日志
//1个哨兵主观认为master下线
31648:X 03 Dec 2020 23:58:54.046 # +sdown master mymaster 192.168.19.129 6383
//3个哨兵认为master下线
31648:X 03 Dec 2020 23:58:54.105 # +odown master mymaster 192.168.19.129 6383 #quorum 3/2
//修改配置文件版本号,升级为4
31648:X 03 Dec 2020 23:58:54.105 # +new-epoch 4
//开始故障转移
31648:X 03 Dec 2020 23:58:54.105 # +try-failover master mymaster 192.168.19.129 6383
//开始选举哨兵的leader
31648:X 03 Dec 2020 23:58:54.106 # +vote-for-leader db4577dcac31c1f2d74c46a36237bb2f4c74aa23 4
31648:X 03 Dec 2020 23:58:54.106 # db4577dcac31c1f2d74c46a36237bb2f4c74aa23 voted for db4577dcac31c1f2d74c46a36237bb2f4c74aa23 4
31648:X 03 Dec 2020 23:58:54.106 # 06ca2a580582358ec9a89e8b2624a84579957ca0 voted for db4577dcac31c1f2d74c46a36237bb2f4c74aa23 4
31648:X 03 Dec 2020 23:58:54.107 # a837eb331213341f833ca7ddbc7a1eb44ff51f36 voted for db4577dcac31c1f2d74c46a36237bb2f4c74aa23 4
31648:X 03 Dec 2020 23:58:54.108 # 98a17affcd5a2edb286271b2d14da7d56187c336 voted for db4577dcac31c1f2d74c46a36237bb2f4c74aa23 4
//选举完成
31648:X 03 Dec 2020 23:58:54.173 # +elected-leader master mymaster 192.168.19.129 6383
//leader开始查找合适的slave
31648:X 03 Dec 2020 23:58:54.173 # +failover-state-select-slave master mymaster 192.168.19.129 6383
//已经找到合适的slave)
31648:X 03 Dec 2020 23:58:54.244 # +selected-slave slave 192.168.19.129:6381 192.168.19.129 6381 @ mymaster 192.168.19.129 6383
31648:X 03 Dec 2020 23:58:54.244 * +failover-state-send-slaveof-noone slave 192.168.19.129:6381 192.168.19.129 6381 @ mymaster 192.168.19.129 6383
//等待其他sentinel确认新master
31648:X 03 Dec 2020 23:58:54.328 * +failover-state-wait-promotion slave 192.168.19.129:6381 192.168.19.129 6381 @ mymaster 192.168.19.129 6383
//确认成功
31648:X 03 Dec 2020 23:58:54.809 # +promoted-slave slave 192.168.19.129:6381 192.168.19.129 6381 @ mymaster 192.168.19.129 6383
//对旧master重写配置成为slave
31648:X 03 Dec 2020 23:58:54.809 # +failover-state-reconf-slaves master mymaster 192.168.19.129 6383
//leader哨兵发送`REPLICAOF`命令给slave
31648:X 03 Dec 2020 23:58:54.867 * +slave-reconf-sent slave 192.168.19.129:6379 192.168.19.129 6379 @ mymaster 192.168.19.129 6383
//slave重写配置,但没开始从master同步
31648:X 03 Dec 2020 23:58:55.860 * +slave-reconf-inprog slave 192.168.19.129:6379 192.168.19.129 6379 @ mymaster 192.168.19.129 6383
//slave完成和master的同步
31648:X 03 Dec 2020 23:58:55.860 * +slave-reconf-done slave 192.168.19.129:6379 192.168.19.129 6379 @ mymaster 192.168.19.129 6383
31648:X 03 Dec 2020 23:58:55.949 * +slave-reconf-sent slave 192.168.19.129:6382 192.168.19.129 6382 @ mymaster 192.168.19.129 6383
31648:X 03 Dec 2020 23:58:56.928 * +slave-reconf-inprog slave 192.168.19.129:6382 192.168.19.129 6382 @ mymaster 192.168.19.129 6383
31648:X 03 Dec 2020 23:58:56.928 * +slave-reconf-done slave 192.168.19.129:6382 192.168.19.129 6382 @ mymaster 192.168.19.129 6383
//故障转移成功,所有replicas配置新的master
31648:X 03 Dec 2020 23:58:56.993 # +failover-end master mymaster 192.168.19.129 6383
//切换master
31648:X 03 Dec 2020 23:58:56.993 # +switch-master mymaster 192.168.19.129 6383 192.168.19.129 6381
//显示master直连的slaves
31648:X 03 Dec 2020 23:58:56.993 * +slave slave 192.168.19.129:6379 192.168.19.129 6379 @ mymaster 192.168.19.129 6381
31648:X 03 Dec 2020 23:58:56.993 * +slave slave 192.168.19.129:6382 192.168.19.129 6382 @ mymaster 192.168.19.129 6381
31648:X 03 Dec 2020 23:58:56.993 * +slave slave 192.168.19.129:6383 192.168.19.129 6383 @ mymaster 192.168.19.129 6381

2.2 sentinel API

//查看所有master节点。
src/redis-cli -p 26381 SENTINEL masters

//查看master节点直连的slaves节点信息。
src/redis-cli -p 26381 SENTINEL slaves mymaster

//获取master的ip和端口。
src/redis-cli -p 26381 SENTINEL get-master-addr-by-name mymaster

//强制执行failover(无需其他sentinel同意),完成后同步给其他sentinel。
src/redis-cli -p 26381 SENTINEL get-master-addr-by-name mymaster

//让这个sentinel监听另外的master
src/redis-cli -p 26381 SENTINEL MONITOR mymaster2 127.0.0.1 6389 1

2.3 slave选举条件

(依次判断,相同继续下一条件判断)

  1. 与master失联超过一定时间(配置和计算)
  2. slave优先级
  3. 数据复制的偏移量较大的优先
  4. 进程id较小的有线

2.4 springboot连接

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.3.4.RELEASE</version>
</dependency>

application.yml

spring:
  redis:
    sentinel:
      master: mymaster
      nodes: 192.168.19.129:26381,192.168.19.129:26382,192.168.19.129:26383

2.4 其他说明

  • sentinel不是转发redis命令,而是将redis实例的IP和port告知客户端。所以哨兵配置sentinel-xxx.conf需暴露对外IP和port。

  • master挂掉后重启,会成为slave节点。(redis-6.0.7版本master 挂掉之后错误地重写了所有参与切换的redis的redis.config导致无法重启)

3. 集群

3.1 配置步骤

3.1.1 配置文件

redis7000.conf

port 7000
cluster-enabled yes
cluster-config-file node7000.conf
cluster-node-timeout 15000

daemonize yes
logfile "log7000.log"
dir ./data7000/
pidfile /var/run/redis_7000.pid
appendonly yes

依次配置redis7001.conf ... redis7005.conf。

3.1.2
src/redis-cli --cluster create  192.168.19.129:7000 192.168.19.129:7001 192.168.19.129:7002 192.168.19.129:7003 192.168.19.129:7004 192.168.19.129:7500 192.168.19.129:7501 192.168.19.129:7502 192.168.19.129:7503 192.168.19.129:7504 --cluster-replicas 1

3.2 springboot 连接

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.3.4.RELEASE</version>
</dependency>

application.yml

spring:
  redis:
    cluster:
      nodes: 192.168.19.129:7000,192.168.19.129:7001,192.168.19.129:7002,192.168.19.129:7003,192.168.19.129:7004

3.3 注意事项

  • 配置项里, cluster-enabled yes不能和replicaof <ip> <port>同时配置。
  • 集群里的replica节点,不能用replicaof <ip> <port>。
  • master自行承担了sentinel的节点检测及故障转移任务,所以master至少3个,当master挂掉后,由其余master推选挂掉master的replica作为替换。
  • src/redis-cli -c -h <ip> -p <port>里的-c参数表示是否连接集群,否则只能访问连接节点的数据。

相关文章

  • redis集群优缺点

    [toc] 集群方案 主从复制 哨兵模 Redis-Cluster ShardedJedisPool 中间件 1....

  • redis(二)

    Redis用户认证 禁用危险命令 主从复制的过程 主从复制的部署 哨兵 Redis哨兵+主从+密码 Redis哨兵...

  • redis 主从复制、哨兵、Redis-cluster

    1. 主从复制 主从复制从从复制 1.1 增量同步 buffer环形数组(环形覆盖) 1.2 快照同步 maste...

  • Redis的高可用

    Redis主从复制 什么是主从复制 Redis有三种集群方案,主从复制,哨兵,cluster集群,主从复制是指将一...

  • day16(redis-cluster)

    哨兵的不足 1、集群redis-cluster 1.0、集群介绍 1.1、数据分布 1.2、目录规划 1.3、集群...

  • redis

    redis配置文件概括说明 redis 常用配置 redis 主从复制 配置文件修改 手动修改 redis 哨兵部...

  • redis集群

    本章要点 Redis主从 Redis哨兵 Redis集群 主从复制原理 1. Redis 主从 比较简单在redi...

  • redis的三种集群方式

    redis的三种集群方式 redis有三种集群方式:主从复制,哨兵模式和集群。 1.主从复制 主从复制原理: 从服...

  • spring boot data redis的三种配置方式

    redis 单机版 redis sentine 主从复制:master:哨兵名称,nodes:主节点列表 redi...

  • Redis哨兵模式安装与配置

    在介绍哨兵模式之前首先介绍下Redis主从复制。 Redis 主从复制 可将 主节点 数据同步给 从节点,从节点此...

网友评论

      本文标题:redis 主从复制、哨兵、Redis-cluster

      本文链接:https://www.haomeiwen.com/subject/hzmiwktx.html