MongoDB 3.2容灾测试

  • 1台Primary,1台Secondary,1台Arbiter
    • 当Arbiter挂了
      • Primary和Secondary的主从不会切换
      • 外部应用服务不受影响
      • 在Primary上重新配置拓扑,去掉原有Aribter引入新的Arbiter, 命令如下。这个操作对Primary,Secondary以及外部应用都没有影响。

        rs.reconfig({"_id" : "rs1","members" : [{"_id" : 0, "host" : "127.0.0.1:27017","priority":1},{"_id" : 1, "host" : "127.0.0.1:27018","priority":2},{"_id" : 2, "host" : "127.0.0.1:27019","arbiterOnly" : true}]});


         

    • Primary和Arbiter同时挂了
      • Secondary一直保持Secondary状态,不会自动切换为Primary。重启之后,仍然保持Secondary状态。
      • 外部应用服务不能读写,且应用服务不能正常重启
      • 重启Primary,则经过几秒钟之后,Primary恢复成Primary状态,则外部应用能正常重启,外部应用读写正常,如果外部应用没有重启,则仍然能恢复正常读写;Primary与Secondary之间数据同步恢复正常。
      • 如果因为硬件等原因Primary不能重启,则需要在Secondary的上强制修改拓扑配置,将其余节点去掉,并将原来的Secondary指定为新的Primary,然后修改应用服务的mongo URL指向新的Primary再重启应用服务。修改命令如下:

        rs1:SECONDARY> use admin

        switched to db admin

        rs1:SECONDARY> db.auth('admin','adminpassword')

        1

        rs1:SECONDARY> rs.reconfig({"_id" : "rs1","members" : [{"_id" : 1, "host" : "127.0.0.1:27018","priority":2}]},{ force: true });

        { "ok" : 1 }

        rs1:SECONDARY> rs.status()

        {

                "set" : "rs1",

                "date" : ISODate("2018-11-09T07:02:58.605Z"),

                "myState" : 1,

                "term" : NumberLong(24),

                "heartbeatIntervalMillis" : NumberLong(2000),

                "members" : [

                        {

                                "_id" : 1,

                                "name" : "127.0.0.1:27018",

                                "health" : 1,

                                "state" : 1,

                                "stateStr" : "PRIMARY",

                                "uptime" : 1662,

                                "optime" : {

                                        "ts" : Timestamp(1541746976, 2),

                                        "t" : NumberLong(24)

                                },

                                "optimeDate" : ISODate("2018-11-09T07:02:56Z"),

                                "infoMessage" : "could not find member to sync from",

                                "electionTime" : Timestamp(1541746976, 1),

                                "electionDate" : ISODate("2018-11-09T07:02:56Z"),

                                "configVersion" : 281693,

                                "self" : true

                        }

                ],

                "ok" : 1

        }

        rs1:PRIMARY>

        等原有Primary恢复以后,再将其作为Secondary加入到拓扑当中,需要在新的Primary上修改配置,命令如下

        rs1:PRIMARY> rs.reconfig({"_id" : "rs1","members" : [{"_id" : 0, "host" : "127.0.0.1:27017","priority":1},{"_id" : 1, "host" : "127.0.0.1:27018","priority":2},{"_id" : 2, "host" : "127.0.0.1:27019","arbiterOnly" : true}]});

  • 1台Primary,2台Secondary,1台Arbiter
    • Primary和Arbiter同时挂了,达到总节点数的一半
      • 2台Secondary无法自动选出一个Primary,日志中会报“Not starting an election, since we are not electable due to: Not standing for election because I cannot see a majority (mask 0x1)”
  • 1台Primary,3台Secondary,1台Arbiter
    • Primary和Arbiter同时挂了
      • 3台Secondary会自动选出一个Primary,先选priority值最大的,priority值相同的情况则随机选择。
    • Primary和其中一个Secondary同时挂了
      • 2台Secondary中会自动选出一个Primary,先选priority值最大的,priority值相同的情况则随机选择。
    • Primary,其中一个Secondary和Arbiter同时挂了
      • 2台Secondary无法自动选出一个Primary,日志中会报“Not starting an election, since we are not electable due to: Not standing for election because I cannot see a majority (mask 0x1)”
  • 1台Primary,4台Secondary,1台Arbiter
    • Primary和Arbiter同时挂了
      • 4台Secondary会自动选出一个Primary,暂时没有发现有平局的情况
    • Primary,Arbiter和一个Secondary同时挂,达到总节点数的一半
      • 3台Secondary无法自动选出一个Primary,日志中会报“Not starting an election, since we are not electable due to: Not standing for election because I cannot see a majority (mask 0x1)”
    • Primary和2个Secondary同时挂,达到总节点数的一半
      • 2台Secondary无法自动选出一个Primary,日志中会报“Not starting an election, since we are not electable due to: Not standing for election because I cannot see a majority (mask 0x1)”

多个Secondary节点并不是全部都从主节点同步,也可以从其它从节点同步。Secondaries may automatically change their sync from source as needed based on changes in the ping time and state of other members’ replication.

应用服务里所配的多个Mongo IP只要有一个还处于存活状态,则读写正常,应用服务重启也正常。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MongoDB是一种非关系型数据库,使用文档存储数据。在MongoDB中,数据以JSON格式存储在文档中,文档可以嵌套,使得数据的结构更加灵活。 以下是MongoDB中的一些基本数据操作: 1. 插入数据 可以使用insert_one()或insert_many()函数向集合中插入单个文档或多个文档。 ``` # 插入单个文档 db.collection.insert_one({'name': 'Alice', 'age': 25}) # 插入多个文档 docs = [{'name': 'Bob', 'age': 30}, {'name': 'Charlie', 'age': 35}] db.collection.insert_many(docs) ``` 2. 查询数据 可以使用find()函数查询集合中的文档,还可以使用sort()、limit()和skip()函数对查询结果进行排序、限制数量和跳过指定数量的文档。 ``` # 查询所有文档 docs = db.collection.find() # 查询符合条件的文档 docs = db.collection.find({'age': {'$gt': 30}}) # 对查询结果进行排序、限制数量和跳过指定数量的文档 docs = db.collection.find().sort('age', -1).limit(10).skip(5) ``` 3. 更新数据 可以使用update_one()或update_many()函数更新集合中的单个文档或多个文档。 ``` # 更新单个文档 db.collection.update_one({'name': 'Alice'}, {'$set': {'age': 26}}) # 更新多个文档 db.collection.update_many({'age': {'$lt': 30}}, {'$inc': {'age': 1}}) ``` 4. 删除数据 可以使用delete_one()或delete_many()函数删除集合中的单个文档或多个文档。 ``` # 删除单个文档 db.collection.delete_one({'name': 'Alice'}) # 删除多个文档 db.collection.delete_many({'age': {'$lt': 30}}) ``` 以上是MongoDB中的一些基本数据操作,还有其他更多的操作方式,需要根据具体情况选择不同的操作方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值