搭建redis 集群
说明:
1).分片可以实现Redis内存数据的扩容.可以存储海量的内存数据. Redis分片机制没有实现高可用.如果分片中一个节点宕机,则直接影响整个服务的运行.
2).哨兵可以实现Redis节点的高可用.但是Redis中的数据不能实现内存的扩容.
哨兵服务本身没有实现高可用.如果哨兵发生了异常则直接影响用户使用.
3.)采用redis集群,可以保证数据分散存储,同时保证数据存储的一致性.并且在内部实现高可用的机制.实现了服务故障的自动迁移.
1.集群搭建计划
主从划分:
3台主机 3台从机共6台端口划分7000-7005
2. 集群搭建
- 准备 集群文件夹
mkdir cluster
- 在cluster中分别创建7000-7005 文件夹 方便后期维护
mkdir 7000 7001 7002 7003 7004 7005
- 复制配置文件 将redis根目录中redis.conf 复制到 7000
cp redis.conf cluster/7000/
- 编辑配置文件 vim redis.conf
4.1 注释本地绑定ip
4.2 关闭保护模式
4.3 修改端口号
4.4 启动后台启动
4.5 修改pid 文件
4.6 修改 持久化文件路径
4.7 设定内存优化策略
4.8 为提高效率 关闭 AOP模式
4.9 开启集群配置
4.10 开启集群配置文件
4.11 修改集群超时时间
5. 复制修改后的文件 到另外几个文件夹中 7001~7005
6. 批量修改
说明:分别将7001-7005文件中的7000改为对应的端口号的名称,
修改时注意方向键的使用
7. 编辑 启动脚本
7.1 创建启动脚本文件 vim start.sh
7.2 创建 关闭脚本文件vim shutdown.sh
8. 启动 redis sh start.sh
9.创建 redis集群
命令:
1 代表 拥有一台从机 后面 加上所有的主机ip 和端口 用空格 隔开
redis-cli --cluster create --cluster-replicas 1 192.168.126.129:7000 192.168.126.129:7001 192.168.126.129:7002 192.168.126.129:7003 192.168.126.129:7004 192.168.126.129:7005
2.输入 yes
10. 集群搭建成功
10 .检查 主从配置
redis 集群高可用推选原理
Redis的所有节点都会保存当前redis集群中的全部主从状态信息.并且每个节点都能够相互通信.当一个节点发生宕机现象.则集群中的其他节点通过PING-PONG检测机制检查Redis节点是否宕机.当有半数以上的节点认为宕机.则认为主节点宕机.同时由Redis剩余的主节点进入选举机制.投票选举链接宕机的主节点的从机.实现故障迁移.
2.redis集群(主机最少三台) 宕机条件
说明: redis集群中 只要有一台Redis 主机宕机.(没有从机替补) 则整个Redis集群崩溃(可以进行高可用)
问题分析:
1.如果有6台Redis搭建集群(3主3从),问: 最少宕机多少台Redis集群崩溃??? 宕机2台集群崩溃
2.如果搭建9台Redis.3台主机, 问 :最少宕机Redis台 集群奔溃??? 宕机5台集群崩溃
补充说明:如果想让集群尽可能不宕机,则适当增加从节点的数量. 2-3个从即可.
3.redis分区说明
Redis分区只负责 数据应该存储到哪里的问题.至于是否能存储的下 完全由Redis内存决定
说明: RedisCluster采用此分区,所有的键根据哈希函数(CRC16[key]%16384)映射到0-16383槽内,共16384个槽位,每个节点维护部分槽及槽所映射的键值数据.根据主节点的个数,均衡划分区间.
算法:哈希函数: Hash()=CRC16[key]%16384
图为 3主机的情况
当向redis集群中插入数据时,首先将key进行计算.之后将计算结果匹配到具体的某一个槽的区间内,之后再将数据set到管理该槽的节点中.
特点:
1.hash(key1)%16384 = 3000
2.hash(key2)%16384 = 3000 key1和key2 都归第一个节点进行管理.
Redis hash槽与一致性 hash算法的区别
1.运算位置不同.
1.redis分片机制在业务服务器中完成的运算.
2.redis分区算法在连接Redis之后,由redis进行计算.
2.算法不同 一致性hash算法/hash槽算法. hash算法 是一系列hash算法的总称
3.redis分片可以随意的进行数据的保存. redis分区不能随机存储.分区中只能保存属于我的key.
Redis面试题
1.Redis集群中的主机最多 多少台? 16384个.
Redis集群内存多少最多可以扩展到原有redis多少倍.
2.Redis中存储的数据最多16384个??? 不对的. 16384只是分区的大小.至于能存储多少数据,完全由内存决定.
什么是脑列现象
说明:在集群的机制中,由主机进行选举,当主机在进行选举时如果连续3次出现平票的结果时,则可能引发脑裂现象.
问题:出现脑裂现象的概率是多少? 答: 1/8=12.5%
如何有效降低脑裂现象: 可以通过增加主机的数量来有效降低脑裂的发生
spring整合redis集群
# 配置Redis集群
redis.nodes=192.168.126.129:7000,192.168.126.129:7001,192.168.126.129:7002,192.168.126.129:7003,192.168.126.129:7004,192.168.126.129:7005
编辑配置类
通过String Api 获取 需要的 host 跟port
package com.jt.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import redis.clients.jedis.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Configuration //标识我是配置类
@PropertySource("classpath:/properties/redis.properties")
public class RedisConfig {
/**
* 引入redis集群配置
*/
@Value("${redis.nodes}")
private String nodes; //node,node,node
@Bean
public JedisCluster jedisCluster(){
String[] strNodes = nodes.split(","); //[node1,nod2,nod3.....]
Set<HostAndPort> set = new HashSet<>();
for(String node : strNodes){ //node=host:port
String host = node.split(":")[0];
int port = Integer.parseInt(node.split(":")[1]);
set.add(new HostAndPort(host,port));
}
return new JedisCluster(set);
}