Redis集群_哨兵监控环境搭建
新建sentinel-26379.conf文件
#端口
port 26379
#守护进程运行
daemonize yes
#日志文件
logfile "26379.log"
sentinel monitor mymaster 192.168.92.128 6379 2
新建sentinel-26380.conf文件
#端口
port 26380
#守护进程运行
daemonize yes
#日志文件
logfile "26380.log"
sentinel monitor mymaster 192.168.66.100 6379 2
新建sentinel-26381.conf文件
#端口
port 26381
#守护进程运行
daemonize yes
#日志文件
logfile "26381.log"
sentinel monitor mymaster 192.168.66.100 6379 2
哨兵节点的启动两种方式
redis-sentinel sentinel-26379.conf
查看哨兵节点状态
[root@localhost src]# ./redis-cli -p 26379
127.0.0.1:26379>
127.0.0.1:26379>
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.66.100:6379,slaves=2,sentinels=3
Redis集群_哨兵工作原理详解
监控阶段
通知阶段
sentinel不断的向master和slave发起通知,收集信息。
故障转移阶段
通知阶段sentinel发送的通知没得到master的回应,就会把master标记为SRI_S_DOWN,并且把master 的状态发给各个sentinel,其他sentinel听到master挂了,说我不信,我也去看看,并把结果共享给各 个sentinel,当有一半的sentinel都认为master挂了的时候,就会把master标记为SRI_0_DOWN。
投票方式
方式: 自己最先接到哪个sentinel的竞选通知就会把票投给它。
剔除一些情况:
1. 不在线的
2. 响应慢的
3. 与原来master断开时间久的
4. 优先级原则
1.Redis哨兵模式是Redis的___架构的一种方式。高可用
Redis集群_故障转移
概述
演示当主节点发生故障时,哨兵的监控和自动故障转移功能。
演示故障转移
使用kill命令杀掉主节点
ps aux |grep redis
kill -9 pid
查看哨兵节点信息
如果此时立即在哨兵节点中使用info Sentinel命令查看。
[root@localhost src]# ./redis-cli -p 26379
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6381,slaves=5,sentinels=3
注意: 会发现主节点还没有切换过来,因为哨兵发现主节点故障并转移,需要一段时间。
重启6379节点
[root@localhost src]# ./redis-cli info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:down
配置文件都会被改写
故障转移阶段,哨兵和主从节点的配置文件都会被改写
include /usr/local/redis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
# Generated by CONFIG REWRITE
daemonize yes
protected-mode no
appendonly yes
slowlog-max-len 1200
slowlog-log-slower-than 1000
save 5 1
user default on nopass ~* &* +@all
dir "/usr/local/redis"
replicaof 127.0.0.1 6381
Redis集群_Cluster模式概述
Redis有三种集群模式
哨兵模式的缺点
Cluster模式概述
Redis集群是一个由多个主从节点群组成的分布式服务集群,它具有复制、高可用和分片特性。
Redis集群的优点
1.Redis集群是一个由__节点群组成的分布式服务集群。多个主从
2.Redis哨兵模式的缺点是____。哨兵选举期间,不能对外提供服务
Redis集群_Cluster模式搭建
Redis的集群搭建最少需要3个master节点,我们这里搭建3个master,每个下面挂一个slave节点,总 共6个Redis节点;
环境准备
第1台机器: 192.168.66.101 8001端口 8002端口
第2台机器: 192.168.66.102 8001端口 8002端口
第3台机器: 192.168.66.103 8001端口 8002端口
创建文件夹
mkdir -p /usr/local/redis/redis-cluster/8001 /usr/local/redis/redis-cluster/8002
拷贝配置文件
将redis安装目录下的 redis.conf 文件分别拷贝到8001目录下
cp /usr/local/redis/redis.conf /usr/local/redis/redis-cluster/8001
修改redis.conf文件以下内容
port 8001
daemonize yes
pidfile "/var/run/redis_8001.pid"
#指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据
dir /usr/local/redis/redis-cluster/8001/
#启动集群模式
cluster-enabled yes
#集群节点信息文件,这里800x最好和port对应上
cluster-config-file nodes-8001.conf
# 节点离线的超时时间
cluster-node-timeout 5000
#去掉bind绑定访问ip信息
#bind 127.0.0.1
#关闭保护模式
protected-mode no
#启动AOF文件
appendonly yes
#如果要设置密码需要增加如下配置:
#设置redis访问密码
#requirepass xiaoton
#设置集群节点间访问密码,跟上面一致
#masterauth xiaoton
文件拷贝到8002文件夹
#将8001修改为8002:
cp /usr/local/redis/redis-cluster/8001/redis.conf /usr/local/redis/rediscluster/8002
# 批量修改字符串
:%s/8001/8002/g
将本机机器上的文件拷贝到另外两台机器上
# 第二台机器
scp /usr1/redis/redis-cluster/8001/redis.conf
root@192.168.66.102:/usr1/redis/redis-cluster/8001/
scp /usr1/redis/redis-cluster/8002/redis.conf
root@192.168.66.102:/usr1/redis/redis-cluster/8002/
# 第三台机器
scp /usr1/redis/redis-cluster/8001/redis.conf
root@192.168.66.103:/usr1/redis/redis-cluster/8001/
scp /usr1/redis/redis-cluster/8002/redis.conf
root@192.168.66.103:/usr1/redis/redis-cluster/8002/
分别启动这6个redis实例
/usr/local/redis/src/redis-server /usr/local/redis/redis-cluster/8001/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis/redis-cluster/8002/redis.conf
检查是否启动成功
ps -ef |grep redis
使用redis-cli创建整个redis集群
/usr/local/redis/src/redis-cli -a redis-pw --cluster create --cluster-replicas 1
192.168.66.101:8001 192.168.66.101:8002 192.168.66.102:8001 192.168.66.102:8002
192.168.66.103:8001 192.168.66.103:8002
查看帮助命令
src/redis‐cli --cluster help
验证集群
连接任意一个客户端
/usr/local/redisd/src/redis-cli -a redis-pw -c -h 192.168.66.101 -p 8001
查看集群的信息
cluster info
Redis集群_Cluster模式原理分析
Redis Cluster将所有数据划分为16384个slots(槽位),每个节点负责其中一部分槽位。槽位的信息存储 于每个节点中。只有master节点会被分配槽位,slave节点不会分配槽位。
HASH_SLOT = CRC16(key) % 16384
命令执行
set k1 v1
可以通过{}来定义组的概念,从而是key中{}内相同内容的键值对放到同一个slot中。
mset k1{test} v1 k2{test} v2 k3{test} v3
故障恢复
查看节点
192.168.66.103:8001> cluster nodes
杀死Master节点
lsof -i:8001
kill -9 pid
观察节点信息
1. Redis Cluster模式默认会对key值使用__算法进行hash得到一个整数值,然后用这个整数值对16384 进行取模来得到具体槽位。crc-16
Redis集群_Java操作Redis集群
Jedis整合Redis
引入jedis的maven坐标
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
Java编写的代码
public class JedisClusterTest {
public static void main(String[] args) throws IOException {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(20);
config.setMaxIdle(10);
config.setMinIdle(5);
Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
jedisClusterNode.add(new HostAndPort("192.168.66.101", 8001));
jedisClusterNode.add(new HostAndPort("192.168.66.102", 8002));
jedisClusterNode.add(new HostAndPort("192.168.66.103", 8001));
JedisCluster jedisCluster = null;
try {
//connectionTimeout:指的是连接一个url的连接等待时间
//soTimeout:指的是连接上一个url,获取response的返回等待时间
jedisCluster = new JedisCluster(jedisClusterNode, 6000, 5000, 10, "redis-pw", config);
System.out.println(jedisCluster.set("name", "zhangsan"));
System.out.println(jedisCluster.get("name"));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (jedisCluster != null) {
jedisCluster.close();
}
}
}
}
SpringBoot 整合 Redis
引入maven坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐data‐redis</artifactId>
</dependency>
配置文件
##单服务器
spring.redis.cluster.nodes=192.168.159.129:7001,192.168.159.129:7002,192.168.159
.129:7003,192.168.159.129:7004,192.168.159.129:7005,192.168.159.129:7006
## 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=300
## Redis数据库索引(默认为0)
spring.redis.database=0
## 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
## 连接池中的最大空闲连接
spring.redis.pool.max-idle=100
## 连接池中的最小空闲连接
spring.redis.pool.min-idle=20
## 连接超时时间(毫秒)
spring.redis.timeout=60000
java代码
@RestController
public class TestController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@RequestMapping("/test_cluster")
public void testCluster() throws InterruptedException {
stringRedisTemplate.opsForValue().set("user:name", "xiaoton");
System.out.println(stringRedisTemplate.opsForValue().get("user:name"));
}
}