Mongodb 副本與分片 學習筆記

副本mongodb

        實例1 m1.config數組

            port=27017 #端口服務器

            replSet=spock #副本名稱隨便取app

            dbpath=/usr/local/mongodb/fuben/db1 #數據存放目錄測試

            logpath=/usr/local/mongodb/fuben/log1/mongodb.log #日誌目錄ui

        實例2 m2.config日誌

            port=27027code

            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()

相關文章
相關標籤/搜索