Kibana: Kibana остается только для чтения, когда водяной знак высокого уровня ES был превышен, а затем опустился ниже предела

Созданный на 24 авг. 2017  ·  22Комментарии  ·  Источник: elastic/kibana

Версия Kibana : 6.0.0-beta1

Версия Elasticsearch : 6.0.0-beta1

Версия ОС сервера : Ubuntu 16.04.2 LTS

Версия браузера : Chrome 60.0.3112.90

Версия ОС браузера : Windows 10

Исходный метод установки (например, страница загрузки, yum, из источника и т. Д.) : Официальные пакеты tar.gz

Описание проблемы, включая ожидаемое и фактическое поведение :

Я использую экземпляр Elasticsearch с одним узлом, logstash и Kibana. Все работает на одном хосте в отдельных контейнерах докеров.

Если верхний водяной знак диска превышен на хосте ES, в журнале elasticsearch регистрируется следующее:

[2017-08-24T07:45:11,757][INFO ][o.e.c.r.a.DiskThresholdMonitor] [CSOifAr] rerouting shards: [high disk watermark exceeded on one or more nodes]
[2017-08-24T07:45:41,760][WARN ][o.e.c.r.a.DiskThresholdMonitor] [CSOifAr] flood stage disk watermark [95%] exceeded on [CSOifArqQK-7PBZM_keNoA][CSOifAr][/data/elasticsearch/nodes/0] free: 693.8mb[2.1%], all indice
s on this node will marked read-only

Когда это произойдет, изменения в индексе .kibana , конечно же, не будут выполнены, поскольку в индекс нельзя записать. Это можно увидеть, пытаясь изменить любой параметр в _Management _-> _ Advanced Settings_, где изменение, например, _ search: queryLanguage_ завершается ошибкой с сообщением Config: Error 403 Forbidden: blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];

index_read_only

Если теперь доступно больше дискового пространства, ES будет регистрировать, что узел перешел под высокий уровень:

[2017-08-24T07:47:11,774][INFO ][o.e.c.r.a.DiskThresholdMonitor] [CSOifAr] rerouting shards: [one or more nodes has gone under the high or low watermark]

Теперь можно было бы предположить, что можно было бы внести изменения в настройки Kibana, но попытка изменить настройки по-прежнему терпит неудачу с сообщением об ошибке:

Config: Error 403 Forbidden: blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];

Шаги по воспроизведению :

  1. Убедитесь, что изменения настроек могут быть выполнены без ошибок.
  2. Заполните диск данных elasticsearch так, чтобы верхний водяной знак диска был превышен (я использовал fallocate -l9G largefile )
  3. Проверьте в журнале ES, что верхний водяной знак диска был превышен и индексы были помечены как доступные только для чтения
  4. Выполните изменение настроек и убедитесь, что это не удается, поскольку запись запрещена.
  5. Устраните проблему высокого уровня водяного знака на диске (что я сделал с помощью rm largefile )
  6. Убедитесь, что в журнале ES указано, что узел перешел под высокий водяной знак диска (и, следовательно, должна быть возможна запись?)
  7. Выполните изменение настроек, и оно не удастся, хотя на самом деле должно быть успешным.
Pioneer Program Operations

Самый полезный комментарий

Меня это только что ударило. Это не только Kibana, все индексы блокируются при достижении порога диска и никогда не разблокируются при освобождении места.

Чтобы разблокировать все индексы вручную:

curl -XPUT -H "Content-Type: application/json" https://[YOUR_ELASTICSEARCH_ENDPOINT]:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

Все 22 Комментарий

Итак, как мне оправиться от этого? .kibana остается доступным только для чтения, что бы я ни делал. Я попытался сделать снимок, удалить его и восстановить из снимка - все еще только для чтения ...

Я только что столкнулся с этим на тестовой машине. Да здравствует меня, я не могу продолжать помещать данные в кластер. В конце концов мне пришлось отбросить все задействованные индексы.

Я решил проблему, удалив индекс .kibana:
удалить /.kibana/
Я теряю определенные конфигурации / визуализации / информационные панели, но он отключен.

Меня это только что ударило. Это не только Kibana, все индексы блокируются при достижении порога диска и никогда не разблокируются при освобождении места.

Чтобы разблокировать все индексы вручную:

curl -XPUT -H "Content-Type: application/json" https://[YOUR_ELASTICSEARCH_ENDPOINT]:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

Спасибо @xose , меня снова это ударило, и я смог восстановиться с помощью предложенной вами команды :)

Проблема возникла во всех индексах, а не только в одном .kibana .

Согласно журналам ES, индексы были настроены только для чтения из-за нехватки дискового пространства на хосте elasticsearch. Я запускаю один хост с Elasticsearch, Kibana, Logstash, dockerized вместе с некоторыми другими инструментами. Поскольку эта проблема влияет на другие индексы, мы думаем, что это скорее проблема Elasticsearch, и что проблема, наблюдаемая в Kibana, является симптомом другой проблемы.

Это глупый баг. Можете ли вы пока его разблокировать? По крайней мере, вы должны отобразить предупреждение и указать возможное решение. Для меня действительно глупо заглядывать в журнал ошибок js и находить эту ветку!

@saberkun Вы можете разблокировать его, выполнив команду @xose :

curl -XPUT -H "Content-Type: application/json" https://[YOUR_ELASTICSEARCH_ENDPOINT]:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

Да.

В воскресенье, 26 ноября 2017 г., в 23:12 Аарон К. де Брюн [email protected]
написал:

@saberkun https://github.com/saberkun Вы можете разблокировать его, следуя
команда @xose https://github.com/xose опубликовала:

curl -XPUT -H "Content-Type: application / json" https: // [YOUR_ELASTICSEARCH_ENDPOINT]: 9200 / _all / _settings -d '{"index.blocks.read_only_allow_delete": null}'

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/elastic/kibana/issues/13685#issuecomment-347074533 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AEpb5RJrhqJ8fK9wxGtNvTZtomMtlqzZks5s6jbBgaJpZM4PBHOW
.

Вы можете предоставить дополнительную информацию? Вы получали ошибку при запуске команды? Индексы разблокированы, и теперь вы получаете новое сообщение об ошибке? Какие сообщения об ошибках вы видите сейчас в файлах журнала?

Спасибо. Это фиксируется командой. То есть да, я использовал его, чтобы исправить
проблема

В воскресенье, 26 ноября 2017 г., в 23:19 Аарон де Брюн [email protected]
написал:

Вы можете предоставить дополнительную информацию? Вы получали сообщение об ошибке, когда
выполняете команду? Разблокированы ли индексы, и теперь вы получаете новый
сообщение об ошибке? Какие сообщения об ошибках вы видите сейчас в файлах журнала?

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/elastic/kibana/issues/13685#issuecomment-347075205 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AEpb5Xn5uJBlzvAyXkAjRPom-OiwJ43Gks5s6jg0gaJpZM4PBHOW
.

+1
Получение этой ошибки после обновления с 5.5 до 6.0

+1

ELK 6, очищенная половина диска по-прежнему доступна только для чтения, в logstash разрешена запись снова, кибана остается доступной только для чтения

Удалось решить проблему с помощью обходного пути, предоставленного

+1, такая же ошибка у меня.

То же самое для меня. Решено решением, предоставленным @xose.

То же самое. Приветствую @xose.

Я только что обновил одноузловой кластер с 6.0.0 до 6.1.1 (как ES, так и Kibana). Когда я запустил резервное копирование сервисов, Кибана подбрасывал:

blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];

Как и в прошлый раз - мне пришлось удалить индекс .kibana чтобы он снова заработал. Также был текущий индекс logstash, в котором один из сегментов был указан как нераспределенный. Я тоже удалил его, а затем получил обычный поток предупреждений.

У меня не закончилось место - на этой тестовой машине ~ 92 ГБ из 120 ГБ свободного места. Место хранения - ZFS, и скраб не выявил повреждения данных.

Единственные ошибки в журнале кажутся несущественными:

[2018-01-13T20:48:14,579][INFO ][o.e.n.Node               ] [ripley1] stopping ...
[2018-01-13T20:48:14,597][ERROR][i.n.u.c.D.rejectedExecution] Failed to submit a listener notification task. Event loop shut down?
java.util.concurrent.RejectedExecutionException: event executor terminated
        at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:821) ~[netty-common-4.1.13.Final.jar:4.1.13.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:327) ~[netty-common-4.1.13.Final.jar:4.1.13.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:320) ~[netty-common-4.1.13.Final.jar:4.1.13.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:746) ~[netty-common-4.1.13.Final.jar:4.1.13.Final]
        at io.netty.util.concurrent.DefaultPromise.safeExecute(DefaultPromise.java:760) [netty-common-4.1.13.Final.jar:4.1.13.Final]
        at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:428) [netty-common-4.1.13.Final.jar:4.1.13.Final]
        at io.netty.util.concurrent.DefaultPromise.setFailure(DefaultPromise.java:113) [netty-common-4.1.13.Final.jar:4.1.13.Final]
        at io.netty.channel.DefaultChannelPromise.setFailure(DefaultChannelPromise.java:87) [netty-transport-4.1.13.Final.jar:4.1.13.Final]
        at io.netty.channel.AbstractChannelHandlerContext.safeExecute(AbstractChannelHandlerContext.java:1010) [netty-transport-4.1.13.Final.jar:4.1.13.Final]
        at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:825) [netty-transport-4.1.13.Final.jar:4.1.13.Final]
        at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:794) [netty-transport-4.1.13.Final.jar:4.1.13.Final]
        at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:1027) [netty-transport-4.1.13.Final.jar:4.1.13.Final]
        at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:301) [netty-transport-4.1.13.Final.jar:4.1.13.Final]
        at org.elasticsearch.http.netty4.Netty4HttpChannel.sendResponse(Netty4HttpChannel.java:146) [transport-netty4-6.0.0.jar:6.0.0]
        at org.elasticsearch.rest.RestController$ResourceHandlingHttpChannel.sendResponse(RestController.java:491) [elasticsearch-6.0.0.jar:6.0.0]
        at org.elasticsearch.rest.action.RestResponseListener.processResponse(RestResponseListener.java:37) [elasticsearch-6.0.0.jar:6.0.0]
        at org.elasticsearch.rest.action.RestActionListener.onResponse(RestActionListener.java:47) [elasticsearch-6.0.0.jar:6.0.0]
        at org.elasticsearch.action.support.TransportAction$1.onResponse(TransportAction.java:85) [elasticsearch-6.0.0.jar:6.0.0]
        at org.elasticsearch.action.support.TransportAction$1.onResponse(TransportAction.java:81) [elasticsearch-6.0.0.jar:6.0.0]
        at org.elasticsearch.action.bulk.TransportBulkAction$BulkOperation$1.finishHim(TransportBulkAction.java:380) [elasticsearch-6.0.0.jar:6.0.0]
        at org.elasticsearch.action.bulk.TransportBulkAction$BulkOperation$1.onFailure(TransportBulkAction.java:375) [elasticsearch-6.0.0.jar:6.0.0]
        at org.elasticsearch.action.support.TransportAction$1.onFailure(TransportAction.java:91) [elasticsearch-6.0.0.jar:6.0.0]
        at org.elasticsearch.action.support.replication.TransportReplicationAction$ReroutePhase.finishAsFailed(TransportReplicationAction.java:908) [elasticsearch-6.0.0.jar:6.0.0]
        at org.elasticsearch.action.support.replication.TransportReplicationAction$ReroutePhase$2.onClusterServiceClose(TransportReplicationAction.java:891) [elasticsearch-6.0.0.jar:6.0.0]
        at org.elasticsearch.cluster.ClusterStateObserver$ContextPreservingListener.onClusterServiceClose(ClusterStateObserver.java:310) [elasticsearch-6.0.0.jar:6.0.0]
        at org.elasticsearch.cluster.ClusterStateObserver$ObserverClusterStateListener.onClose(ClusterStateObserver.java:230) [elasticsearch-6.0.0.jar:6.0.0]
        at org.elasticsearch.cluster.service.ClusterApplierService.doStop(ClusterApplierService.java:168) [elasticsearch-6.0.0.jar:6.0.0]
        at org.elasticsearch.common.component.AbstractLifecycleComponent.stop(AbstractLifecycleComponent.java:85) [elasticsearch-6.0.0.jar:6.0.0]
        at org.elasticsearch.cluster.service.ClusterService.doStop(ClusterService.java:106) [elasticsearch-6.0.0.jar:6.0.0]
        at org.elasticsearch.common.component.AbstractLifecycleComponent.stop(AbstractLifecycleComponent.java:85) [elasticsearch-6.0.0.jar:6.0.0]
        at org.elasticsearch.node.Node.stop(Node.java:713) [elasticsearch-6.0.0.jar:6.0.0]
        at org.elasticsearch.node.Node.close(Node.java:735) [elasticsearch-6.0.0.jar:6.0.0]
        at org.apache.lucene.util.IOUtils.close(IOUtils.java:89) [lucene-core-7.0.1.jar:7.0.1 8d6c3889aa543954424d8ac1dbb3f03bf207140b - sarowe - 2017-10-02 14:36:35]
        at org.apache.lucene.util.IOUtils.close(IOUtils.java:76) [lucene-core-7.0.1.jar:7.0.1 8d6c3889aa543954424d8ac1dbb3f03bf207140b - sarowe - 2017-10-02 14:36:35]
        at org.elasticsearch.bootstrap.Bootstrap$4.run(Bootstrap.java:185) [elasticsearch-6.0.0.jar:6.0.0]
[2018-01-13T20:48:14,692][INFO ][o.e.n.Node               ] [ripley1] stopped
[2018-01-13T20:48:14,692][INFO ][o.e.n.Node               ] [ripley1] closing ...
[2018-01-13T20:48:14,704][INFO ][o.e.n.Node               ] [ripley1] closed
[2018-01-13T20:48:39,879][INFO ][o.e.n.Node               ] [ripley1] initializing ...
[2018-01-13T20:48:40,054][INFO ][o.e.e.NodeEnvironment    ] [ripley1] using [1] data paths, mounts [[/scratch/elasticsearch (scratch/elasticsearch)]], net usable_space [92.5gb], net total_space [93.6gb], types [zfs]
[2018-01-13T20:48:40,055][INFO ][o.e.e.NodeEnvironment    ] [ripley1] heap size [989.8mb], compressed ordinary object pointers [true]
[2018-01-13T20:48:40,119][INFO ][o.e.n.Node               ] [ripley1] node name [ripley1], node ID [TvkaGbQpR5KZ-ZScMZN6AQ]
[2018-01-13T20:48:40,119][INFO ][o.e.n.Node               ] [ripley1] version[6.1.1], pid[6942], build[bd92e7f/2017-12-17T20:23:25.338Z], OS[Linux/4.10.0-38-generic/amd64], JVM[Oracle Corporation/OpenJDK 64-Bit Server VM/1.8.0_151/25.151-b12]
[2018-01-13T20:48:40,120][INFO ][o.e.n.Node               ] [ripley1] JVM arguments [-Xms1g, -Xmx1g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -XX:-OmitStackTraceInFastThrow, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -XX:+HeapDumpOnOutOfMemoryError, -XX:HeapDumpPath=/var/lib/elasticsearch, -Des.path.home=/usr/share/elasticsearch, -Des.path.conf=/etc/elasticsearch]
[2018-01-13T20:48:41,315][INFO ][o.e.p.PluginsService     ] [ripley1] loaded module [aggs-matrix-stats]
[2018-01-13T20:48:41,315][INFO ][o.e.p.PluginsService     ] [ripley1] loaded module [analysis-common]
[2018-01-13T20:48:41,315][INFO ][o.e.p.PluginsService     ] [ripley1] loaded module [ingest-common]
[2018-01-13T20:48:41,315][INFO ][o.e.p.PluginsService     ] [ripley1] loaded module [lang-expression]
[2018-01-13T20:48:41,315][INFO ][o.e.p.PluginsService     ] [ripley1] loaded module [lang-mustache]
[2018-01-13T20:48:41,315][INFO ][o.e.p.PluginsService     ] [ripley1] loaded module [lang-painless]
[2018-01-13T20:48:41,315][INFO ][o.e.p.PluginsService     ] [ripley1] loaded module [mapper-extras]
[2018-01-13T20:48:41,315][INFO ][o.e.p.PluginsService     ] [ripley1] loaded module [parent-join]
[2018-01-13T20:48:41,320][INFO ][o.e.p.PluginsService     ] [ripley1] loaded module [percolator]
[2018-01-13T20:48:41,320][INFO ][o.e.p.PluginsService     ] [ripley1] loaded module [reindex]
[2018-01-13T20:48:41,320][INFO ][o.e.p.PluginsService     ] [ripley1] loaded module [repository-url]
[2018-01-13T20:48:41,320][INFO ][o.e.p.PluginsService     ] [ripley1] loaded module [transport-netty4]
[2018-01-13T20:48:41,320][INFO ][o.e.p.PluginsService     ] [ripley1] loaded module [tribe]
[2018-01-13T20:48:41,321][INFO ][o.e.p.PluginsService     ] [ripley1] no plugins loaded
[2018-01-13T20:48:43,801][INFO ][o.e.d.DiscoveryModule    ] [ripley1] using discovery type [zen]
[2018-01-13T20:48:44,587][INFO ][o.e.n.Node               ] [ripley1] initialized
[2018-01-13T20:48:44,587][INFO ][o.e.n.Node               ] [ripley1] starting ...
[2018-01-13T20:48:44,587][INFO ][o.e.n.Node               ] [ripley1] starting ...
[2018-01-13T20:48:44,759][INFO ][o.e.t.TransportService   ] [ripley1] publish_address {192.168.42.40:9300}, bound_addresses {[::]:9300}
[2018-01-13T20:48:44,792][INFO ][o.e.b.BootstrapChecks    ] [ripley1] bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks
[2018-01-13T20:48:47,864][INFO ][o.e.c.s.MasterService    ] [ripley1] zen-disco-elected-as-master ([0] nodes joined), reason: new_master {ripley1}{TvkaGbQpR5KZ-ZScMZN6AQ}{H39AkwwqS_i-fg3Gl5J8QQ}{192.168.42.40}{192.168.42.40:9300}
[2018-01-13T20:48:47,869][INFO ][o.e.c.s.ClusterApplierService] [ripley1] new_master {ripley1}{TvkaGbQpR5KZ-ZScMZN6AQ}{H39AkwwqS_i-fg3Gl5J8QQ}{192.168.42.40}{192.168.42.40:9300}, reason: apply cluster state (from master [master {ripley1}{TvkaGbQpR5KZ-ZScMZN6AQ}{H39AkwwqS_i-fg3Gl5J8QQ}{192.168.42.40}{192.168.42.40:9300} committed version [1] source [zen-disco-elected-as-master ([0] nodes joined)]])
[2018-01-13T20:48:47,884][INFO ][o.e.h.n.Netty4HttpServerTransport] [ripley1] publish_address {192.168.42.40:9200}, bound_addresses {[::]:9200}
[2018-01-13T20:48:47,884][INFO ][o.e.n.Node               ] [ripley1] started
[2018-01-13T20:48:48,326][INFO ][o.e.g.GatewayService     ] [ripley1] recovered [6] indices into cluster_state
[2018-01-13T20:49:01,493][INFO ][o.e.c.m.MetaDataDeleteIndexService] [ripley1] [logstash-2018.01.14/D0f_lDkSQpebPFcey6NHFw] deleting index
[2018-01-13T20:49:18,793][INFO ][o.e.c.m.MetaDataCreateIndexService] [ripley1] [logstash-2018.01.14] creating index, cause [auto(bulk api)], templates [logstash-*], shards [5]/[0], mappings []
[2018-01-13T20:49:18,937][INFO ][o.e.c.r.a.AllocationService] [ripley1] Cluster health status changed from [YELLOW] to [GREEN] (reason: [shards started [[logstash-2018.01.14][4]] ...]).

+1 такая же ошибка в 6.1.2

Это функция Elasticsearch. Согласно ошибке Elasticsearch, all indices on this node will marked read-only .

Чтобы отменить это для индекса, вы можете установить для index.blocks.read_only_allow_delete значение null.

Более подробную информацию об этом можно найти здесь: https://www.elastic.co/guide/en/elasticsearch/reference/current/disk-allocator.html.

К вашему сведению - для тех, кто все еще сталкивается с этим, вот быстрое однострочное исправление индексов:
curl -s -H "Content-Type: application/json" http://localhost:9200/_cat/indices | awk '{ print $3 }' | sort | xargs -L 1 -I{} curl -s -XPUT -H "Content-Type: application/json" http://localhost:9200/{}/_settings -d '{"index.blocks.read_only_allow_delete": null}'

Он получает список всех индексов в вашем кластере, а затем для каждого из них отправляет команду, чтобы сделать его не доступным только для чтения.

К вашему сведению - для тех, кто все еще сталкивается с этим, вот быстрое однострочное исправление индексов:
curl -s -H "Content-Type: application/json" http://localhost:9200/_cat/indices | awk '{ print $3 }' | sort | xargs -L 1 -I{} curl -s -XPUT -H "Content-Type: application/json" http://localhost:9200/{}/_settings -d '{"index.blocks.read_only_allow_delete": null}'

Он получает список всех индексов в вашем кластере, а затем для каждого из них отправляет команду, чтобы сделать его не доступным только для чтения.

Я тоже делал это, пока не нашел решение @darkpixel (https://github.com/elastic/kibana/issues/13685#issuecomment-347074533)

Вы можете сделать эту настройку для _all вместо того, чтобы переходить по одному. В моем случае это занимает довольно много времени для сотен индексов, тогда как установка «все» занимает всего несколько секунд.

curl -XPUT -H "Content-Type: application/json" https://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

Я решил проблему, удалив индекс .kibana:
удалить /.kibana/
Я теряю определенные конфигурации / визуализации / информационные панели, но он отключен.

Большое спасибо за это WA. Для меня это решенная проблема.

Это сработало для меня. Обе команды были необходимы для того, чтобы кабана заработала после новой установки:

curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_cluster/settings -d '{ "transient": { "cluster.routing.allocation.disk.threshold_enabled": false } }'
curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

Это не потребовало удаления индекса .kibana. Теперь работает отлично!

Источник:
https://selleo.com/til/posts/esrgfyxjee-how-to-fix-elasticsearch-forbidden12index-read-only

Была ли эта страница полезной?
0 / 5 - 0 рейтинги