热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

redis主从备份自动切换+java代码实现类

阅读本文您会学会:1.redis主从备份并自动切换(masterslaver)模式的搭建2.java中配合redis主从备份的方法【实现目

阅读本文您会学会:
1.redis 主从备份并自动切换(master slaver)模式的搭建
2.java 中 配合redis主从备份的方法
【实现目标】:
master redis 正常运行
slaver redis 自动备份 master 的所有数据
当master redis 冗掉 slaver 自动升级为master 接替原来master 的工作
当原master 重启后 自动加入主从备份,原master 会变成新的slaver。
【环境配置】:
此类集群配置需要至少三台机器(当然,可以是虚拟机),三台机器分别安装同样的redis 环境,并配置好ip,及port
ip分别为:

* 192.168.9.17(redis sentinel 集群监控)
* 192.168.9.18(redis 主)
* 192.168.9.19(redis 从)

chmod
【redis 配置】
主:

* 主的redis 配置文件,使用默认的配置文件就可以,当然配置一下更好
* * 此处主要配置的有端口号 port 6379* 后台启动 daemonize yes* 日志位置,注意要自己新建.log类型文件 logfile"home\oracle\redis\text.log"

从:

* 从的redis 配置文件
* * 同主的三个配置属性* 增加master 配置 slaveof 192.168.9.18 6379

sentinel:

* 从安装文件目录下复制 sentinel.conf 文件到软件目录
* 编辑该文件,可将原来的文件中属性文字等清空,再加上下列文字

redis-0##sentinel实例之间的通讯端口

port 26379#master1
sentinel monitor master1 192.168.9.18 6379 1
sentinel down-after-milliseconds master1 5000
sentinel failover-timeout master1 900000
sentinel parallel-syncs master1 2


master2 可以添加多组主从的redis监听…….


..
..

【启动】

* 一定要按顺序启动redis,先启动主,再启动从,最后启动sentinel
* * ./redis-server ./redis.conf* ./redis-sentinel ./sentinel.conf --sentinel * ps:如果提示-bash 权限不够 则使用chmod 777 ./redis.conf 这个命令 执行所有需要运行的文件 然后再正常启动就可以了。* 启动后 可以查看redis 的信息
* ./redis-cli -h 192.168.9.18 -p 6379 info 查看redis信息

Replication

role:slave #代表192.168.9.18:6379 这台redis是主
master_host:192.168.9.18
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_priority:100
slave_read_only:1
connected_slaves:0

* ./redis-cli -h 192.168.9.17 -p 26379 info 查看sentinel 集群信息,如下则表示配置成功

Sentinel

sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=master1,status=ok,address=192.168.9.18:6379,slaves=1,sentinels=1
【故障演示】

* 主redis 冗掉后 ./redis-cli -h 192.168.9.18 -p 6379 shutdown
* 则发现redis 自动把slaver机器升级为master ,而重新启动原来的master服务,则原master服务会变成新的slaver。
* 注意:如果master 发生迁移后,需要重新启动所有redis 的情况下,必须最先启动“新的”master节点,否则sentinel 会一直找不到master。如果想要停止sentinel,可输入./redis-cli -p 26379 shutdown

【代码处配合自动切换】
上述部分是服务器部分自动切换,还需要程序处修改redis配置,此处我们使用jedis 进行演示。
使用以下配置类即可
核心代码在于
Set sentinels = new HashSet();
// 此处放置ip及端口为 sentinel
// 服务地址,如果有多个sentinel 则逐一add即可
sentinels.add(“80.27.112.118:26379”);
jedisPool = new JedisSentinelPool(“master1”,sentinels);
以下代码为工具类 通过配置后可以直接使用

package com.aisino.redis;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import com.aisino.spring.util.SystemConfig;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;

public class JedisClusterUtil {

static {// redis 属性配置 startJedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(5000);config.setMaxIdle(256);config.setMaxWaitMillis(5000L);config.setTestOnBorrow(true);config.setTestOnReturn(true);config.setTestWhileIdle(true);config.setMinEvictableIdleTimeMillis(60000L);config.setTimeBetweenEvictionRunsMillis(3000L);config.setNumTestsPerEvictionRun(-1);// redis 属性配置 endSet sentinels = new HashSet();sentinels.add("80.27.112.118:26379"); // 此处放置ip及端口为 sentinel// 服务地址,如果有多个sentinel 则逐一add即可jedisPool = new JedisSentinelPool("master1", sentinels, config);
}private static JedisSentinelPool jedisPool;public static String get(String key) {String value = null;Jedis jedis = null;try {jedis = jedisPool.getResource();value = jedis.get(key);} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}return value;
}public static void close(Jedis jedis) {try {jedisPool.returnResource(jedis);} catch (Exception e) {if (jedis.isConnected()) {jedis.quit();jedis.disconnect();}}
}public static byte[] get(byte[] key) {byte[] value = null;Jedis jedis = null;try {jedis = jedisPool.getResource();value = jedis.get(key);} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}return value;
}public static void set(String key, String value) {Jedis jedis = null;try {jedis = jedisPool.getResource();jedis.set(key, value);} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}
}public static void set(String key, String value, int time) {Jedis jedis = null;try {jedis = jedisPool.getResource();jedis.set(key, value);jedis.expire(key, time);} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}
}public static void set(byte[] key, byte[] value, int time) {Jedis jedis = null;try {jedis = jedisPool.getResource();jedis.set(key, value);jedis.expire(key, time);} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}
}public static void hset(byte[] key, byte[] field, byte[] value) {Jedis jedis = null;try {jedis = jedisPool.getResource();jedis.hset(key, field, value);} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}
}public static void hset(String key, String field, String value) {Jedis jedis = null;try {jedis = jedisPool.getResource();jedis.hset(key, field, value);} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}
}public static String hget(String key, String field) {String value = null;Jedis jedis = null;try {jedis = jedisPool.getResource();value = jedis.hget(key, field);} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}return value;
}public static byte[] hget(byte[] key, byte[] field) {byte[] value = null;Jedis jedis = null;try {jedis = jedisPool.getResource();value = jedis.hget(key, field);} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}return value;
}public static void hdel(byte[] key, byte[] field) {Jedis jedis = null;try {jedis = jedisPool.getResource();jedis.hdel(key, new byte[][] { field });} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}
}public static void lpush(String key, String value) {Jedis jedis = null;try {jedis = jedisPool.getResource();jedis.lpush(key, new String[] { value });} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}
}public static void rpush(byte[] key, byte[] value) {Jedis jedis = null;try {jedis = jedisPool.getResource();jedis.rpush(key, new byte[][] { value });} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}
}public static void rpoplpush(byte[] key, byte[] destination) {Jedis jedis = null;try {jedis = jedisPool.getResource();jedis.rpoplpush(key, destination);} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}
}public static List lpopList(byte[] key) {List list = null;Jedis jedis = null;try {jedis = jedisPool.getResource();list = jedis.lrange(key, 0L, -1L);} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}return list;
}public static String rpop(String key) {String bytes = null;Jedis jedis = null;try {jedis = jedisPool.getResource();bytes = jedis.rpop(key);} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}return bytes;
}public static List lrange(byte[] key, int from, int to) {List result = null;Jedis jedis = null;try {jedis = jedisPool.getResource();result = jedis.lrange(key, from, to);} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}return result;
}public static void del(String key) {Jedis jedis = null;try {jedis = jedisPool.getResource();jedis.del(key);} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}
}public static long llen(byte[] key) {long len = 0L;Jedis jedis = null;try {jedis = jedisPool.getResource();jedis.llen(key);} catch (Exception e) {jedisPool.returnBrokenResource(jedis);e.printStackTrace();} finally {close(jedis);}return len;
}

}


推荐阅读
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • Redis API
    安装启动最简启动命令行输入验证动态参数启动配置文件启动常用配置通用命令keysbdsize计算key的总数exists判断是否存在delkeyvalue删除指定的keyvalue成 ... [详细]
  • ZABBIX 3.0 配置监控NGINX性能【OK】
    1.在agent端查看配置:nginx-V查看编辑时是否加入状态监控模块:--with-http_stub_status_module--with-http_gzip_stat ... [详细]
  • 其实之前也有下载过完整的android源码,但是从来没有对这个做过一些总结,在加上最近需要经常去看,索性就在从新下载,编译一下,其实这些东西官网上面都有。http:sou ... [详细]
  • python+selenium十:基于原生selenium的二次封装fromseleniumimportwebdriverfromselenium.webdriv ... [详细]
  • [翻译]PyCairo指南裁剪和masking
    裁剪和masking在PyCairo指南的这个部分,我么将讨论裁剪和masking操作。裁剪裁剪就是将图形的绘制限定在一定的区域内。这样做有一些效率的因素࿰ ... [详细]
author-avatar
小呀么小果冻
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有