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选举条件
(依次判断,相同继续下一条件判断)
- 与master失联超过一定时间(配置和计算)
- slave优先级
- 数据复制的偏移量较大的优先
- 进程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参数表示是否连接集群,否则只能访问连接节点的数据。
网友评论