AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 305514
Accepted
Mickael
Mickael
Asked: 2022-01-01 08:06:52 +0800 CST2022-01-01 08:06:52 +0800 CST 2022-01-01 08:06:52 +0800 CST

MongoDB: Como converter um autônomo em um conjunto de réplicas

  • 772

Sou novo no MongoDB e estou procurando por várias horas como promover minha instância autônoma do mongo em um replicaset. Meu ambiente real é um servidor ubuntu

root@UMONGO1:/home/msc# lsb_release -a

Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal

executando uma instância autônoma do mongodb localmente na porta 27017:

root@UMONGO1:/var/lib# systemctl status mongod
● mongod.service - MongoDB Database Server
     Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-01-01 15:46:52 CET; 10min ago
       Docs: https://docs.mongodb.org/manual
   Main PID: 964 (mongod)
     Memory: 222.6M
     CGroup: /system.slice/mongod.service
             └─964 /usr/bin/mongod --config /etc/mongod.conf



# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
#  engine:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1


# how the process runs
processManagement:
  timeZoneInfo: /usr/share/zoneinfo

#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:

Importei um banco de dados daqui O objetivo é criar mais dois servidores e replicar os dbs neles.

Referindo-se à documentação:

Converter um Standalone em um Conjunto de Réplicas Estou confuso sobre os dois parâmetros --port e --dbpath que preciso usar. Se eu quiser promover minha instância real, devo usar o caminho e a porta do banco de dados existente, certo? Mas o que quer que eu esteja tentando é um fracasso.

Usando outra porta:

mongod --port 27017 --dbpath /var/lib/mongodb/ --replSet rs0

"ctx":"initandlisten","msg":"Error setting up listener","attr":{"error":{"code":9001,"codeName":"SocketException","errmsg":"Address already in use"}}}

mongod --port 27018 --dbpath /var/lib/mongodb/ --replSet rs0

BException in initAndListen, terminating","attr":{"error":"DBPathInUse: Unable to lock the lock file: /var/lib/mongodb/mongod.lock (Resource temporarily unavailable). Another mongod instance is already running on the /var/lib/mongodb/ directory"}}

Usando um novo diretório:

mongod --port 27017 --dbpath /media/msc/MONGO/rs/ --replSet rs0

"replication":{"replSet":"rs0"},"storage":{"dbPath":"/media/msc/MONGO/rs/"}}}}
{"t":{"$date":"2021-12-31T16:55:28.885+01:00"},"s":"E",  "c":"CONTROL",  "id":20568,   "ctx":"initandlisten","msg":"Error setting up listener","attr":{"error":{"code":9001,"codeName":"SocketException","errmsg":"Address already in use"}}}

mongod --port 27018 --dbpath /media/msc/MONGO/rs/ --replSet rs0

{"t":{"$date":"2021-12-31T16:57:11.762+01:00"},"s":"I",  "c":"-",        "id":4939300, "ctx":"monitoring-keys-for-HMAC","msg":"Failed to refresh key cache","attr":{"error":"NotYetInitialized: Cannot use non-local read concern until replica set is finished initializing.","nextWakeupMillis":2000}}

e esta espera "nextWakeupMillis" nunca para.

Você pode fornecer ajuda sobre qual é a configuração correta e qual é o problema?

****************** EDIT: 01/03/2022 ******************

Agora posso promover minha instância usando:

mongod --port 27017 --dbpath /var/lib/mongodb/ --replSet rs0

e, em seguida, abrir um novo shell e enviar

rs.initiate()

Mas por que o serviço não inicia com essa nova configuração?

● mongod.service - MongoDB Database Server
     Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Mon 2022-01-03 11:39:51 CET; 1min 12s ago
       Docs: https://docs.mongodb.org/manual
    Process: 904 ExecStart=/usr/bin/mongod --config /etc/mongod.conf (code=exited, status=14)
   Main PID: 904 (code=exited, status=14)

janv. 03 11:39:35 UMONGO1 systemd[1]: Started MongoDB Database Server.
janv. 03 11:39:51 UMONGO1 systemd[1]: mongod.service: Main process exited, code=exited, status=14/n/a
janv. 03 11:39:51 UMONGO1 systemd[1]: mongod.service: Failed with result 'exit-code'.

Além disso, se eu reiniciar o servidor, tenho que repetir essas ações. Existe alguma maneira de corrigir a configuração e iniciar o serviço mongod?

mongodb replication
  • 4 4 respostas
  • 2544 Views

4 respostas

  • Voted
  1. Wernfried Domscheit
    2022-01-04T06:34:42+08:002022-01-04T06:34:42+08:00

    Para iniciantes, muitas vezes é confuso quando a documentação do MongoDB não enfatiza claramente as configurações do arquivo de configuração e as opções de linha de comando.

    Quando você executa o MongoDB como serviço, deve editar seu arquivo de configuração /etc/mongod.confassim

    # mongod.conf
    
    # Where and how to store data.
    storage:
      dbPath: /var/lib/mongodb
      journal:
        enabled: true
    
    # where to write logging data.
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongodb/mongod.log
    
    # network interfaces
    net:
      port: 27017
      bindIp: 127.0.0.1
    
    # how the process runs
    processManagement:
      timeZoneInfo: /usr/share/zoneinfo
    
    ### THIS ONE ### 
    replication:
      replSetName: rs0
    
    • 3
  2. JJussi
    2022-01-02T02:25:33+08:002022-01-02T02:25:33+08:00

    Se você usa o endereço localhost 127.0.0.1 e deseja ter um conjunto de réplicas, todas as réplicas (diferentes) (processos mongoD) devem existir em portas diferentes E ter diretórios de dados diferentes (storage.dbPath), porque estão na mesma máquina. Então, rs0 usa f.ex. 27007, rs1 usa f.ex. 27017, rs2 usa f.ex. 27027 e, em seguida, os diretórios são f.ex. /var/lib/mongodb/rs0, /var/lib/mongodb/rs1...

    No entanto, se você criar seu conjunto de réplicas com várias máquinas,

    1. você não pode usar o endereço do host local, você precisa se vincular ao IP da placa de rede
    2. a porta pode ser 27017 em cada nó
    • 2
  3. RolandoMySQLDBA
    2022-01-01T14:07:49+08:002022-01-01T14:07:49+08:00

    Parece que já existe um mongod em execução.

    Veja suas mensagens de erro

    "ctx":"initandlisten","msg":"Erro ao configurar o ouvinte","attr":{"error":{"code":9001,"codeName":"SocketException","errmsg": "Endereço já em uso" }}}

    então você tem

    BException in initAndListen, terminating","attr":{"error":"DBPathInUse: Não foi possível bloquear o arquivo de bloqueio: /var/lib/mongodb/mongod.lock (Recurso temporariamente indisponível). Outra instância do mongod já está sendo executada no diretório /var/lib/mongodb/"}}

    então

    "replication":{"replSet":"rs0"},"storage":{"dbPath":"/media/msc/MONGO/rs/"}}}} {"t":{"$date":" 2021-12-31T16:55:28.885+01:00"},"s":"E", "c":"CONTROL", "id":20568, "ctx":"initandlisten","msg": "Erro ao configurar o ouvinte","attr":{"error":{"code":9001,"codeName":"SocketException","errmsg":" Endereço já em uso "}}}

    As etapas 1,2 na documentação dizem isso

    1. Desligue a instância mongod autônoma.
    2. Reinicie a instância. Use a opção --replSet para especificar o nome do novo conjunto de réplicas.

    Verifique se o mongod está sendo executado com isso

    ps -ef | grep -v grep | grep mongod
    

    Então entre no mongo

    mongo --port 27017
    

    e execute isso para desligá-lo

    use admin
    db.shutdownServer()
    

    Então, você deve ser capaz de iniciá-lo com

    mongod --port 27017 --dbpath /var/lib/mongodb/ --replSet rs0
    

    já que a porta 27017 deve ser livre para usar

    ATUALIZAÇÃO 2022-01-01 11:54 EST

    Acabei de criar uma instância vagrant e tentei

    mongod --port 27017 --dbpath /var/lib/mongodb --logpath /var/log/mongodb.log --fork --replSet rs0
    

    Aqui é Vagrant

    C:\MongoDBClasses\M312 Diagnostics and Debugging>cd m312-vagrant-env
    
    C:\MongoDBClasses\M312 Diagnostics and Debugging\m312-vagrant-env>vagrant up
    Bringing machine 'm312' up with 'virtualbox' provider...
    ==> m312: Clearing any previously set forwarded ports...
    ==> m312: Clearing any previously set network interfaces...
    ==> m312: Preparing network interfaces based on configuration...
        m312: Adapter 1: nat
        m312: Adapter 2: hostonly
    ==> m312: Forwarding ports...
        m312: 30000 (guest) => 30000 (host) (adapter 1)
        m312: 30001 (guest) => 30001 (host) (adapter 1)
        m312: 30002 (guest) => 30002 (host) (adapter 1)
        m312: 22 (guest) => 2222 (host) (adapter 1)
    ==> m312: Running 'pre-boot' VM customizations...
    ==> m312: Booting VM...
    ==> m312: Waiting for machine to boot. This may take a few minutes...
        m312: SSH address: 127.0.0.1:2222
        m312: SSH username: vagrant
        m312: SSH auth method: private key
    ==> m312: Machine booted and ready!
    [m312] GuestAdditions 6.0.14 running --- OK.
    ==> m312: Checking for guest additions in VM...
    ==> m312: Setting hostname...
    ==> m312: Configuring and enabling network interfaces...
    ==> m312: Mounting shared folders...
        m312: /shared => C:/MongoDBClasses/M312 Diagnostics and Debugging/m312-vagrant-env/shared
        m312: /vagrant => C:/MongoDBClasses/M312 Diagnostics and Debugging/m312-vagrant-env
        m312: /dataset => C:/MongoDBClasses/M312 Diagnostics and Debugging/m312-vagrant-env/dataset
    ==> m312: Machine already provisioned. Run `vagrant provision` or use the `--provision`
    ==> m312: flag to force provisioning. Provisioners marked to run always will still run.
    
    C:\MongoDBClasses\M312 Diagnostics and Debugging\m312-vagrant-env>vagrant ssh
    Welcome to Ubuntu 14.04.6 LTS (GNU/Linux 3.13.0-170-generic x86_64)
    
     * Documentation:  https://help.ubuntu.com/
    
      System information as of Sat Jan  1 16:31:19 UTC 2022
    
    
    
    Last login: Thu Dec 23 02:34:39 2021 from 10.0.2.2
    Welcome to Ubuntu 14.04.6 LTS (GNU/Linux 3.13.0-170-generic x86_64)
    
     * Documentation:  https://help.ubuntu.com/
    
      System information as of Sat Jan  1 16:31:19 UTC 2022
    
    
    
    Last login: Thu Dec 23 02:34:39 2021 from 10.0.2.2
    root@m312:~#
    

    Aqui está como eu implantei o mongod

    root@m312:~# mkdir /var/lib/mongodb
    root@m312:~# mongod --port 27017 --dbpath /var/lib/mongodb --logpath /var/log/mongodb.log --fork --replSet rs0
    about to fork child process, waiting until server is ready for connections.
    forked process: 2348
    child process started successfully, parent exiting
    root@m312:~#
    root@m312:~# mongo
    MongoDB shell version v3.4.2
    connecting to: mongodb://127.0.0.1:27017
    MongoDB server version: 3.4.2
    Server has startup warnings:
    2022-01-01T16:44:19.551+0000 I STORAGE  [initandlisten]
    2022-01-01T16:44:19.551+0000 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
    2022-01-01T16:44:19.551+0000 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
    2022-01-01T16:44:19.822+0000 I CONTROL  [initandlisten]
    2022-01-01T16:44:19.822+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
    2022-01-01T16:44:19.822+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
    2022-01-01T16:44:19.822+0000 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
    2022-01-01T16:44:19.822+0000 I CONTROL  [initandlisten]
    2022-01-01T16:44:19.822+0000 I CONTROL  [initandlisten]
    2022-01-01T16:44:19.822+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
    2022-01-01T16:44:19.822+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
    2022-01-01T16:44:19.822+0000 I CONTROL  [initandlisten]
    2022-01-01T16:44:19.822+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
    2022-01-01T16:44:19.822+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
    2022-01-01T16:44:19.822+0000 I CONTROL  [initandlisten]
    MongoDB Enterprise > rs.initiate()
    {
            "info2" : "no configuration specified. Using a default configuration for the set",
            "me" : "m312:27017",
            "ok" : 1
    }
    MongoDB Enterprise rs0:SECONDARY>
    MongoDB Enterprise rs0:PRIMARY>
    

    Suspeito que o arquivo mongod.conf esteja interferindo no comando que você está usando na documentação.

    SUGESTÃO : Renomeie o arquivo conf

    mv mongod.conf mongod.conf.bak
    

    Em seguida, implante o mongod usando meu comando ou o da documentação do MongoDB

    • 1
  4. Best Answer
    Mickael
    2022-01-06T10:39:01+08:002022-01-06T10:39:01+08:00

    Finalmente depois de horas de pesquisa/teste e graças a várias respostas úteis aqui, consegui construir o cluster e estou começando a entender mais claramente como funciona o cluster mongodb. Esqueci totalmente o Ubuntu, o que quer que eu tentei, o serviço não será iniciado.

    Eu tenho dois membros, MONGO2 e MONGO3 com o serviço mongo em execução.

    • O primeiro passo é modificar o arquivo conf de cada máquina:

    MONGO2

    # network interfaces
    net:
      port: 27017
      bindIp: 10.0.0.5,127.0.0.1,0.0.0.0
      
      #replication:
    replication:
      replSetName: rs0
    

    MONGO3:

    # network interfaces
    net:
      port: 27017
      bindIp: 10.0.0.6,127.0.0.1,0.0.0.0
      
      #replication:
    replication:
      replSetName: rs0
    
    • Reinicie os serviços para que as alterações sejam efetivas.
    • Pare o serviço no servidor que será o primário (MONGO2).
    • Promova o servidor.

    ./mongod.exe --port 27017 --dbpath M:\db\data --replSet rs0 --bind_ip_all

    Quando esta mensagem de erro aparecer:

    {"t":{"$date":"2021-12-31T16:57:11.762+01:00"},"s":"I",  "c":"-",        "id":4939300, "ctx":"monitoring-keys-for-HMAC","msg":"Failed to refresh key cache","attr":{"error":"NotYetInitialized: Cannot use non-local read concern until replica set is finished initializing.","nextWakeupMillis":2000}}
    
    • Abra um novo console PS e conecte-se ao mongodb ./mongo.exe --port 27017

    entãors.initiate()

    • Feche tudo e inicie o serviço mongo.

    • Adicione seu outro servidor ao clusterrs.add("MONGO3:27017");

    Resultado

    rs0:PRIMARY> rs.conf()
    {
            "_id" : "rs0",
            "version" : 3,
            "term" : 4,
            "members" : [
                    {
                            "_id" : 0,
                            "host" : "MONGO2:27017",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "secondaryDelaySecs" : NumberLong(0),
                            "votes" : 1
                    },
                    {
                            "_id" : 1,
                            "host" : "MONGO3:27017",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "secondaryDelaySecs" : NumberLong(0),
                            "votes" : 1
                    }
            ],
            "protocolVersion" : NumberLong(1),
            "writeConcernMajorityJournalDefault" : true,
            "settings" : {
                    "chainingAllowed" : true,
                    "heartbeatIntervalMillis" : 2000,
                    "heartbeatTimeoutSecs" : 10,
                    "electionTimeoutMillis" : 10000,
                    "catchUpTimeoutMillis" : -1,
                    "catchUpTakeoverDelayMillis" : 30000,
                    "getLastErrorModes" : {
    
                    },
                    "getLastErrorDefaults" : {
                            "w" : 1,
                            "wtimeout" : 0
                    },
                    "replicaSetId" : ObjectId("61d5799d9249ea1cc550e79d")
            }
    }
    
    • 1

relate perguntas

  • Bons recursos para operar/administrar o MongoDB

  • É imprudente executar a replicação no mesmo servidor físico?

  • Existe uma maneira de medir o atraso de replicação no MySQL com uma resolução inferior a 1 segundo?

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve