云服务器内容精选

  • 问题现象 使用Sarama客户端收发消息存在以下问题: Sarama客户端无法感知分区变化,当Topic分区数增加时,需要重启客户端后才能正常消费。 Sarama客户端消息最大处理时间(MaxProcessingTime)默认值为100ms,超过最大处理时间可能导致消费者无法消费。 当消费位点重置策略设置为Oldest(earliest)时,当客户端重启时,偏移量重置后可能从最小位点开始重复消费所有消息。 消费者同时订阅多个Topic时,部分分区可能无法消费到消息。
  • 解决方法 建议您使用Confluent-Kafka-go作为Kafka客户端库。 以下为您提供常用Golang客户端的对比,具体参见表1。 表1 常用Golang客户端对比 客户端 优点 缺点 Confluent-Kafka-go Confluent-Kafka-go是由Confluent提供的官方Kafka客户端库,与Kafka完全兼容,支持所有的Kafka特性。 稳定性高,基于librdkafka,具有高性能和低延迟的特点。 增加编译复杂度。由于导入C++库,Golang编译器需要引入额外编译配置,增加了编译依赖,提高编译复杂度。 Kafka-go kafka-go是一个简单、轻量级的Kafka客户端库,易于学习和使用。 kafka-go的代码库相对较小,依赖较少,可以减少应用程序的体积和依赖关系。 Kafka-go相对于Confluent-Kafka-go来说,功能较为有限,不支持一些高级特性和复杂的配置选项。 性能和吞吐量较低,适用于一些对性能要求不高的简单应用场景。 Sarama Sarama采用原生Golang语言编写,对于异步以及高并发操作支持度较好。 问题较多,文档相对较少。 Sarama在处理大量消息时,会占用较多的内存资源,可能会对应用程序的性能造成一定的影响。
  • Kafka实例的连接地址默认有多少个? Kafka实例的连接地址个数和实例的代理个数有关,连接地址个数即为代理个数。每类实例规格对应的代理个数如下表所示。 表1 Kafka集群实例规格 规格名称 代理个数范围 单个代理TPS 单个代理分区上限 单个代理建议消费组数 单个代理客户端总连接数上限 存储空间范围(GB) 单个代理流量规格(MB/s) kafka.2u4g.cluster.small 3~30 20000 100 15 2000 300~300000 40 kafka.2u4g.cluster 3~30 30000 250 20 2000 300~300000 100 kafka.4u8g.cluster 3~30 100000 500 100 4000 300~600000 200 kafka.8u16g.cluster 3~50 150000 1000 150 4000 300~1500000 375 kafka.12u24g.cluster 3~50 200000 1500 200 4000 300~1500000 625 kafka.16u32g.cluster 3~50 250000 2000 200 4000 300~1500000 750 表2 Kafka单机实例规格 规格名称 代理个数 单个代理TPS 单个代理分区上限 单个代理建议消费组数 单个代理客户端总连接数上限 存储空间范围(GB) 单个代理流量规格(MB/s) kafka.2u4g.single.small 1 20000 100 15 2000 100~10000 40 kafka.2u4g.single 1 30000 250 20 2000 100~10000 100 父主题: 连接问题
  • 使用内网通过同一个VPC访问实例 客户端和实例是否使用相同的安全组? 是,如果保留了创建安全组后,系统默认添加的入方向“允许安全组内的弹性云服务器彼此通信”规则和出方向“放通全部流量”规则,则无需添加其他规则。否则,请添加表1所示规则。 表1中的源地址以全网段放通为例,可根据实际安全需要修改为客户端的IP地址。 表1 安全组规则 方向 协议 类型 端口 源地址 说明 入方向 TCP IPv4 9092 0.0.0.0/0 使用内网通过同一个VPC访问Kafka实例(明文接入)。 入方向 TCP IPv6 9192 ::/0 使用内网通过同一个VPC访问Kafka实例(关闭SSL加密)。 入方向 TCP IPv4 9093 0.0.0.0/0 使用内网通过同一个VPC访问Kafka实例(密文接入)。 入方向 TCP IPv6 9193 ::/0 使用内网通过同一个VPC访问Kafka实例(开启SSL加密)。 否,执行2。 参考如下配置安全组规则。 假设客户端和Kafka实例的安全组分别为:sg-53d4、Default_All。以下规则,远端可使用安全组,也可以使用具体的IP地址,本章节以安全组为例介绍。 客户端所在安全组需要增加如下规则,以保证客户端能正常访问Kafka实例。 表2 安全组规则 方向 策略 协议端口 目的地址 出方向 允许 全部 Default_All 图1 配置客户端安全组 Kafka实例所在安全组需要增加如下规则,以保证能被客户端访问。 表3 安全组规则 方向 策略 协议端口 源地址 入方向 允许 全部 sg-53d4 图2 配置Kafka实例安全组
  • 跨VPC访问和通过DNAT访问实例 请按照表4设置安全组规则。 表4 安全组规则 方向 协议 端口 源地址 说明 入方向 TCP 9011 198.19.128.0/17 通过 VPC终端节点 实现跨VPC访问Kafka实例(密文接入和明文接入都适用)。 入方向 TCP 9011 0.0.0.0/0 使用DNAT访问Kafka实例(密文接入和明文接入都适用)。 入方向 TCP 9092 0.0.0.0/0 使用对等连接跨VPC访问Kafka实例(明文接入)。 入方向 TCP 9093 0.0.0.0/0 使用对等连接跨VPC访问Kafka实例(密文接入)。
  • 通过公网访问实例 请按照表5设置安全组规则。 表5中的源地址以全网段放通为例,可根据实际安全需要修改为客户端的IP地址。 表5 安全组规则 方向 协议 类型 端口 源地址 说明 入方向 TCP IPv4 9094 0.0.0.0/0 通过公网访问Kafka(明文接入)。 入方向 TCP IPv4 9095 0.0.0.0/0 通过公网访问Kafka(密文接入)。 入方向 TCP IPv6 9192 ::/0 通过公网访问Kafka实例(关闭SSL加密)。 入方向 TCP IPv6 9193 ::/0 通过公网访问Kafka实例(开启SSL加密)。
  • 如何配置安全组? RabbitMQ实例支持VPC内访问和公网访问,配置安全组的方式如下: VPC内访问实例 客户端只能部署在与RabbitMQ实例处于相同虚拟私有云(VPC)的弹性云服务器(E CS )上。 除了ECS、RabbitMQ实例必须处于相同VPC之外,还需要他们的安全组分别配置了正确的规则,客户端才能访问RabbitMQ实例。 建议ECS、RabbitMQ实例配置相同的安全组。安全组创建后,默认包含组内网络访问不受限制的规则。 如果配置了不同安全组,可参考如下配置方式: 假设ECS、RabbitMQ实例分别配置了安全组:sg-53d4、Default_All。 以下规则,远端可使用安全组,也可以使用具体的IP地址。 ECS所在安全组需要增加如下规则,以保证客户端能正常访问RabbitMQ实例。 图1 配置ECS安全组 表1 安全组规则 方向 协议端口 目的地址 出方向 全部放通 Default_All RabbitMQ实例所在安全组需要增加如下规则,以保证能被客户端访问。 图2 配置RabbitMQ实例安全组 表2 安全组规则 方向 协议端口 源地址 入方向 全部放通 sg-53d4 通过公网访问实例 RabbitMQ实例所在安全组需要增加如下规则,以保证能被客户端访问。 表3中的源地址以全网段放通为例,可根据实际安全需要修改为客户端的IP地址。 表3 安全组规则 方向 协议端口 源地址 入方向 TCP:5672 RabbitMQ客户端所在的IP地址或地址组 具体如图3所示。 图3 安全组规则1 父主题: 连接问题
  • 可能原因三:用户名或密码错误 报错如下: [root@ecs-test RabbitMQ-Tutorial]# java -cp .:rabbitmq-tutorial.jar Send 192.168.125.111 5672 user ******* Exception in thread "main" com.rabbitmq.client.AuthenticationFailureException: AC CES S_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile. at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:351) at com.rabbitmq.client.impl.recovery.RecoveryAwareAMQConnectionFactory.newConnection(RecoveryAwareAMQConnectionFactory.java:64) 解决方法:修改用户名或密码。如果忘记密码,参考重置实例密码,重置密码。
  • 可能原因二:端口不正确 VPC内访问场景下,端口不正确时,报错如下: [root@ecs-test RabbitMQ-Tutorial]# java -cp .:rabbitmq-tutorial.jar Send 192.168.125.111 5673 user ******* Exception in thread "main" java.net.ConnectException: Connection refused (Connection refused) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 公网访问场景下,端口不正确时,报错如下: [root@ecs-test RabbitMQ-Tutorial]# java -cp .:rabbitmq-tutorial.jar Send 139.xxx.179 5673 user ******* Exception in thread "main" java.net.SocketTimeoutException: connect timed out at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 解决方法:修改端口号。
  • 可能原因五:未创建Vhost或者填错Vhost名称 报错如下: Couldn't log in: server connection error 530, message: NOT_ALLOWED - vhost /localdev/ not found 解决方法: 如果未创建Vhost,进入RabbitMQ控制台的“Vhost列表”页面,创建Vhost。 如果是Vhost名称填错了,请参考RabbitMQ控制台的“Vhost列表”页面显示的Vhost名称,修改连接URL和配置文件。
  • 可能原因一:连接地址不正确 VPC内访问场景下,连接地址不正确时,报错如下: [root@ecs-test RabbitMQ-Tutorial]# java -cp .:rabbitmq-tutorial.jar Send 192.168.125.110 5672 user ******* Exception in thread "main" java.net.NoRouteToHostException: No route to host (Host unreachable) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 公网访问场景下,连接地址不正确时,报错如下: [root@ecs-test RabbitMQ-Tutorial]# java -cp .:rabbitmq-tutorial.jar Send 139.xxx.178 5672 user ******* Exception in thread "main" java.net.SocketTimeoutException: connect timed out at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 解决方法:在RabbitMQ控制台的“基本信息”页面,获取“内网连接地址”/“公网连接地址”,修改连接实例代码中的连接地址。
  • SSL方式连接RabbitMQ实例失败? 首先排查安全组的入方向规则,是否放开了端口5671(SSL方式访问)或5672(非SSL访问)。 其次,参考如下内容配置SSL单向认证: 1 2 3 4 5 6 7 8 ConnectionFactory factory = new ConnectionFactory(); factory.setHost(host); factory.setPort(port); factory.setUsername(user); factory.setPassword(password); factory.useSslProtocol(); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); 父主题: 连接问题
  • Kafka实例连接数有限制吗? 不同规格的Kafka实例,连接数限制如下: 表1 老规格Kafka实例的连接数 基准带宽 连接数上限 100MB/s 3000 300MB/s 10000 600MB/s 20000 1200MB/s 20000 表2 新规格Kafka实例的连接数 实例规格 单个代理客户端总连接数上限 kafka.2u4g.cluster.small 2000 kafka.2u4g.single.small 2000 kafka.2u4g.cluster 2000 kafka.2u4g.single 2000 kafka.4u8g.cluster 4000 kafka.8u16g.cluster 4000 kafka.12u24g.cluster 4000 kafka.16u32g.cluster 4000 父主题: 连接问题
  • Kafka实例是否支持跨VPC访问? Kafka实例支持跨VPC访问,您可以通过以下任意一个方式实现跨VPC访问: 创建VPC对等连接,将两个VPC的网络打通,实现跨VPC访问。具体步骤请参考VPC对等连接说明。 创建一个云连接实例,然后在创建的云连接实例中加载需要互通的VPC,实现跨VPC访问。具体步骤请参考同区域同账号VPC互通。 利用VPC终端节点在不同VPC间建立跨VPC的连接通道,实现Kafka客户端通过内网访问Kafka实例。具体步骤请参考跨VPC访问Kafka实例。 父主题: 连接问题