澳门美高梅手机网站ZooKeeper笔记——技术点汇总

Redis是3个key-value存款和储蓄系统,今后在种种系统中的使用越来越多,大部分境况下是因为其高质量的特点,被用作缓存使用,这里介绍下Redis常常蒙受的接纳境况。

目录

· ZooKeeper安装

· 分布式1致性理论

    · 壹致性级别

    · 集中式系统

    · 分布式系统

    · ACID特性

    · CAP理论

    · BASE理论

    · 一致性协议

· ZooKeeper概况

· ZooKeeper
API

    · 命令

    · Java
API

    · Curator

· ZooKeeper应用场景

    · 数据宣布/订阅

    · 计划水管道理

    · 命名服务

    · 集群众管理理

    · Master选举

    · 分布式锁

    · 分布式队列

    · Hadoop

    · HBase

    · Kafka


 

Redis特性

一个出品的施用情状肯定是亟需根据产品的特色,先列举一下Redis的特色:

  • 读写质量优秀
  • 持久化
  • 数据类型丰硕
  • 单线程
  • 多少自动过期
  • 文告订阅
  • 分布式

那边大家透过多少个场景,不一致维度说下Redis的采用。

ZooKeeper安装

ID

Host Name

1

centos1

2

centos2

  1. 配备机器名。

    vi /etc/hosts

    192.168.0.220 centos1
    192.168.0.221 centos2

  2. 安装JDK并布置环境变量(JAVA_HOME、CLASSPATH、PATH)。

  3. 布署文件。

    tar zxvf zookeeper-3.4.八.tar.gz -C /opt/app/
    cd /opt/app/zookeeper-三.四.8/
    mkdir data/ logs/
    vi conf/zoo.cfg # 集群每台机械的zoo.cfg配置必须1律。

    tickTime=2000
    dataDir=/opt/app/zookeeper-3.4.8/data/
    dataLogDir=/opt/app/zookeeper-3.4.8/data_logs/
    clientPort=218一 initLimit=五 syncLimit=贰 server.一=centos1:288捌:388⑧ # 每台机器都要感知集群的机械组成,配置格式为“server.id=host:port:port”。id范围1~255。
    server.2=centos2:2888:3888

    # 在dataDir目录创制myid文件。根据zoo.cfg配置,id应与机械和工具对应。如centos1的id为1,centos二的id为二.
    echo ① > data/myid
    echo 贰 > data/myid

  4. 启动、关闭。

    bin/zkServer.sh start
    bin/zkServer.sh stop
    bin/zkServer.sh status

  5. 验证。

    bin/zkCli.sh -server centos1:2181

    [zk: centos1:2181(CONNECTED) 0] ls /
    [zookeeper]
    [zk: centos1:2181(CONNECTED) 1] create /helloworld 123
    Created /helloworld
    [zk: centos1:2181(CONNECTED) 2] ls /
    [helloworld, zookeeper]
    [zk: centos1:2181(CONNECTED) 3] quit
    Quitting…

    bin/zkCli.sh -server centos2:2181

    [zk: centos2:2181(CONNECTED) 0] ls /
    [helloworld, zookeeper]
    [zk: centos2:2181(CONNECTED) 1] get /helloworld
    123
    cZxid = 0x100000008
    ctime = Sat Jun 18 16:10:12 CST 2016
    mZxid = 0x100000008
    mtime = Sat Jun 18 16:10:12 CST 2016
    pZxid = 0x100000008
    cversion = 0
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 3
    numChildren = 0
    [zk: centos2:2181(CONNECTED) 2] quit
    Quitting…

高品质符合当作缓存

缓存是Redis最普遍的利用场景,之富有这么使用,主假设因为Redis读写质量非凡。而且慢慢有代表memcached,成为首要选择服务端缓存的零件。而且,Redis内部是支撑工作的,在动用时候能有效保险数据的壹致性。
用作缓存使用时,壹般有三种艺术保存数据:

  • 一、读取前,先去读Redis,假设没有数量,读取数据库,将数据拉入Redis。
  • 二、插入数据时,同时写入Redis。

方案1:实施起来大致,可是有七个须求注意的地点:
一、制止缓存击穿。(数据库未有就要求命中的数据,导致Redis平素未有数据,而一贯命中数据库。)
二、数据的实时性绝对会差不离。

方案2:数据实时性强,不过付出时不便于统1处理。

本来,三种格局基于真实境况来适用。如:方案一适用于对于数据实时性供给不是特意高的场景。方案二适用于字典表、数据量一点都不大的数据存款和储蓄。

分布式一致性理论

拉长的多少格式质量更高,应用场景充足

Redis比较别的缓存,有3个十分的大的优势,正是帮忙五种数据类型。

数据类型 说明
string 字符串,最简单的k-v存储
hash hash格式,value为field和value,适合ID-Detail这样的场景。
list 简单的list,顺序列表,支持首位或者末尾插入数据
set 无序list,查找速度快,适合交集、并集、差集处理
sorted set 有序的set

实在,通过下边包车型地铁数据类型的表征,基本就能体会精晓合适的采纳场景了。

  • string——适合最不难易行的k-v存款和储蓄,类似于memcached的囤积结构,短信验证码,配置音信等,就用那类别型来囤积。
  • hash——1般key为ID大概唯一标示,value对应的正是详情了。如商品详情,个人新闻详情,音讯详情等。
  • list——因为list是雷打不动的,比较适合储存1些平稳且数据相对固化的数量。如省市区表、字典表等。因为list是有序的,适合依据写入的时光来排序,如:最新的***,音讯队列等。
  • set——能够大致的接头为ID-List的格局,如搜狐中1人有啥样好友,set最牛的地点在于,能够对七个set提供交集、并集、差集操作。例如:查找四人一只的不分相互等。
  • Sorted
    Set——是set的升高版本,扩大了三个score参数,自动会依照score的值进行排序。相比较吻合类似于top
    拾等不依据插入的时间来排序的数据。

看来,就算Redis不像关周密据库那么复杂的数据结构,不过,也能符合广大现象,比1般的缓存数据结构要多。通晓各种数据结构适合的政工场景,不仅有益于进步开发功用,也能卓有作用运用Redis的属性。

壹致性级别

  1. 强1致性:写入与读出多少一致。用户体验好,但对系统影响较大。

2.
弱1致性:写入后不承诺及时能够读到,也不承诺多久之后达到相同,但会尽量确认保证到有些时间级别(比如秒级)后数据壹致。细分:

    a)
会话一致性:只保险同三个客户端会话中写入与读出多少1致,别的会话不恐怕确定保证。

    b)
用户一致性:只有限支持同三个用户中写入与读出多少一致,别的会话无法保证。

    c)
最后1致性:保障在必然时间内,达到数据1致性。产业界比较青睐的大型分布式系统数据一致性。

单线程能够用作分布式锁

谈起Redis和Memcached
的差异,大家越来越多的是聊到数据结构和持久化那二日性状,其实还有1个比较大的界别正是:

  • Redis 是单线程,多路复用格局增强处理功用。
  • Memcached 是二十多线程的,通过CPU线程切换到增强处理作用。

就此Redis单线程的那一个性子,其实也是很关键的运用场景,最常用的正是分布式锁。
应对高产出的系统,都是用多服务器布置,各类技能框架针对数据锁都有很好的处理形式,如
.net 的lock,java
的synchronized,都能由此锁住有个别对象来应对线程导致的数量污染难题。不过毕竟,只可以控制本服务器的线程,分布式计划现在数据污染难题,就相比难处理了。Redis的单线程这一个特点,就特出契合这几个需求,伪代码如下:

//产生锁
while lock!=1
    //过期时间是为了避免死锁
    now = int(time.time())
    lock_timeout = now + LOCK_TIMEOUT + 1
    lock = redis_client.setnx(lock_key, lock_timeout)

//真正要处理的业务
doing() 

//释放锁
now = int(time.time())
if now < lock_timeout:
    redis_client.delete(lock_key)

以上是五个只表明流程的伪代码,其实全部的逻辑是很简短的,只要考虑到死锁时的景况,就比较好处理了。Redis作为分布式锁,因为其天性的优势,不会变成瓶颈,1般会生出瓶颈的是的确的作业处理内容,依然尽量压缩锁的限制来担保系统性子。

集中式系统

  1. 特征:铺排组织简单。

  2. 标题:有明显的单点难点。

自动过期能使得升高开发成效

Redis针对数据都能够安装过期时间,那特特性也是豪门利用比较多的,过期的多寡清理无需使用方去关注,所以开发功用也正如高,当然,品质也正如高。最普遍的就是:短信验证码、具有时间性的货品展示等。无需像数据库还要去查时间实行相比较。因为使用比较不难,就不赘述了。

分布式系统

一.
定义:分布式系统是三个硬件或软件组件分布在差异的互联网总计机上,相互之间仅仅通过音讯传递实行通讯和协调的系统(摘自《分布式系统概念与规划》)。

  1. 特点。

    a) 分布性:多台计算机在半空上肆意分布,并且分布景况随时变动。

    b) 对等性:无主/从之分,既无控制总体种类的主机,也无被决定的从机。

    c)
并发性:例如三个节点出现操作1些共享能源,诸如数据库或分布式存款和储蓄。

    d)
缺少全局石英钟:空间上Infiniti制分布的多少个进度,由于缺少全局挂钟类别控制,很难定义何人先实行什么人后执行

    e) 故障总是会发出。

3.
副本(Replica):分布式系统对数码和服务提供的一种冗余方式。目标是为了增加数据的可靠性和劳动的可用性。

  1. 并发:假设逻辑控制流在岁月上海重机厂叠,那么它们正是现身的。

  2. 问题。

    a)
通讯很是:网络光导纤维、路由器或DNS等硬件装置或连串造成网络不可用;互连网健康时通讯延时大于单机,平时单机内部存款和储蓄器访问延时时阿秒数量级(约十ns),互连网通讯延时在0.一~1ms左右(105~拾陆倍于内部存储器访问)。

    b)
网络分区:俗称“脑裂”。原书解释有标题,摘壹段出自网络的表明:“Imagine
that you have 10-node cluster and for some reason the network is divided
into two in a way that 四 servers cannot see the other 6. As a result you
ended up having two separate clusters; 四-node cluster and 陆-node
cluster. Members in each sub-cluster are thinking that the other nodes
are dead even though they are not. This situation is called Network
Partitioning (aka Split-Brain
Syndrome).”。每种节点的加入与退出可视作特殊的互联网分区。

    c)
三态:3态即成功、战败和过期。由于网络不可信,恐怕会油但是生晚点。超时的二种情景:壹)请求(信息)并未被成功地发送到接收方;二)请求(音信)成功地被接收方接收后开始展览了拍卖,但上报响应给发送方时音信丢失。

    d) 节点故障:每一个节点每时每刻都只怕出现故障。

分布式和持久化有效应对海量数据和高产出

Redis初期的版本官方只是支撑单机可能简单的为主,大多接纳则都以和谐去支付集群的中间件,不过随着应用越来越广阔,用户关于分布式的意见越来越高,所以Redis
三.0版本时候官方参加了分布式的支撑,重借使多个地点:

  • Redis服务器主从热备,确定保障系统稳定
  • Redis分片应对海量数据和高产出

再正是Redis固然是3个内存缓存,数据存在内存,可是Redis支持种种主意将数据持久化,写入硬盘,全部,Redis数据的安居也是老大有保持的,结合Redis的集群方案,有的系统现已将Redis当做一种NoSql数据存款和储蓄来适用。

ACID特性

一.
事情(Transaction):由1类别对系统中数据开始展览走访与立异的操作所结合的二个程序执行逻辑单元(Unit),狭义上的事务特指数据库事务。

  1. 原子性(Atomicity):

    a) 事务中各种操作只同意任何打响实践或任何实行破产。

    b) 任何壹项操作战败都将促成业务退步,同时别的已施行的操作将被吊销。

叁.
1致性(Consistency):假诺数据库发生故障,事务尚未形成被迫中断,事务中已施行的写操作不应该写入数据库。

  1. 隔离性(Isolation):

    a) 2个作业的执行不可能被其余工作烦扰。

    b) Read Uncommitted、Read Committed、Repeatable
Read、Serializable4个隔断级别,隔绝性依次增加,并发性依次下跌。

    c) 伍个隔断级别解决的割裂难点。

级别            \           问题

脏读

重复读

幻读

Read Uncommitted

Read Committed

Repeatable Read

Serializable

  1. 持久性(Durability):一旦事情执行成功,对数据库的修改必须永久保存。

示例:秒杀和Redis的结合

秒杀是现行反革命互连网系统中常见的经营销售情势,作为开发者,其实最不愿意那样的运动,因为非技术人士无法懂获得中间的技术难度,导致在能源协调上连接有点错误。秒杀其实平常会冒出的题材归纳:

  • 并发太高导致程序阻塞。
  • 库存无法有效控制,出现超卖的情况。

事实上化解这一个问题着力就多少个方案:

  • 多少尽量缓存,阻断用户和数据库的直白互动。
  • 通过锁来控制防止超卖现象。

现行反革命认证一下,倘若未来做2个秒杀,那么,Redis应该怎么结合开始展览利用?

  • 超前预热数据,放入Redis
  • 商品列表放入Redis List
  • 商品的详情数据 Redis hash保存,设置过期时间
  • 商品的仓库储存数量Redis sorted set保存
  • 用户的地点新闻Redis set保存
  • 订单位面积产量生扣仓库储存通过Redis成立分布式锁,仓库储存同步扣除
  • 订单位面积产量生后发货的数目,发生Redis list,通过信息队列处理
  • 秒杀结束后,再把Redis数据和数据库进行协同

上述是贰个粗略的秒杀系统和Redis结合的方案,当然实际大概还会引入http缓存,或许将音讯对接用MQ代替等方案,也会产出业务遗漏的景色,这么些只是梦想能投石问路。

各种技能都有属于自身的使用场景,唯有对技术的特色有一定清晰的认识,才能更好的利用技术,发挥其最大的优势。


迎接大家关切自我的万众号交换、学习、第近来间获取最新的稿子。
微信号:itmifen

澳门美高梅手机网站 1

CAP理论

1.
剧情:一个分布式系统不恐怕还要满意1致性(Consistency)、可用性(Availability)和分区容错性(Partion
tolerance)这三个为重须要,最七只可以同时满意个中两项。

  1. 1致性:四个副本之间保持一致的表征。

3.
可用性:系统提供的劳务必须平昔处于可用状态,对于用户的每种操作请求总是能在个别时间内重临结果。“有限时间内”是系统规划之初设定好的运作指标,日常分歧系统会有非常的大不一样。

  1. 分区容错性:境遇别的互连网分区故障时,依然能提供一致性和可用性的劳务。

  2. 度量(摘自网络):

    a)
对于超越50%重型网络使用的场所,主机众多、安顿分散,而且现在的集群规模更为大,所以节点故障、互连网故障是常态,而且要保证服务可用性达到N个九,即确定保证P和A,放任C(退而求其次保障最后一致性)。就算有个别地点会潜移默化客户体验,但没达到规定的标准造成用户流程的沉痛程度。

    b)
对于涉嫌到金钱那样无法有一丝迁就的气象,C必须保障。网络爆发故障宁可停止服务,那是保险CA,放弃P。貌似这几年国内银行业发生了不下10起事故,但潜移默化面相当的小,报到也不多,广大群众知道的少。还有一种是保险CP,抛弃A。例如网络故障事只读不写。

BASE理论

  1. BASE是Basically Available(基本可用)、Soft
    state(软状态)和伊芙ntually consistency(最终1致性)的简写。

  2. BASE核心绪想:尽管不只怕形成强1致性(Strongconsistency),但可依据使用的我业务特色,选择适当措施完成最终①致性(伊芙ntually
    consistency)。

三.
BASE是对CAP中一致性和可用性权衡的结果,来源于对常见网络系统一分配布式时间总括。

四.
为主可用:不可预见故障时,允许损失部分可用性。比如响应时间的损失、功用的损失。

伍.
软情景:允许系统中的数据存在中间状态,并以为该地方不会影响系统一体化可用性,即允许分歧节点的数目副本同步存在延时。

陆.
说起底一致性:全数数据副本,在经过一段时间同步后,最后能达到3个一致性状态。

一致性协议

  1. 最出名的一致性协议和算法:贰品级提交协议(二PC/Two-Phase
    Commit)、叁阶段提交协议(三PC/Three-Phase Commit)和Paxos算法。

  2. 大部关周到据库选择贰PC商业事务达成分布式事务。

ZooKeeper概况

  1. ZooKeeper是一个分布式数据1致性解决方案,是谷歌(Google)Chubby(杂谈)的开源完毕。

  2. ZooKeeper选择ZAB(ZooKeeper Atomic Broadcast)一致性协议。

  3. ZooKeeper保险如下分布式壹致性个性。

    a)
顺序1致性:同一客户端发起的乞请,最后会严刻按发起顺序应用到ZooKeeper中。

    b)
原子性:全数请求的处理结果在全方位集群拥有机器上的利用情状是如出一辙的。

    c) 单一视图(Single System
Image):客户端连接ZooKeeper任意一个服务器,看到的数据模型都以1样的。

    d) 可相信性:应用了客户端请求之后,引起的多寡变动被永久保存。

    e) 实时性:仅保险在早晚时间后,最后一致性。

  1. ZooKeeper的设计目的。

    a) 简单的数据模型:提供树形结构的下令空间,树上的数目节点称为ZNode。

    b) 能够构建集群。

    c)
顺序访问:客户端各类更新请求,都会分配1个大局唯一的递增编号,那么些编号反应了颇具操作的先后顺序。

    d) 高质量:全局数据存款和储蓄在内部存款和储蓄器,尤其适用于读为主的使用场景。

  1. 集群剧中人物。

    a) 未有Master/Slave,而引入二种剧中人物。

    b) Leader:为客户端提供读、写服务。通过Leader公投进度发生。

    c)
Follower:为客户端提供读、写服务,即使是写请求则转载给Leader。参加Leader公投进程。

    d) Observer:与Follower相同,唯一区别是不列席Leader公投进度。

  1. 数码节点ZNode。

    a) 分为持久节点和如今节点(Ephemeral
Node),一时节点在客户端会话失效后被移除,而持久节点在履行移除操作后才被移除。

    b) 顺序节点(Sequence
Node),被成立时ZooKeeper自动在其节点名后扩张3个整型数字(唯一命名)。

7.
版本:各个ZNode都有三个Stat数据结构,包括version(当前ZNode的版本)、cversion(当前ZNode子节点的版本)和aversion(当前ZNode的ACL版本)。

  1. Watcher。

    a)
允许客户端在内定节点上注册一些沃特cher,在那些特定事件触发时,ZooKeeper将事件通报到注册的客户端上。

    b) 即Publish/Subscribe(发布/订阅)。

  1. ACL(Access Control Lists)。

    a) ZooKeeper采取ACL策略进行权力决定,类似UNIX文件系统权限控制。

    b) CREATE:制造子节点权限。

    c) READ:获取节点数据和子节点列表的权限。

    d) WRubiconITE:更新节点数据的权力。

    e) DELETE:删除子节点的权位。

    f) ADMIN设置节点ACL的权杖。

  1. 集群构成。

    a)
“过半存货即可用”指假若ZooKeeper集群要对外可用,须要求有多数的机械日常工作而且互相之间寻常通讯。即假设搭建3个同意F台机械宕机的集群,则要布置二xF+一台服务器。

    b)
6台机械的集群可用性上并不及5台机器的集群高,所以产生了“官方推荐服务器数为奇数”的传道。

    c) 需澄清:任意服务器数的ZooKeeper集群都能配置且寻常运作。

ZooKeeper API

命令

  1. 创建节点:create [-s] [-e] path data
    [acl],-s顺序节点,-e临时节点。

  2. 列出子节点:ls path [watch]。

  3. 取得节点:get path [watch]。

  4. 履新节点:set path data [version]。

  5. 删除节点:delete path [version]。

  6. 去除节点及其子节点:rmr path。

  7. 举例。

    [zk: localhost:2181(CONNECTED) 0] create /test A
    Created /test
    [zk: localhost:2181(CONNECTED) 1] create /test/mynode B
    Created /test/mynode
    [zk: localhost:2181(CONNECTED) 2] create -s /test/snode 0
    Created /test/snode0000000001
    [zk: localhost:2181(CONNECTED) 3] create -s /test/snode 0
    Created /test/snode0000000002
    [zk: localhost:2181(CONNECTED) 4] create -s /test/snode 0
    Created /test/snode0000000003
    [zk: localhost:2181(CONNECTED) 5] ls /test
    [snode0000000002, mynode, snode0000000001, snode0000000003]
    [zk: localhost:2181(CONNECTED) 6] get /test/mynode
    B
    cZxid = 0x200000029
    ctime = Sun Jun 19 00:04:05 CST 2016
    mZxid = 0x200000029
    mtime = Sun Jun 19 00:04:05 CST 2016
    pZxid = 0x200000029
    cversion = 0
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 1
    numChildren = 0
    [zk: localhost:2181(CONNECTED) 7] set /test/mynode C
    cZxid = 0x200000029
    ctime = Sun Jun 19 00:04:05 CST 2016
    mZxid = 0x20000002d
    mtime = Sun Jun 19 00:05:34 CST 2016
    pZxid = 0x200000029
    cversion = 0
    dataVersion = 1
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 1
    numChildren = 0
    [zk: localhost:2181(CONNECTED) 8] delete /test/mynode
    [zk: localhost:2181(CONNECTED) 9] ls /test
    [snode0000000002, snode0000000001, snode0000000003]

Java API

待补充。

Curator

一.
Curator是Netflix开源的壹套ZooKeeper客户端框架,化解了众多ZooKeeper客户端万分底层的底细开发工作(如延续重连、反复注册沃特cher、NodeExistsException至极等),是海内外最广大的ZooKeeper客户端之一。

  1. Curator的API最大优点在于遵守了Fluent设计风格。

  2. Maven依赖配置。


    org.apache.curator
    curator-framework
    2.10.0


    org.apache.curator
    curator-recipes
    2.10.0

ZooKeeper应用场景

多少公布/订阅

ZooKeeper接纳推拉结合的“发表/订阅”形式:客户端向服务器注册关怀的节点,节点的数目变化时,服务器向客户端发送沃特cher事件布告,客户端收到布告后主动到服务器获取最新数据。

安顿水管道理

  1. 大局配置音讯平常具有一个特征:

    a) 数据量相比小;

    b) 运维时数据内容动态变化;

    c) 集群中个机械共享,配置一致。

  1. 比如机器列表音讯、运营时的开关配置、数据库配置音讯等。

  2. 落实原理:“公布/订阅”(沃特cher)。

  3. 以数据库切换举例。

澳门美高梅手机网站 2

    a) 配置存储:管理员创立ZNode存储配置。

 1 import org.apache.curator.RetryPolicy;
 2 import org.apache.curator.framework.CuratorFramework;
 3 import org.apache.curator.framework.CuratorFrameworkFactory;
 4 import org.apache.curator.retry.ExponentialBackoffRetry;
 5 import org.apache.curator.utils.CloseableUtils;
 6 
 7 public class CreateConfig {
 8 
 9     public static void main(String[] args) throws Exception {
10         String path = "/configserver/app1/database_config";
11         String config = "jdbc.driver=com.mysql.jdbc.Driver\n"
12                 + "jdbc.url=jdbc:mysql://centos1:3306/test?useUnicode=true&characterEncoding=utf8\n"
13                 + "jdbc.username=test\n"
14                 + "jdbc.password=test\n";
15         
16         RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
17         CuratorFramework client = null;
18         try {
19             client = CuratorFrameworkFactory.builder()
20                     .connectString("centos1:2181,centos2:2181")
21                     .sessionTimeoutMs(5000)
22                     .retryPolicy(retryPolicy)
23                     .build();    // Fluent
24             client.start();
25             client.create()
26                     .creatingParentContainersIfNeeded()
27                     .forPath(path, config.getBytes());
28         } finally {
29             CloseableUtils.closeQuietly(client);
30         }
31     }
32 
33 }

    b)
配置获取:集群机各机器运维时获取配置,并注册该ZNode数据变动的沃特cher。

 1 import org.apache.curator.RetryPolicy;
 2 import org.apache.curator.framework.CuratorFramework;
 3 import org.apache.curator.framework.CuratorFrameworkFactory;
 4 import org.apache.curator.framework.recipes.cache.NodeCache;
 5 import org.apache.curator.framework.recipes.cache.NodeCacheListener;
 6 import org.apache.curator.retry.ExponentialBackoffRetry;
 7 import org.apache.curator.utils.CloseableUtils;
 8 
 9 public class RunServer {
10 
11     public static void main(String[] args) throws Exception {
12         String path = "/configserver/app1/database_config";
13         
14         RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
15         CuratorFramework client = null;
16         NodeCache nodeCache = null;
17         try {
18             client = CuratorFrameworkFactory.builder()
19                     .connectString("centos1:2181,centos2:2181")
20                     .sessionTimeoutMs(5000)
21                     .retryPolicy(retryPolicy)
22                     .build();
23             client.start();
24             byte[] data = client.getData()
25                     .forPath(path);
26             System.out.println("Get config when server starting.");
27             System.out.println(new String(data));
28             
29             // Register watcher
30             nodeCache = new NodeCache(client, path, false);
31             nodeCache.start(true);
32             final NodeCache nc = nodeCache;
33             nodeCache.getListenable().addListener(new NodeCacheListener() {
34 
35                 @Override
36                 public void nodeChanged() throws Exception {
37                     System.out.println("Get config when changed.");
38                     System.out.println(new String(nc.getCurrentData().getData()));
39                 }
40                 
41             });
42             
43             Thread.sleep(Long.MAX_VALUE);
44             
45         } finally {
46             CloseableUtils.closeQuietly(nodeCache);
47             CloseableUtils.closeQuietly(client);
48         }
49     }
50 
51 }

    c) 配置变更:管理员修改ZNode的多少(配置)。

 1 import org.apache.curator.RetryPolicy;
 2 import org.apache.curator.framework.CuratorFramework;
 3 import org.apache.curator.framework.CuratorFrameworkFactory;
 4 import org.apache.curator.retry.ExponentialBackoffRetry;
 5 import org.apache.curator.utils.CloseableUtils;
 6 
 7 public class UpdateConfig {
 8 
 9     public static void main(String[] args) throws Exception {
10         String path = "/configserver/app1/database_config";
11         String config = "jdbc.driver=com.mysql.jdbc.Driver\n"
12                 + "jdbc.url=jdbc:mysql://centos2:3306/test?useUnicode=true&characterEncoding=utf8\n"
13                 + "jdbc.username=foo\n"
14                 + "jdbc.password=foo\n";
15         
16         RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
17         CuratorFramework client = null;
18         try {
19             client = CuratorFrameworkFactory.builder()
20                     .connectString("centos1:2181,centos2:2181")
21                     .sessionTimeoutMs(5000)
22                     .retryPolicy(retryPolicy)
23                     .build();    // Fluent
24             client.start();
25             client.setData()
26                     .forPath(path, config.getBytes());
27         } finally {
28             CloseableUtils.closeQuietly(client);
29         }
30     }
31 
32 }

命名服务

1.
分布式系统中,被取名的实业平日是集群中的机器、提供的服务地点或远程对象等。

  1. 广义上命名服务的财富一定不自然是实体能源,比如分布式全局唯壹ID。

  2. 以数据库主键(分布式全局唯1ID的1种)举例。

澳门美高梅手机网站 3

    a) 可使用UUID,但UUID的缺陷:长度过长;字面上看不出含义。

    b) 完结原理:顺序节点。

    c) 代码。

 1 import org.apache.curator.RetryPolicy;
 2 import org.apache.curator.framework.CuratorFramework;
 3 import org.apache.curator.framework.CuratorFrameworkFactory;
 4 import org.apache.curator.retry.ExponentialBackoffRetry;
 5 import org.apache.curator.utils.CloseableUtils;
 6 import org.apache.zookeeper.CreateMode;
 7 
 8 public class GenerateId {
 9     
10     public static void main(String[] args) throws Exception {
11         for (int index = 0; index < 10; index++) {
12             // type1-job-0000000000
13             System.out.println(generate("type1"));
14         }
15         for (int index = 0; index < 5; index++) {
16             // type2-job-0000000000
17             System.out.println(generate("type2"));
18         }
19     }
20 
21     private static String generate(String type) throws Exception {
22         String path = "/generateid/" + type + "/job-";
23         
24         RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
25         CuratorFramework client = null;
26         try {
27             client = CuratorFrameworkFactory.builder()
28                     .connectString("centos1:2181,centos2:2181")
29                     .sessionTimeoutMs(5000)
30                     .retryPolicy(retryPolicy)
31                     .build();
32             client.start();
33             path = client.create()
34                     .creatingParentContainersIfNeeded()
35                     .withMode(CreateMode.PERSISTENT_SEQUENTIAL)
36                     .forPath(path);
37             return type + '-' + path.substring(path.lastIndexOf('/') + 1);
38         } finally {
39             CloseableUtils.closeQuietly(client);
40         }
41     }
42 
43 }

集群众管理理

  1. 集群机器监察和控制。

    a)
完毕进度:监察和控制系统在/cluster_server节点上登记沃特cher监听,添加机械时,由机械在/cluster_server节点下开创一个暂且节点/cluster_server/[host_name],并定时写入运转状态音信。

    b) 既能实时获取机器的上/下线境况,又能获取机器的运维新闻。

    c) 适合广大分布式系统监察和控制。

  1. 分布式日志收集。

    a)
日志系统包括日志源机器和收集器机器,由于硬件难点、扩大容积、机房迁移或互连网难点等原因,他们都在转移。

    b) 达成进程。

澳门美高梅手机网站 4

        i.
注册收集器机器:收集器机器运营时创造一个持久节点/log_collector/[collector_hostname],再次创下制多个临时节点/log_collector/[collector_hostname]/status,写入运营状态音信。

        ii.
义务分发:日志系统将全方位日志源机器分为若干组,分别在对应的收集器机器创设的节点/log_collector/[collector_hostname]下创建持久节点/log_collector/[collector_hostname]/[origin_hostname],而收集器机器获取/log_collector/[collector_hostname]的子节点来收获日志源机器列表,同时沃特cher监听/log_collector/[collector_hostname]的子节点变化。

        iii.
动态分配:日志系统一直沃特cher监听/log_collector下的一体子节点,当有新收集器机器参预时,则将负载高的天职重新分配给新收集器机器;当有收集器机器退出时,则将其下的日志源机重视新分配给任何收集器机器。

Master选举

1.
Master用来协调集群中别的系统单元,具有对分布式系统状态变更的决定权。例如读写分离场景中,客户端写请求是由Master处理的。

贰.
兑现原理:利用ZooKeeper强壹致性,保障在分布式高并发意况下节点创设一定全局唯壹,即确认保证客户端不也许再度创建二个已存在的ZNode。

3.
落到实处进程:大选时,集群中各机器同时创制一时节点/master_election,并写入机器音信,创制成功的机械成为Master,创设退步的机器沃特cher监控节点/master_election开头等待,一旦该节点被移除则另行公投。

  1. Curator封装了Master大选成效。

    1 import org.apache.curator.RetryPolicy;
    2 import org.apache.curator.framework.CuratorFramework;
    3 import org.apache.curator.framework.CuratorFrameworkFactory;
    4 import org.apache.curator.framework.recipes.leader.LeaderSelector;
    5 import org.apache.curator.framework.recipes.leader.LeaderSelectorListenerAdapter;
    6 import org.apache.curator.retry.ExponentialBackoffRetry;
    7 import org.apache.curator.utils.CloseableUtils;
    8
    9 public class MasterElection {
    10
    11 public static void main(String[] args) throws Exception {
    12 String path = “/master_election”;
    13
    14 RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
    15 CuratorFramework client = null;
    16 LeaderSelector selector = null;
    17 try {
    18 client = CuratorFrameworkFactory.builder()
    19 .connectString(“centos1:2181,centos2:2181”)
    20 .sessionTimeoutMs(5000)
    21 .retryPolicy(retryPolicy)
    22 .build();
    23 client.start();
    24 selector = new LeaderSelector(client, path, new LeaderSelectorListenerAdapter() {
    25
    26 @Override
    27 public void takeLeadership(CuratorFramework client) throws Exception {
    28 long threadId = Thread.currentThread().getId();
    29 System.out.println(“Thread” + threadId + ” is master.”);
    30 Thread.sleep(3000);
    31 System.out.println(“Thread” + threadId + ” has been down.”);
    32 System.exit(0);
    33 }
    34
    35 });
    36 selector.autoRequeue();
    37 selector.start();
    38 Thread.sleep(Long.MAX_VALUE);
    39
    40 } catch (InterruptedException e) {
    41 e.printStackTrace();
    42
    43 } finally {
    44 CloseableUtils.closeQuietly(selector);
    45 CloseableUtils.closeQuietly(client);
    46 }
    47 }
    48
    49 }

分布式锁

  1. 分布式锁是决定分布式系统之间联合访问共享资源的一种办法。

  2. 分布式锁分为排它锁(Exclusive
    Lock,简称X锁,又称写锁、独占锁)和共享锁(Shared
    Lock,简称S锁,又称读锁)。

    a) 排它锁类似JDK的synchronized和ReentrantLock。

    b) 共享锁类似JDK的ReadWriteLock中的读锁。

三.
排它锁完毕进程:与Master公投类似。全数客户端同时创设权且节点/execlusive_lock,创立成功的客户端获取了锁,创设失利的客户端沃特cher监听节点/execlusive_lock开端等候,1旦该节点被移除(即排它锁已放出)则再度该进度。

  1. 共享锁完结进程:

    a) 成立持久节点/shared_lock。

    b)
全体客户端依照须要的锁类型(LX570/W)创造一时半刻顺序节点/shared_lock/[hostname-R/W-],如/shared_lock/[host1-R-0000000000]、/shared_lock/host1-W-0000000003。

    c) 获取/shared_lock下的全体子节点。

    d) 各客户端鲜明本身的节点顺序。

        i.
当前客户端须要Odyssey锁时,假若无比本身序号小的子节点或持有比本人序号小的子节点都以本田UR-V锁,则收获昂Cora锁成功;如若比自个儿序号小的子节点有W锁,则沃特cher监听该W锁节点并等候。

        ii.
当前客户端必要W锁时,如若自个儿序号是细微的子节点,则赢得W锁成功,不然沃特cher监听比自身序号小的子节点中序号最大的节点并等候。

    e) 各客户端收到沃特cher通告后,则收获锁成功。

  1. Curator封装了分布式锁功能。

分布式队列

一.
产业界分布式队列产品基本上是音信中间件(或称新闻队列),ZooKeeper也可完结分布式队列功效。

  1. 分布式队列分为FIFO和Barrier三种:

    a) FIFO即常见的队列;

    b) Barrier类似JDK的CyclicBarrier,等待的数量达到一定值时才实施。

  1. FIFO完成进度(类似共享锁):

    a) 创建持久节点/queue_fifo。

    b)
全体客户端成立方今顺序节点/queue_fifo/[hostname-],如/queue_fifo/host1-0000000000。

    c) 获取/ queue_fifo下的全部子节点。

    d)
各客户端明显本人的节点顺序:如若协调序号是小小的的子节点,则实施;不然沃特cher监听比本人序号小的节点中序号最大的节点并听候。

    e) 收到Watcher通知后,则执行。

  1. 巴里r完成进度:

    a) 创立持久节点/queue_barrier。

    b)
全部客户端成立一时半刻节点/queue_barrier/[hostname],如/queue_fifo/host1。

    c) 获取/ queue_fifo下的全数子节点。

    d)
尽管实节点数大于或等于某值,则进行;不然沃特cher监听节点/queue_barrier并等待。

    e) 收到Watcher布告后,重复步骤c。

Hadoop

  1. HDFS的NameNode和YAGL450N的ResourceManager都以依据ZooKeeper完成HA。

  2. YA奇骏N的HA落成进度(类似Master大选):

    a)
运营时期,几个ResourceManager并存,但唯有二个为Active状态,别的为Standby状态。

    b)
当Active状态的节点不可能工作时,斯坦dby状态的节点竞争公投产生新的Active节点。

    c)
倘诺ResourceManager一“假死”,可能会招致ResourceManager二变为Active状态,当ResourceManager壹恢复生机后,出现“脑裂”。通过ACL权限决定可以化解,即ResourceManager一恢复生机后发觉ZNode不是本人成立,则自动切换为Standby状态。

HBase

与抢先八分之四分布式NoSQL数据库差别的是,HBase的数量写入是强一致性的,甚至索引列也是强1致性。

Kafka

卡夫卡首要用来落实低延时的出殡和埋葬和收集大批量的轩然大波和日志数据。大型互连网Web应用中,指网址的PV数和用户访问记录等。

 

作者:netoxi
出处:http://www.cnblogs.com/netoxi
正文版权归小编和今日头条共有,欢迎转发,未经允许须保留此段评释,且在篇章页面明显地方给出原来的作品连接。欢迎指正与交流。

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注