Высокодоступная система ведения журналов Graylog (mongodb, elasticsearch) с двумя центрами обработки данных

Мне нужно настроить высокодоступный кластер Graylog2, который разделен на 2 центра обработки данных. если первый дата-центр полностью вышел из строя, второй должен продолжать работу и наоборот. (балансировщик нагрузки на переднем плане)

Например, в каждом центре обработки данных может быть 1 экземпляр elasticsearch, 1 экземпляр Graylog и 2 экземпляра mongodb. В итоге у меня есть 2 экземпляра elasticsearch, 2 Graylog и 4 экземпляра mongodb.

Как я прочитал из документации mongodb, мне нужно нечетное количество избирателей. Итак, предположим, что всего избирателей их 3. (у первого ЦОД 2, у второго 1)

В некоторых конфигурациях эластичный поиск работает должным образом. Но монгодб нет :(

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

Напоследок хочу поделиться своими конфигами. Примечание: в моей текущей конфигурации всего 2 mongodb.

Спасибо..

эластичный поиск 1-й:

  cluster.name: graylog
  node.name: graylog-1
  network.host: 0.0.0.0
  http.port: 9200
  discovery.zen.ping.multicast.enabled: false
  discovery.zen.ping.unicast.hosts: ["10.0.0.2"]
  discovery.zen.minimum_master_nodes: 1
  index.number_of_replicas: 2

эластичный поиск 2-й:

  cluster.name: graylog
  node.name: graylog-2
  network.host: 0.0.0.0
  http.port: 9200
  discovery.zen.ping.multicast.enabled: false
  discovery.zen.ping.unicast.hosts: ["10.0.0.1"]
  discovery.zen.minimum_master_nodes: 1

mongodb 1-й и 2-й (rs.conf()):

  {
        "_id" : "rs0",
        "version" : 4,
        "protocolVersion" : NumberLong(1),
        "members" : [
                {
                        "_id" : 0,
                        "host" : "10.0.0.1:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
                {
                        "_id" : 1,
                        "host" : "10.0.0.2:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                }
        ],
        "settings" : {
                "chainingAllowed" : true,
                "heartbeatIntervalMillis" : 2000,
                "heartbeatTimeoutSecs" : 10,
                "electionTimeoutMillis" : 10000,
                "getLastErrorModes" : {

                },
                "getLastErrorDefaults" : {
                        "w" : 1,
                        "wtimeout" : 0
                },
                "replicaSetId" : ObjectId("****")
        }
  }

серый журнал 1-й:

  is_master = true
  node_id_file = /etc/graylog/server/node-id
  password_secret = ***
  root_password_sha2 = ***
  plugin_dir = /usr/share/graylog-server/plugin
  rest_listen_uri = http://10.0.0.1:9000/api/
  web_listen_uri = http://10.0.0.1:9000/
  rotation_strategy = count
  elasticsearch_max_docs_per_index = 20000000
  rotation_strategy = count
  elasticsearch_max_docs_per_index = 20000000
  elasticsearch_max_number_of_indices = 20
  retention_strategy = delete
  elasticsearch_max_number_of_indices = 20
  retention_strategy = delete
  elasticsearch_shards = 2
  elasticsearch_replicas = 1
  elasticsearch_index_prefix = graylog
  allow_leading_wildcard_searches = false
  allow_highlighting = false
  elasticsearch_discovery_zen_ping_unicast_hosts = 10.0.0.1:9300, 10.0.0.2:9300
  elasticsearch_network_host = 0.0.0.0
  elasticsearch_analyzer = standard
  output_batch_size = 500
  output_flush_interval = 1
  output_fault_count_threshold = 5
  output_fault_penalty_seconds = 30
  processbuffer_processors = 5
  outputbuffer_processors = 3
  processor_wait_strategy = blocking
  ring_size = 65536
  inputbuffer_ring_size = 65536
  inputbuffer_processors = 2
  inputbuffer_wait_strategy = blocking
  message_journal_enabled = true
  message_journal_dir = /var/lib/graylog-server/journal
  lb_recognition_period_seconds = 3
  mongodb_uri = mongodb://10.0.0.1,10.0.0.2/graylog
  mongodb_max_connections = 1000
  mongodb_threads_allowed_to_block_multiplier = 5
  content_packs_dir = /usr/share/graylog-server/contentpacks
  content_packs_auto_load = grok-patterns.json
  proxied_requests_thread_pool_size = 32

серый журнал 2-й:

  is_master = false
  node_id_file = /etc/graylog/server/node-id
  password_secret = ***
  root_password_sha2 = ***
  plugin_dir = /usr/share/graylog-server/plugin
  rest_listen_uri = http://10.0.0.2:9000/api/
  web_listen_uri = http://10.0.0.2:9000/
  rotation_strategy = count
  elasticsearch_max_docs_per_index = 20000000
  rotation_strategy = count
  elasticsearch_max_docs_per_index = 20000000
  elasticsearch_max_number_of_indices = 20
  retention_strategy = delete
  elasticsearch_max_number_of_indices = 20
  retention_strategy = delete
  elasticsearch_shards = 2
  elasticsearch_replicas = 1
  elasticsearch_index_prefix = graylog
  allow_leading_wildcard_searches = false
  allow_highlighting = false
  elasticsearch_discovery_zen_ping_unicast_hosts = 10.0.0.1:9300, 10.0.0.2:9300
  elasticsearch_transport_tcp_port = 9350
  elasticsearch_network_host = 0.0.0.0
  elasticsearch_analyzer = standard
  output_batch_size = 500
  output_flush_interval = 1
  output_fault_count_threshold = 5
  output_fault_penalty_seconds = 30
  processbuffer_processors = 5
  outputbuffer_processors = 3
  processor_wait_strategy = blocking
  ring_size = 65536
  inputbuffer_ring_size = 65536
  inputbuffer_processors = 2
  inputbuffer_wait_strategy = blocking
  message_journal_enabled = true
  message_journal_dir = /var/lib/graylog-server/journal
  lb_recognition_period_seconds = 3
  mongodb_uri = mongodb://10.0.0.1,10.0.0.2/graylog
  mongodb_max_connections = 1000
  mongodb_threads_allowed_to_block_multiplier = 5
  content_packs_dir = /usr/share/graylog-server/contentpacks
  content_packs_auto_load = grok-patterns.json
  proxied_requests_thread_pool_size = 32

person Fethi    schedule 13.12.2016    source источник


Ответы (1)


В ваших конфигурационных файлах много неправильных представлений.

Например, в вашей конфигурации Elasticsearch вы написали:

discovery.zen.minimum_master_nodes: 2

Как это сработает, если один из двух узлов ES выйдет из строя?

И в вашей конфигурации Graylog вы написали:

elasticsearch_shards = 2
elasticsearch_replicas = 1

Как это сработает, если один из двух узлов ES выйдет из строя?

Краткий ответ: непросто создать высокодоступный кластер с автономными частями в двух разных центрах обработки данных (через глобальную сеть).

Я бы рекомендовал прибегнуть к другой архитектуре, например. грамм. используя RabbitMQ или Apache Kafka для буферизации сообщений журнала и позволяя Graylog (работающему в 1 центре обработки данных) извлекать сообщения оттуда.

person joschi    schedule 13.12.2016
comment
Спасибо за ответ. В то же время я обновил конфигурацию эластичного поиска выше. Теперь эластичный поиск работает должным образом. Но с возможностью разделения мозга, верно? но все же проблема с mongo db. Я понимаю вашу точку зрения, но это не дает нам полностью работающую систему, когда datacenter1 не работает? - person Fethi; 13.12.2016
comment
Я не менял настройки осколка и реплики elasticsearch, но кажется, что первичные осколки на первой машине, а вторичные содержат только реплики (и, как я знаю, они меняются при включении-выключении) какие идеальные значения в этом случае вы предлагаете ? Спасибо - person Fethi; 13.12.2016
comment
Определить полностью работающую систему. С данной настройкой у вас все равно не будет работающей системы, если один дата-центр выйдет из строя. - person joschi; 13.12.2016