主从哨兵模式含集群

虚拟机的IP地址:192.168.244.128----------------------------本地地址:127.0.0.1

http://www.redis.cn/

https://www.cnblogs.com/leeSmall/p/8398401.html

https://www.cnblogs.com/51life/p/10233340.html

https://www.cnblogs.com/xichji/p/11286443.html

https://www.cnblogs.com/xrq730/p/11039384.html

https://www.cnblogs.com/Junsept/p/7459488.html

https://blog.csdn.net/ThinkWon/article/details/103522351?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.channel_param\&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.channel_param

https://blog.csdn.net/mingyuli/article/details/120574316

Redis有三种集群方式:主从复制,哨兵模式和集群

一、Redis主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点保证数据的一致性

./redis-server /opt/redis/etc/redis.conf

  1. 主从复制的相关操作

master配置修改端口:redis.conf

port 6379

requirepass 123456

masterauth 123456 (下次作为从服务器登录主服务器密码)

slave1修改配置: s1.conf vi redis6380.conf

port 6380

replicaof 192.168.174.132 6379 (5.x) | slaveof 192.168.174.132 6379

requirepass 123456

masterauth 123456

pidfile "/var/run/redis_6380.pid"

replica-read-only yes #从服务器默认只读,从服务写会造成主从不一致

slave2修改配置: s2.conf

port 6381

replicaof 127.0.0.1 6379|6380(slave1的从服务器)

requirepass 123456

masterauth 123456

pidfile "/var/run/redis_6381.pid"

requirepass是认证密码,之后要作主从切换,所以建议所有的密码都一致, masterauth是从机对主机验证时,所需的密码。(即主机的requirepass)

启动主机:

redis-server redis.conf

关闭机器: kill -9 PID

redis-cli -p 端口号 shutdown

启动从机:

redis-server s1.conf

redis-server s2.conf

验证主从复制:

master:

[root@localhost master]# redis-cli

127.0.0.1:6379> auth 123456

OK

127.0.0.1:6379> set test chenqm

OK

127.0.0.1:6379> info replication

Replication

role:master

connected_slaves:2

slave0:ip=127.0.0.1,port=6380,state=online,offset=2559,lag=0

slave1:ip=127.0.0.1,port=6381,state=online,offset=2559,lag=0

......

slave1:

[root@localhost slave2]# redis-cli -p 6380

127.0.0.1:6380> auth 123456

OK

127.0.0.1:6380> get test

"chenqm"

slave2:

[root@localhost slave2]# redis-cli -p 6381

127.0.0.1:6381> auth 123456

OK

127.0.0.1:6381> get test

"chenqm"

切换主从:80 81 82

主节点shutdown后,将从节点转换成为主节点

127.0.0.1:6380> slaveof no one (4.x版本) | replicaof no one (5.x版本)

将当前服务器转变为某一服务器的副本服务器

127.0.0.1:6381> slaveof 127.0.0.1 6380 (4.x版本)| replicaof 192.168.174.131 6380 | replicaof localhost 6380

  1. Redis主从拓扑

a)一主一从:用于主节点故障转移从节点,当主节点的"写"命令并发高且需要持久化,可以只在从节点开启AOF(主节点不需要),这样即保证了数据的安全性,也避免持久化对主节点的影响

b)一主多从:针对"读"较多的场景,"读"由多个从节点来分担,但节点越多,主节点同步到多节点的次数也越多,影响带宽,也加重主节点的不稳定

c)树状主从:一主多从的缺点(主节点推送次数多压力大)可用些方案解决,主节点只推送一次数据到从节点B,再由从节点B推送到C,减轻主节点推送的压力。

  1. 数据同步

redis 2.8版本以上使用psync命令完成同步,过程分"全量"与"部分"复制

全量复制:一般用于初次复制场景(第一次建立SLAVE后全量)

部分复制:网络出现问题,从节点再次连接主节点时,主节点补发缺少的数据,每次数据增量同步

心跳:主从有长连接心跳,主节点默认每10S向从节点发ping命令,repl-ping-slave-period控制发送频率

  1. 主从的缺点

a)主从复制,若主节点出现问题,则不能提供服务,需要人工修改配置将从变主

b)主从复制主节点的写能力单机,能力有限

c)单机节点的存储能力也有限

5.主从故障如何故障转移

a)主节点(master)故障,从节点slave-1端执行 slaveof|replicaof no one后变成新主节点;

b)其它的节点成为新主节点的从节点,并从新节点复制数据;

c)需要人工干预,无法实现高可用。

二、哨兵模式:

万一主机挂了,redis提供了一个sentinel(哨兵),以此实现主从切换的功能,类似zookeeper

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

1、通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。

2、当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

3、一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。

配置sentinel:

vi sentinel.conf:

port 26379

sentinel monitor mymaster 192.168.174.131 6379 1

sentinel auth-pass mymaster 123456

daemonize yes

protected-mode no

#哨兵服务端口

port 26379

#哨兵监控的master,当集群中有超过一半以上及2个(quorum)sentinel认为master死了时,才能真正认为该master已经不可用了【注意这里ip不能写127.0.0.1,否则将来程序也会去找127.0.0.1】

sentinel monitor mymaster 192.168.174.131 6379 2 (quorum)

#设置master和slave验证密码(sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同)

sentinel auth-pass mymaster 123456

#守护进程模式

daemonize yes

#关闭保护模式

protected-mode no

#master或slave多长时间(默认30秒)不能使用后标记为s_down状态。

sentinel down-after-milliseconds mymaster 30000

#从节点执行replicaof no one命令一直失败的话,当时间超过18S时则故障转移失败

sentinel failover-timeout mymaster 18000

1、启动sentinel服务(到对应的目录(src)执行相应的命令):

./redis-sentinel ../sentinel.conf

注意启动的顺序:首先主机服务,然后启动从机服务,最后启动哨兵服务

2、关闭master进程:kill -9 6379 (使用shutdown退出有时候不能修改配置文件)

3、查看客户端

master切换了,当6379端口的这个服务重启的时候,他会变成slave。

因为sentinel在切换master的时候,把对应的sentinel.conf和redis.conf文件的配置修改。

4、多哨兵模式下选举

http://www.sohu.com/a/318236060_100149956

这个选举的大体思路是:

每个哨兵节点通过向其他哨兵节点发送"sentinel is-master-down-by addr"命令来申请成为哨兵领导者。

而每个哨兵节点在收到一个"sentinel is-master-down-by addr"命令时,只允许给第一个节点投票,其他节点的该命令都会被拒绝。

如果一个哨兵节点收到了半数以上的同意票半且超过它配置的quorum的票数,则成为哨兵领导者。

哨兵模式的优缺点:

优点:

哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。

主从可以自动切换,系统更健壮,可用性更高。

缺点:

Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。

三、Redis-Cluster集群

https://blog.csdn.net/fst438060684/article/details/80712433

https://blog.csdn.net/qq_36514588/article/details/83856795

https://blog.csdn.net/weixin_42440345/article/details/95048739

redis的哨兵模式基本已经可以实现高可用,读写分离,但是在这种模式下每台redis服务器都存储相同的数据,浪费内存,

所以在Redis3.0上加入了cluster模式,实现的redis的分布式存储,也就是说每台redis节点上存储不同的内容。

搭建集群创建cluster目录,分别配置多个redis.conf,官方建议至少3主3从

先清空全部redis的原始数据

清理数据:redis-cli flushdb

redis.conf:

daemonize yes #redis后台运行

pidfile /var/run/redis_6000.pid #pidfile文件对应6000,6001,6002

port 6000 #端口6000,6001,6002

cluster-enabled yes #开启集群 把注释#去掉

cluster-config-file nodes_6000.conf #集群的配置 配置文件首次启动自动生成

cluster-node-timeout 5000 #请求超时 设置5秒够了

masterauth 123456

requirepass 123456

protected-mode no

#编写启动脚本 vi sb.sh

#!/bin/bash

./redis-server /opt/redis/etc/cluster/redis7000.conf

./redis-server /opt/redis/etc/cluster/redis7001.conf

./redis-server /opt/redis/etc/cluster/redis7002.conf

./redis-server /opt/redis/etc/cluster/redis7003.conf

./redis-server /opt/redis/etc/cluster/redis7004.conf

./redis-server /opt/redis/etc/cluster/redis7005.conf

Redis5.0开始不再使用ruby搭建集群,使用命令redis-cli:(注意不要写127.0.0.1)

#创建集群 先要删除redis的数据========>

redis-cli --cluster create 192.168.88.144:7000 192.168.88.144:7001 192.168.88.144:7002 192.168.88.144:7003 192.168.88.144:7004 192.168.88.144:7005 -a 123456 --cluster-replicas 1

redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

replicas 1 表示我们希望为集群中的每个主节点创建一个从节点

./redis-cli --cluster create 192.168.88.149:7000 192.168.88.149:7001 192.168.88.149:7002 192.168.88.149:7003 192.168.88.149:7004 192.168.88.149:7005 --cluster-replicas 1

./redis-cli --cluster create 192.168.88.152:7000 192.168.88.152:7001 192.168.88.152:7002 192.168.88.152:7003 192.168.88.152:7004 192.168.88.152:7005 --cluster-replicas 1

./redis-cli --cluster create 192.168.88.155:7000 192.168.88.155:7001 192.168.88.155:7002 192.168.88.155:7003 192.168.88.155:7004 192.168.88.155:7005 --cluster-replicas 1

如果需要手动挂载从节点:

redis-cli --cluster add-node 192.168.174.131:6003 192.168.174.131:6000 --cluster-slave

创建集群出错:[ERR] Node xxxxx is not empty. Either the node already knows other nodes (check with CLUSTER NODES)

解决方法:

1)、停止所有redis进程,将需要新增的节点下aof、rdb等本地备份文件删除;

2)、同时将新Node的集群配置文件删除,即:删除你redis.conf里面cluster-config-file所在的文件,一般为nodes.conf;

3)、再次添加新节点如果还是报错,对数据库进行清除:

192.168.174.131:6000> flushdb

#添加端口

firewall-cmd --zone=public --add-port=6380/tcp --permanent (永久)

#查看所有打开的端口:

firewall-cmd --zone=public --list-ports

#重新载入

firewall-cmd --reload

vi openport.sh

#!/bin/bash

firewall-cmd --zone=public --add-port=7000/tcp --permanent

firewall-cmd --reload

firewall-cmd --zone=public --add-port=7001/tcp --permanent

firewall-cmd --reload

firewall-cmd --zone=public --add-port=7002/tcp --permanent

firewall-cmd --reload

firewall-cmd --zone=public --add-port=7003/tcp --permanent

firewall-cmd --reload

firewall-cmd --zone=public --add-port=7004/tcp --permanent

firewall-cmd --reload

firewall-cmd --zone=public --add-port=7005/tcp --permanent

firewall-cmd --reload

firewall-cmd --zone=public --list-ports

测试:

打开端口为6000的客户端 查看:

[root@localhost master]# redis-cli -c -p 6000 -a 123456

127.0.0.1:6000> cluster info

127.0.0.1:6000> set id 111

-> Redirected to slot [7568] located at 127.0.0.1:6002

OK

127.0.0.1:6002> get id

"122"

---------------获取数据

./redis-cli -c -h 192.168.88.151 -p 7000

https://blog.csdn.net/qq_41432730/article/details/121591008

相关推荐
InterestingFigure32 分钟前
头条系统-05-延迟队列精准发布文章-概述&添加任务(db和redis实现延迟任务)、取消&拉取任务&定时刷新(redis管道、分布式锁setNx)...
数据库·redis·分布式·缓存
前端组件开发41 分钟前
JeeSite V5.7.1 发布,Java快速开发平台,Spring Boot,Vue3,微服务
java·数据库·spring boot·微服务·oracle·开源
Zonda要好好学习1 小时前
黑马点评DAY1|Redis入门、Redis安装
数据库·redis·oracle
isfox2 小时前
玩转springboot之springboot多环境配置
spring boot
一碗谦谦粉2 小时前
Spring之spring的单例bean是线程安全的吗
java·spring
java6666688882 小时前
Spring Boot中的数据加密与解密
java·spring boot·后端
GoodStudyAndDayDayUp3 小时前
一个简单的spring+kafka生产者
sql·spring·kafka
YoungSoulwt3 小时前
23- Redis 主从复制是怎么实现的?
数据库·redis
喜欢猪猪4 小时前
springboot的双亲委派
java·spring boot·后端
开五档的蒙奇4 小时前
【Redis7】零基础篇
redis