我遇到了无法解决的问题。部分是因为我无法用正确的术语来解释它。我很陌生,对这个笨拙的问题感到抱歉。
您可以在下面看到我的目标概述。
我希望在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 }
我在这里做错了什么?
有什么想法吗?
答案 0 :(得分:9)
您实际上可以按照MongoDB Manual设置副本集。很清楚。 以下是一些关键步骤:
更改配置文件并添加以下行。不要将主/从复制搞乱,因为副本集旨在替代主/从复制。因此,您可能希望从配置文件中删除这些主/从相关配置。
replSet = [set name]
编辑:在最新版本的mongoDB中,replSet
似乎不再存在,至少它是 no longer documented 。以下似乎已经完成了我的案例。
replication:
replSetName: "smm"
重新启动您的mongod实例:
systemctl restart mongodb
// or
service mongod restart
转到本地数据库并启动副本集。不要将任何东西传递给启动函数,mongodb会很好地处理所有事情。请注意,它将使用您的主机名作为当前实例的名称,因为我知道它并不那么容易更改。因此,您可能需要先更改主机名。
use local
rs.initiate()
那就是它。你的套装很棒。如果您有其他成员加入该集,则需要执行1/2步骤,然后转到主实例并键入:
rs.add("hostname:port")
仅当您想要更改副本集的配置时,是否需要输入:
var conf = rs.conf();
// change your conf here
rs.reconfig(conf);
请注意,这会导致服务器脱机一点时间。如果你在网上做,请小心。
答案 1 :(得分:1)
我希望在MongoDB
中讨论复制和副本集的概念。
我们如何获得可用性和容错?我们的意思是,如果该节点发生故障,我们仍然希望能够使用该系统。如果主节点出现故障并且由于某种原因我们完全失去了它,那么假设备份之间丢失或硬件损坏导致系统无法使用。因此,我们要解决这两个问题的方法是引入复制。
副本集指的是一组mongod
和mongo
个节点,它们共同作用,并且在数据方面彼此镜像。有一个主节点,其他节点是辅助节点。但是,这种选择是动态的。写入主数据库的数据将异步复制到辅助数据库。应用程序和驱动程序保持连接到主要和将,并且只能写入主要。比如,如果主要人员失败,其中一个辅助人员将进行选举以选出新的主要人员。要选择新的主要节点,我们必须拥有原始节点数的绝大部分。因此,由于此处的原始节点数 3 ,我们需要 2 节点来选择新的主节点,这就是我们拥有的数量。所以,如果一个人失败了,那么其他任何人都可以成为主要的。在这种情况下,应用程序将通过驱动程序连接到主要权限。一切都透明。
稍后如果关闭服务器启动,它将把副本集作为辅助服务器加入。并且最小节点数 3 - 因为如果我们小于3,那么剩下的将不是原始集的大部分。因此,没有办法选出新的小学。所以,我们没有主要的,这意味着我们不能再获得权利。