Процесс и явление обновления
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. Откатить приложение
проблема вызывает
Основные сомнения:
- Почему в других средах нет проблем, а в онлайн-средах есть проблемы. Есть проблема с ЗК онлайн?Его не существует
-
org.apache.dubbo.metadata.report.MetadataReport
Для чего это? Почему на 2.7.4 нет проблем, а на 2.7.8 проблема?
Процесс расследования:
- 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 по умолчанию будет использовать реестр в качестве центра метаданных.