测试在次节点(Secondary)进行数据删除。是删除不了的。
fymongodb:SECONDARY> db.test.drop() 2019-04-19T21:48:38.140+0800 E QUERY [js] Error: drop failed: { "operationTime" : Timestamp(1555681711, 1), "ok" : 0, "errmsg" : "not master", "code" : 10107, "codeName" : "NotMaster", "$clusterTime" : { "clusterTime" : Timestamp(1555681711, 1), "signature" : { "hash" : BinData(0,"I+dFkOHcdqW+La7xvy8JFij+5CY="), "keyId" : NumberLong("6681517989155569665") } } } : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DBCollection.prototype.drop@src/mongo/shell/collection.js:707:1 @(shell):1:1 配置副本集登录验证副本集配置用户和密码,登录主节点,添加admin 用户。
> use admin switched to db admin > db.createUser({ user: "admin", pwd: "9toc7tpji8", roles: [{ role: "root", db: "admin" }] }) Successfully added user: { "user" : "admin", "roles" : [ { "role" : "root", "db" : "admin" } ] }在主节点生成 keyflie 并复制到其它两个节点
# 生成 keyFile openssl rand -base64 90 -out /opt/mongodb/keyfile #并复制到其它两个节点 scp /opt/mongodb/keyfile fymongodb002:/opt/mongodb/ scp /opt/mongodb/keyfile fymongodb003:/opt/mongodb/更改三个节点的 keyFile 文件权限和所有者
chmod 600 /opt/mongodb/keyfile # 一定要更改成 600 权限,否正会报错 chown mongodb:mongodb /opt/mongodb/keyfile # 更改文件所有者更改三个节点的 mongodb_rep.yaml 配置文件,将 security 的参数 authorization 设置为 enabled,并配置
keyFile 的路径。
security: authorization: "enabled" keyFile: '/opt/mongodb/keyfile' clusterAuthMode: "keyFile"然后依次重启 fymongodb001、 fymongodb002、 fymongodb003 。
# fymongodb001 systemctl restart mongodb # fymongodb002 systemctl restart mongodb # fymongodb003 systemctl restart mongodb登陆 fymongodb001,我们使用 db.auth() 进行登陆验证。
fymongodb:PRIMARY> show dbs; fymongodb:PRIMARY> use admin switched to db admin fymongodb:PRIMARY> db.auth('admin','9toc7tpji8') 1 fymongodb:PRIMARY> show dbs; admin 0.000GB config 0.000GB local 0.000GB 三 、副本集维护 副本集成员如何以单节点启动副本集当做单节点启动需要更改配置文件,主要的配置文件有以下几点:
注释副本集名称设置,replSet=fymongodb
更改端口
如果是分片储存的,那么还需要注释分片配置,添加 skipShardingConfigurationChecks = true。
然后我们执行维护完后,关闭节点
use admin db.shutdownServer()然后还原原来的配置,然后作为副本集成员加入副本集。
副本集设置节点的优先级如果我们想让某个节点成为主节点,或者是当主节点 down 了后,你想指定某个节点 优先级更高地成为 次节点。
cfg = rs.conf() cfg.members[0].priority = 0.5 cfg.members[1].priority = 0.5 cfg.members[2].priority = 1 rs.reconfig(cfg) 副本集使用备份数据进行启动 # 使用备份数据进行启动 mongod --dbpath /data/db # 删除 local 数据库 use local db.dropDatabase() # 指定副本集名称并以备份数据 启动 mongod --dbpath /data/db --replSet <replName> # 启动副本集 rs.initiate( { _id : <replName>, members: [ { _id : 0, host : <host:port> } ] }) 副本集数据量比较大时如何添加次节点当副本集的数据量比较大的时候,我们添加新的节点的时候,如果使用初始化同步的话,会给主节点造成比较大的压力。我们有以下选择:
暂停当前副本集中的一个次节点,然后将 次节点的数据(data)复制到要新添加的节点的数据目录。然后再将两个节点启动。(建议先测试)
如果要复制数据文件,请确保您的副本包含local数据库的内容。
指定同步节点 rs.syncFrom(hostportstr),指定同步节点为次节点,默认的是同步节点 是主节点。
但是该设置在重新启动节点,或者同步指定的新节点的连接被关闭了,是会失效的。(建议先测试)
如果我们决定还是从主节点进行同步数据。
副本集延迟节点延迟节点在此未记录,详细见官方文档。
副本集常用命令 # 副本集初始化 rs.initiate( { _id : "rs0", members: [ { _id: 0, host: "mongodb0.example.net:27017" }, { _id: 1, host: "mongodb1.example.net:27017" }, { _id: 2, host: "mongodb2.example.net:27017" } ] }) # 副本集添加成员 rs.add('mongodb3.example.net:27017') # 副本集添加仲裁节点 rs.addArb('mongodb4.example.net:27017') # 移除节点 rs.remove('hostportstr') # 查看当前的配置 rs.conf() # 查看各个节点状态和身份 rs.status() # 设定某个节点多少秒不可成为主节点 rs.freeze(secs) # 设置次节点从指定节点同步数据 rs.syncFrom(hostportstr) # 降低主节点为次节点,只能在主节点上运行 rs.stepDown([stepdownSecs, catchUpSecs]) # 查看帮助 rs.help() # 次节点执行,表示允许次节点读取数据 rs.slaveOk() # 判断当前节点是否是主节点 rs.isMaster() # 查看 Oplog 信息 rs.printReplicationInfo() # 查看副本集的次节点与主节点延迟 db.printSlaveReplicationInfo() # 移除原有副本集命令 use local db.system.replset.remove({}) # 关闭 mongodb进程服务 use admin db.shutdownServer() 四、注意事项建议将副本集至少部署在3个可用区。
配置副本集成员,使用的是主机名而不是 ip,因为 ip 可能变动。
副本集包含奇数个投票成员。
错误问题报错内容:
Failed global initialization: BadValue: replication.replSetName is not allowed when storage.indexBuildRetry is specifiedstorage 参数 indexBuildRetry 不能与 副本集共存,当开启 副本集的时候,就需要将indexBuildRetry 参数注释。
Changed in version 4.0: The setting cannot be used in conjunction with.
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx