AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 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:如何将独立集转换为副本集

  • 772

我是 MongoDB 的新手,并且搜索了几个小时如何将我的 mongo 独立实例提升为副本集。我的实际环境是一台 ubuntu 服务器

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

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

在端口 27017 上本地运行独立的 mongodb 实例:

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:

我从这里导入了一个数据库目标是再创建两台服务器并在它们上面复制数据库。

参考文档:

将独立集转换为副本集我对必须使用的两个参数 --port 和 --dbpath 感到困惑。如果我想推广我的实际实例,我应该使用现有的数据库路径和端口,对吗?但无论我在尝试什么,它都是失败的。

使用另一个端口:

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"}}

使用新目录:

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}}

而这种等待“nextWakeupMillis”永远不会停止。

您能否提供有关正确配置和问题所在的帮助?

******************编辑:2022 年 1 月 3 日******************

现在我可以使用以下方式推广我的实例:

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

然后打开一个新的shell并发送

rs.initiate()

但是为什么服务不会以这个新配置启动呢?

● 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'.

此外,如果我重新启动服务器,我必须重复这些操作。有没有办法修复配置并启动 mongod 服务?

mongodb replication
  • 4 4 个回答
  • 2544 Views

4 个回答

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

    对于初学者来说,当 MongoDB 文档没有明确强调配置文件设置和命令行选项时,通常会感到困惑。

    当您将 MongoDB 作为服务运行时,您必须/etc/mongod.conf像这样编辑配置文件

    # 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

    如果您使用 localhost 127.0.0.1 地址并希望拥有副本集,那么所有(不同的)副本(mongoD 进程)必须存在于不同的端口并且具有不同的数据目录(storage.dbPath),因为它们位于同一台机器上。所以,rs0 使用 f.ex。27007,rs1 使用 f.ex。27017,rs2 使用 f.ex。27027 然后目录是 f.ex。/var/lib/mongodb/rs0, /var/lib/mongodb/rs1...

    但是,如果您使用多台机器构建副本集,那么

    1. 不能使用localhost地址,需要绑定网卡IP
    2. 每个节点的端口可以是 27017
    • 2
  3. RolandoMySQLDBA
    2022-01-01T14:07:49+08:002022-01-01T14:07:49+08:00

    似乎已经有一个 mongod 正在运行。

    查看您的错误消息

    "ctx":"initandlisten","msg":"设置监听器时出错","attr":{"error":{"code":9001,"codeName":"SocketException","errmsg": "地址已经正在使用中” }}}

    那么你得到了

    BException in initAndListen, terminating","attr":{"error":"DBPathInUse: Unable to lock the lock file: /var/lib/mongodb/mongod.lock (资源暂时不可用)。另一个 mongod 实例已经在 /var/lib/mongodb/目录上运行"}}

    然后

    "复制":{"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": "设置监听器时出错","attr":{"error":{"code":9001,"codeName":"SocketException","errmsg":"地址已在使用中"}}}

    文档中的步骤 1,2 说明了这一点

    1. 关闭独立的 mongod 实例。
    2. 重启实例。使用 --replSet 选项指定新副本集的名称。

    验证 mongod 是否正在使用它运行

    ps -ef | grep -v grep | grep mongod
    

    所以登录mongo

    mongo --port 27017
    

    并运行它来关闭它

    use admin
    db.shutdownServer()
    

    然后,你应该能够开始它

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

    因为端口 27017 应该可以免费使用

    更新 2022-01-01 11:54 EST

    我刚刚启动了一个 vagrant 实例并尝试了它

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

    这里是流浪者

    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:~#
    

    这是我部署 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>
    

    我怀疑 mongod.conf 文件干扰了您在文档中使用的命令。

    建议:重命名conf文件

    mv mongod.conf mongod.conf.bak
    

    然后,使用我的命令或 MongoDB 文档中的命令部署 mongod

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

    最后经过数小时的研究/测试,并感谢这里有几个有用的答案,我成功地构建了集群,并且我开始更清楚地了解 mongodb 集群是如何工作的。完全忘记了 Ubuntu,无论我尝试什么服务都无法启动。

    我有两个成员, MONGO2 和 MONGO3 运行着 mongo 服务。

    • 第一步是修改每台机器的conf文件:

    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
    
    • 重新启动服务,使更改生效。
    • 停止将成为主服务器 (MONGO2) 上的服务。
    • 提升服务器。

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

    当出现此错误消息时:

    {"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}}
    
    • 打开一个新的 PS 控制台并连接到 mongodb ./mongo.exe --port 27017

    然后rs.initiate()

    • 关闭一切并启动 mongo 服务。

    • 将您的其他服务器添加到集群rs.add("MONGO3:27017");

    结果

    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

相关问题

  • 关于操作/管理 MongoDB 的良好资源

  • 在同一台物理服务器上运行复制是不明智的吗?

  • 有没有办法以小于 1 秒的分辨率测量 MySQL 中的复制滞后?

  • 运行时间偏移延迟复制的最佳实践

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve