青春须早为,岂能长少年。这篇文章主要讲述Zookeeper - 理论基础-补充相关的知识,希望能为你提供帮助。
一、节点Zookeeper的数据节点称为ZNode,ZNode是Zookeeper中数据的最小单元,每个ZNode都可以保存数据,同时还可以挂载子节点,因此构成了一个层次化的命名空间,称为树,如下图所示:
每个数据节点都是由生命周期的,类型不同则会不同的生命周期,节点类型可以分为持久节点(PERSISTENT)、临时节点(EPHEMERAL)、顺序节点(SEQUENTIAL)三大类,可以通过组合生成如下四种类型节点:
每个节点除了存储数据外还存储了节点本身的一些状态信息,可通过get命令获取。节点的所有信息都包装在Stat对象中,主要包含以下通用信息:
比如在一个数据节点/zk-book被创建完毕后节点的version值是0,表示的含义是:当前节点自从创建之后,被更新过0次。如果现在对该节点的数据内容进行更新操作,那么随后version值就会变成1,同时需要注意的是,其表示的是对数据节点数据内容的变更次数,强调的是变更次数,因此即使前后两次变更并没有使得数据内容的值发生变化,version的值任然会变更。
二、WatcherZookeeper使用Watcher机制实现分布式数据的发布/订阅功能。Zookeeper的Watcher机制主要包括客户端线程、客户端WatcherManager、Zookeeper服务器三部分。客户端在向Zookeeper服务器注册的同时,会将Watcher对象存储在客户端的WatcherManager当中。当Zookeeper服务器触发Watcher事件后,会向客户端发送通知,客户端线程从WatcherManager中取出对应的Watcher对象来执行回调逻辑。
简单实现如下例所示:
public class Sample_CONNECTIONLOSS_SESSIONEXPIRED implements Watcher
private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
public static void main(String[] args) throws Exception
ZooKeeper zk = new ZooKeeper("domain1.book.zookeeper,domain2.book.zookeeper", 5000,
new Sample_CONNECTIONLOSS_SESSIONEXPIRED());
connectedSemaphore.await();
while (true)
try
System.out.println("Get data: " + zk.getData("/$7_4", true, null));
catch (Exception e)
e.printStackTrace();
Thread.sleep(200);
@Override
public void process(WatchedEvent event)
if (event.getType() == EventType.None &
&
event.getState() == KeeperState.SyncConnected)
connectedSemaphore.countDown();
System.out.println(event.getType().toString() + "-" + event.getState().toString());
三、ACLZookeeper内部存储了分布式系统运行时状态的元数据,这些元数据会直接影响基于Zookeeper进行构造的分布式系统的运行状态,如何保障系统中数据的安全,从而避免因误操作而带来的数据随意变更而导致的数据库异常十分重要,Zookeeper提供了一套完善的ACL权限控制机制来保障数据的安全。
我们可以从三个方面来理解ACL机制:权限模式(Scheme)、授权对象(ID)、权限(Permission),通常使用"**scheme : id : permission **"来标识一个有效的ACL信息。权限模式用来确定权限验证过程中使用的检验策略,有如下四种模式:
授权对象是指权限赋予的用户或一个指定实体,如IP地址或机器等。不同的权限模式通常有不同的授权对象。权限是指通过权限检查可以被允许执行的操作,Zookeeper对所有数据的操作权限分为CREATE(节点创建权限)、DELETE(节点删除权限)、READ(节点读取权限)、WRITE(节点更新权限)、ADMIN(节点管理权限),这5种权限简写为crwda。在zoo.cfg文件中进行配置。
3.1、扩展ACL
【Zookeeper - 理论基础-补充】开发人员也可自己扩展ACL,权限控制器需要实现AuthenticationProvider接口,注册自定义权限控制器通过在zoo.cfg配置文件中配置如下配置项:authProvider.1=com.zkbook.CustomAuthenticationProvider。
3.1.1、使用scheme进行授权控制public class Sample_AuthFailed1 implements Watcher
final static String SERVER_LIST = "domain1.book.zookeeper:2181";
static ZooKeeper zkClient = null;
static ZooKeeper zkClient_error = null;
static List<
ACL>
acls = new ArrayList<
ACL>
(1);
static
for (ACL ids_acl : Ids.CREATOR_ALL_ACL)
acls.add(ids_acl);
public static void main(String[] args) throws Exception
try
zkClient = new ZooKeeper(SERVER_LIST, 3000, new Sample_AuthFailed1());
zkClient.addAuthInfo("digest", "taokeeper:true".getBytes());
zkClient.create("/zk-book", "".getBytes(), acls, CreateMode.EPHEMERAL);
zkClient_error = new ZooKeeper(SERVER_LIST, 3000, new Sample_AuthFailed1());
zkClient_error.addAuthInfo("digest", "taokeeper:error".getBytes());
zkClient_error.getData("/zk-book", true, null);
catch (NoAuthException e)
e.printStackTrace();
Thread.sleep(Integer.MAX_VALUE);
@Override
public void process(WatchedEvent event)
System.out.println(event.getState());
System.out.println(event.getType());
3.1.2、使用Super权限模式进行权限控制public class AuthSample_Super
final static String PATH = "/zk-book";
public static void main(String[] args) throws Exception
ZooKeeper zookeeper1 = new ZooKeeper("domain1.book.zookeeper:2181",5000,null);
zookeeper1.addAuthInfo("digest", "foo:true".getBytes());
zookeeper1.create( PATH, "init".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.EPHEMERAL );
ZooKeeper zookeeper2 = new ZooKeeper("domain1.book.zookeeper:2181",50000,null);
zookeeper2.addAuthInfo("digest", "foo:zk-book".getBytes());
System.out.println(zookeeper2.getData( PATH, false, null ));
ZooKeeper zookeeper3 = new ZooKeeper("domain1.book.zookeeper:2181",50000,null);
zookeeper3.addAuthInfo("digest", "foo:false".getBytes());
System.out.println(zookeeper3.getData( PATH, false, null ));
3.1.3、使用World权限模式进行权限控制public class AuthSample_World
final static String PATH = "/zk-book";
public static void main(String[] args) throws Exception
推荐阅读
- MYSQL小内存, 大问题
- Python3操作BeautifulSoup基础语法
- Fastjon2他来了,性能显著提升,还能再战十年
- Forward windows logs to rsyslog server? with Nxlog
- GitHub打不开(看看这5个免费的国内Git仓库吧~)
- 干货合集│最好用的 python 库都在这
- 一些编码Tips
- 音频 3A 处理实践,让你的应用更「动听」
- SpringBoot应用使用自定义的ApplicationContext实现类