redis主从复制和sentinel配置高可用

一:redis主从配置
1、环境准备

master : 192.168.50.10 6179
slave1: 192.168.50.10 6279
slave2: 192.168.50.10 6379
2、redis.conf配置文件配置

master

port 6179
requirepass 123456 #密码认证,可以不设置
dir "/var/redis/6179" #工作目录,dump.rdb会保留在这个目录
slave1

port 6279
slaveof 192.168.50.10 6179 #master的ip和端口,不能使用127.0.0.1 6179
masterauth 123456 #如果master设置了requirepass,则这里需要配置
slave-read-only yes #默认就是yes
dir "/var/redis/6279"
slave2

port 6379
slaveof 192.168.50.10 6179 #master的ip和端口,不能使用127.0.0.1 6179
masterauth 123456 #如果master设置了requirepass,则这里需要配置
slave-read-only yes #默认就是yes
dir "/var/redis/6379"
注意:如果slaveof 127.0.0.1 6179,则链接sentinel时提示是127.0.0.1,无法连接

3、启动redis并测试 ==> 如果设置了daemonize yes则没有日志输出,默认是no

启动: nohup redis-server /redis/redis.conf $1>>/var/log/redis/redis.log 2>&1 &

master 127.0.0.1:6179>info replication

slave1 127.0.0.1:6279>info replication

slave2 127.0.0.1:6379>info replication

在master中执行如下语句,如果所有机器执行keys* 都能查出name这个key说明能够复制

127.0.0.1:6179> set name nametest
4、日志分析

slave1和slave2一启动就会去链接master

master启动后,接受slave1和slave2的信息同步请求,进行RDB持久化(在内存中持久化)

5、redis主从同步规则

Salve会发送sync命令到Master
Master启动一个后台进程,将Redis中的数据快照保存到文件中
启动后台进程的同时,Master会将保存数据快照期间接收到的写命令缓存起来
Master完成写文件操作后,将该文件发送给Salve
Salve将文件保存到磁盘上,然后加载文件到内存恢复数据快照到Salve的Redis上
当Salve完成数据快照的恢复后,Master将这期间收集的写命令发送给Salve端
后续Master收集到的写命令都会通过之前建立的连接,增量发送给salve端
总结一下,主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步

注意:在redis2.8开始,slave重新启动,会发送psync到master进行部分同步,而不是sync全量同步

二:Sentinel 组件实现HA配置
1、介绍

Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,功能类似于zk,用于监控redis master状态,进行切换。

sentinel是和redis独立的组件,不需要每个redis节点都启动sentinel,可以在任何机器上部署,只要能够连接redis master即可。

其功能类似于zk,用于监听和选举,可以启动多个sentinel作为集群,只要连接的master相同,则认为是统一集群,sentinel集群中各个sentinel也有互相通信,通过gossip协议

一个sentinel可以监听多个redis集群,他们是通过连接到redis master,利用发布/订阅功能来发现其他sentinel的存在。

2、配置参数介绍

集群1 mymaster

# 至少2个sentinel认为mymaster挂了,才真正认为是挂了,所以sentinel至少要有2个在运行
sentinel monitor mymaster 192.168.50.10 6179 2
# sentinel向master发送ping,如果在这时间内没有响应,则这个sentinel认为master挂了
sentinel down-after-milliseconds mymaster 60000
#
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
集群2 resque

sentinel monitor resque 192.168.50.10 6179 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5
3、工作原理

链接master,获取slave和其他sentinel信息,记录到自己的sentinel.conf中,如下图

sentinel发现down-after-milliseconds 时间内master没有回复,则认为failor,它会问集群其他sentinel是否也有人认为失败,个数达到sentinel monitor mymaster xxx 2,才会触发failover

sentinel集群选举其中一个sentinel拿着一个唯一的版本号去进行master切换。此sentinel指定一个slave发送SLAVE OF NO ONE,将其转化为master,同时将这些配置信息广播给其他sentinel,进行更新master信息

4、启动 ===> 如果设置了daemonize yes则没有日志输出

nohup redis-server redis-slave1/sentinel.conf --sentinel $1>>/var/log/sentinel/sentinel.log 2>&1 &
5、失败测试=> 6379变成了6179的redis

6、注意

当一个master配置为需要密码才能连接时,客户端和slave在连接时都需要提供密码。

master通过requirepass设置自身的密码,不提供密码无法连接到这个master。
slave通过masterauth来设置访问master时的密码。

但是当使用了sentinel时,由于一个master可能会变成一个slave,一个slave也可能会变成master,所以需要同时设置上述两个配置项。
三:动态切换master测试
1、pom依赖

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2、代码

public class JedisSentinelTest {
public static void main(String[] args) {
/**
* 获取master链接~方法一
*/
HashSet<String> sentinelSet = new HashSet<>();
sentinelSet.add("192.168.50.10:26179"); // 这个节点目前是挂掉的,也可以配置,后续启动有效
sentinelSet.add("192.168.50.10:26279");
sentinelSet.add("192.168.50.10:26379");
JedisSentinelPool myMasterSentinel = new JedisSentinelPool(www.tiaotiaoylzc.com"mymaster", sentinelSet);

Jedis master = myMasterSentinel.getResource();
master.set(www.fengshen157.com"aaaa", "aaaTest");
master.close();

/**
* 获取master链接~方法二
*/
Jedis sentinelNode = new Jedis("192.168.50.10", 26179);
List<Map<String, String>> masterList www.shengbangyule178.cn= sentinelNode.sentinelMasters();
Map<String, String> masterMap = null;
for (Map<String, String> temp : masterList){
if ("mymaster".equals(temp.get("name"))){
masterMap = temp;
break;
}
}
System.out.println("masterIp:www.meiwanyule.cn" + masterMap.get("ip"));
System.out.println("masterPort:" + masterMap.get("port"));

List<String> mymaster = sentinelNode.sentinelGetMasterAddrByName("mymaster");
System.out.println("masterIp:" + mymaster.get(0));
System.out.println("masterPort:" + mymaster.get(1));

/**
* 获取slaves
*/
Jedis jedis = new Jedis("192.168.50.10", 26179);
List<Map<String, String>> slaves www.myptvip8.com= jedis.sentinelSlaves("mymaster");
for (Map<String, String> temp : slaves){
System.out.println("slaveIp:" + temp.get("ip"));
System.out.println("slaveIp:" + temp.get("port"));
}

/**
* 主从切换
*/
Map<String, String> first = slaves.get(0);
Jedis toBeMaster = new Jedis(first.get("ip"), Integer.parseInt(first.get(www.huanhuayule.cn"port")));
String flag = toBeMaster.slaveofNoOne(); // 将自己设置为主节点

for (int i = 1; i < slaves.size(); i++){
Map<String, String> temp = slaves.get(i);
Jedis ortherSlave = new Jedis(temp.get("ip"), Integer.parseInt(temp.get("port")));
ortherSlave.slaveof(first.get(www.078881.cn/ "ip"), Integer.parseInt(first.get("port")));
}

Jedis slave = new Jedis("192.168.50.10", 6279);
/**
* 重新加载配置信息,复原
*/
slave.configResetStat();

/**
* 手动触发RDB(save、bgsave)以及aof rewrite
*/
slave.save();
slave.bgsave();
slave.bgrewriteaof();

/**
* 获取信息,可以知道自己是什么角色
*/
String info = slave.info();

原文地址:https://www.cnblogs.com/qwangxiao/p/10586833.html

时间: 2024-08-02 03:10:36

redis主从复制和sentinel配置高可用的相关文章

redis主从复制原理与优化-高可用

一 什么是主从复制 机器故障:容量瓶颈:QPS瓶颈 一主一从,一主多从 做读写分离 做数据副本 扩展数据性能 一个maskter可以有多个slave 一个slave只能有一个master 数据流向是单向的,从master到slave 二 复制的 配置 2.1 slave 命令 6380是从,6379是主 ? 在6389上执行 ? slave of 127.0.0.1 6379 #异步 slaveof no one #取消复制,不会把之前的数据清除 2.2 配置文件 slaveof ip port

基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案

基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案 http://www.tuicool.com/articles/naeEJbv 基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案 时间 2014-02-21 15:15:17  IT社区推荐资讯 原文  http://itindex.net/detail/48192-redis-sentinel-redis Redis Sentinel是一个分布式系统,可以部署多个Se

11.Redis 哨兵集群实现高可用

作者:中华石杉 Redis 哨兵集群实现高可用 哨兵的介绍 sentinel,中文名是哨兵.哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 redis master 和 slave 进程是否正常工作. 消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员. 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上. 配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址

Azure 配置高可用的准备系列工作-建立不同区域的存储账户和建立网络!

?? 我们谈到我们的业务,经常谈到一个词,三层架构,就是我们的UI层,数据访问层和数据存储层的分离,通常情况下我们的业务高可用必须满足这三层的全部高可用的情况下才能达到最高级别的高可用. 那么谈到Azure,我们怎么来保证数据在跨站点级别的高可用呢?我们先来谈谈我们怎么保证在IAAS 层面的高可用,拿到了测试账号,我们首先要做的一个事情就是创建基于北方和东边数据中心的虚拟网络,基于虚拟网络分别创建我们的数据中心,那就接下来走起吧,我们先来创建东边的数据中心的虚拟机网络: 登录以后,创建虚拟网络,

18.1 集群介绍;18.2 keepalived介绍;18.3,18.4,18.5 用keepalived配置高可用集群(上,中,下);

18.1 集群介绍 1. 根据功能划分为两大类:高可用和负载均衡 2. 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务 3. 实现高可用的开源软件有:heartbeat.keepalived 负载均衡集群,需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2 4. 实现负载均衡的开源软件有LVS.keepalived.haproxy.nginx,

linux之LVS的DR模式搭建以及配置高可用管理LVS(heartbeat,keepalive)

LVS/DR Realserver: 172.25.44.6 172.25.44.7 Virtualserver: VR3:172.25.44.3 VR5:172.25.44.5 Vip:172.25.44.100 Lvs和realserver必须在同一网段 ######################## Virtualserver: ip addr add 172.25.44.100/24 dev eth0   ##添加vip ip addr show yum install ipvsadm

heartbeat v2配置高可用web集群和基于nfs搭建MySQL高可用集群

安装环境:Centos 6.4, httpd2.4,mysql5.5,heartbeat v2 提供两台机器node1和node2,在/etc/hosts文件中添加名称解析,并且主机名称要与节点名称要相同,即uname -n的名称要和hosts定义的名称必须一样. #   IP                         HOSTNAME             ALIAS 10.204.80.79     node1.mylinux.com     node1 10.204.80.80  

apache+inotify-tools+keepalived+lvs-DR模式配置高可用负载均衡集群

环境:虚拟机VMware workstation 9 操作系统:Redhat 5.6 i386 一.keepalived+LVS-DR模式配置高可用负载均衡 拓扑如下: 二.服务器IP配置信息 四台服务器均有VMware虚拟机实现,两台HA主机.两台web服务器.网络方式都设置为NAT模式 1.master:192.168.80.145 2.slaver:192.168.80.137 3.web1:192.168.80.144 4.web2:192.168.80.134 5.VIP:192.16

Linux高可用集群方案之配置heartbeat v2基于crm+hb_gui接口,配置高可用httpd,mysql,lvs

本章主要配置heartbeat v2基于crm+hb_gui接口,配置高可用httpd,mysql,lvs. 如何安装heartbeat v2.httpd.nfs.配置心跳连接.ssh密钥通信.同步时间.添加名称解析.配置yum源等请参照: >> Linux高可用集群方案之配置heartbeat v2基于haresources配置文件的httpd高可用集群 http://ccschan.blog.51cto.com/11854461/1922966  ll  本文导航    · 前期准备及相关