如何使用MongoDB配置副本集

10

我有一个无法解决的问题。部分原因是我无法用正确的术语来解释它。我是新手,对于这个笨拙的问题感到抱歉。

下面您可以看到我目标的概述。

我想要在MongoDB中配置复制集,我尝试了以下方式

use local
db.dropDatabase()

config = { _id: "rs0", members:[
{_id: 0, host: 'localhost:27017'}]
}

rs.initiate(config)

我希望一切都是正确的,但这里显示以下错误消息。

{ "errmsg" : "server is not running with --replSet", "ok" : 0 }

我这里有什么问题吗?

有任何想法吗?


1
错误信息告诉您需要做什么:更改配置文件(通常为/etc/mongodb.conf,具体取决于您的Linux发行版),添加以下行: replSet = [副本集名称] - yaoxing
@yaoxing,我仍然收到相同的错误信息... - Naresh
请在此处查看我的答案:https://dev59.com/_WjWa4cB1Zd3GeqPsaCl#61929189 - DragonFire
2个回答

21
其实你可以按照MongoDB手册中的步骤设置复制集,非常清晰明了。以下是一些关键步骤:
  1. 修改配置文件并添加以下内容。不要与主从复制的设置混淆,因为复制集是主从复制的替代品。所以你可能需要从配置文件中删除那些与主从有关的配置。

replSet = [set name]

编辑:最近版本的mongoDB中似乎不再存在replSet,至少它已经不再被文档记录了。以下方法在我的情况下似乎可以解决问题。

replication: 
  replSetName: "smm"
  • 重新启动 mongod 实例:

    systemctl restart mongodb
    // or
    service mongod restart
    
    去本地数据库并初始化副本集。不要传递任何参数给initiate函数,MongoDB会自动处理一切。请注意,它将使用您的主机名作为当前实例的名称,而我知道更改主机名并不容易。因此,在执行此操作之前,您可能需要更改主机名。
    use local
    rs.initiate()
    
  • 就这样,您的集合已准备好使用。如果您有其他成员要加入该集合,您需要执行1/2步骤,并前往您的主实例并输入:

    rs.add("hostname:port")
    

    仅当您想更改复制集的配置时,才需要键入:

    var conf = rs.conf();
    // change your conf here
    rs.reconfig(conf);
    

    请注意,这将导致服务器离线一段时间。如果您是在线操作,请小心。


    靠近 rs.initiate() 我得到了相同的错误信息 { "errmsg" : "server is not running with --replSet", "ok" : 0 }。 - Naresh
    如果我强制使用rs.reconfig(conf),它会给出以下错误:"TypeError: rs.conf()没有属性shell/utils.js:1494"。 - Naresh
    你是如何启动Mongod实例的?使用命令行还是作为守护进程? - yaoxing
    如果我运行以下查询 mongod --replSet rs0 --dbpath /var/lib/mongo/...,我会得到以下错误: [initandlisten] MongoDB启动:pid=5186 port=27017 dbpath=/var/lib/mongo/ 64-bit host=naresh [initandlisten] db版本v2.0.4,pdfile版本4.5 [initandlisten] git版本:nogitversion [initandlisten] 构建信息:Linux yellow 2.6.24-29-server #1 SMP Tue Oct 11 15:57:27 UTC 2011 x86_64 BOOST_LIB_VERSION=1_46_1 [initandlisten] 选项:{ dbpath: "/var/lib/mongo/", replSet: "rs0" } [initandlisten] initAndListen中的异常:10296 dbpath (/var/lib/mongo/)不存在,终止... - Naresh
    让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/51149/discussion-between-naresh-and-yaoxing - Naresh
    显示剩余5条评论

    1
    我希望讨论MongoDB中的复制和副本集概念。
    我们如何获得可用性和容错能力?这意味着如果该节点崩溃,我们仍然希望能够使用系统。如果主节点崩溃,并且由于某些原因我们完全失去它,例如备份之间的丢失或硬件损坏导致系统无法使用。为了解决这两个问题,我们引入了复制。
    一个副本集是指一组mongodmongo节点,它们共同协作并以数据为镜像互相匹配。其中有一个主节点和其他节点都是从节点,但是这个选择是动态的。写入主节点的数据将异步复制到从节点。应用程序和驱动程序保持连接到主节点,并且只能向主节点写入。如果主节点崩溃,则其中一个从节点将进行选举以选出新的主节点。要选举新的主节点,我们必须具有原始节点数量的严格多数。因此,由于此处的原始节点数量为3,我们需要2个节点来选举新的主节点,而这正是我们拥有的数量。因此,如果其中一个节点崩溃,那么任何其他节点都可以成为主节点。在这种情况下,应用程序将通过驱动程序连接到主节点以获取权限,所有操作都是透明的。
    如果宕机的服务器稍后恢复,它将作为辅助节点加入复制集。最少需要3个节点,因为如果节点数少于3个,则剩余节点无法构成原始集合的大多数,这样就无法选举新的主节点。所以,我们只能没有主节点,这意味着我们不能再进行操作。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接