2017 Pig-0.16.0设置

前提:已经装好hadoop2.7.3

redis集群是redis提供分布式数据库方案,


 

 

集群通过分片(Sharding)来进展数量共享,并提供复制和故障转移效果。

       单机版本:

 

     export
PIG_HOME=/usr/local/pig
    export
PATH=$PATH:$PIG_HOME/bin

节点

运行:pig -x local



 

 

redis集群寻常由七个节点(node)组成,在开端每个node 都是互为独立的。

hadoop版本系统布局:

要组建成真的可工作的集群,我们务必将顺序独立的节点连接起来,构成一个分包七个节点的集群。

export
PIG_CLASSPATH=/usr/local/hadoop/etc/hadoop

 

pig

命令

或   pig -x mapreduce

cluster meet <ip> <port>

 

 

 

 


向一个node 发送命令 cluster meet,让节点与ip/port所指定的节点
进行握手(handshake),

 

当握手成功时,node节点就会将ip/port所指定的节点添加到node节点当前所在的集群中。

 

 

 

举例:

 

三个节点

 

– 127.0.0.1:7000

 

– 127.0.0.1:7001

– 127.0.0.1:7002

 图片 1

 

图片 2

 

 

启航节点

 

一个节点就是一个运作在集群方式下的redis服务器,redis会在启动时 依照cluster-enabled 配置选项

确定是或不是来打开集群情势。

 图片 3

 

运作在集群情势的redis服务器,会继续运用具有在单机形式中应用的服务器组件。

 

cluster  meet 命令的落实

 

经过向节点A发送Cluster MEET
命令,客户端可以让接受命令的节点A将另一个节点B添加到节点A当前所在的集群里面:

图片 4

 

 

很像TCP/IP 三遍握手

 

 

槽指派


 

redis集群通过分片的章程来保存数据库中的键值对:

  • 集群的整套数据库被分为16384个槽(slot)
  • 数据库中的每个键都属于那16384个槽的里边一个
  • 集群中的每个节点可以处理0或最多16384个槽

 

当数据库中的16384个槽都有节点在拍卖时,集群处于上线状态(ok),

假如数据库中有其余一个槽没有得到处理,那么集群处于下线状态(fail)。

 

下边使用cluster meet 命令将7000 7001 7002 多少个节点连接到同一个集群里,

而是这一个集群近来如故处在下线状态,因为集群中的三个节点都不曾拍卖其他槽

 

命令:cluster info 

 图片 5

 

命令:cluster addslots 

添加一个或七个槽指派(assign)给某节点 来负责

 

将槽0–槽5000 指派给节点7000 负责

 图片 6

 

传播节点的槽指派新闻

 

一个节点除了记录自己需处理的槽记录,还会将团结的槽新闻,发送给集群中的其余节点;

告诉其余节点,自己所承担的怎么着模块。

 

 图片 7

 

各类节点都会通报自己的槽记录给任何任何节点,而各样节点也会记录自己的槽记录;

由此,集群中的每个节点都会驾驭数据库中的16384个槽分别被派遣给了集群中的哪些节点。

 

 

在集群中执行命令


在对数据库中的16384个槽都进行了选派之后,集群就会跻身上线状态,

此刻客户端就可以向集群中的节点发送数据命令。

 

当客户端向节点发送与数码库键有关的指令时,接收命令的节点会计算出命令要拍卖的多寡库键属于哪个槽

并检查那个槽是不是派出给了协调:

  • 即使键所在的槽正好指派了现阶段节点,
    • 那就是说节点直接执行那些命令
  • 假设键所在的槽并没有派出给当下节点,
    • 那么节点会向客户端重回一个moved 错误,
    • 指导客户端转向至正确的节点,并再一次发送之前想要执行的指令。

 

流程图

图片 8

 

 

总计键属于哪个槽

def slot_number(key):

     return CRC16(key) & 16383

crc16 用于统计键KEY的crc-16校验和,而 & 16383 则用来总结出一个介于0至
16383 之间的整数作为KEY的槽号。

 

查看键的槽号

命令:cluster keyslot <key>

 图片 9

 

MOVED错误

 

moved 错误的格式为:

MOVED <slot> <ip>:<port>

 

slot 为键所在的槽,而ip/port则是负担处理槽slot的节点的IP地址和端口号。

  • 为此能指定具体的ip,端口号。是因为各种节点都明白每个槽由哪个节点负责

 

一个集群客户端平日会与集群中的多少个节点制造套接字连接,而所谓的节点转向实际就是换一个套接字来发送命令

假定客户端尚未与想要转向的节点成立套接字连接,那么客户端会先根据MOVED错误提供的IP地址和端口号来连接节点,

下一场再展开转向。

 

再度分片


redis
集群的双重分片操作能够将轻易数量一度派出给某个节点(源节点)的槽改为打发给另一个节点(目的节点)

并且相关槽所属的键值对 也会从源节点被移动到对象节点。

 

再次分片操作可以在线(online)进行,在再一次分片的长河中,集群不须求底线,并且源节点和目的节点都可以继续处理命令请求。

 

再次分片的已毕原理

 重新分片由redis 集群管理软件 redis-trib 负责实施。

 

redis-trib 对集群的单个槽举办再次分片的步调如下:

  1. redis-trib 对目标节点发送 cluster setslot <slot> importing
    <sorce_id> 命令

    • 让对象节点准备好从源节点导入(import)属于槽slot的键值对
  2. redis-trib 对源节点发送 cluster setslot <slot> migrating
    <target_id>命令

    • 让源节点准备好将属于槽slot 的键值对槽slot的键值对搬迁(migrate)
  3. redis-trib 向源节点发送 cluster getkeysinslot <slot>
    <count>命令

    • 得到最多count 个 属于槽slot的键值对的键名(key name)
  4. 对此步骤3赢得的每个键名,redis-trib都向源节点 发送 migrate
    <target_ip> <tartget_port> <key_name> 0
    <timeout> 命令。

    • 被入选的键,从源节点迁移至目的节点
  5. 双重执行步骤3和手续4,直到源节点保存的具备属于槽slot
    的键值对都被迁移到对象节点甘休。

    • 老是迁移如下图所示
  6. redis-trib 向集群中的任意一个节点发送 cluster setslot <slot>
    node <target_id> 命令,

    • 将槽slot指派给目标节点,这一音信透过音信发送至整个集群
    • 终极集群中的所有节点都会知晓槽slot 已经派出给了对象节点。

图片 10

 

 

 

方方面面经过:

 图片 11

 

 

ASK 错误


 

当客户端向源节点发送一个域数额库键有关的通令,

与此同时命令要拍卖的数据库键值对刚刚就属于正值被迁移的槽时:

  • 源节点会先在祥和的数据库里寻找指定的键,假诺找到的话,就径直实施客户端发送的通令
  • 只要源节点没有找到指定的键,那么那么些键有可能已经被迁移到了目的节点
    • 源节点将向客户端再次回到一个ASK错误
      • 因势利导客户端转向正在导入槽的靶子节点,相提并论新发送此前想要执行的一声令下。

 

过程

图片 12

 

 

例子:

槽16198 中的love 键 从7002 迁移到7003

 图片 13

图片 14

 

 

ASKING标志位

 

ASKING命令唯一要做的就是打开发送该命令的客户端的REDIS_ASKING标识。

 

诚如景况下:

  • 如客户端向节点发送一个关于槽i的一声令下,而槽i又尚未派出给那个节点,
    • 那就是说节点将向客户端再次回到一个MOVED 错误;
  • 假设展现节点正在导入槽i,并且发送命令的客户端带有REDIS_ASKING标识,

    • 那么节点将非凡执行那么些关于槽i的指令三回
      • 即便槽i
        还尚无专业分配给节点,但如果有ASKING标识也就特种执行一遍。

 

判定进程

图片 15

 

 

 

小心:客户端的REDIS_ASKING标识是一个四次性标识;

 

例子:

假设我们在成功施行GET命令之后,再次向节点7003殡葬GET命令,

那么第二次发送的GET没拿过来将进行破产,因为此时客户端的REDIS_ASKING标识已经被移除:

图片 16

 

 

ASK错误和MOVED错误的分别

  • MOVED错误代表槽的负责权已经从一个节点转移到了另一个节点
    • 在客户端收到有关槽i 的moved 错误之后,
      • 客户端每一回境遇关于槽i的授命请求时,都能够一贯将指令请求发送至moved错误所针对的节点。
    • 而ASK错误只是七个节点在迁移槽的历程中使用的一种暂时措施:

      • 客户端只是暂时将关于槽i的下令请求,发送至ASK 引导的 节点;
      • 下次出殡仍然发送到当前 节点,直到再接受ASK
        错误,然后再辅导到 新节点。

 

复制与故障转移


 

Redis集群中的节点为主节点和从节点,其中主节点用于处理槽,而从节点则用于复制某个主节点,

并在被复制的主节点下线时,代替下线主节点继续处理命令请求。

 

例子:

图片 17

 

 

一旦那时候,节点7000
进入下线状态,那么集群中仍在健康运转的多少个主节点将在节点7000
的七个从节点

从7004 和7005
中选出一个节点作为新的主节点,这些新的主节点将接管原来节点7000
负责处理的槽,并

后续处理客户端发送的一声令下请求。

 图片 18

 

安装从节点

出殡命令:

CLUSTER REPLICATE <node_id>

能够让接受命令的节点成为node_id
所指定节点的从节点,并初始对主节点进行复制:

 

故障检测

集群中的每个节点都会定期地向集群中的其余节点发送ping音信,以此来检测对方是或不是在线,

要是接收ping音讯的节点每页在确定的命宫内,发送ping音信的节点回复,那么源节点则将目的节点标记为疑似下线(probale
fail,PFAIL)

 

集群中的各种节点会通过相互发送新闻的办法来沟通集群中逐条节点的动静音讯。

 

即便一个集群里面,半数以上的主节点 都将某个主节点
报告为疑似下线,那么这么些主节点将被标记为已下线(FAIL).

将主节点标记为已下线的节点会向集群广播一条有关该主节点的FAIL信息,所有接受那条FAIL新闻的节点都会马上将

该主节点标记为已下线。

图片 19

 

 

故障转移

当一个从节点发现自己正在复制的主节点进入了已下线状态时,

从节点将起来对下线主节点举办故障转移,故障转移手续:

  1. 底线主节点的富有从节点里面,会有一个被入选作为新的主
    • 被入选的从节点会举行SLAVEOF no one ,成为 新的主
  2. 新主节点,处理原主的所有槽
  3. 新主节点向集群广播一条pong信息,让集群中的其余节点及时清楚此节点已经化为主节点
  4. 新主节点初步收受和团结肩负处理的槽有关的下令请求,故障转移完结。

 

推选新的主节点

集群选举新的主节点的办法:

  1. 集群的布局纪元是一个自增计数器,它的早先值为0
  2. 当集群里的某个节点初叶一遍故障转移操作时,集群配置纪元的值会增一
  3. 对此每个配置纪元,集群里每个负责处理槽的主节点都有两遍投票的空子,
    • 而首先个向主节点须要投票的从节点将获得主节点的投票
  4. 当从节点发现自己的主节点下线,

    • 从节点向集群广播一条音讯,要求收取新闻的主节点,投票给协调。
      • CLUSTERMSG_TYPE_FAILOVER_AUTH_REQUEST消息
  5. 如果主节点有投票权(它正值处理槽),并且没有投票。

    • 将向须求投票的从库,重临一条音信
      • CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK
    • 意味着那么些主节点支撑该从节点成为新的主节点

  6. 从节点通过吸收音讯的个数,统计自己拿走了稍稍主节点的帮助

    • CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK
  7. 如集群中有N个有着投票权的主节点,那么从节点收集到领先等于N/2+1张帮助票时,从节点当选为新的主节点。
  8. 因为在每个配置纪元里,主节点只可以投三遍票,所以取得N/2+1的从节点只会有一个。
  9. 假设在一个配置纪元里没有从节点收集到充裕多的帮助票,那么集群进入一个新的配备纪元,并重复展开选举,直到选出新的主节点截止

 

只顾:选举新主的方法与sentinel的方法分外类似,都是基于Raft算法的领头选举格局来落到实处的。

 

消息


集群中的各节点通过发送和吸纳新闻来开展通讯。

 

节点发送的消息根本有以下多样:

  • MEET消息
    • 当发送者接到客户端发送的CLUSTER MEET命令时
    • 发送者会向接收者发送MEET信息,请求接收者加入到发送者当前所处的集群里面。
  • PING消息

    • 集群里面每个节点默许每秒会从已知节点列表随机选出5个节点,
    • 对那5个节点中最长日子尚未发送过PING新闻的节点发送PING音讯,以此来检测被选中的节点是或不是在线
    • 别的,PONG信息会对PING信息爆发震慑
      • 如节点A最终一遍接受节点B发送的PONG音讯的小时,
      • 距离当前几日子当先了节点A的cluser-node-timeout的一半
      • 则A 向B 发送PING 消息。
      • 提防节点A 长日子从没人身自由选中B,导致节点B的音信更新滞后
  • PONG消息

    • 当接受者收到MEET音讯依旧PING音讯,回一条PONG音信以确认收到那条消息。
    • 其余,一个节点也得以经过向集群广播自己的PONG信息来让集群中的其余节点及时刷新关于我的认识。
      • 如,故障转移操作成功未来,新的节点会向集群广播一条PONG信息,
      • 其一来让集群中的其他节点及时领会那些节点已经改成了主节点。
  • FAIL消息

    • 当主节点A判断主节点B已经进来FAIL状态时,
    • 节点A向集群广播一条有关B的FAIL音讯,
    • 负有接收那条消息的节点及时向B 节点标记为已下线
  • PUBLISH消息

    • 当节点接收到一个PUBLISH命令时,节点会执行那么些命令,
    • 并向集群广播一条PUBLISH音讯,
    • 所有接受到那条PUBLISH新闻的节点都会履行同一的PUBLISH命令。

 

 

例子:

出殡PING
音讯和再次回到PONG音讯的例证,如若在一个含有A,B,C,D,E,F七个节点的集群里:

  • 节点A向节点D发送PING信息,并且音信里面含有了节点B和节点C的音信
    • 当节点D收到那一个PING新闻,它将履新自己对节点B和节点C的认识
  • 今后,节点D将向节点A放回一条PONG消息,并且音信里面包蕴了节点E和节点F的新闻,

    • 当节点A收到那条PONG新闻时,它将创新自己对节点E和节点F的认识。

 

一切经过

图片 20

 

 

FAIL音讯已毕的长河

图片 21

 

 

PUBLISH信息达成过程

图片 22

 

 

 

总结:

  • 节点通过握手来将此外节点添加到温馨所处的集群当中。
  • 集群中的16384个槽可以独家派出给集群中的各类节点,
    • 各类节点都会记录哪些槽指派给了和谐
    • 而什么槽又被派遣给了其余节点
  • 节点在接到一个下令请求时,会先检查那一个命令请求要处理的键所在的槽是或不是友善担当

    • 万一不是,节点将向客户端重返MOVED错误,
    • MOVED错误辅导的音讯,可以指引客户端转向正确的节点
  • 对Redis集群的再次分片工作是由redis-trib负责实施的。

    • 双重分片的第一是将属于某个槽的富有键值对从一个节点转移到另一个节点
  • 要是节点A正在搬迁槽i至B节点,

    • 那么当节点A没能在投机的数据库中找到命令指定的数量库键时,
      • 节点A会向客户端再次回到一个ASK错误,
      • 指点客户端到节点B继续搜寻指定的多寡库键
  • MOVED错误表示槽的负责权已经从一个节点转移到了另一个节点,

    • ASK错误只是多少个节点在迁移槽的经过中拔取的一种暂时措施
  • 集群里的从节点用于复制主节点,并在主节点下线时,代替主节点继续处理命令请求

  • 集群中的节点通过发送和吸收新闻来举办交通,常见音讯类型:
    • MEET,PING,PONG,PUBLISH,FAIL

发表评论

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