groupadd g_mongo
useradd -d /var/mongodb -g g_mongo mongo
passwd mongo
xxxxxx
/var/mongodb/bin/mongo push_open --host 10.12.29.81 --port 40000 -u push -p --authenticationDatabase push_open
/var/mongodb/bin/mongo 10.12.30.25:3001/push_open -u push_device -p --authenticationDatabase push_open 58f53330234230
mongo --host 172.17.160.208 --port 20000 -u push_device -p push_device@123 --authenticationDatabase push_device
/var/mongodb/bin/mongo 172.17.160.208:20000/push_device -u push_device -p --authenticationDatabase push_device push_device@123
db.receipt_stat.find();
show collections
db.device.find({"deviceId":"5b6bff5b3dc4e6580c12241f","appId":"ZngnvJIM7wQusNtbqYnpH6XX"}).pretty()
db.sms_blacklist.find();
db.receipt_stat.find({"day":"20180726"})
show collections
db.auth("push_message","push_message123")
db.app_device.find({"registrationId":"CN_dc7bfcbdfa3e9400175b37f962b3fcf2"})
use push_message;
db.auth("push_device","push_device123");
db.push_task.find({"_id":"71172"}).pretty();
db.sms_blacklist.find().pretty();
db.app_device.find({"appId":"jCbBaqYIpP8eqr4iqYSqcqA1","createTime":{$gt:ISODate("2018-12-07T04:38:31.803Z")}}).limit(1).pretty()
db.receipt_stat.find({"day":"20190227"}, {total: 1, appId: 1, _id:0}).sort({total: -1})
db.receipt_stat.find({"day":"20190227"}, {total: 1, appId: 1, _id:0}).count()
mongoexport --host 10.13.30.141 --port 3100 -d push_device -c device --csv --out device.csv --fields _id,imei
db.app_device.getIndexes()
db.app_device.totalIndexSize()
db.runCommand({enablesharding:'push_sms'})
db.runCommand({shardcollection:'push_sms.sms_relation', key:{regId:1}})
日常使用的慢日志(system.profile)查询
#返回最近的10条记录
db.system.profile.find().limit(10).sort({ ts : -1 }).pretty()
#返回最慢的10条记录
db.system.profile.find().limit(10).sort({ millis : -1 }).pretty()
#返回大于5毫秒的慢操作
db.system.profile.find({ millis : { $gt : 5 } } ).pretty()
#返回所有的操作,除command类型的
db.system.profile.find( { op: { $ne : ‘command‘ } }).pretty()
#返回特定集合
db.system.profile.find( { ns : ‘mydb.test‘ } ).pretty()
#查看集合sites索引大小
db.sites.totalIndexSize()
#性能统计
/var/mongodb/bin/mongostat --host 10.12.30.25 --port 3001 -u root --authenticationDatabase admin root/c2ffcabd84301a31508681169f70231e
# 分片
将分片加入集群
在mongos中sh.addShard方法将分片加入分片集群
sh.addShard("push-bjsm-message-1/10.12.29.101:4000,10.12.29.102:4000,10.12.29.103:4000")
sh.addShard("push-bjsm-message-2/10.12.29.112:4000,10.12.29.113:4000,10.12.29.114:4000")
sh.addShard("push-bjsm-message-3/10.12.29.208:4000,10.12.29.203:4000,10.12.30.13:4000")
sh.addShard("push-bjsm-message-4/10.12.29.90:4000,10.12.29.91:4000,10.12.29.92:4000")
sh.addShard("push-bjsm-message-5/10.12.30.24:4000,10.12.30.25:4000,10.12.30.40:4000")
sh.addShard("push-bjsm-message-6/10.12.30.52:4000,10.12.30.56:4000,10.12.30.66:4000")
使用sh.status方法确认追加的shard是否正确追加了
开启分片功能:sh.enableSharding("库名")、sh.shardCollection("<database>.<collection>", { <key> : "hashed" } )
sh.enableSharding("push_open")
db.push_task.createIndex( { appId: 1,_id:1 } ,{background: true})
sh.shardCollection("push_open.push_task", { appId : 1 , _id:1 } )
db.notification.createIndex( { appId: 1,_id:1 } ,{background: true})
sh.shardCollection("push_open.notification", { appId : 1 , _id:1 } )
Demo
方法一 相对灵活
@Bean("statMongoClientURI")
public MongoClientURI statMongoClientURI(MongoConfig mongoConfig) {
String uri = mongoConfig.getStatDbUri();
MongoClientOptions.Builder optionsBuilder = MongoClientOptions.builder();
optionsBuilder.connectTimeout(mongoConfig.getStatDbConnectTimeout());
optionsBuilder.socketTimeout(mongoConfig.getStatDbSocketTimeout());
optionsBuilder.serverSelectionTimeout(mongoConfig.getStatDbSelectTimeout());
logger.info("statMongoClientURI:" + uri);
return new MongoClientURI(uri, optionsBuilder);
}
@Bean("statMongoDbFactory")
public MongoDbFactory statMongoDbFactory(@Qualifier("statMongoClientURI") MongoClientURI mongoClientURI) throws UnknownHostException {
return new SimpleMongoDbFactory(mongoClientURI);
}
@Bean("statMongoTemplate")
public MongoTemplate statMongoTemplate(@Qualifier("statMongoDbFactory") MongoDbFactory mongoDbFactory) {
MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory);
logger.info("statMongoTemplate initialized");
return mongoTemplate;
}
package com.xxxx.receipt.mongo.stat;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
@Repository
public class StatDaoImpl implements StatDao {
@Resource(name = "statMongoTemplate")
private MongoOperations statMongoTemplate;
@Override
public int update(String appId, String day, String field, long inc) throws Exception {
Criteria criteria = new Criteria();
criteria.andOperator(Criteria.where("appId").is(appId), Criteria.where("day").is(day));
return statMongoTemplate.upsert(
new Query(criteria),
new Update().inc(field, inc).set("updateTime", System.currentTimeMillis() / 1000),
StatEntity.class).getN();
}
}
方法二、相对简单
package com.xxxx.receipt.mongo;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
@Configuration
@EnableMongoRepositories(basePackages = "com.xxxx.receipt.mongo.app", mongoTemplateRef = "statMongoTemplate")
public class StatRepositoriesConfiguration {
}
package com.xxxx.receipt.mongo.app;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;
@Repository
public interface AppDeviceRepository extends MongoRepository<AppDeviceEntity, String> {
@Query(value="{'appId':?0, 'deviceId':?1}", fields = "{'_id':1}")
AppDeviceEntity findRegistrationId(String appId, String deviceId);
}
@Repository
public class AppDeviceDaoImpl implements AppDeviceDao {
@Resource
private AppDeviceRepository deviceRepository;
@Override
public AppDeviceEntity findRegistrationId(final String appId, final String deviceId) throws Exception {
return new Tracer<AppDeviceEntity>().execMethodWithTrace(new Tracer.Run<AppDeviceEntity>() {
@Override
public AppDeviceEntity doRun() throws RuntimeException {
return deviceRepository.findRegistrationId(appId, deviceId);
}
}, "findRegistrationId", appId + "|" + deviceId);
}
}
StatEntity
package com.xxxx.receipt.mongo.stat;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.util.Date;
@Document(collection = "receipt_stat")
public class StatEntity implements Serializable {
@Id
private String id;
private String appId;
private String day;
private String total;
private String success;
private String fail;
private Date createTime;
private Date updateTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
public String getDay() {
return day;
}
public void setDay(String day) {
this.day = day;
}
public String getTotal() {
return total;
}
public void setTotal(String total) {
this.total = total;
}
public String getSuccess() {
return success;
}
public void setSuccess(String success) {
this.success = success;
}
public String getFail() {
return fail;
}
public void setFail(String fail) {
this.fail = fail;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
https://stackoverflow.com/questions/16478101/spring-data-mongo-use-or-in-query
https://www.mkyong.com/mongodb/spring-data-mongodb-query-document/
https://stackoverflow.com/questions/36784017/set-mongo-timeout-in-spring-boot
https://www.cnblogs.com/t2xingzhe/p/3555268.html
https://stackoverflow.com/questions/41766929/spring-mongo-queries-set-custom-timeout
慢查询
https://blog.csdn.net/yisun123456/article/details/78274477
入门+原理
https://draveness.me/mongodb-wiredtiger/
https://cloud.tencent.com/developer/article/1116315
http://www.ttlsa.com/mongodb/how-mongodbs-journaling-works/