010
Ускорение входящей миграции
011
012
Введение
013
014
В этом файле прописаны некоторые советы по ускорению
015 миграции.
016
017
Предварительные требования
018
019
Перед началом работы необходимо удостовериться что POD-ы Кафки и
020 Java настроены корректно ресурсы.
021
022
Java Удостоверьтесь, что в yaml файле mybpm-api, правильно
023 настроен environment JAVA_TOOL_OPTIONS.
024
025
Значение в "-Xms" и "-Xmx" должны быть одинаковы и составлять не
026 более 75% от общей памяти выделенной на сам под. 50% самый
027 безопасный и оптимальный вариант.
028
029
Пример. Если на POD выделено 10Gb, то этому параметру можно
030 выделить не более 7680M или 7Gb (75%). Но лучше поставить 5120M
031 (50%)
032
033
034 - { name: JAVA_TOOL_OPTIONS, value: "-Xms7680M -Xmx7680M" }
035
036
037 or
038
039
040
041
042 - { name: JAVA_TOOL_OPTIONS, value: "-Xms5120M -Xmx5120M" }
043
044
045
Kafka Удостоверьтесь, что в yaml файле kafka, правильно настроен
046 environment KAFKA_HEAP_OPTS.
047
048
Правила такие же как для Java, но лимит 50% от памяти POD-а
049
050
Пример. Если на POD выделено 10Gb. То этому параметру нужно
051 выделить 5120M или 5Gb (50%).
052
053
054 - { name: JAVA_TOOL_OPTIONS, value: "-Xms5120M -Xmx5120M" }
055
056
057
Основная часть
058
059
Самый простой способ увеличить скорость миграции - увеличить
060 количество консьмеров (consumers), потребляющие сообщения из топика
061 IN_MIGRATION
062
063
Кол-во консьюмеров насраивается в зукипере (ZooKeeper) в
064 директории consumers. Чтобы найти эту директорию:
065
066
067 - Перейдите в ZooNavigator (адрес, на котором он разворачивается,
068 смотрите в docker-compose файле для локалки это - http://localhost:10010)
070
071 - Перейдите в директорию mybpm
072
073 - Далее перейдите в директорию consumers
074
075 - Здесь лежат конфигурации всех коньсьюмеров mybpm-а, кол-во
076 консьюмеров для миграции можно изменить в файле
077 InMigration.workerCount
078
079
080
Адрес файла в zoonavigator-е
081 "/mybpm/consumers/InMigration.workerCount"
082
083
Правила по установке консьюмеров
084
085
086 - Кол-во консьюмеров никогда не должно превышать количество
087 партиций (partitions) топика (в данном случае топика
088 IN_MIGRATION)
089
090 - Кол-во консьюмеров должно быть делителем числа партиции топика.
091 Например, если в топике IN_MIGRATION 48 партиции, то возможное
092 значение для консьюмеров: 1, 2, 4, 6, 8, 12, 24, 48.
093
094 - Обратите внимание кол-во консьюмеров напрямую зависит от
095 выделенных ресурсов системе. Если памяти недостаточно кафке или
096 Java, то даже увеличив кол-во консьюмеров, вы не ускорите
097 миграцию.
098
099 - Лучший выбор постепенно увеличивать количество по следющему
100 алгоритму:
101
102
103 - По дефолту стоит 1 консьюмер, нужно увеличить до 2. Проверить
104 нагрузку на сервер во время миграции.
105
106 - Если нагрузка в рамках допустимого и миграции стала быстрее, то
107 можно увеличить кол-во консьюмеров еще раз, учитывая
108 вышеприведенные правила (при 48 партициях, следующие значения
109 будут: 4, 6, 8, 12, 24, 48)
110
111 - Повторять до тех пор, пока не найдете оптимальное значение
112 (скорость перестала увеличиваться или нагрузка слишком
113 большая)
114
115
116
117
118
Дополнительные способы
119
120
Увеличить скорость миграции можно также отключив трэкинг времени
121 исполнения методов. Сделать это можно в конфиге в зукипере. Для
122 этого нужно найти InMigrationConfig.
123
124
Адрес конфига в zoonavigator-е
125 "/mybpm/configs/InMigrationConfig.txt"
126
127
В этом конфиге для параметра "trackTimings" нужно поставить
128 значение false. Это даст небольшой прирост скорости.
129
130
Дополнительная информация
131
132
Чтобы посмотреть среднюю скорость миграцию, нужно выполнить
133 SQL-команду:
134
135
SELECT (SUM(inserted_data_counter) / extract(epoch from
136 MAX(finished_at) - MIN(started_at))) as avg_speed FROM
137 in_migration.from_kafka_to_mongo_tracking WHERE started_at >=
138 <время начало миграции>;
139
140
Этот запрос вернет кол-во записей в секунду.
141
142
143
at kz.greetgo.md_reader.util.MdUtil.xmlTextToDoc(MdUtil.java:80)
at kz.greetgo.md_reader.core.MdConverter.prepareHtmlFileFrom(MdConverter.java:136)
at kz.greetgo.md_reader.core.MdConverter.convert(MdConverter.java:208)
at kz.greetgo.md_reader.controller.RenderController.downloadToc(RenderController.java:360)
at kz.greetgo.md_reader.controller.RenderController.request(RenderController.java:108)
at jdk.internal.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
at kz.greetgo.md_reader.interceptors.TextReplaceFilter.doFilter(TextReplaceFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:166)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.io.IOException: Server returned HTTP response code: 429 for URL: http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:2000)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1589)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:677)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1397)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1333)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.startPE(XMLDTDScannerImpl.java:732)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.skipSeparator(XMLDTDScannerImpl.java:2101)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.scanDecls(XMLDTDScannerImpl.java:2064)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.scanDTDExternalSubset(XMLDTDScannerImpl.java:299)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1165)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(XMLDocumentScannerImpl.java:1040)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:943)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:605)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:542)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:889)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:825)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at java.xml/com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:247)
at java.xml/com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:342)
at java.xml/javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:122)
at kz.greetgo.md_reader.util.MdUtil.xmlTextToDoc(MdUtil.java:71)
... 48 more