010
1) Установка и настройка платформы MyBPM
011
012
Перед установкой платформы MyBPM необходимо выбрать топологию
013 среды, где будет устанавливаться платформа. Топология определяется
014 следующими факторами:
015
016
017 - Степень отказоустойчивости (как часто система находиться в
018 рабочем состоянии и долго ли сбоит);
019
020 - Производительные ресурсы (количество серверов, их мощность,
021 наличие RAID-массивов).
022
023 - Степень безопасности хранения данных (нужно ли данные шифровать
024 или достаточно только шифровать передачу данных)
025
026
027
1.1) Степень отказоустойчивости
028
029
Степень отказоустойчивости определяется формулой, которая
030 называется формулой отказоустойчивости на систему.
031
032
Формула отказоустойчивости на систему состоит из трёх индексов:
033 D, H и А разделённых дефисом.
034
035
Индекс D определяет в какие дни недели необходимо обеспечить
036 функционирование системы, и может иметь следующие значения:
037
038
039 - D7 - Постоянная работа, т.е. 7 дней в неделю.
040
041 - D5 - Рабочие дни с понедельника по пятницу.
042
043
044
Индекс H определяет в какие часы дня необходимо обеспечить
045 работу системы, и может иметь следующие значения:
046
047
048 - H24 - Система работает полные сутки - 24 часа
049
050 - H8 - Система работает в рабочее время, с 9:00 до 18:00
051
052
053
Индекс А определяет частоту простоев, и может иметь следующие
054 значения:
055
056
057 - A0 - Обеспечена работа без простоев (но ошибки
058 возможны)
059
060 - A5 - С вероятными простоями не больше 5
061 часов
062
063 - A24 - С вероятными простоями не больше
064 суток
065
066
067
Например, индекс отказоустойчивости W5-D8-A5 обозначает работу
068 системы в рабочее время с 9 до 18 с возможными простоями не больше
069 нескольких часов.
070
071
Самый жёсткий индекс: D7-H24-A0 - 24/7 без простоев. Самый
072 лёгкий индекс: D5-H8-A24 - рабочие дни в рабочее время с
073 возможностью простоя до суток.
074
075
1.2) Производительные ресурсы
076
077
Производительные ресурсы зависят:
078
079
1) от количества пользователей системы; 2) от количества данных
080 в системе; 3) от количества процессов работающих одновременно; 4)
081 от индекса А в формуле отказоустойчивости.
082
083
1.3) Степень безопасности хранения данных
084
085
Есть две степени безопасности хранение данных:
086
087
1) Хранение на диске в открытом виде; 2) Шифрование диска.
088
089
1.4) Топология
090
091
1.4.1) Общие сведения о компонентах
092
093
Топология выбирается в зависимости от производительных ресурсов,
094 индекса А в степени устойчивости и степени безопасности хранения
095 данных.
096
097
Платформа включает в себя следующие компоненты:
098
099
1) MyBPM Web 2) MyBPM API 3) Apache Kafka 4) Apache Zookeeper 5)
100 MongoDB 6) ElasticSearch 7) PostgreSQL
101
102
Пользователи с помощью браузера подключаются к компоненту MyBPM
103 Web (или просто Web-компонент), который отображает пользователю
104 графический интерфейс посредством динамического HTML и JavaScript.
105 Web-компонент в свою очередь обращается к компоненту MyBPM API (или
106 просто API-компонент). API-компонент представляет собой
107 state-less-приложение на основе Boot Spring Framework. Он в свою
108 очередь обращается одновременно к первым пяти компонентам.
109
110
Компонент Apache Kafka (или просто кафка) используется для
111 хранения истории изменений в системе и как брокер сообщений.
112
113
Компонент Apache Zookeeper (или просто зукипер) используется для
114 хранения конфигурации системы и для синхронизации данных в
115 Кафке.
116
117
Компонент MongoDB (или просто монго) используется для хранения
118 оперативных данных, структуры данных и реализации некоторых
119 вспомогательных механизмов.
120
121
Компонент ElasticSearch (или просто эластик) используется для
122 поиска данных.
123
124
Компонент PostgreSQL (или просто постгрес) используется для
125 реализации различных вспомогательных механизмов.
126
127
1.4.2) Топология и установка зукипера и кафки
128
129
Имеются топологии зукипера:
130
131
1) Zoo1 - одна инстанция зукипера (см. Установка Zookeeper с
133 топологией Zoo1); 2) Zoo3 - три инстанции зукипера как один
134 кластер (см. Установка
135 Zookeeper с топологией Zoo3).
136
137
Имеются топологии кафки:
138
139
1) Kafka1-F1 - одна инстанция с фактором репликации один (см. Установка Kafka по
141 топологии Kafka1-F1); 2) Kafka3-F2 - три инстанции как один
142 кластер с фактором репликации два (см. Установка Kafka по
144 топологии Kafka3-F2).
145
146
1.4.3) Топология и установка монги
147
148
Имеются топологии монги:
149
150
1) Mongo1-RS1 - одна инстанция как одна группа репликации rs1
151 (см. Установка монги по
152 топологии Mongo1-RS1) 2) Mongo3-RS1 - три инстанции как одна
153 группа репликации rs1 (см. Установка монги по топологии
155 Mongo3-RS1).
156
157
1.4.4) Топология и установка эластика
158
159
Имеются топологии эластика:
160
161
1) Elastic1-F1 - одна инстанция с фактором репликации один Установка эластика по
163 топологии Elastic1-F1; 2) Elastic3-F2 - три инстанции как один
164 кластер с фактором репликации два Установка эластика по
166 топологии Elastic3-F2
167
168
1.4.4) Топология и установка постгреса
169
170
Имеются топологии постгреса:
171
172
1) PG1 - один сервер без репликации; 2) PG1-R1-MAN - один
173 сервер-мастер и один сервер репликации с ручной активацией реплики;
174 3) PG1-R2-AUTO - один сервер-мастер и два сервера репликации с
175 автоматической активацией реплики как мастера.
176
177
1.5) Топология и установка MyBPM API и
178 Web
179
180
MyBPM API можно запускать в трёх режимах:
181
182
1) MyBPM-API-Consumer-mix - смешанный режим - он обрабатывает
183 API-запросы и сообщения кафки. 2) MyBPM-API-сервиса - он отвечает
184 за обработку API-запросов как со стороны MyBPM-Web так и сторонними
185 системами; 3) MyBPM-Consumer-обработчик - он отвечает за обработку
186 сообщений от кафки;
187
188
MyBPM-API-Consumer-mix обозначается буквой M MyBPM-API-сервис
189 обозначается буквой A MyBPM-Consumer-обработчик обозначается буквой
190 C
191
192
Формула топологии API и Web состоит из нескольких частей
193 разделённых дефисом:
194
195
196 [Основа]:MN-AN-CN-WN
197
198
199
200
201
202
Где N - это число от 0 и больше. Букву с нулём можно не писать,
203 а можно писать. W - с нулём не бывает
204
205
[Основа] - это применяемая виртуализация. Может принимать одно
206 из двух значений:
207
208
1) Do - Docker - приложение запускается на docker с
209 использованием docker-compose; 2) Ku - Kubernetes - приложение
210 запускается в кластере Kubernetes.
211
212
Например, формула: Do:M1-W1 - обозначает, что система поднимает
213 одну инстанцию в смешанном режиме (MyBPM-API-Consumer-mix) с
214 помощью docker-compose на докере.
215
216
Например, формула: Ku:A2-C3-W2 - обозначает, что система
217 разворачивается в кластере Kubernetes и запускает два
218 MyBPM-API-инстанции, три обработчика сообщений кафки
219 (MyBPM-Consumer) и два веб-модуля MyBPM Web.
220
221
1.5) Выбор топологии по предоставленным
222 серверам.
223
224
Платформу можно установить на следующих вариантах наборов
225 серверов:
226
227
Вариант 1
228
229
Один сервер:
230
231
232 - CPU: 8 ядер Core i7+
233
234 - RAM: 32GB
235
236 - HDD: 500GB
237
238
239
Тут нужно выбирать формулу платформы: Do:M1-W1 (Zoo1, Kafka1-F1,
240 Mongo1-RS1, Elastic1-F1, PG1) Степень отказоустойчивости: от
241 D5-H8-A24 до D7-H24-A5. Индекс A0 на одном сервере невозможен.
242
243
Вариант 2
244
245
Три сервера. Каждый минимум
246
247
248 - CPU: 8 ядер Core i7+
249
250 - RAM: 32GB
251
252 - HDD: 500GB
253
254
255
Тут нужно выбирать формулу платформы:
256
257
258 Ku:M3-W2 (Zoo3, Kafka3-F2, Mongo3-RS1, Elastic3-F2, PG1-R1-MAN или PG1-R2-AUTO)
259
260
261
262
263
264
Степень отказоустойчивости:
265
266
267 - D5-H8-A24 - (PG1-R1-MAN)
268
269 - D7-H24-A0 - данная степень дороже (PG1-R2-AUTO)
270
271
272
Вариант 3
273
274
Три сервера для Zookeeper и Kafka
275
276
277 - CPU: 8 ядер Core i7+
278
279 - RAM: 16GB
280
281 - HDD: 500GB
282
283
284
Три сервера для MongoDB
285
286
287 - CPU: 8 ядер Core i7+
288
289 - RAM: 16GB
290
291 - HDD: 500GB
292
293
294
Три сервера для ElasticSearch
295
296
297 - CPU: 8 ядер Core i7+
298
299 - RAM: 16GB
300
301 - HDD: 500GB
302
303
304
Четыре сервера для PostgreSQL и MyBPM API и Web
305
306
307 - CPU: 4 ядер Core i7+
308
309 - RAM: 16GB
310
311 - HDD: 500GB
312
313
314
Тут выбирается формула платформы:
315
316
317 Ku:M3-W2 (Zoo3, Kafka3-F2, Mongo3-RS1, Elastic3-F2, PG1-R2-AUTO)
318
319
320
321
322
323
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