MongoDB集群搭建

不得不说MongoDB的集群搭建还是比较容易的,之前搜了很久没什么比较全的教程。而且没有人提说不能先开启安全,要不会导致用户认证信息不同步的问题,让我实验了一整个下午最终才找到正确的方案。

复制集原理

虽然MongoDB支持好几种复制方式,但是我这里比较推荐的是这种。

一个集群至少有三台主机,一个是主,一个是副本集,还有一个仲裁节点。仲裁节点不存储数据,只是负责故障转移的群体投票,这样就少了数据复制的压力。

如果你没有在配置文件打开副本集也能写入数据的话,那么副本集是不允许写入数据的。只能从主节点写入。

除了这三种节点还有以下几种:

Secondary-Only:不能成为primary节点,只能作为secondary副本节点,防止一些性能不高的节点成为主节点。

Hidden:这类节点是不能够被客户端制定IP引用,也不能被设置为主节点,但是可以投票,一般用于备份数据。

Delayed:可以指定一个时间延迟从primary节点同步数据。主要用于备份数据,如果实时同步,误删除数据马上同步到从节点,恢复又恢复不了。

Non-Voting:没有选举权的secondary节点,纯粹的备份数据节点。

搭建集群

首先你需要准备三台服务器,然后每台服务器安装好MongoDB(不懂安装?狂戳我吧)。

我们这里假设有以下三台配置好MongoDB的服务器(如果你要跨服务商连接请使用公网IP,如果只是内网连接建议使用内网IP,包括第一台都必须是公网IP,不能是127.0.0.1):

  • 1.1.1.1:27017

  • 2.2.2.2:27017

  • 3.3.3.3:27017

在配置的时候记得修改配置文件,配置文件一般在/etc/mongod.conf。

如果是使用公网IP,请先将配置文件下的bindIp修改成0.0.0.0,这样就可以不限制IP登录。如果需要限制IP我建议使用公有云的安全组或者防火墙。

net: port: 27017 bindIp: 0.0.0.0

加上下面这个配置(每一台主机的集群名称必须是统一的):

replication: replSetName: 集群名

我们假设第一台为主,那么先用ssh进入第一台服务器,然后执行mongo连接到这台服务器的MongoDB。(注意,先不要开启安全认证)

执行

rs.initiate({_id: "rs0",members: [{ _id: 0 , host: "1.1.1.1:27017" }]})

这样我们就增加了第一台服务器,不过建议这个时候快一点增加其它主机,以免发生本来是我们预定为主的服务器变成从的事情。

增加第二台主机可以通过:

rs.add("2.2.2.2:27017")

增加第三台的时候我们要求它要成为冲裁节点,所以得这么做:

rs.add("3.3.3.3:27017",{arbiter:true})

如果都返回{ "ok" : 1 }那就代表搭建完成。

你可以通过rs.status()查看目前的状态。

提升优先级

由于副本集是通过投票来判定主和副本的,你可以通过设定某个的优先级来让它在投票中胜出。

在mongo的命令行下执行rscfg=rs.conf()来将配置赋予rscfg这个变量,然后执行rscfg.members[0].priority=10修改第一个的权重为10。这里支持更大,不过建议别太大。

安全认证

没有账号密码肯定是不安全的,任何人都可以连接,肿么办?

安全认证由用户认证和副本集认证组成(我也不知道这样称呼对不对,嘿嘿嘿~)。

我们先登录到主MongoDB的服务器中,执行use admin,进入到admin数据库中(如果账户不是admin下会没权控制副本集啥的),然后执行db.createUser({user: "root",pwd: "123456",roles: [{ role: "root", db: "admin" }]}); 创建一个管理员。

如果以后要使用管理员登录,也必须经过admin数据库的,先use到admin再通过db.auth("root","123456")登录。

用户认证部分就搞定,这时候因为我们还没开启安全认证,所以还是可以不用登录的。

紧接着,我们需要生成一个密钥文件用于副本集认证(这里采用keyfile,使用SCRAM-SHA-1的验证机制来进行内部验证),如果副本集没有这个密钥是不能连接到集群的。

open rand -base64 741 > /你要存放的路径

因为密钥文件只能是600权限,所以我们要先将文件的所有者转给MongoDB。

sudo chown mongodb:mongodb 文件地址

通常来说Mongodb的进程执行者是mongodb,如果担心不是的,可以通过ps -aux确认下。==记得把这个生成的文件复制给另外两台主机==(必须是同一个密钥才能通过认证)。

然后修改下Mongodb的配置文件,增加下面几行后重启Mongodb:

security: authorization: enabled keyFile: "密钥文件路径"

注意参数名后面要跟个空格!

把所有的服务器更改好配置重启后就必须使用账户才能登陆到MongoDB了。

如何使用

这里只针对java讲解,推荐使用本宝宝开发的MongoPlugin哦!

使用MongoPlugin连接副本集和使用读写分离都非常简单,详情见Plugin的文档:http://www.cybermkd.com/mongodb-plugin-2/

读写分离大致分为以下几种策略:

  • primary
    • 主节点,默认模式,读操作只在主节点,如果主节点不可用,报错或者抛出异常。
  • primaryPreferred
    • 首选主节点,大多情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点。
  • secondary
    • 从节点,读操作只在从节点, 如果从节点不可用,报错或者抛出异常。
  • secondaryPreferred
    • 首选从节点,大多情况下读操作在从节点,特殊情况(如单主节点架构)读操作在主节点。
  • nearest
    • 最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点,根据ping时间最短。

比较推荐是使用secondaryPreferred。

results matching ""

    No results matching ""