• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >云计算 > Jedis分片Sentinel连接池实验,jedissentinel实验

Jedis分片Sentinel连接池实验,jedissentinel实验

作者:网友 字体:[增加 减小] 来源:互联网

本文主要包含jedis sentinel,jedis连接池,jedis连接池配置,jedis池,jedis等服务器相关知识,网友希望可以进行参考

Jedis分片Sentinel连接池实验,jedissentinel实验


Jedis分片Sentinel连接池实验

1.起因

众所周知,Redis官方HA工具Sentinel已经问世很久了,但令人费解的是,Jedis官方却迟迟没有更新它的连接池。到目前Maven库中最新的2.7.3版本为止,都只能要么使用分片连接池,要么使用不分片的Sentinel连接池。如果既进行了Sharding,又对每组的主从实例配置Sentinel进行监控,怎么办?答案是只能自己开发了,晕!还好万能的GitHub上已经有人提供了一个简单可用的分片Sentinel连接池实现,于是就直接拿来用用。


2.Sentinel配置

我的Redis是这样配置的:一个主6379带一个从16379,名字叫mymaster-6379;另一个主6380带另一个从16380,名字叫mymaster-6380。Sentinel按照惯例,起三个实例26379,26380,26381。以其中一个为例,其他的Sentinel配置只是端口号不同:

port 26379
dir /tmp

sentinel monitor mymaster-6379 192.168.241.220 6379 2
sentinel down-after-milliseconds mymaster-6379 30000
sentinel parallel-syncs mymaster-6379 1
sentinel failover-timeout mymaster-6379 180000

sentinel monitor mymaster-6380 192.168.241.220 6380 2
sentinel down-after-milliseconds mymaster-6380 30000
sentinel parallel-syncs mymaster-6380 1
sentinel failover-timeout mymaster-6380 180000

如果想要Sentinel快速failover,就把sentinel down-after-milliseconds mymaster-6379 30000中的30秒改短点,这个时间是Sentinel Ping不到Master多久后开始failover。具体Redis主从复制和Sentinel如何配置就不赘述了,请参考我以前写的Redis主从和HA配置。


3.Jedis客户端扩展

3.1 测试代码

将GitHub那个开源的连接池引到工程里,使用起来很简单,只需通过构造方法传入所有Sentinel实例的连接地址以及master的名字列表。连接池配置可以使用默认的。

注意:一定要每次重新从pool中取一个连接,否则会一直访问老master。

    public static void main(String[] args) throws Exception {
        Set<String> sentinels = new HashSet<String>();
        sentinels.add("192.168.111.222:26379");
        sentinels.add("192.168.111.222:26380");
        sentinels.add("192.168.111.222:26381");

        ShardedJedisSentinelPool pool = new ShardedJedisSentinelPool(
                Arrays.asList("mymaster-6379", "mymaster-6380"),
                sentinels
        );

        while (true) {
            String ts = new SimpleDateFormat("hh:mm:ss").format(new Date());
            ShardedJedis jedis = pool.getResource();
            try {
                System.out.println(ts + ": hello=" + jedis.get("hello"));
            } catch (Exception e) {
                System.out.println(ts + ": Cannot connect to Redis");
            } finally {
                jedis.close();
            }
            Thread.sleep(500L);
        }
    }

3.2 连接泄露Bug

循环时发现ShardedJedisSentinelPool连接池有时竟然满了!毕竟默认是8个连接,但为什么会这样?查了下代码,果然是这个原因!这个新扩展的pool没有为getResource()出来的ShardedJedis设置DataSource,所以关闭ShardedJedis时没法正常还回到连接池中。

补丁很简单,就是参照Jedis的ShardedJedisPool,覆写一些资源管理的方法。

    @Override
    public ShardedJedis getResource() {
        ShardedJedis jedis = super.getResource();
        jedis.setDataSource(this);
        return jedis;
    }

    @Override
    public void returnBrokenResource(final ShardedJedis resource) {
        if (resource != null) {
            returnBrokenResourceObject(resource);
        }
    }

    @Override
    public void returnResource(final ShardedJedis resource) {
        if (resource != null) {
            resource.resetState();
            returnResourceObject(resource);
        }
    }

3.3 KeyTag

此外,ShardedJedisSentinelPool的构造方法中没提供传入KeyTagPattern的地方,这也需要手动传入到ShardedJedisFactory中。需要的话,自己动手加一下吧!


4.Failover实验

以key=hello为例,事先在6380实例上准备好key的值。

4.1 实验结果

首先,启动Java程序不断访问。然后,在后台kill掉6380那个Redis实例。控制台输出会警告无法连接Redis。大概30秒左右,本地连接池注册的Sentinel监听器会收到failover消息。于是,从pool.getResource()拿到的连接自动切换到Slave实例了,又可以查询到hello对应的值了。

10:13:42: hello=nihaonihao111
10:13:42: Cannot connect to Redis
10:13:43: Cannot connect to Redis
10:13:45: Cannot connect to Redis



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Jedis分片Sentinel连接池实验,jedissentinel实验

相关文章

  • 云服务器之间实时文件同步和文件备份的最简单高效的免费方案,实时文件备份
  • hadoop-2.6.0安装(new),hadoop-2.6.0new
  • Hadoop向HDFS写入、删除、读取文件,
  • 云计算NA1
  • Azkaban的AJAX的RestFul接口调用事例
  • Docker 中文文档目录,docker文档目录
  • Docker(1):Virtualbox Install Centos7 &amp; Docker,dockervirtualbox
  • 与Greenplum度过的三个星期,greenplum三个星期
  • HIVE动态分区实战,hive动态实战
  • Maven构建Hadoop Web项目,maven构建hadoopweb

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • 如何选择大数据培训机构,选择数据培训机构
    • &lt;转&gt;Openstack Ceilometer监控项扩展,openstackceilometer
    • hadoop学习笔记(六)——hadoop2.5.2全分布模式实现的部署,hadoophadoop2.5.2
    • Greenplum+Hadoop学习笔记-14-定义数据库对象之创建与管理序列、索引以及视图,hadoop-14-
    • 《转》openstack中删除虚拟主机,状态一直deleting,《转》openstack
    • hadoop集群只有一个datanode启动问题,hadoop集群datanode
    • Docker image的工作原理,dockerimage
    • HBase基本数据操作详解,HBase数据操作详解
    • Hadoop自测题,hadoop
    • 云服务器 性能测试之web压力测试,web压力测试

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有