一、主从模式
1.下载页面:https://download.redis.io/releases/ 我下载的 redis-6.2.1
2.解压 :tar -zxvf redis-6.2.1 进入 :cd redis-6.2.1
3.编译并指定位置安装 : make PREFIX=/ruojian/redis-6.2.1 install,分别安装在主机192.168.5.1(主),192.168.5.2(从)
4.修改 192.168.5.1 配置文件
daemonize no --> daemonize yes (后台程序方式运行)
pidfile /var/run/redis_6379.pid --> pidfile /ruojian/redis-6.2.1/redis_6379.pid
5.修改 192.168.5.2 配置文件
daemonize no --> daemonize yes (后台程序方式运行)
pidfile /var/run/redis_6379.pid --> pidfile /ruojian/redis-6.2.1/redis_6379.pid
slaveof 192.168.5.1 6379 :增加一行
6.分别启动 :/ruojian/redis-6.2.1/bin/redis-server /ruojian/redis-6.2.1/redis.conf
7.在 192.168.5.1 上进入 redis-cli (配置环境变量方便使用)执行 info 命令

当前为 master ,slave 数量为 1
8.在 192.168.5.2 上进入 redis-cli 执行 info 命令
我这里是在一台主机上开了两个端口测试的 所以 master ip 是本机 正常是 192.168.5.1
9.在 master 上面可以读和写,在 slave 上只能读,写的时候会提示 你不能写一个只读从。
10.主从分别执行 monitor 命令进入到 redis 监控模式
再开一个 redis-cli 窗口执行选择数据库 读写命令,可以看见监控窗口有每一条命令的记录
当 slave 上线时 master 会执行一次 PING 命令
当 master 执行 set 命令时,可以看见 slave 监控窗口也出现 set 命令
正常情况 slave 会每隔 10 秒向 master 发送一次 ping 命令
二、哨兵
1.复制 sentinel.conf 配置文件三份 26380.conf, 26381.conf, 26382.conf
2.分别修改 ip :port 为 26380,26381,26382
3.设置监控的 master 主服务器,服务器ip和端口 (三个配置文件一样)
sentinel monitor mymaster 127.0.0.1 6381 2 (文件中有个默认的 叫 mymaster,需要注释掉)
4.启动 redis 一主两从: /ruojian/redis-6.2.1/bin/redis-server /ruojian/redis-6.2.1/redis.conf
5.启动三个 sentinel :/ruojian/redis-6.2.1/bin/redis-sentinel /ruojian/redis-6.2.1/26380.conf
Sentinel会根据Master的配置自动发现Master的Slaves
6.通过命令查看 master是6381,kill 掉之后 sentinel 日志发生变化
主服务器判断为下线失效至少需要2个Sentinel同意,如果多数Sentinel同意才会执行故障转移,
7.重新启动 6381 ,日志显示 slave 上线,master 还是 6380,不会回到 6381
8.工作原理(摘抄自 https://www.cnblogs.com/maybesuch/p/10257374.html ) :
- master 状态监测,如果 master 异常,则会进行 master-slave 转换,将其中一个 slave 升级为 master,将之前的 master 降级为 slave
- master-slave 转换后,master_redis.conf、slave_redis.conf 和 sentinel.conf 的内容都会发生改变,master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换
- 每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令
- 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
- 如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
- 当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线
- 在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令
- 当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次
- 若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。
- 若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。
三、集群
1.安装好单机 redis
2.将 daemonize no --> daemonize yes (后台程序方式运行)
3.将 # cluster-enabled yes 的注释打开
4.redis 集群至少需要3个节点,因为投票机制是需要超过半数支持才会同意,要保证集群的高可用,每个节点至少需要1个从节点,所以需要6个节点
5.把 redis.conf 复制到 bin 目录里面去,
6.创建目录 cluster ,把 bin 目录中的文件复制到 cluster 下的 redis01 目录中,删除 dump.rdb 文件
cp -r bin/ /ruojian/redis-6.2.1/cluster/redis01 :最后一个目录可以不存在,会自动创建 (必须保证 cluster 目录存在 )
7.把 redis01 复制5分 分别为 02 03 04 05 06,分别修改端口为 6380 6381 6382 6383 6384 6385
8.编写脚本批量启动 runAll.sh ,添加可执行权限 chmod +x runAll.sh
9.启动6个节点
10.创建集群 :redis-cli --cluster create --cluster-replicas 1 192.168.5.14:6380 192.168.5.14:6381 192.168.5.14:6382 192.168.5.14:6383 192.168.5.14:6384 192.168.5.14:6385
--cluster-replicas 1 :集群主节点需要多少个从节点,每个主节点设置1个从节点,所以我们创建了6个节点
11.如果遇到 :[ERR] Node 192.168.5.14:6380 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
删除每一个节点下的这两个文件
再重新创建集群
12.选择集群中任意一个节点连接:redis-cli -p 6380
cluster info :查询集群信息
cluster nodes : 查询集群节点信息
13.设置密码(6个节点需要单独设置),不重启
config set masterauth 123456
config set requirepass 123456
auth 123456
config rewrite
14.Java 连接集群
a.创建 Spring Boot 项目导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
b.编辑 application.yml 文件
server:
port: 9550
spring:
redis:
database: 0
password: 123456
jedis:
pool:
max-active: 8
max-wait: -1
max-idle: 8
min-idle: 0
timeout: 10000
cluster:
nodes:
- 192.168.5.14:6380
- 192.168.5.14:6381
- 192.168.5.14:6382
- 192.168.5.14:6383
- 192.168.5.14:6384
- 192.168.5.14:6385
c.编写测试接口
@Autowired
private RedisTemplate<String, String> rt;
@RequestMapping(value="/set/{key}/{value}")
public String set(@PathVariable String key, @PathVariable String value){
ValueOperations<String, String> redisValue=rt.opsForValue();
redisValue.set(key, value);
return redisValue.get(key);
}
@RequestMapping(value="/get/{key}")
public String get(@PathVariable String key){
ValueOperations<String, String> redisValue=rt.opsForValue();
return redisValue.get(key);
}
d.测试链接 http://localhost:9550/set/123/123456789
e.服务器查询结果