假设我们有几个相同的节点,它们是某些n层服务的应用服务器.假设我们使用Apache ZooKeeper来保留我们分布式应用程序的所有配置.另外,我们在此应用程序前面有一个nginx作为负载均衡器和反向代理.
因此,假设我们执行仅在node1上更改数据的命令,并且在某段时间内,node2与node1不同.我们希望代理将所有特殊请求(需要特定数据)重定向到node1,直到所有信息都迁移到node2并且node2与node1具有相同的数据.
有没有办法让nginx(或其他代理)从Apache ZooKeeper读取其配置?或更广泛的:有没有办法有效地切换代理配置?当然,它应该在没有(或最小)整个系统的停机时间内完成 - 因此重新启动nginx不是选项.
是否有任何记录良好的Apache ZooKeeper用例用于分发Java应用程序的配置,特别是Spring服务?
像许多云服务用户一样,我需要更改可变数量的Java服务的配置,最好是在运行时,而不需要重新启动服务.
UPDATE
最后,我最终写了一些东西,将ZooKeeper节点作为属性文件加载,并创建一个ResourcePropertySource并将其插入到Spring上下文中.请注意,这不会反映上下文启动后ZooKeeper节点的更改.
public class ZooKeeperPropertiesApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
private static final Logger logger = LoggerFactory.getLogger(ZooKeeperPropertiesApplicationContextInitializer.class);
private final CuratorFramework curator;
private String projectName;
private String projectVersion;
public ZooKeeperPropertiesApplicationContextInitializer() throws IOException {
logger.trace("Attempting to construct CuratorFramework instance");
RetryPolicy retryPolicy = new ExponentialBackoffRetry(10, 100);
curator = CuratorFrameworkFactory.newClient("zookeeper", retryPolicy);
curator.start();
}
/**
* Add a primary property source to the application context, populated from
* a pre-existing ZooKeeper node.
*/
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
logger.trace("Attempting to add …Run Code Online (Sandbox Code Playgroud) 所以我的目标是以分布式方式建立一个由几个kafka经纪人组成的集群.但我看不出让经纪人了解对方的方法.
据我所知,每个代理在其配置中需要一个单独的ID,如果我从kubernetes启动容器,我无法保证或配置?
他们还需要有相同的advertised_host?
是否有任何我需要更改的参数需要更改才能让节点相互发现?
使用脚本在Dockerfile的末尾进行这样的配置是否可行?和/或共享卷?
我目前正在尝试使用spotify/kafka-image进行此操作,该图像具有预先配置的zookeeper + kafka组合,在vanilla Kubernetes上.
apache-kafka docker google-cloud-platform kubernetes apache-zookeeper
为什么不推荐在kafka-consumer中使用zookeeper以及为什么建议使用bootstrap服务器呢?bootstrap-server的优点是什么?
在我为解决此问题所做的步骤下方:
.\bin\windows\kafka-server-start.bat .\config\server.properties在第二步发生错误:
ERROR KafkaServer 启动期间的致命错误。准备关闭 (kafka.server.KafkaServer) kafka.common.InconsistentClusterIdException:集群 ID Reu8ClK3TTywPiNLIQIm1w 与 meta.properties 中存储的 clusterId Some(BaPSk1bCSsKFxQQ4717R6Q) 不匹配。代理正在尝试加入错误的集群。配置的zookeeper.connect 可能是错误的。 在 kafka.server.KafkaServer.startup(KafkaServer.scala:220) 在 kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:44) 在 kafka.Kafka$.main(Kafka.scala:84) 在 kafka.Kafka.main (Kafka.scala)
当我触发.\bin\windows\kafka-server-start.bat .\config\server.properties zookeeper控制台返回时:
信息 [SyncThread:0:FileTxnLog@216] - 创建新的日志文件:log.1
如何解决此问题以使 kafka 运行?
编辑您可以在此处访问正确站点(服务器故障)上的正确问题
编辑这里是答案
是否有任何现有工具可以帮助读取Zookeeper事务日志?默认情况下,它是二进制格式,我想以人类可读的形式阅读它.
我正在使用kafka_2.9.2-0.8.1.1和zookeeper 3.4.6.
是否有可以从zookeeper中自动删除使用者组的实用程序?或者我可以删除zookeeper中/ consumers/[group_id]下的所有内容吗?如果是后者,还有什么我错过了吗?这可以用现场系统完成吗?
要从命令行界面删除zookeeper中的节点,可以使用delete命令.当我运行它时,它说:
Node not empty: /testNode
Run Code Online (Sandbox Code Playgroud)
我正在使用本指南.
我正在尝试将Apache Curator与dockerized zookeeper实例一起使用,无论我如何尝试连接,我总是最终得到一个
org.apache.zookeeper.KeeperException $ UnimplementedException:KeeperErrorCode =未实现...
错误.我已经尝试了解文档,但我没有到达任何地方.我已登录zookeeper CLI并确保端口号正确:
snerd@powerglove:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 31f1093495ba compose_zookeeper "/opt/zookeeper/bin/ 3 weeks ago Up About a minute 0.0.0.0:32770->2181/tcp,
0.0.0.0:32769->2888/tcp, 0.0.0.0:32768->3888/tcp zookeeper
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试使用的代码:
public class App {
public static void main( String[] args ) {
CuratorFramework client = CuratorFrameworkFactory.newClient("0.0.0.0:32770", new RetryUntilElapsed(3000, 1000));
client.start();
try {
client.create().forPath("/larry-smells/foop", "tuna?".getBytes());
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,从策展人入门页面来看,这应该可行.我错过了什么?
edit1 刚才发现我能够将数据从动物园管理员集合中拉出来:
System.out.println(new String(curatorFramework.getData().forPath("/larry-smells")));
Run Code Online (Sandbox Code Playgroud)
但是create命令仍然在爆炸.
EDIT2
错误的堆栈跟踪:
org.apache.zookeeper.KeeperException $ …
使用CuratorFramework,有人可以解释我怎么做:
使用用户名foo和密码bar?那些不知道这个用户/通行证的人将无法做任何事情.
出于此问题的目的,我不关心通过明文发送的SSL或密码.
apache-zookeeper ×10
apache-kafka ×4
java ×2
apache ×1
docker ×1
kubernetes ×1
nginx ×1
scala ×1
service ×1
spring ×1