redis高可用架构的三种方式
- 主从复制(master slave)
master提供读写,并且通过【全量复制 增量复制】方式把数据同步到从slave。当master挂了之后,没有自动选举新master的功能,只能人工干预,这段时间内不能提供服务,缺点很明显。 - 哨兵
哨兵是一个独立的进程,在生产环境上可以把它和redis实例分别部署在不同的机器。原理是,哨兵发送命令,等待redis服务器响应,从而实现监控redis服务器。
哨兵的作用:
1.监控多个redis服务
2.当发现master挂了之后,执行故障转移。然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。 - 集群
搭建redis哨兵步骤
redis实例
redis-master 192.168.127:6379
redis-slave1 192.168.127:6001
redis-slave2 192.168.127:6002
master-redis.conf
#为了测试方便关闭主机绑定
#bind 127.0.0.1 ::1
#关闭保护模式
protected-mode no
# 设置密码
requirepass 123456
#启用后台启动
daemonize yes
#设置master的密码
masterauth 123456
slave-redis.conf
#bind 127.0.0.1 ::1
#关闭保护模式
protected-mode no
# 设置密码
requirepass 123456
#设置master的ip和端口 老版本的使用 【slaveof <masterip> <masterport>】
#redis-5.0.4版本的使用下面的方式配置,其他版本自行查阅官方文档
replicaof <masterip> <masterport>
#设置master的密码
masterauth 123456
#分别把两个slave的端口设置为 6001 6002
port 6001
#启用后台启动
daemonize yes
分别在redis-master/bin redis-slave1/bin redis-slave2/bin下执行这个命令来启动redis服务./redis-server ../redis.conf
,启动完后在redis-master/bin下执行./redis-cli -a 123456 -p 6379
,这样我们就用客户端连接到了服务端,然后执行info replication
,查看主从的相关配置:
主从算是搭建好了,下来我们搭建哨兵,实现故障转移。
sentinel实例
sentinel1 192.168.127:20001
sentinel1 192.168.127:20002
sentinel1 192.168.127:20003
sentinel.conf
#修改端口
port 20001
#设置要监控的master的信息【sentinel monitor <master-name> <ip> <redis-port> <quorum>】
sentinel monitor mymaster 192.168.127.128 6379 2
# 设置master的密码【sentinel auth-pass <master-name> <password>】
sentinel auth-pass mymaster 123456
# 关闭保护模式
protected-mode
分别在sentinel1/bin sentinel2/bin sentinel3/bin 下执行./redis-sentinel ../sentinel.conf
这个命令来启动哨兵。启动成功如下图所示:
主从切换
刚开始端口为6379是主服务器,现在我们执行./redis-cli -a 123456 -p 6379 shutdown
这个命令把master挂掉,看看是否能实现主从切换。
查看sentinel的启动日志,我们发现6001被选举为新的master了,如下图:
我们去6001,执行info replication
命令,看到确实变成了master
如果我们把挂到的6379 master启动起来,它会当成slave加入进来,如下图所示
使用jedis客户端连接redis哨兵
package com.demo;
import java.util.HashSet;
import java.util.Set;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;
public class JedisConnectionUtils {
static JedisSentinelPool jedisSentinelPool=null;
static{
JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();
Set<String> sentinels=new HashSet<String>();
sentinels.add("192.168.127.128:20001");
sentinels.add("192.168.127.128:20002");
sentinels.add("192.168.127.128:20003");
jedisSentinelPool=new JedisSentinelPool("mymaster", sentinels,jedisPoolConfig,5000,"123456");
}
public static Jedis getJedis() {
return jedisSentinelPool.getResource();
}
}
今天redis的哨兵搭建就到这来结束了,大神勿喷,在留言区多交流,谢谢大家