5月27日 21:28
What are the advanced features of Zookeeper? How to use Watcher, ACL, and transaction operations?
Answer
Zookeeper provides multiple advanced features that make it more flexible and powerful in distributed systems.
1. Watcher Mechanism
Watcher Characteristics:
- One-time trigger: Automatically deleted after triggering
- Lightweight: Only notifies event type, does not include data
- Asynchronous notification: Processed through callback functions
Watcher Types:
java// Node data changes zk.getData("/path", watcher, null); // Child node changes zk.getChildren("/path", watcher); // Node existence changes zk.exists("/path", watcher);
Event Types:
NodeCreated: Node createdNodeDeleted: Node deletedNodeDataChanged: Node data changedNodeChildrenChanged: Child nodes changed
Best Practices:
- Re-register Watcher after it triggers
- Avoid time-consuming operations in Watcher
- Use
exists()to monitor non-existent nodes
2. ACL Permission Control
Permission Types:
CREATE: Create child nodesREAD: Read node dataWRITE: Update node dataDELETE: Delete child nodesADMIN: Set ACL
Permission Schemes:
java// world: anyone ZooDefs.Ids.OPEN_ACL_UNSAFE // auth: authenticated user new ACL(Perms.ALL, new Id("auth", "username:password")) // digest: username password new ACL(Perms.READ, new Id("digest", "username:password")) // ip: IP address new ACL(Perms.READ, new Id("ip", "192.168.1.1")) // super: super administrator
Setting ACL:
java// Set ACL when creating node zk.create("/secure", data, ZooDefs.Ids.READ_ACL_UNSAFE, CreateMode.PERSISTENT); // Modify node ACL zk.setACL("/secure", ZooDefs.Ids.OPEN_ACL_UNSAFE, -1);
3. Transaction Operations
Transaction Characteristics:
- Atomicity: Either all succeed or all fail
- Sequentiality: Execute in submission order
multi Operation:
javaList<Op> ops = new ArrayList<>(); // Create node ops.add(Op.create("/multi/node1", "data1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT)); // Update data ops.add(Op.setData("/multi/node1", "newData".getBytes(), -1)); // Delete node ops.add(Op.delete("/multi/node1", -1)); // Execute transaction zk.multi(ops);
4. Four-Letter Commands
Common Four-Letter Commands:
bash# View cluster status echo stat | nc localhost 2181 # View connection information echo cons | nc localhost 2181 # View environment variables echo envi | nc localhost 2181 # View configuration echo conf | nc localhost 2181 # View monitoring information echo mntr | nc localhost 2181 # View node statistics echo dump | nc localhost 2181 # Reset connection statistics echo srst | nc localhost 2181 # View server status echo srvr | nc localhost 2181 # View watcher information echo wchs | nc localhost 2181
5. Data Snapshots and Transaction Logs
Transaction Logs:
- Record all write operations
- Used for data recovery
- Sequential write, high performance
Snapshots:
- Periodically save memory state
- Accelerate startup recovery
- Compressed storage
Recovery Process:
- Load latest snapshot
- Apply transaction logs after snapshot
- Sync differential data with Leader
6. Client Reconnection Mechanism
Automatic Reconnection:
java// Set retry policy RetryPolicy retryPolicy = new ExponentialBackoffRetry( 1000, // base sleep time 3 // max retries ); CuratorFramework client = CuratorFrameworkFactory.builder() .connectString("localhost:2181") .retryPolicy(retryPolicy) .build();
Retry Policies:
ExponentialBackoffRetry: Exponential backoffRetryNTimes: Fixed number of retriesRetryUntilElapsed: Timeout retryRetryOneTime: Single retry
7. Session Management
Session States:
CONNECTING: ConnectingCONNECTED: ConnectedRECONNECTING: ReconnectingCLOSED: Closed
Session Timeout:
- Client heartbeat maintains session
- Ephemeral nodes automatically deleted after timeout
- Configurable timeout
Session Recovery:
java// Recover using session ID and password byte[] password = zk.getSessionPasswd(); long sessionId = zk.getSessionId(); ZooKeeper newZk = new ZooKeeper( "localhost:2181", 30000, watcher, sessionId, password );
8. Container Nodes (3.5+)
Container Node Characteristics:
- Automatically deleted when no child nodes
- Used for dynamic resource management
Use Cases:
- Parent node for locks
- Temporary resource groups
java// Create container node zk.create("/container", null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.CONTAINER);
9. TTL Nodes (3.5+)
TTL Node Characteristics:
- Set expiration time
- Automatically deleted when expired
- Need to enable TTL feature
Enable TTL:
properties# zoo.cfg zookeeper.extendedTypesEnabled=true
Create TTL Node:
java// Create TTL node zk.create("/ttl-node", data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_WITH_TTL, new Stat(), 5000); // TTL 5 seconds
10. Advanced Client Curator
Curator Framework Features:
- Connection management
- Retry mechanism
- Distributed lock
- Leader election
- Distributed counter
- Distributed queue
Distributed Lock Example:
javaInterProcessMutex lock = new InterProcessMutex( client, "/locks/my-lock" ); try { // Acquire lock lock.acquire(); // Execute business logic doSomething(); } finally { // Release lock lock.release(); }
Leader Election Example:
javaLeaderSelectorListener listener = new LeaderSelectorListener() { @Override public void takeLeadership() { // Execute after becoming Leader while (true) { // Maintain Leader status Thread.sleep(1000); } } }; LeaderSelector selector = new LeaderSelector( client, "/leader", listener ); selector.start();
11. Data Migration and Backup
Data Export:
bash# Export data using zkCli zkCli.sh -server localhost:2181 get /path > backup.txt
Data Import:
bash# Import data zkCli.sh -server localhost:2181 create /path "data"
Cluster Migration:
- Stop writes
- Export data
- Import to new cluster
- Switch client connections
12. Monitoring and Alerting
Monitoring Metrics:
- Node status
- Latency metrics
- Throughput
- Connection count
- Memory usage
Alerting Strategies:
- Leader switch alert
- Latency threshold alert
- Connection limit alert
- Memory usage alert
13. Security Hardening
Security Measures:
- Enable SASL authentication
- Configure ACL permissions
- Network isolation
- Regular backups
- Log auditing
SASL Authentication Configuration:
properties# jaas.conf Server { org.apache.zookeeper.server.auth.DigestLoginModule required user_super="admin"; }; Client { org.apache.zookeeper.server.auth.DigestLoginModule required username="admin" password="admin"; };