ZooKeeper权限配置

本文详细介绍了如何利用Zookeeper作为配置管理服务,特别关注了如何通过digest认证方式实现对节点数据的安全权限控制,包括如何为不同用户提供特定权限来操作Zookeeper上的数据。
最近使用Zookeeper作为配置管理服务,因为配置数据有很高的安全要求,需要有权限控制,也就是需要登录才能看到Zookeeper上面的数据。

Zookeeper对权限的控制是节点级别的,而且不继承,即对父节点设置权限,其子节点不继承父节点的权限。

Zookeeper提供了几种认证方式
* world:有个单一的ID,anyone,表示任何人。
* auth:不使用任何ID,表示任何通过验证的用户(是通过ZK验证的用户?连接到此ZK服务器的用户?)。
* digest:使用 用户名:密码 字符串生成MD5哈希值作为ACL标识符ID。权限的验证通过直接发送用户名密码字符串的方式完成,
* ip:使用客户端主机ip地址作为一个ACL标识符,ACL表达式是以 addr/bits 这种格式表示的。ZK服务器会将addr的前bits位与客户端地址的前bits位来进行匹配验证权限。

digest方式比较适合我们的业务,因此采用此种方式对Zookeeper进行权限控制。

创建节点数据时:
List<ACL> acls = new ArrayList<ACL>(2);   

Id id1 = new Id("digest", DigestAuthenticationProvider.generateDigest("admin:admin123"));
ACL acl1 = new ACL(ZooDefs.Perms.ALL, id1);

Id id2 = new Id("digest", DigestAuthenticationProvider.generateDigest("guest:guest123"));
ACL acl2 = new ACL(ZooDefs.Perms.READ, id2);

acls.add(acl1);
acls.add(acl2);

ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 10000, new DefaultWatcher());
zk.create("/test", new byte[0], acls, CreateMode.PERSISTENT);


登录Zookeeper读取节点数据时:
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 10000, new DefaultWatcher());
zk.addAuthInfo("digest", "guest:guest123".getBytes());
byte[] value = zk.getData("/test", null, new Stat());


这样对Zookeeper上的节点数据设置多个用户,用于不同的权限操作。
<think>根据提供的引用信息,用户希望了解ZooKeeper的日志配置方法。引用内容涉及日志滚动策略、配置文件修改位置(log4j.properties、zoo.cfg、zkEnv.sh)以及日志清理脚本示例。以下将综合引用信息整理配置步骤: ### 配置目标 1. 修改日志输出方式(从Console改为滚动文件) 2. 配置按大小滚动(如1GB切割) 3. 设置保留文件数量(如30个) 4. 指定日志存储路径 ### 配置步骤 #### 1. 修改`log4j.properties` - 路径:`$ZK_HOME/conf/log4j.properties` - 关键修改项: ```properties # 设置日志输出为滚动文件 zookeeper.root.logger=INFO, ROLLINGFILE zookeeper.log.file=zookeeper.log # 使用按文件大小滚动的Appender(替换原有DailyRollingFileAppender) log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file} # 设置单个日志文件最大为1GB log4j.appender.ROLLINGFILE.MaxFileSize=1GB # 设置保留的备份文件数(此处保留30个) log4j.appender.ROLLINGFILE.MaxBackupIndex=30 # 日志格式(可选,保持默认或自定义) log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [%t] %p %c (%F:%L) - %m%n ``` > **注意**:默认配置可能使用`DailyRollingFileAppender`(按天滚动),需替换为`RollingFileAppender`以实现按大小滚动。 #### 2. 修改日志存储路径 - **方式1**:通过`zkEnv.sh`指定(推荐) 编辑`$ZK_HOME/bin/zkEnv.sh`: ```bash # 设置日志目录 if [ "x${ZOO_LOG_DIR}" = "x" ]; then ZOO_LOG_DIR="/your/custom/log/path" # 替换为实际路径 fi # 确保日志输出类型包含ROLLINGFILE if [ "x${ZOO_LOG4J_PROP}" = "x" ]; then ZOO_LOG4J_PROP="INFO,ROLLINGFILE" fi ``` - **方式2**:通过`zoo.cfg`指定事务日志路径(**注意**:此路径与上述应用日志不同) ```properties # 在zoo.cfg中配置事务日志目录(非应用日志) dataLogDir=/path/to/transaction/logs ``` #### 3. 重启ZooKeeper服务 - 修改后需重启集群节点使配置生效: ```bash # 进入ZooKeeper的bin目录 ./zkServer.sh stop ./zkServer.sh start ``` ### 日志清理补充(可选) 引用[4]提供了日志清理脚本示例,适用于未配置滚动策略时的手动清理。若已配置`MaxBackupIndex`,则无需额外清理,旧日志文件会自动删除。 ### 注意事项 - **日志类型区分**: - **应用日志**:记录服务运行状态(通过`log4j.properties`配置)。 - **事务日志**:记录事务操作(通过`zoo.cfg`的`dataLogDir`配置)。 - **权限问题**:确保ZooKeeper进程对日志目录有读写权限。 - **集群配置**:需在所有节点上同步修改。 §§ 相关问题 §§ 1. ZooKeeper的事务日志和应用日志有什么区别? 2. 如何监控ZooKeeper的磁盘空间使用情况? 3. 日志滚动配置后未生效的可能原因有哪些? </think>### ZooKeeper日志配置方法 根据引用内容,ZooKeeper日志配置主要通过修改以下三个文件实现(以按大小滚动切割为例): #### 1. **修改`log4j.properties`**(核心配置) 路径:`$ZK_HOME/conf/log4j.properties` ```properties # 将日志输出目标改为ROLLINGFILE(原默认值可能为CONSOLE) zookeeper.root.logger=INFO,ROLLINGFILE # 配置滚动日志策略 log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/zookeeper.log log4j.appender.ROLLINGFILE.MaxFileSize=1GB # 单个文件最大1GB log4j.appender.ROLLINGFILE.MaxBackupIndex=30 # 保留30个备份文件 log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [%t] %p %c(%L): %m%n ``` > **关键参数说明**: > - `MaxFileSize`:触发切割的单个日志文件大小 > - `MaxBackupIndex`:保留的历史日志文件数量 > - 需删除或注释原有`DailyRollingFileAppender`配置(引用[2])[^2] --- #### 2. **指定日志存储路径** **方式1:通过`zkEnv.sh`设置**(推荐) 路径:`$ZK_HOME/bin/zkEnv.sh` ```bash # 添加/修改以下环境变量 export ZOO_LOG_DIR="/opt/zookeeper/logs" # 自定义日志目录 export ZOO_LOG4J_PROP="INFO,ROLLINGFILE" # 启用滚动日志策略 ``` > 注:目录需提前创建或确保ZooKeeper有写入权限[^2] **方式2:通过`zoo.cfg`设置事务日志路径** 路径:`$ZK_HOME/conf/zoo.cfg` ```properties dataLogDir=/opt/zookeeper/transaction_logs # 事务日志独立路径 ``` > 事务日志与应用日志分离可提升性能[^2][^3] --- #### 3. **重启服务生效** ```bash # 重启所有ZooKeeper节点 $ZK_HOME/bin/zkServer.sh restart ``` 重启后日志将按新策略生成: - 主日志:`zookeeper.log` - 历史日志:`zookeeper.log.1`, `zookeeper.log.2`, ...(保留30个) --- ### 日志清理补充方案(可选) 若需额外清理旧日志(如引用[4]),可使用脚本: ```bash # 示例:删除超过30天的日志 find $ZOO_LOG_DIR -name "zookeeper.log.*" -mtime +30 -exec rm -f {} \; ``` > **注意事项**: > 1. 配置需同步到集群所有节点 > 2. 确保日志目录磁盘空间充足(建议预留日志总大小×2的空间)[^3] > 3. 事务日志(`dataLogDir`)和应用日志分离存放可避免相互影响[^2][^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值