mongodb需要配置仲裁节点

记录一下,MongoDB的角色创建及配置,以便以后使用

经过大量血的教训,一个分片配置两个副本集时(一个是primary一个是secondary),如果primary挂掉,secondary是不会升级的,必须要加上一个不存储数据的仲裁节点

简介

  Replica Set,中文翻译叫做副本集,不过我并不喜欢把英文翻译成中文,总是感觉怪怪的。其实简单来说就是集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据需要和主节点一致

 

    Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。

       默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置叫做Read Preference Modes,同时Java客户端提供了简单的配置方式,可以不必直接对数据库进行操作。

       仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。我开始也不相信必须要有仲裁节点,但是自己也试过没仲裁节点的话,主节点挂了备节点还是备节点,所以咱们还是需要它的。

介绍完了集群方案,那么现在就开始搭建了。

副本集搭建

1、准备配置文件

复制代码
# mongod.conf
# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /home/dd/mongodb/logs/mongod.log #日志文件存放目录

# Where and how to store data.
storage:
  dbPath: /home/dd/mongodb/db #数据文件存放目录
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# how the process runs
processManagement:
  fork: true  #以守护程序的方式启用,即在后台运行
  pidFilePath: /home/dd/mongodb/mongod.pid  # location of pidfile

# network interfaces
net:
  port: 27017 #端口
  bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.

#security:
  #authorization: enabled 
#operationProfiling:

replication:
  replSetName: matchData1 #sharding: ## Enterprise-Only Options #auditLog: #snmp:
复制代码

红色标示出副本集的名称,副本集以此名称来识别是否属于同一个集群中

2、启动准备好的一台Mongodb数据库

bin/mongod –f mongo.conf

3、连接到Mongo的admin库

bin/mongo ip:port/admin

4、增加用户

复制代码
use admin
db.createUser({user:"root",pwd:"root",roles:["root"]})
use ball
db.createUser(  
  {  
    user: "basket",  
    pwd: "basket",
    roles: [{role: "readWrite", db: "ballmatch"}]  
  }  
)
复制代码

5、生成keyFile文件

在服务器上执行

openssl  rand  –base64 753  >  mongodb.keyfile

chmod 600 keyFile

将keyFile配置到Mongo配置文件,同时开启验证

security:
  authorization: enabled
  keyFile:/home/dd/mongodb/mongodb.keyfile

没有这个文件的机器就无法加入副本集,开启了keyFile,隐含就开启了auth,这个时候连接副本集就需要进行认证了

6、重启Mongo服务

7、拷贝到其他服务器,修改对应得目录

8、添加副本集配置

cfg={_id:"matchData1", members:[{_id:0, host:'192.168.10.242:37017', priority:1},{_id:1, host:'192.168.10.242:37018', priority:2}, {_id:2, host:'192.168.10.242:37019', arbiterOnly:true}]};
rs.initiate(cfg);

cfg:变量名,任意起

_id:”matchData1” 配置文件中配置的副本集名称

host:Mongodb的ip+端口

 

priority:优先级,数字越大优先级越高(0-100),优先级最高的会是初始的主节点,显示为PRIMARY。如果不想让某些成员在故障切换时成为primary,则将它们的优先级设为0(为0永不会成为主节点)

 

当副本集切换失败时,可用如下代码重新配置:

rs.reconfig(cfg, {force:true});

9、副本集状态

复制代码
rs.status()

"health" : 1, #代表机器正常 
"stateStr" : "PRIMARY",  #代表是主节点,可读写,其中有以下几下状态  
1. STARTUP:刚加入到复制集中,配置还未加载  
2. STARTUP2:配置已加载完,初始化;  
3. RECOVERING:正在恢复,不适用读  
4. ARBITER: 仲裁者  
5. DOWN:节点不可到达  
6. UNKNOWN:未获取其他节点状态而不知是什么状态,一般发生在只有两个成员的架构 
7. REMOVED:移除复制集  
8. ROLLBACK:数据回滚,在回滚结束时,转移到RECOVERING或SECONDARY状态  
9. FATAL:出错。查看日志grep “replSet FATAL”找出错原因,重新做同步  
10. PRIMARY:主节点  
11. SECONDARY:备份节点  
复制代码

10、维护

前提是这个ip:port必须是使用了同一个relpSet名称的mongodb实例即可

添加副本,在登录到主节点下输入

rs.add("ip:port"); 

删除副本 

rs.remove("ip:port");

新增仲裁节点

rs.addArb(“ip:port”);