《Redis开发与运维》笔记-哨兵安装与部署
部署拓扑结构
Redis Sentinel物理结构:
角色 | ip | port | 别名 |
---|---|---|---|
master | 127.0.0.1 | 6380 | 主节点或者6380节点 |
slave-1 | 127.0.0.1 | 6381 | slave-1或者6381节点 |
slave-2 | 127.0.0.1 | 6382 | slave-2或者6382节点 |
sentinel-1 | 127.0.0.1 | 26380 | sentinel-1或者26380节点 |
sentinel-2 | 127.0.0.1 | 26381 | sentinel-2或者26381节点 |
sentinel-3 | 127.0.0.1 | 26382 | sentinel-3或者26382节点 |
部署Redis数据节点
- 主节点配置
//redis-6380.conf
port 6380 //配置端口
daemonize yes //配置后台启动
logfile "6380.log" //配置日志文件
dbfilename "dump-6380.rdb" //配置rdb文件名称
dir "/root/redis-3.2.11/data" //配置数据存储目录
启动主节点
redis-server redis-6380.conf
- 从节点配置
- 6381节点
//redis-6381.conf
port 6381 //配置端口
daemonize yes //配置后台启动
logfile "6381.log" //配置日志文件
dbfilename "dump-6381.rdb" //配置rdb文件名称
dir "/root/redis-3.2.11/data" //配置数据存储目录
slaveof 127.0.0.1 6380 //配置主节点复制地址
masterauth password //配置主节点密码 如果有密码的话
- 6382节点
//redis-6382.conf
port 6382 //配置端口
daemonize yes //配置后台启动
logfile "6382.log" //配置日志文件
dbfilename "dump-6382.rdb" //配置rdb文件名称
dir "/root/redis-3.2.11/data" //配置数据存储目录
slaveof 127.0.0.1 6380 //配置主节点复制地址
masterauth password //配置主节点密码 如果有密码的话
启动节点
redis-server redis-6381.conf
redis-server redis-6382.conf
主从节点启动完成后,可以通过命令查看状态
主节点视角:
[root@izwz9ja3exxb7by25st5gbz redis-3.2.11]# cd /usr/local/bin/
[root@izwz9ja3exxb7by25st5gbz bin]# redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:master //节点角色为主节点
connected_slaves:2 //当前从节点数量
//从节点列表
slave0:ip=127.0.0.1,port=6382,state=online,offset=16456486,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=16456486,lag=1
master_repl_offset:16456909
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15408334
repl_backlog_histlen:1048576
127.0.0.1:6380>
从节点视角:
[root@izwz9ja3exxb7by25st5gbz bin]# redis-cli -p 6381
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1 //主节点地址信息
master_port:6380
master_link_status:up //链接状态 up代表成功
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:16484022
slave_priority:100
slave_read_only:1 //从节点只读
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381>
如果主从节点采用的公网地址访问 ,将127.0.0.1替换为公网地址即可。
部署Sentinel节点
3个sentinel节点配置其实都一样,只需要配置不同的端口就行。
//sentinel-26380.conf
protected-mode no //关闭保护模式 公网访问的话一定要关闭
port 26380
dir /root/redis-3.2.11/data
//配置监控主节点的地址信息 并命名为mymaster 2代表判断主节点失败至少需要2个Sentinel节点同意
//如果主从节点采用的公网地址访问 ,将127.0.0.1替换为公网地址即可。
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel auth-pass mymaster password //配置监控主节点的密码 如果有的话
sentinel down-after-milliseconds mymaster 30000 //判断节点是否失败的重要依据 超过设定时间,则代表节点不可达
sentinel parallel-syncs mymaster 1 //故障转移过程中 每次允许同时多少个从节点进行复制,限制向新节点发起复制操作的从节点个数。
sentinel failover-timeout mymaster 180000 //故障转移超时时间
启动节点
//方式一
redis-sentinel sentinel-6382.conf &
//方式二
redis-server sentinel-6382.conf --sentinel &
查看配置状态:
redis-cli -p 26380
127.0.0.1:26380> 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:6380,slaves=2,sentinels=3
127.0.0.1:26380>
如果主从节点采用的公网地址访问 ,将127.0.0.1替换为公网地址即可。
Java客户端连接
引入依赖包
//引入jedis客户端 maven方式 对应redis版本
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
新建测试类
package top.layne.redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;
import java.util.HashSet;
import java.util.Set;
/**
* @author Layne
* @date 2021/3/24
*/
public class RedisSentinel {
public static void main(String[] args) {
Set<String> sentinelSet = new HashSet<String>();
//添加sentinel节点地址信息 公网地址访问 替换掉127.0.0.1就行
sentinelSet.add("127.0.0.1:26380");
sentinelSet.add("127.0.0.1:26381");
sentinelSet.add("127.0.0.1:26382");
JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster", sentinelSet);
Jedis jedis = jedisSentinelPool.getResource();
String value = jedis.get("layne");
System.out.println("value:" + value);
System.out.println("client:" + jedis.info());
jedis.set("layne","sentinel" );
jedis.close();
jedisSentinelPool.destroy();
}
}
验证测试
可以通过直接kill 掉redis主节点进程 或者通过shutdown执行关闭,客户端不受影响,依然能响应数据信息。通过redis-cli 去连接从节点查看 info replication命令会发现有新的主节点生成,重新启动旧的主节点,会发现会被修改为从节点,去复制新的主节点信息