Apache Curator

java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy解决方法

走远了吗. 提交于 2020-10-16 18:23:36
java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy解决方法 参考文章: (1)java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy解决方法 (2)https://www.cnblogs.com/zhjh256/p/9951594.html 备忘一下。 来源: oschina 链接: https://my.oschina.net/stackoom/blog/4676611

零废话!全程高能NettyRedis+ZooKeeper笔记

て烟熏妆下的殇ゞ 提交于 2020-10-02 03:35:26
写在最前面 移动时代、5G时代、物联网时代的大幕已经开启,它们对于高性能、高并发的开发知识和技术的要求,抬升了Java工程师的学习台阶和面试门槛。大公司的面试题从某个侧面映射出生产场景中对专项技术的要求。高并发的面试题以前基本是BAT等大公司的专利,现在几乎蔓延至与Java项目相关的整个行业。例如,与Java NIO、Reactor模式、 高性能通信、分布式锁、分布式ID、分布式缓存、高并发架构等技术相关的面试题,从以前的加分题变成了现在的基础题,这也映射出开发Java项目所必需的技术栈:分布式Java框架、Redis缓存、分布式搜索ElasticSearch、分布式协调ZooKeeper、消息队列Kafka、高性能通信框架Netty。 今天分享的这份笔记虽然重在讲解Netty、Redis、 ZooKeeper的使用方法,但是还有一个更大的价值,就是为大家打下Java高并发开发技术的坚实基础。 首先,从操作系统的底层原理开始讲解:浅显易懂地剖析高并发IO的底层原理,并介绍如何让单体Java应用支持百万级的高并发:从传统的阻塞式OIO开始,细致地解析Reactor高性能模式,介绍高性能网络开发的基础知识:从Java的线程Join和线程池开始,介绍Java Future和Guava ListenableFuture两种常用异步回调技术。这些原理方面的基础知识非常重要

Elasticsearch面试题及答案详解

放肆的年华 提交于 2020-09-28 18:45:59
自知水平有限,欢迎大家留言拍砖指正。 1、elasticsearch了解多少,说说你们公司es的集群架构,索引数据大小,分片有多少,以及一些调优手段 。 面试官:想了解应聘者之前公司接触的ES使用场景、规模,有没有做过比较大规模的索引设计、规划、调优。 解答: 如实结合自己的实践场景回答即可。 比如:ES集群架构13个节点,索引根据通道不同共20+索引,根据日期,每日递增20+,索引:10分片,每日递增1亿+数据, 每个通道每天索引大小控制:150GB之内。 仅索引层面调优手段: 1.1、设计阶段调优 (1)根据业务增量需求,采取基于日期模板创建索引,通过roll over API滚动索引; (2)使用别名进行索引管理; (3)每天凌晨定时对索引做force_merge操作,以释放空间; (4)采取冷热分离机制,热数据存储到SSD,提高检索效率;冷数据定期进行shrink操作,以缩减存储; (5)采取curator进行索引的生命周期管理; (6)仅针对需要分词的字段,合理的设置分词器; (7)Mapping阶段充分结合各个字段的属性,是否需要检索、是否需要存储等。…….. 1.2、写入调优 (1)写入前副本数设置为0; (2)写入前关闭refresh_interval设置为-1,禁用刷新机制; (3)写入过程中:采取bulk批量写入; (4)写入后恢复副本数和刷新间隔; (5

不用找了,基于 Redis 的分布式锁实战来了!

十年热恋 提交于 2020-08-16 10:22:52
作者:菜蚜 my.oschina.net/wnjustdoit/blog/1606215 前言:在分布式环境中,我们经常使用锁来进行并发控制,锁可分为乐观锁和悲观锁, 基于数据库版本戳的实现是乐观锁,基于redis或zookeeper的实现可认为是悲观锁了。乐观锁和悲观锁最根本的区别在于线程之间是否相互阻塞。 那么,本文主要来讨论基于redis的分布式锁算法问题。 从2.6.12版本开始,redis为SET命令增加了一系列选项(set [key] NX/XX EX/PX [expiration]): EX seconds – 设置键key的过期时间,单位时秒 PX milliseconds – 设置键key的过期时间,单位时毫秒 NX – 只有键key不存在的时候才会设置key的值 XX – 只有键key存在的时候才会设置key的值 原文地址: https://redis.io/commands/set 中文地址: http://redis.cn/commands/set.html 注意: 由于SET命令加上选项已经可以完全取代SETNX, SETEX, PSETEX的功能,所以在将来的版本中,redis可能会不推荐使用并且最终抛弃这几个命令。 这里简单提一下,在旧版本的redis中(指2.6.12版本之前),使用redis实现分布式锁一般需要setNX、expire、getSet

Dubbo整合SpringBoot

巧了我就是萌 提交于 2020-08-12 01:04:24
目前的dubbo已支持和springboot集成,还是之前的 例子 ,这次我们通过springboot容器来实现。借此了解一下基于springboot容器启动的dubbo的配置及使用。 1. 准备工作 创建一个Maven空项目,作为项目的父工程,此工程的子项目基于Spring Boot 2.0.5 实现 在父工程的pom.xml引入之后要创建的子工程 < modules > < module > gmall-interface </ module > < module > user-service-provider </ module > < module > order-service-consumer </ module > </ modules > 可以提前看一下工程结构 下面分别来实现子工程:(子工程的实现方式都是在gmall工程下新建Module) 2. 公共API 项目中共用的接口和POJO类,代码和之前一样,这里不再展开 3. 服务提供者 工程结构如下 引入依赖 <!-- 引入公共API,以实现其接口 --> < dependency > < groupId > com.zang </ groupId > < artifactId > gmall-interface </ artifactId > < version > 1.0-SNAPSHOT </ version

分布式锁用 Redis 还是 Zookeeper?

家住魔仙堡 提交于 2020-08-10 07:22:46
云栖号资讯:【 点击查看更多行业资讯 】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 为什么用分布式锁? 在讨论这个问题之前,我们先来看一个业务场景: 系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用户下单。 由于系统有一定的并发,所以会预先将商品的库存保存在redis中,用户下单的时候会更新redis的库存。 此时系统架构如下: 但是这样一来会产生一个问题:假如某个时刻,redis里面的某个商品库存为1,此时两个请求同时到来,其中一个请求执行到上图的第3步,更新数据库的库存为0,但是第4步还没有执行。 而另外一个请求执行到了第2步,发现库存还是1,就继续执行第3步。 这样的结果,是导致卖出了2个商品,然而其实库存只有1个。 很明显不对啊!这就是典型的库存超卖问题 此时,我们很容易想到解决方案:用锁把2、3、4步锁住,让他们执行完之后,另一个线程才能进来执行第2步。 按照上面的图,在执行第2步时,使用Java提供的synchronized或者ReentrantLock来锁住,然后在第4步执行完之后才释放锁。” 这样一来,2、3、4 这3个步骤就被“锁”住了,多个线程之间只能串行化执行。 但是好景不长,整个系统的并发飙升,一台机器扛不住了。现在要增加一台机器,如下图:

zookeeper实现分布式锁总结,看这一篇足矣(设计模式应用实战)

主宰稳场 提交于 2020-08-08 09:02:44
zk实现分布式锁纵观网络各种各样的帖子层出不穷,笔者查阅很多资料发现一个问题,有些文章只写原理并没有具体实现,有些文章虽然写了实现但是并不全面 借这个周末给大家做一个总结,代码拿来就可以用并且每一种实现都经过了测试没有bug。下面我们先从最简单的实现开始介绍: 简单的实现 package com.srr.lock; /** * @Description 分布式锁的接口 */ abstract public interface DistributedLock { /** * 获取锁 */ boolean lock(); /** * 解锁 */ void unlock(); abstract boolean readLock(); abstract boolean writeLock(); } package com.srr.lock; /** * 简单的zk分布式做实现策略 * 性能比较低会导致羊群效应 */ public abstract class SimplerZKLockStrategy implements DistributedLock{ /** * 模板方法,搭建的获取锁的框架,具体逻辑交于子类实现 * @throws Exception */ @Override public boolean lock() { // 获取锁成功 if (tryLock()){

Zookeeper入门,一篇就够啦

若如初见. 提交于 2020-08-08 04:53:13
创作不易,如果觉得这篇文章对你有帮助,欢迎各位老铁点个赞呗,您的支持是我创作的最大动力! 本系列主要总结下Zookeeper的基础使用,笔者准备写四篇文章: 博文内容 资源链接 Linux下搭建Zookeeper运行环境 https://blog.csdn.net/smilehappiness/article/details/105933433 Zookeeper入门,一篇就够啦 https://blog.csdn.net/smilehappiness/article/details/105933292 Zookeeper客户端ZkClient、Curator的使用,史上最详细的教程来啦~ https://blog.csdn.net/smilehappiness/article/details/105938058 Zookeeper使用总结(进阶篇) https://blog.csdn.net/smilehappiness/article/details/105938119 文章目录 前言 1 初识Zookeeper 2 Zookeeper运行环境 3 zoo.cfg配置文件详解 4 Zookeeper数据结构 5 Zookeeper客户端 5.1 图形界面客户端 5.2 命令行客户端 前言 本文主要介绍Zookeeper的一些概念,以及通过命令行的方式

zookpeer常见面试题

早过忘川 提交于 2020-08-08 04:31:53
1.ZAB 协议是什么? ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持崩溃恢复的原子广播协议。 ZAB 协议包括两种基本的模式: 崩溃恢复和消息广播 。 当整个 zookeeper 集群刚刚启动或者 Leader 服务器宕机、重启或者网络故障导致不存在过半 的服务器与 Leader 服务器保持正常通信时,所有进程(服务器)进入崩溃恢复模式; 首先 选举产生新的 Leader 服务器,然后集群中 Follower 服务器开始与新的 Leader 服务器进行数 据同步,当集群中超过半数机器与该 Leader 服务器完成数据同步之后,退出恢复模式进入 消息广播模式, Leader 服务器开始接收客户端的事务请求生成事物提案来进行事务请求处 理。 2.Znode 有哪几种类型 PERSISTENT- 持久节点 除非手动删除,否则节点一直存在于 Zookeeper 上 EPHEMERAL- 临时节点 临时节点的生命周期与客户端会话绑定,一旦客户端会话失效(客户端与 zookeeper 连接断 开不一定会话失效),那么这个客户端创建的所有临时节点都会被移除。 PERSISTENT_SEQUENTIAL- 持久顺序节点 基本特性同持久节点,只是增加了顺序属性,节点名后边会追加一个由父节点维护的自增整 型数字。 EPHEMERAL_SEQUENTIAL- 临时顺序节点

Elasticsearch通过elasticsearch-curator 插件来定期删除Index

心不动则不痛 提交于 2020-08-05 08:29:55
Elasticsearch管理中索引的管理非常重要。基于磁盘空间和性能的考量,索引的生命周期管理显得尤为重要。Curator允许对索引创建、删除等操作,下面是我们借助 elasticsearch-curator 插件来定期删除index.本文主要介绍elasticsearch-curator 插件的安装步骤。 Step 1下载 https://www.elastic.co/guide/en/elasticsearch/client/curator/current/yum-repository.html Step 2 上传安装包至服务器,并创建相应的文件 Step 3 安装 执行的安装命令如下: yum localinstall elasticsearch-curator- 5.8 . 1 - 1 .x86_64.rpm Step 4 完善更新配置文件 config.yml文件 详细内容如下: --- # Remember, leave a key empty if there is no value. None will be a string , # not a Python " NoneType " client: hosts: - 2 01.101 . 101.101 port: 端口 url_prefix: use_ssl: False certificate: