ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【Redis】三种集群模式(主从复制、哨兵模式、Cluster) [打印本页]

作者: 王海鱼    时间: 2024-8-31 20:51
标题: 【Redis】三种集群模式(主从复制、哨兵模式、Cluster)


前言

redis有三种集群模式,此中主从是最常见的模式。Sentinel 哨兵模式是为了弥补主从复制集群中主机宕机后,主备切换的复杂性而演变出来的。哨兵顾名思义,就是用来监控的,重要作用就是监控主从集群,自动切换主备,完成集群故障转移。cluster 模式是redis官方提供的集群模式,使用了Sharding 技术,不但实现了高可用、读写分离、也实现了真正的分布式存储。

一、主从复制

Redis的主从复制是一种数据复制技术,在主从复制模式中,有一个主节点和多个从节点。主节点负责处置惩罚写请求,而从节点则负责处置惩罚读请求。这种模式下的数据同步是单向的,即只能从主节点向从节点同步数据。当主节点出现故障时,此中一个从节点可以被提拔为新的主节点,以包管服务的一连可用。




代码设置
1. 在application.yml中添加以下设置:
  1. spring:
  2.   redis:
  3.     master:
  4.       url: redis://localhost:6379
  5.     slave:
  6.       url: redis://localhost:6380
复制代码
2. Spring Boot集成Redis主从模式的代码示例:
  1. @Configuration
  2. public class RedisConfig {
  3.     @Value("${spring.redis.master.url}")
  4.     private String masterUrl;
  5.     @Value("${spring.redis.slave.url}")
  6.     private String slaveUrl;
  7.     @Bean
  8.     public LettuceConnectionFactory connectionFactory() {
  9.         return new LettuceConnectionFactory(new RedisStandaloneConfiguration(masterUrl, EnumSet.of(RedisClientConfiguration.Command.SLAVE_READ_ONLY)));
  10.     }
  11.     @Bean
  12.     public RedisTemplate<String, Object> redisTemplate() {
  13.         RedisTemplate<String, Object> template = new RedisTemplate<>();
  14.         template.setConnectionFactory(connectionFactory());
  15.         return template;
  16.     }
  17. }
复制代码

重要作用:

工作原理:
redis 的复制分为两部分利用 同步(SYNC)和 下令传播(command propagate)



在Redis 2.8版本之前,主从复制是通过全量复制实现的,这通常是一个较重的利用。而在Redis 2.8及其后续版本中,引入了增量复制,这是一种更高效的复制方式,它只在网络中断期间或从节点未实时同步数据时才发送写下令的快照。
总结来说,Redis的主从复制不但提高了数据安全性,还增强了Redis服务的性能和可靠性。

优缺点
优点:
缺点:

环境搭建
创建redis-cluster目录,然后复制3份redis(也可以一个redis三份不同的设置文件,启动的时候,读取相应的设置文件);
分别修改它们的redis.conf设置文件,如下所示:
redis-6380/redis.conf​​​​​​​
  1. port 6380
  2. pidfile /var/run/redis-6380.pid
  3. logfile "redis-6380.log"
  4. dbfilename dump-6380.rdb
  5. daemonize yes
复制代码
redis-6381/redis.conf
  1. port 6381
  2. pidfile /var/run/redis-6381.pid
  3. logfile "redis-6381.log"
  4. dbfilename dump-6381.rdb
  5. daemonize yes
  6. # 如果不通过修改配置文件,也可以在客户端中输入“SLAVEOF 127.0.0.1 6380”即刻生效!!
  7. # 也可以在客户端中输入“SLAVEOF NO ONE”来断开主从关系
  8. replicaof 127.0.0.1 6380
复制代码
redis-6382/redis.conf
  1. port 6382
  2. pidfile /var/run/redis-6382.pid
  3. logfile "redis-6382.log"
  4. dbfilename dump-6382.rdb
  5. daemonize yes
  6. replicaof 127.0.0.1 6380
复制代码
开启3个客户端,来连接这3个redis服务实例;利用ping查看服务是否正常,而且通过info replication查看自己在集群中的脚色



二、Sentinel 哨兵模式

哨兵模式是为相识决主从复制集群中主机宕机后,主备切换的复杂性而演变出来的。在这种模式下,有一个或多个哨兵节点,它们的重要作用就是监控主从集群,自动切换主备,完成集群故障转移。
Redis的哨兵模式是一种特别的高可用解决方案。哨兵可以大概实时检测master的状态,当master处于故障状态时,哨兵会根据一定的推举算法选出一个新的主节点,并将其他从节点切换到新的主节点上。Redis的哨兵模式中,为了确保其结实性,至少需要部署3个实例。这三个实例分别扮演不同的脚色:主节点、从节点和哨兵节点。


重要功能:
工作原理:
每个Sentinel(哨兵)进程以每秒钟一次的频率向整个集群中的Master主服务器,Slave从服务器以及其他Sentinel(哨兵)进程发送一个 PING 下令。
如果一个实例(instance)距离末了一次有效复兴 PING 下令的时间凌驾 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel(哨兵)进程标记为主观下线(SDOWN)。
如果一个Master主服务器被标记为主观下线(SDOWN),则正在监视这个Master主服务器的所有 Sentinel(哨兵)进程要以每秒一次的频率确认Master主服务器的确进入了主观下线状态。
当有充足数量标 Sentinel(哨兵)进程(大于等于设置文件指定的值)在指定的时间范围内确认Master主服务器进入了主观下线状态(SDOWN), 则Master主服务器会被标记为客观下线(ODOWN)。
此时就会进行哨兵推举,选出一个领头的哨兵对主从数据库发起故障的修复(就是选一个从数据库作为新的Master)。
在一样平常情况下, 每个 Sentinel(哨兵)进程会以每 10 秒一次的频率向集群中的所有Master主服务器、Slave从服务器发送 INFO 下令。
当Master主服务器被 Sentinel(哨兵)进程标记为客观下线(ODOWN)时,Sentinel(哨兵)进程向下线的 Master主服务器的所有 Slave从服务器发送 INFO 下令的频率会从 10 秒一次改为每秒一次。
若没有充足数量标 Sentinel(哨兵)进程同意 Master主服务器下线, Master主服务器的客观下线状态就会被移除。若 Master主服务器重新向 Sentinel(哨兵)进程发送 PING 下令返回有效复兴,Master主服务器的主观下线状态就会被移除。
哨兵监控

哨兵关照及故障转移

哨兵设置


优缺点
优点:

缺点:

环境搭建
1. 搭建 1 主 2 从共 3 个节点的 Redis 主从复制节点。
  1. #8000 为主节点端口,8001和8002为对应从节点
  2. 8000>./redis-server redis.conf
  3. 8001>./redis-server redis.conf
  4. 8002>./redis-server redis.conf
复制代码
2. 新建3个哨兵节点并设置哨兵 sentinel.conf 文件。新建端口为18000、18001、18002 共三个哨兵节点,启动:./redis-sentinel sentinel.conf
  1. bind 127.0.0.1
  2. port 18000 #其他两个分别为 18002、18003
  3. protected-mode no  #若想从远程连接redis集群,需要将sentinel的protected-mode修改为no
  4. sentinel myid sentinel-1  #设定sentinel myid 每个都不一样,使用yum安装的时候,直接就生成了
  5. sentinel monitor mymaster 127.0.0.1 8000 2 #数字2,表示主机挂掉后salve投票看让谁接替成为主机,得票数多少后成为主机。
  6. sentinel down-after-milliseconds mymaster 5000
  7. sentinel failover-timeout mymaster 15000
  8. sentinel parallel-syncs mymaster 2
  9. sentinel auth-pass mymaster 123456  #设置用于与主服务器和从服务器进行身份验证的密码
复制代码
3. 使用 Redis-cli 连接
  1. $redis-cli -h 127.0.0.1 -p 8000 -a 123456
复制代码
Redis -cli 连接到主库可以执行 set 下令,连接到从库执行 set 下令会有异常提示
  1. (error)READONLY You cant write against a read only save
复制代码
4. 使用 Jedis.jar 连接 Redis 哨兵
  1. Set<String> sentinels = new HashSet<String>(Arrays.asList(
  2.     "127.0.0.1:18000",
  3.     "127.0.0.1:18001",
  4.     "127.0.0.1:18002"
  5. ));
  6. JedisSentinelPool pool = new JedisSentinelPool("mymaster",sentinels,jedisPoolConfig,"123456");
复制代码
Redis Sentinel是Redis高可用的实现方案。Sentinel是一个管理多个Redis实例的工具,它可以实现对Redis的监控、关照、自动故障转移。

三、Cluster 集群模式

Redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群 redis集群接纳P2P模式,是完全去中央化的,不存在中央节点大概代理节点。
在集群模式下,Cluster实现了分布式存储,数据被分片存储在多个节点上,每个节点负责一部分数据。这种模式下的数据同步是双向的,即可以在各个节点之间进行数据同步。别的,当某个节点出现故障时,其负责的数据可以被其他节点接受,以包管服务的一连可用。


重要作用
1. 数据分区

2. 高可用

3. 数据分片

数据分片原理
redis 数据分片使用的是hash slot, redis集群有16384个哈希槽,每个Key通过CRC16校验后对16384取模来决定放置哪一个槽。
当存取redis key时候,redis会根据CRC16算法得到一个结果,然后把结果和16384求余,通过这个值去对应得节点获取数据。
这个时候,应用客户端现实上只需要连接此中恣意一个节点即可,然后Redis Cluster 中每个节点都保存了其他节点得槽信息。如许当存取key计算完槽之后,通过保存槽信息从设置中获取节点信息,然后再去对应得节点获取数据。
综上所述,每个Redis集群理论上最多可以有16384个节点。

复制原理
redis-cluster集群引入了主从复制模型,一个主节点对应一个大概多个从节点,当主节点宕机的时候,就会启用从节点。当其它主节点 ping 一个主节点 A 时,如果半数以上的主节点与 A 通信超时,那么以为主节点 A 宕机了。如果主节点 A 和它的从节点 A1 都宕机了,那么该集群就无法再提供服务了。

一致性保存
Redis-Cluster 使用了异步复制:主节点对客户端请求复兴状态后,异步发起写利用给从节点,会存在一个时间间隙。
Redis-Cluster 出现网络分区时,当一个客户端与至少包含一个主节点在内的少数节点被孤立,可能导致在节点超时时间(node timeout)内,另一个网络分区内的大部分节点重新推举被孤立主节点的从节点为新的主节点。节点超时时间选项为 cluster-node-timeout 15000(毫秒)。

群集部署
群集部署发起至少3台以上的master节点,发起使用3主3从六个节点的模式。
 Cluster 群集由多个redis服务器组成的分布式网络服务群集,群集中有多个master主节点,每个主节点都可读可写,节点之间会相互通信,两两相连,redis群集无中央节点。
1. 新建3主3从 Redis-cluster:6 个 Redis 启动目录,并新建 6 份 Redis 设置文件 redis.conf。并启动 6 个 Redis。
  1. port 8000
  2. cluster-enabled yes
  3. cluster-config-file nodes.conf  #集群配置名
  4. cluster-node-timeout 15000
  5. appendonly yes  #快照压缩功能开启
复制代码
2. 设置 Ruby 运行环境:安装 Ruby 及 Ruby-Redis 管理工具(redis 的版本和 ruby 包的版本最好保持一致)
  1. yum install ruby rubygems -y
  2. gem install redis-5.0.4.gem
复制代码
3. 设置 Redis-Cluster:
使用 redis-trib.rb 的 create 下令创建 Redis-Cluster;
  1. ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 
  2.  127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 
复制代码
根据下令提示输入选项后(输入“yes”),会创建一个新的集群。
选项 replicas 1:表示集群中的每个主节点对应一个从节点,后三个地址为从节点。



四、结语

以上三种模式各有优缺点,可以根据现实情况选择适合的模式来使用Redis。例如,如果对高可用性有较高要求,可以选择哨兵模式或集群模式;如果对性能有较高要求,可以选择主从复制模式。




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4