课堂笔记第三天&第四天

第三天课程:Zookeeper

Zookeeper概述&主从、主备集群

  1. 是一个分布式协调服务的开源框架,是一个分布式的小文件存储系统。有目录式结构。

  2. 主从集群 (一主多从)
    主和从各司其职,从角色要受到主的管理
    主角色 主节点 master leader 老大
    从角色 从节点 slave follower 小弟

  3. 主备集群(常见一主多备)
    解决单点故障:一系列步骤中的某一个节点故障,导致整个流程错误。
    同一时刻,有且只有一个主可以工作,当主挂了,备顶上。
    主角色 active
    备角色 standby

  4. Zookeeper是一个主从集群。

全局数据一致性

  1. 全局数据一致性:无论客户端连接到集群上哪个服务器,看到的数据目录结构都是一样的。
  2. 两个从角色都要操作数据目录结构,主角色按照fifo指定集群的顺序。

集群主从角色职责

  1. 针对事务性操作,如何保持数据全局一致性
  2. 任何角色都可以接收事务性请求和非事务性请求,如果是非事务性请求,自己直接处理。
  3. 如果是事务性请求,如果是主角色接收,自己处理;如果是从角色接收,内部转发给主角色处理。
  4. 所有的事务性请求,主角色按照请求时间顺序编号,依次处理

数据模型–文件系统特性

  1. 不再有文件夹之分,都叫节点 znode
  2. znode既像文件又像文件夹
  3. 存储数据大小有限制
  4. zk目录中每个znode叫做节点
  5. zk集群中每个服务器也叫做节点

数据结构–节点类型

  1. 临时节点和永久节点
  2. znode节点由客户端创建–客户端首先通过某方式连接到zk集群,建立会话session–连接成功进行增删改查–操作完毕断开连接,结束对话。
  3. 临时节点根创建她的客户端跟集群的session有关系,会话结束,节点消失。
  4. 临时节点下面不能创建子节点。
  5. 序列化特性:记录每个子节点创建的先后顺序。

Zookeeper集群搭建

通过虚拟网桥将主机的网卡和虚拟交换机Vmnet0连接在一起

安装过程学到的命令

  1. 复制:cp,剪切:mv,删除:rm
    活学活用: 重新命名 mv zookeeper/ zoo
  2. ssh连接之后:scp -r /etc/hosts root@node-2:/etc/ 拷贝文件从一个虚拟机至另一个
  3. echo 2 > zkdata/myid 在zkdata下面新建myid,myid里面是 2

ZooKeeper-安装详解

  1. 检测集群时间是否一致:
    查看时间:date
    设置时间与北京时间一致:
    yum install ntpdate
    ntpdate cn.pool.ntp.org
  2. 检测防火墙是否关闭
    service iptables stop
    chkconfig iptables off
    chkconfig iptables --list
  3. 检测主机IP是否映射
  4. server.1=node-1:2888:3888
    2888心跳端口,3888选举端口

ZooKeeper–Shell客户端操作&节点属性

  1. 客户端连接: /zookeeper/bin/zkCli.sh -server node-1
  2. shell基本操作:
    a. 创建节点: create [-s]/[-e] path data acl
    acl:进行权限控制
    -s: 顺序节点,-e:临时节点,都不加就是永久节点
  3. 临时节点下面不能有child
  4. 读取节点属性
    get path:获得节点的数据和属性
    ls2 path:获得节点的子节点和属性
  5. 属性:dataVersion: 数据版本号,对节点进行set操作,值加1
    cversion:子节点版本号,有变化时,加1
    cZxid:事务id
    ephemeralOwner = 0x0 如果znode这个值有数据,这个节点是短暂节点,这个值代表创建该临时节点的session编号。
  6. 更新节点:set path data
  7. 删除节点:delete path
    若节点存在子节点,先删除子节点再删除父节点
    或者递归删除节点:rmr path
  8. quota:对节点约束
    在计算子节点的个数中,将自己也算成子节点。
    quota限制是个软性限制,没有强制限制。(超出只会在日志中警告)
    zookeeper.out可以查看日志
    setquota -n|-b val path:对节点增加限制,n表示子节点最大个数,b表示数据值最大长度
    listquota path:列出限制
    delquota [-n|-b] path

ZooKeeper–watcher监听机制

  1. watcher机制实现分布式的通知功能。
  2. a. 设置监听(监听的事件),b. 监听该事件是否发生,c. 如果事件发生(监听触发,通知,回调)
  3. zookeeper允许客户端向服务端注册一个watcher监听,当服务端的一些事件触发这个watcher,就会向指定客户端发送一个事件来实现分布式的通知。
  4. 机制特点
    a. 一次性触发
    b. 事件封装:WatchedEvent: 通知状态,事件类型,节点路径
    c. event异步发送。watcher的通知事件从服务端到客户端是异步的。
    d. 先注册再发送。
  5. help可查看哪些命令可以watch
    比如:
    get /666 没有设置监听
    get /666 watch 设施监听,只要数据发生改变,监听触发。
    set /666 456 修改数据,监听触发
    设置监听的客户端收到:
    WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/666

第四天课程:ZooKeeper–Java API&网络编程

ZooKeeper–Java环境和创建节点

public class ZkClient{
    public static void main(String[] args) throws Exception{
        //参数列表:第一个zk地址,写几个访问几个
        ZooKeeper zk = new ZooKeeper("node-1:2181,node-2:2181", 30000, new Watcher() {
            //监听触发通知客户端,客户端就在这进行事件处理
            public void process(WatchedEvent watchedEvent) {
            }
        });
        //创建znode
        zk.create("/hello","EM".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        //删除znode
        zk.delete("/enheng", 0);
        zk.close();
    }
}

ZooKeeper–java api–监听和实现永久监听

  1. java操作zk集群,事件中有连接事件(type=none path=null), 这类事件不需要我们注册,客户端可以直接收到。
  2. 如果想满足永久触发,就需要在上次触发通知后,再次设置监听。
public class ZkClient
{
	static ZooKeeper zk = null;
    public static void main(String[] args) throws Exception
    {
        //参数列表:第一个zk地址,写几个访问几个
        zk = new ZooKeeper("node-1:2181,node-2:2181", 30000, new Watcher() 
        {
            //监听触发通知客户端,客户端就在这进行事件处理
            public void process(WatchedEvent watchedEvent) 
            {
            		System.out.println("状态"+watchedEvent.getState());
            		System.out.println("事件类型"+watchedEvent.getType());
            		System.out.println("路径"+watchedEvent.getPath());
            		//如果想多次触发监听,在这里收到监听事件的时候再次设置同节点 同事件的监听 即可满足
            		try {
						zk.getData("/hello", true, null);  //继续设置监听
					} catch (KeeperException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
            }
        });
        //创建znode
        //zk.create("/hello","EM".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        //删除znode
        //zk.delete("/enheng", 0);
        //获取data,同时设置监听
        zk.getData("/hello", true, null);
        zk.setData("/hello", "333333333".getBytes(), -1);
        zk.setData("/hello", "444444444".getBytes(), -1);
        zk.close();
    }
}

ZooKeeper–选举机制–概念&全新和非全新

  1. 服务器id:myid的值,编号越大在算法中的权重越大。
  2. 数据id:值越大数据越新,在选举算法中数据越新,权重越大。
  3. 选举状态:
    looking:竞选状态
    following:随从状态,同步leader状态,参与投票
    observing:观察状态:同步leader状态,不参与投票
    leading:领导者状态
  4. 逻辑时钟:投票的次数。
  5. 全新集群选举:集群刚搭建好,第一次启动,没有任何客户端操作过
    a. 每个人都给自己投票
    b. 谁的票数过半,选举结束
    c. myid大的权重大
  6. 非全新集群选举:集群已经运行工作过一段时间,重新选举leader的过程
    针对非全新集群选举,优中择优,选择数据最新的,状态最好的
    a. 逻辑时钟小的被淘汰
    b. 数据id大的胜出
    c. myid大的胜出

ZooKeeper–典型应用–全局配置中心

  1. 把需要全局管理的信息放在zk指定的某个znode
  2. 每个模块启动的时候都去zk集群指定路径获取数据库的相关信息,同时设置监听,监听节点数据是否发送改变
  3. 当业务需要,更改db的信息时,管理员只需要修改zk集群上对应的znode的信息即可
  4. 一旦修改,监听触发,通知给设置监听的客户端,重新获取新的数据再次设置同样的监听。
  5. 只适用于小数据场景。这样数据更新可能会比较快。

ZooKeeper–典型应用–命名中心

  1. 将服务地址命名
  2. znode节点是短暂的
  3. 时刻动态维护服务的提供列表和消费列表

ZooKeeper–典型应用–如何给其他软件选举

  1. 需求:开发了一款分布式软件,软件有leader,有follower,如何决定哪个角色是leader,哪个是follower。要求借用zookeeper完成这款软件的选举
  2. zookeeper如何给其他软件选举leader。
  3. 思路:leader只有一个(唯一性),leader挂了再次选举新的leader(选举重复性
  4. znode如果非序列性,节点不能重名,重复选举–>重复监听。
  5. 过程:
    a. 每个软件角色启动后第一步去zk指定路径下创建znode
    b. 最终一定只有一个角色能够创建该节点,谁创建成功谁就是leader
    c. 其他的作为follower,同时要监听leader创建的节点
    d. 当leader挂掉,leader跟zk的会话断开,节点消失,触发监听,各个follower收到通知,并且再去指定目录创建同样类型同样名字的节点。
  6. 分布式锁:a)保持独占,znode的唯一性,先到先得,b)控制时序,需要大的靠前,依次排序。
    在这里插入图片描述

网络编程–概述&通信三要素

  1. 网络通信三要素:IP端口:数字逻辑标识,不同端口代表不同进程;通信协议
  2. UDP:用户数据报协议
    a. 不需要建立连接
    b. 每个数据包限制在64k
    c. 不需要连接,不可靠协议
    d. 速度快
  3. TCP:传输控制协议
    a. 建立连接,形成传输通道
    b. 大数据量传输
    c. 通过三次握手建立连接,是可靠协议
    d. 必须建立连接,效率低

网络编程–了解网络模型

  1. 物理层:主要定义物理设备标准,主要作用:将数据最终编码为0、1标识的比特流,通过物理介质传播
    数据链路层:将接收到的数据进行网卡地址的封装与解封装
    网络层:将接收到的数据进行IP地址的封装和解封装
    传输层:定义数据传输的协议和端口号,主要将接收到的数据进行分段和传输,到达目的地址后进行重组
    会话层:通过传输层建立数据传输的通道,主要在系统间发起会话和接收会话请求。
    表示层:对接收数据的解释,加密与解密,压缩与解压,主要确保一个系统的应用层发送的数据被另一个系统的应用层识别。
    应用层:为一些终端应用程序提供服务。

网络编程–了解socket机制–TCP、UDP

  1. socket也叫做套接字,用于描述ip和端口,应用程序通过socket向网络发出请求或者应答网络请求。
  2. 通信两端都有socket。
  3. 数据在两个socket之前通过IO传输

网络编程–IO通信模型–BIO、NIO

  1. 本地IO需要系统内核支持,网络IO也需要系统内核支持
  2. BIO是阻塞IO:阻塞产生:操作系统没有发现socket从指定的端口x来,操作系统一直等待。
  3. NIO是非阻塞IO
    三大核心部分:
    Channel 通道:对数据的写入和读取要通过通道。双向的,可读可写可同时读写。channel不会直接处理数据,通过buffer处理数据。
    Buffer 缓冲区:容器对象,包含读取或写入的数据。
    Selector 选择器:选择已经就绪的任务。channel先去selector注册。selector轮询客户端找已经就绪的任务。

网络编程–了解阻塞、非阻塞

  1. 阻塞和非阻塞是程序级别的,阻塞:程序一直等待数据来,非阻塞:程序执行,线程轮询直到IO准备好数据。
  2. 同步和非同步是操作系统级别的。同步:IO资源没有准备好,操作系统不响应程序。非同步:操作系统告诉程序会把IO资源放在哪,准备好了之后用事件机制发给程序。

网络编程–RPC实质

  1. RPC–远程过程调用协议。
  2. 满足:调用远程方法或者函数就像调用本地的一样,对于使用者来说忽略底层网络细节,那就符合RPC的协议规范。
  3. 通过RPC可以网络通信。

总结

  1. ZooKeeper是一个分布式协调服务的开源框架。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王二小、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值