Обновление Dubbo вызывает простои ZK

Java

Процесс и явление обновления

1. Версия Dubbo обновлена ​​с 2.7.4 до 2.7.8. 2. Работа в средах разработки, тестирования и предварительного выпуска более 3 недель. 3. При публикации в сети приложение не запускается, что сопровождается большим количеством журналов переподключения клиентов ZK, а именно:

2020-09-24 15:03:40.664, [TID:N/A], INFO, org.apache.zookeeper.ClientCnxn, ClientCnxn.java, 1299, onConnected Session establishment complete on server xx/x:2181, sessionid = 0xe72dc060e3f1d06, negotiated timeout = 40000
2020-09-24 15:03:40.666, [TID:N/A], INFO, org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient, Log4jLogger.java, 66, info  [DUBBO] Curator zookeeper client instance initiated successfully, session id is e72dc060e3f1d06, dubbo version: 2.7.8, current host: 10.3.107.40
2020-09-24 15:03:53.734, [TID:N/A], WARN, org.apache.zookeeper.ClientCnxn, ClientCnxn.java, 1164, run Session 0xe72dc060e3f1d06 for server xx/xx:2181, unexpected error, closing socket connection and attempting reconnect
java.io.IOException: Packet len18594568 is out of range!
	at org.apache.zookeeper.ClientCnxnSocket.readLength(ClientCnxnSocket.java:113)
	at org.apache.zookeeper.ClientCnxnSocketNIO.doIO(ClientCnxnSocketNIO.java:79)
	at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:366)
	at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1141)
2020-09-24 15:03:55.540, [TID:N/A], WARN, org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient, Log4jLogger.java, 81, warn  [DUBBO] Curator zookeeper connection of session e72dc060e3f1d06 timed out. connection timeout value is 3000, session expire timeout value is 60000, dubbo version: 2.7.8, current host: 10.3.107.40
2020-09-24 15:03:56.165, [TID:N/A], INFO, org.apache.zookeeper.ClientCnxn, ClientCnxn.java, 879, primeConnection Socket connection established to xx/xx:2181, initiating session
2020-09-24 15:03:56.346, [TID:N/A], INFO, org.apache.zookeeper.ClientCnxn, ClientCnxn.java, 1299, onConnected Session establishment complete on server xx/xx:2181, sessionid = 0xe72dc060e3f1d06, negotiated timeout = 40000
2020-09-24 15:04:08.135, [TID:N/A], WARN, org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient, Log4jLogger.java, 81, warn  [DUBBO] Curator zookeeper connection recovered from connection lose, reuse the old session e72dc060e3f1d06, dubbo version: 2.7.8, current host: 10.3.107.40
2020-09-24 15:04:53.046, [TID:N/A], WARN, org.apache.zookeeper.ClientCnxn, ClientCnxn.java, 1164, run Session 0xe72dc060e3f1d06 for server xx/xx:2181, unexpected error, closing socket connection and attempting reconnect
java.io.IOException: Packet len18594616 is out of range!
	at org.apache.zookeeper.ClientCnxnSocket.readLength(ClientCnxnSocket.java:113)
	at org.apache.zookeeper.ClientCnxnSocketNIO.doIO(ClientCnxnSocketNIO.java:79)
	at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:366)
	at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1141)
2020-09-24 15:04:54.626, [TID:N/A], WARN, org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient, Log4jLogger.java, 81, warn  [DUBBO] Curator zookeeper connection of session e72dc060e3f1d06 timed out. connection timeout value is 3000, session expire timeout value is 60000, dubbo version: 2.7.8, current host: 10.3.107.40

4. Дальше идут миллионы следующих логов

2020-09-24 15:37:50.309, [TID:N/A], ERROR, org.apache.curator.framework.imps.CuratorFrameworkImpl, CuratorFrameworkImpl.java, 694, logError Background operation retry gave up
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss
	at org.apache.zookeeper.KeeperException.create(KeeperException.java:102)
	at org.apache.curator.framework.imps.CuratorFrameworkImpl.checkBackgroundRetry(CuratorFrameworkImpl.java:862)
	at org.apache.curator.framework.imps.CuratorFrameworkImpl.processBackgroundOperation(CuratorFrameworkImpl.java:647)
	at org.apache.curator.framework.imps.WatcherRemovalFacade.processBackgroundOperation(WatcherRemovalFacade.java:152)
	at org.apache.curator.framework.imps.GetChildrenBuilderImpl$2.processResult(GetChildrenBuilderImpl.java:187)
	at org.apache.zookeeper.ClientCnxn$EventThread.processEvent(ClientCnxn.java:604)
	at org.apache.zookeeper.ClientCnxn$EventThread.run(ClientCnxn.java:508)

5. В отдел эксплуатации и обслуживания поступил сигнал тревоги, и ЗК повесил трубку

6. Откатить приложение

проблема вызывает

Основные сомнения:

  1. Почему в других средах нет проблем, а в онлайн-средах есть проблемы. Есть проблема с ЗК онлайн?Его не существует
  2. org.apache.dubbo.metadata.report.MetadataReportДля чего это? Почему на 2.7.4 нет проблем, а на 2.7.8 проблема?

Процесс расследования:

  1. Packet lenxx is out of range!
2020-09-24 15:03:53.734, [TID:N/A], WARN, org.apache.zookeeper.ClientCnxn, ClientCnxn.java, 1164, run Session 0xe72dc060e3f1d06 for server xx/xx:2181, unexpected error, closing socket connection and attempting reconnect
java.io.IOException: Packet len18594568 is out of range!
	at org.apache.zookeeper.ClientCnxnSocket.readLength(ClientCnxnSocket.java:113)
	at org.apache.zookeeper.ClientCnxnSocketNIO.doIO(ClientCnxnSocketNIO.java:79)
	at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:366)
	at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1141)

Я столкнулся с этой проблемой до при работе ZK. В то время в узле было написано длинная длинная строка случайных чисел. Когда я получил этот узел, я сообщил о такой ошибке. Сделал некоторые исследования в Интернете,

public static final int packetLen = Integer.getInteger("jute.maxbuffer",4096 * 1024);
protected void readLength() throws IOException {
    int len = incomingBuffer.getInt();
    if (len < 0 || len >= ClientCnxn.packetLen) {
        throw new IOException("Packet len" + len + " is out of range!");
    }
    incomingBuffer = ByteBuffer.allocate(len);
}

Вероятно, превышает определенный предел, он может быть жестоким путем настройкиjute.maxbufferразмер решает эту проблему. Но почему сообщается об этой ошибке? Это потому, что узел слишком большой? Однако в версии 2.7.4 такой ошибки нет.Может быть она вызвана мониторингом зк в новой версии?

2. Посмотрите ключевой журнал в центре журнала и обнаружите, что он включает в себяMetadataReport

Injection of @DubboReference dependencies is failed; nested exception is java.lang.IllegalStateException: Failed to receive INITIALIZED event from zookeeper, pls. check if url zookeeper://xx:2181/org.apache.dubbo.metadata.report.MetadataReport?client=&dubbo.config-center.root-path=/ is correct

В текущей версии dubbo центр метаданных — это просто место для хранения метаданных, и никакая другая сложная логика не задействована. И мы открыли центр метаданных для всех приложений через центр конфигурации, и поменяли центр метаданных на Redis, почему здесь такое генерируется?

3. ВMetadataReportInstanceВ методе init это включает получениеMetadataReportлогика, которая в конечном итоге приводит кZookeeperDynamicConfigurationинициализация

4. Почему он не проявляется в других средах, а только в повседневной жизни? Потому что другие среды настроили центр метаданных как Redis для всех клиентов через глобальный центр конфигурации dubbo, но онлайн-конфигурации нет. Поэтому здесь используется центр метаданных по умолчанию и ZK. Если клиент не настроит центр метаданных, Dubbo по умолчанию будет использовать реестр в качестве центра метаданных.