记录一下,MongoDB的角色创建及配置,以便以后使用
简介
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”);
注:新加入副本集的节点,会自动同步当前副本集已有权限及数据