namedhao 发表于 2018-10-25 13:54:59

MongoDB数据量较大时如何构建索引--减少业务最少影响

  在数据量较大或请求量较大,直接建立索引对性能有显著影响时,可以利用复制集(数据量较大时一般为线上环境,使用复制集为必然选择或者使用分片.)中部分机器宕机不影响复制集工作的特性,继而建立索引。
  备注:添加索引的表使用WT引擎,数据量有1.5亿左右。
  1. 副本集配置参数
  节点1:
  $ more shard1.conf
  dbpath=/data/users/mgousr01/mongodb/dbdata/shard1_1
  logpath=/data/users/mgousr01/mongodb/logs/shard1_1.log
  pidfilepath=/data/users/mgousr01/mongodb/dbdata/shard1_1/shard1-1.pid
  directoryperdb=true
  logappend=true
  replSet=shard1
  shardsvr=true
  bind_ip=127.0.0.1,x.x.x.x
  port=37017
  oplogSize=9024
  fork=true
  #noprealloc=true
  #auth=true
  journal=true
  profile=1
  slowms=10
  maxConns=12000
  storageEngine = wiredTiger
  wiredTigerCacheSizeGB=96
  #clusterAuthMode=keyFile
  keyFile=/data/users/mgousr01/mongodb/etc/keyFilers0.key
  wiredTigerDirectoryForIndexes=on
  wiredTigerCollectionBlockCompressor=zlib
  wiredTigerJournalCompressor=zlib
  节点2:
  $ more shard2.conf
  dbpath=/data/users/mgousr01/mongodb/dbdata/shard2_1
  logpath=/data/users/mgousr01/mongodb/logs/shard2_1.log
  pidfilepath=/data/users/mgousr01/mongodb/dbdata/shard2_1/shard2-1.pid
  directoryperdb=true
  logappend=true
  replSet=shard1
  shardsvr=true
  bind_ip=127.0.0.1,x.x.x.x
  port=37017
  oplogSize=9024
  fork=true
  #noprealloc=true
  #auth=true
  journal=true
  profile=1
  slowms=10
  maxConns=12000
  storageEngine = wiredTiger
  wiredTigerCacheSizeGB=96
  #clusterAuthMode=keyFile
  keyFile=/data/users/mgousr01/mongodb/etc/keyFilers0.key
  wiredTigerDirectoryForIndexes=on
  wiredTigerCollectionBlockCompressor=zlib
  wiredTigerJournalCompressor=zlib
  节点3:
  $ more shard3.conf
  dbpath=/data/users/mgousr01/mongodb/dbdata/shard3_1
  logpath=/data/users/mgousr01/mongodb/logs/shard3_1.log
  pidfilepath=/data/users/mgousr01/mongodb/dbdata/shard3_1/shard3-1.pid
  directoryperdb=true
  logappend=true
  replSet=shard1
  shardsvr=true
  bind_ip=127.0.0.1,x.x.x.x
  port=37017
  oplogSize=9024
  fork=true
  #noprealloc=true
  #auth=true
  journal=true
  profile=1
  slowms=10
  maxConns=12000
  storageEngine = wiredTiger
  wiredTigerCacheSizeGB=96
  #clusterAuthMode=keyFile
  keyFile=/data/users/mgousr01/mongodb/etc/keyFilers0.key
  wiredTigerDirectoryForIndexes=on
  wiredTigerCollectionBlockCompressor=zlib
  wiredTigerJournalCompressor=zlib
  2. 启动mongodb
  mongod -f   启动
  3. 配置副本集命令(登陆任意一台主机)
  config={_id:'shard1',members:[{_id:0,host:'x.x.x.x:37017',priority:1,tags:{'use':'xxx'}},{_id:1,host:'x.x.x.x:37017',priority:1,tags:{'use':'xxx'}},{_id:2,host:'x.x.x.x:37017',priority:1,tags:{'use':'xxx'}}]}
  rs.initiate(config)
  4. 在primary库进行写操作模拟线上
  for(i=0;i use chicago
  Build the Index
  > db.users.createIndex({username:1,created:1},{unique:true},{name:"username_created_unique"},{background:true})
  【建议以后创建索引 要有命名规范】
  (5)查看索引信息
  > db.users.getIndexes()
  [
  {
  "v" : 1,
  "key" : {
  "_id" : 1
  },
  "name" : "_id_",
  "ns" : "chicago.users"
  },
  {
  "v" : 1,
  "unique" : true,
  "key" : {
  "username" : 1,
  "created" : 1
  },
  "name" : "username_1_created_1",
  "ns" : "chicago.users"
  }
  ]
  (6)再次停掉副本集的mongod进程
  $ pwd
  /data/users/mgousr01/mongodb/etc
  $ mongod -f shard3.conf --shutdown
  (7)启动mongod进程
  将shard3.conf配置文件的replSet=shard1注释去掉;然后启动
  mongod -f shard3.conf
  mongo ip:37017/admin
  启动后,会将节点加入到副本集中,然后同步primary数据,secondary上的索引不会对主造成影响导致主从不一致状况发生。
  7.对第二个secondary副本操作--节点2
  重复第6步即可。
  8.构建所有secondarys索引大致步骤
  For each secondary in the set, build an index according to the following steps:
  (1)Stop One Secondary
  (2)Build the Index
  (3)Restart the Program mongod
  9.构建primary节点索引
  (1)登陆到主节点
  mongo ip:37017/admin
  (2) 将主节点降级
  shard1:PRIMARY> rs.stepDown(30)
  2016-04-19T12:49:44.423+0800 I NETWORKDBClientCursor::init call() failed
  2016-04-19T12:49:44.426+0800 E QUERY    Error: error doing query: failed
  at DBQuery._exec (src/mongo/shell/query.js:83:36)
  at DBQuery.hasNext (src/mongo/shell/query.js:240:10)
  at DBCollection.findOne (src/mongo/shell/collection.js:187:19)
  at DB.runCommand (src/mongo/shell/db.js:58:41)
  at DB.adminCommand (src/mongo/shell/db.js:66:41)
  at Function.rs.stepDown (src/mongo/shell/utils.js:1006:15)
  at (shell):1:4 at src/mongo/shell/query.js:83
  2016-04-19T12:49:44.427+0800 I NETWORKtrying reconnect to xxxx failed
  2016-04-19T12:49:44.428+0800 I NETWORKreconnect xxxx ok
  shard1:SECONDARY>
  降级命令执行后,会主动变成secondary节点。上述两个secondary节点会有一个节点选举成为primary节点。
  (3)后续构建索引的方法和第6步一样。
  说明:
  让primary降级:rs.stepDown(downseconds=60),primary降级期间,它不会参与选举,如果降级时限过后,副本集还是没有primary,它会参与选举。
  Preventing Electoins
  让secondaries保持状态:rs.freeze(seconds),这样就可以在这个时间内对primary做处理,而不用担心除非选举。
  解除状态锁定:rs.freeze(0)。

页: [1]
查看完整版本: MongoDB数据量较大时如何构建索引--减少业务最少影响