首页 > 代码库 > Mongodb 副本与分配 学习笔记

Mongodb 副本与分配 学习笔记

副本

        实例1 m1.config

            port=27017 #端口

            replSet=spock #副本名称随便取

            dbpath=/usr/local/mongodb/fuben/db1 #数据存放目录

            logpath=/usr/local/mongodb/fuben/log1/mongodb.log #日志目录

        实例2 m2.config

            port=27027

            replSet=spock

            dbpath=/usr/local/mongodb/fuben/db2

            logpath=/usr/local/mongodb/fuben/log2/mongodb.log

        实例3 m3.config

            port=27037

            replSet=spock

            dbpath=/usr/local/mongodb/fuben/db3

            logpath=/usr/local/mongodb/fuben/log3/mongodb.log

           

        启动3个实例

        /usr/local/mongodb/bin/mongod -f m*.config

        连接任意一个实例

        mongo --port 27017

        配置变量

        config ={

            ‘_id‘:‘spock‘,

            ‘members‘:[

                {‘_id‘:0,‘host‘:‘localhost:27017‘},

                {‘_id‘:1,‘host‘:‘localhost:27027‘},

                {‘_id‘:2,‘host‘:‘localhost:27037‘}

            ]

        }

        导入配置

            rs.initiate(config) 创建副本集成功

        向集合中插入数据

            db.user.insert({‘name‘:‘andi‘,‘age‘:22,‘sex‘:‘M‘})

           

        链接其他实例查看数据同步情况

            db.user.find()

                Error: error: { "$err" : "not master and slaveOk=false", "code" : 13435 } 备份库默认不能读

            设置可以查看数据

            db.setSlaveOk()

            db.user.find() 【成功】

           

        副本集管理

            db.isMaster() 查看是否为主等其他信息

            rs.status() 查看副本集状态

            {

                "set" : "spock",

                "date" : ISODate("2017-06-16T03:08:08.452Z"),

                "myState" : 1,

                "members" : [

                    {

                        "_id" : 1,

                        "name" : "localhost:27027",

                        "health" : 1,

                        "state" : 2,

                        "stateStr" : "SECONDARY",

                        "uptime" : 156845,#其他程序可以连接到此节点的立即时间(秒)

                        "optime" : Timestamp(1497425785, 2),

                        "optimeDate" : ISODate("2017-06-14T07:36:25Z"),#每个成员的oplog中最后一个操作时间

                        "lastHeartbeat" : ISODate("2017-06-16T03:08:08.148Z"),#当期服务器最后一次收到其他服务器的心跳

                        "lastHeartbeatRecv" : ISODate("2017-06-16T03:08:08.146Z"),

                        "pingMs" : 0,#心跳从当期服务器到达某个服务器的平均时间

                        "syncingTo" : "localhost:27017",#复制源

                        "configVersion" : 1

                    },

                ],

                "ok" : 1

            }

            rs.config() 查看配置信息

            {

                "_id" : "spock", #副本集名称

                "version" : 1, #版本号,没修改一次增加

                "members" : [ #成员信息数组(添加和修改时可以指定下列选项)

                    {

                        "_id" : 0, #成员ID

                        "host" : "localhost:27017", #成员地址

                        "arbiterOnly" : false, #是否是仲裁者(仲裁者就是起哄的,没有数据)

                        "buildIndexes" : true, #副本上边是否创建索引

                        "hidden" : false, #是否隐藏成员(只有优先级为0的才可以设置成隐藏)客户端无法将请求发送给他

                        "priority" : 1, #被选为master的优先级默认为1,0不参与竞选

                        "tags" : {

                           

                        },

                        "slaveDelay" : 0, #延迟复制时间(秒)(优先级为0才可以延迟)

                        "votes" : 1#投票数量(不要随便改)

                    },

                    ....

                ],

                "settings" : {

                    "chainingAllowed" : true,

                    "heartbeatTimeoutSecs" : 10,

                    "getLastErrorModes" : {

                       

                    },

                    "getLastErrorDefaults" : {

                        "w" : 1,

                        "wtimeout" : 0

                    }

                }

            }

            修改配置信息

            config = rs.config()

            config.members[1].host = ‘127.0.0.1:27057‘

            rs.reconfig(config)

           

            rs.add(‘localhost:27087‘) 向副本集中添加一个新的副本集

            rs.remove(‘localhost:27087‘)

           

            强制重新设置

            rs.reconfig( config, {" force" : true})

           

            将主节点降级为备份节点(降级时间100秒,100秒后如果没有主节点,可以重新申请竞选)

            rs.stepDown(second)

           

            强制备份节点在一段时间内始终处于备份状态(不参与竞选)

            rs.freeze( 10000)

           

            #查看复制源

            db.adminCommand({replSetGetStatus:1})[‘syncingTo‘]

            #修改复制源

            db.adminCommand({‘replSetSyncFrom‘:‘localhost:27027‘})

            #强制其他成员必须从主节点复制数据

            var config = rs.config()

            config.settings = config.settings || {}

            config.settings.allowChaining = false

            rs.reconfig(config)

            #增加oplog大小

            1,如果当前服务器是主节点,让它退位,以便让其他成员的数据能够尽快更新到与它一致。

            2,关闭当前服务器。

            3,将当前服务器以单机模式启动。

            4,临时将oplog中的最后一条insert操作保存到其他集合中

                uselocal

                //op:"i"用于查找最后一条Insert操作

                varcursor=db.oplog.rs.find({"op":"i"})

                varlastInsert=cursor.sort({"$natural":-1}).limit(1).next()

                db.tempLastOp.save(lastInsert)

                //确保保存成功,这非常重要!

                db.tempLastOp.findOne()

            5,删除当期oplog

                db.oplog.rs.drop()

            6,创建一个新的oplog;

                db.createCollection(‘oplog.rs‘,{‘capped‘:true,‘size‘:10000})

            7,将最后一条操作记录歇会oplog

                var temp = db.tempLastOp.findOne()

                db.oplog.rs.insert(temp)

                db.oplog.rs.findOne()

            8,最后,当期服务器作为副本启动

           

            从延迟备份节点恢复数据

            方法一

                1,关闭所有其他成员。

                2,删除其他成员数据目录中的所有数据

                3,重启所有成员,然后他们会自动从延迟库复制数据

            方法二

                1,关闭说有成员,包括延迟备份节点

                2,删除其他成员(除了延迟备份节点)的数据目录

                3,将延迟备份节点数据文件复制到其他服务器

                4,重启所有成员

   

 

    分片

        用途

        增加可用RAM

        增加可用磁盘空间

        减少单机负载

        处理单机无法承受的吞吐量

       

        配置服务器

            配置服务器相当于集群的大脑,保存着集群和分片的元数据,即各分片包含哪些数据的信息。

            mm.config内容

                logpath=/data/mongo_test/fuben/logm/mongodb.log

            配置服务器端口为:27019 (检查是否被占用)

            数据默认存放地址/data/configdb 手动创建

            开启配置服务器

                mongod --configsvr -f/usr/local/mongodb/db/mm.comfig

                --configsvr 指定mongodb为新配置服务器

               

            开启mongos 进程 默认监听27017端口

                mongos --configdb localhost:27019,...,... --logpath logmt/mongodb.log

                --configdb 指定配置服务器,可以指定多个,用,分开

               

            将副本转换为分片

                链接mongos服务

                    mongo admin --port 27017

                将以有副本添加到分片

                    sh.addShard(‘spock/localhost:27027,localhost:27037‘)

               

                向以有分片中添加分片(注意副本名不能重复)

                    sh.addShard(‘abc/localhost:28017‘)

                测试

                    在mongos链接中想test.goods集合中插入100条数据

                    for(var i = 0;i<100;i++){

                        db.goods.insert({‘name‘:‘goods‘+i,‘addtime‘:new Date()})

                    }

                    默认情况下数据会插入到第一个分片副本所在的服务器中,

                    而后添加的副本没有数据。

                    添加分片数据

                        再goods表上创建索引

                        db.goods.ensureIndex({‘name‘:1})

                        按索引建分片

                        sh.shardCollection(‘test.goods‘,{‘name‘:1})

                       

                    查看分片状态

                    sh.status()

Mongodb 副本与分配 学习笔记