一、MongoDB数据库参数配置
1、推荐使用mongodbcfgproperties配置,则在构造MongoDBService对象的时候只需调用无参构造方法即可自动完成配置。
2、如果没有通过mongodbcfgproperties,会采用程序指定的默认配置。
// 定义默认配置,1、IP地址 2、端口号 3、用户名 4、密码 5、配置文件位置名 6、数据库名 private static final String MONGODB_ADDRESS = "127001"; private static final int MONGODB_PORT = 27017; private static final String MONGODB_USERNAME = "root"; private static final String MONGODB_PASSWORD = ""; private static final String MONGODB_RESOURCE_FILE = "mongodbcfgproperties"; private static final String MONGODB_DBNAME = "test"; private static final String MONGODB_COLLECTIONNAME = "test";3、通过有参构造方法构造MongoDBService对象或通过get/set方法,指定数据库及集合,优先级最高。
//有参构造方法,指定数据库名与集合名 public MongoDBServiceImpl(String dbName, String collName) { thisdbName = dbName; thiscollName = collName; try { db = getDb(); } catch (Throwable e) { eprintStackTrace(); } } //无参构造方法,返回配置文件配置的数据库对象引用,如果配置文件中没有设置则返回默认数据库对象引用 public MongoDBServiceImpl() { getDb(); } / 获取数据库对象,3种情况(优先级从高到低):<span style="white-space: pre"> </span> 1、构造方法指定2、配置文件指定3、默认数据库<span style="white-space: pre"> </span> (情况2、3在MongoDButil中设置) / public DB getDb() { if (thisdb == null) { if (thisdbName == null) { thisdb = MongoDBUtilgetDB(); } else { thisdb = MongoDBUtilgetDBByName(thisdbName); } } return thisdb; } / 获取集合对象,3种情况(优先级从高到低): 1、构造方法指定2、配置文件指定3、默认数据库 (情况2、3在MongoDButil中设置) / public DBCollection getCollection() { if(thiscollName != null){ return dbgetCollection(thiscollName); } else { return MongoDBUtilgetDBCollection(); } }二、方法简介(具体实现参看MongoDBServiceImpl接口实现类)
1、获取基本信息或对象:
(1)、获取数据库名: getDbName()
(2)、设置数据库名(指定数据库): setDbName(String dbName)
(3)、获取集合名: getCollName()
(4)、设置集合名(指定集合): setCollName(String collName)
(5)、获取数据库对象: getDb()
2、数据插入方式:
(1)、插入单条数据: insert(DBObject obj)
(2)、插入多条数据: insertBatch(List list)void
3、数据删除方式:
(1)、删除单条数据: delete(DBObject obj)
(2)、删除多条数据: deleteBatch(List list)
4、数量统计方式:
(1)、获取集合中数据数量: getCollectionCount()
(2)、获取符合条件的数据数量: getCount(DBObject obj)
5、查找数据:
(1)、查找所有数据: findAll()
(2)、查找符合条件的数据: find(DBObject obj)
(3)、查找符合条件的数据并排序: find(DBObject query, DBObject sort)
(4)、查找符合条件的指定数量的数据并排序:find(DBObject query, DBObject sort, int start, int limit)
(5)、由ID查找数据: getById(String id)
6、更新数据 :update(DBObject setFields, DBObject whereFields) void
7、打印List: printListDBObj(List list)
测试代码:(@Test)
public class testMongoService { //使用mongodbcfgproperties中配置的数据库与集合,如未指定,使用MongoDBUtil中默认的数据库与集合 MongoDBService mongoDBService1 = new MongoDBServiceImpl(); //测试插入数据 @Test public void testInsert(){ //数据一,包括用户名、密码,地址信息(省份、城市),爱好[…] BasicDBList dbList1 = new BasicDBList(); dbList1add("basketball"); dbList1add("music"); dbList1add("web"); DBObject dbObject1 = new BasicDBObject("username","insert1") append("age", 18) append("address", new BasicDBObject("province","广东")append("city", "广州")) append("favourite", dbList1); //数据二 BasicDBList dbList2 = new BasicDBList(); dbList2add("football"); dbList2add("music"); DBObject dbObject2 = new BasicDBObject("username","insert2") append("age", 18) append("address", new BasicDBObject("province","陕西")append("city", "西安")) append("favourite", dbList2); //数据三 BasicDBList dbList3 = new BasicDBList(); dbList3add("Linux"); DBObject dbObject3 = new BasicDBObject("username","insert3") append("age", 18) append("address", new BasicDBObject("province","河北")append("city", "保定")) append("favourite", dbList3); //数据四 BasicDBList dbList4 = new BasicDBList(); dbList4add("swim"); dbList4add("android"); DBObject dbObject4 = new BasicDBObject("username","insert4") append("age", 18) append("address", new BasicDBObject("province","四川")append("city", "成都")) append("favourite", dbList4); //数据五 DBObject dbObject5 = new BasicDBObject("username", "insert5") append("age", 28) append("address", new BasicDBObject("city", "杭州")); mongoDBService1printListDBObj(mongoDBService1findAll()); Systemoutprintln("——————————————————insert collection——————————————————"); List<dbobject> list = new ArrayList<dbobject>(); listadd(dbObject1); listadd(dbObject2); listadd(dbObject3); listadd(dbObject5); mongoDBService1insertBatch(list); Systemoutprintln("——————————————————insert one——————————————————"); mongoDBService1insert(dbObject4); mongoDBService1printListDBObj(mongoDBService1findAll()); } //测试查询数据 @Test public void testFind(){ DBObject dbObject = new BasicDBObject("username","insert1"); Systemoutprintln("数量:" + mongoDBService1getCollectionCount()); Systemoutprintln("username=java的数据数量:" + mongoDBService1getCount(dbObject)); Systemoutprintln("——————————————————find all——————————————————"); mongoDBService1printListDBObj(mongoDBService1findAll()); Systemoutprintln("——————————————————find obj——————————————————"); mongoDBService1printListDBObj(mongoDBService1find(dbObject)); Systemoutprintln("——————————————————find sort——————————————————"); mongoDBService1printListDBObj(mongoDBService1find(new BasicDBObject(), new BasicDBObject("age", 1))); Systemoutprintln("——————————————————find sort limit——————————————————"); mongoDBService1printListDBObj(mongoDBService1find(new BasicDBObject(), new BasicDBObject("age", 1), 1, 2)); } //测试数据更新 @Test public void testUpdate(){ BasicDBObject newDocument = new BasicDBObject("$set",new BasicDBObject("age",11)); BasicDBObject searchQuery = new BasicDBObject()append("username", "insert2"); mongoDBService1printListDBObj(mongoDBService1find(searchQuery)); Systemoutprintln("——————————————————update——————————————————"); mongoDBService1update(newDocument, searchQuery); mongoDBService1printListDBObj(mongoDBService1find(searchQuery)); } //测试数据删除 @Test public void testDelete(){ DBObject dbObject1 = new BasicDBObject("username", "insert1"); DBObject dbObject2 = new BasicDBObject("username", "insert2"); DBObject dbObject3 = new BasicDBObject("username", "insert3"); DBObject dbObject4 = new BasicDBObject("username", "insert4"); DBObject dbObject5 = new BasicDBObject("username", "insert5"); List<dbobject> list = new ArrayList<dbobject>(); listadd(dbObject1); listadd(dbObject2); listadd(dbObject3); listadd(dbObject4); mongoDBService1printListDBObj(mongoDBService1findAll()); Systemoutprintln("——————————————————delete list——————————————————"); mongoDBService1deleteBatch(list); Systemoutprintln("——————————————————delete one——————————————————"); mongoDBService1delete(dbObject5); //Systemoutprintln("——————————————————delete all——————————————————"); //mongoDBService1delete(new BasicDBObject()); mongoDBService1printListDBObj(mongoDBService1findAll()); }}</dbobject></dbobject></dbobject></dbobject>测试结果:
源代码:(完整项目文件下载链接:点击打开链接)
MongoDBServiceImpljava
public class MongoDBServiceImpl implements MongoDBService { private String dbName; private String collName; private DB db; //有参构造方法,指定数据库名与集合名 public MongoDBServiceImpl(String dbName, String collName) { thisdbName = dbName; thiscollName = collName; try { db = getDb(); } catch (Throwable e) { eprintStackTrace(); } } //无参构造方法,返回配置文件配置的数据库对象引用,如果配置文件中没有设置则返回默认数据库对象引用 public MongoDBServiceImpl() { getDb(); } / 获取数据库对象,3种情况(优先级从高到低): 1、构造方法指定2、配置文件指定3、默认数据库 (情况2、3在MongoDButil中设置) / public DB getDb() { if (thisdb == null) { if (thisdbName == null) { thisdb = MongoDBUtilgetDB(); } else { thisdb = MongoDBUtilgetDBByName(thisdbName); } } return thisdb; } / 获取集合对象,3种情况(优先级从高到低): 1、构造方法指定2、配置文件指定3、默认数据库 (情况2、3在MongoDButil中设置) / public DBCollection getCollection() { if(thiscollName != null){ return dbgetCollection(thiscollName); } else { return MongoDBUtilgetDBCollection(); } } public DBObject map2Obj(Map<string, object=""> map) { DBObject obj = new BasicDBObject(); if (mapcontainsKey("class") && mapget("class") instanceof Class) mapremove("class"); objputAll(map); return obj; } //插入数据 public void insert(DBObject obj) { getCollection()insert(obj); } //插入多条数据 public void insertBatch(List<dbobject> list) { if (list == null || listisEmpty()) { return; } List<dbobject> listDB = new ArrayList<dbobject>(); for (int i = 0; i < listsize(); i++) { listDBadd(listget(i)); } getCollection()insert(listDB); } //删除数据 public void delete(DBObject obj) { getCollection()remove(obj); } //删除多条数据 public void deleteBatch(List<dbobject> list) { if (list == null || listisEmpty()) { return; } for (int i = 0; i < listsize(); i++) { getCollection()remove(listget(i)); } } //获取集合中的数据数量 public long getCollectionCount() { return getCollection()getCount(); } //查找符合条件的数据数量 public long getCount(DBObject obj) { if (obj != null) return getCollection()getCount(obj); return getCollectionCount(); } //查找符合条件的数据 public List<dbobject> find(DBObject obj) { DBCursor cur = getCollection()find(obj); return DBCursor2list(cur); } //查找符合条件的数据并排序 @Override public List<dbobject> find(DBObject query, DBObject sort) { DBCursor cur; if (query != null) { cur = getCollection()find(query); } else { cur = getCollection()find(); } if (sort != null) { cursort(sort); } return DBCursor2list(cur); } //查找符合条件的数据并排序,规定数据个数 @Override public List<dbobject> find(DBObject query, DBObject sort, int start, int limit) { DBCursor cur; if (query != null) { cur = getCollection()find(query); } else { cur = getCollection()find(); } if (sort != null) { cursort(sort); } if (start == 0) { curbatchSize(limit); } else { curskip(start)limit(limit); } return DBCursor2list(cur); } //将DBCursor转化为list<dbobject> private List<dbobject> DBCursor2list(DBCursor cur) { List<dbobject> list = new ArrayList<dbobject>(); if (cur != null) { list = curtoArray(); } return list; } //更新数据 public void update(DBObject setFields, DBObject whereFields) { getCollection()updateMulti(whereFields, setFields); } //查询集合中所有数据 public List<dbobject> findAll() { DBCursor cur = getCollection()find(); List<dbobject> list = new ArrayList<dbobject>(); if (cur != null) { list = curtoArray(); } return list; } //由ID获取数据 public DBObject getById(String id) { DBObject obj = new BasicDBObject(); objput("_id", new ObjectId(id)); DBObject result = getCollection()findOne(obj); return result; } public String getDbName() { return dbName; } public void setDbName(String dbName) { thisdbName = dbName; thisdb = MongoDBUtilgetDBByName(thisdbName); } public String getCollName() { return collName; } public void setCollName(String collName) { thiscollName = collName; } @Override public void printListDBObj(List<dbobject> list) { // TODO Auto-generated method stub for(DBObject dbObject: list){ Systemoutprintln(dbObject); } } }</dbobject></dbobject></dbobject></dbobject></dbobject></dbobject></dbobject></dbobject></dbobject></dbobject></dbobject></dbobject></dbobject></dbobject></dbobject></string,>MongoDBUtiljava
public class MongoDBUtil { // 定义默认配置,1、IP地址 2、端口号 3、用户名 4、密码 5、配置文件位置名 6、数据库名 private static final String MONGODB_ADDRESS = "127001"; private static final int MONGODB_PORT = 27017; private static final String MONGODB_USERNAME = "root"; private static final String MONGODB_PASSWORD = ""; private static final String MONGODB_RESOURCE_FILE = "mongodbcfgproperties"; private static final String MONGODB_DBNAME = "test"; private static final String MONGODB_COLLECTIONNAME = "test"; // 定义静态变量,1、Mongo对象(代表数据库连接)2、DB对象(代表数据库)3、集合名4、数据库相关配置映射集合5、已获取的数据库连接 private static Mongo mongo; private static DB db; private static DBCollection collection; private static Map<string, string=""> cfgMap = new HashMap<string, string="">(); private static Hashtable<string, db=""> mongoDBs = new Hashtable<string, db="">(); / 初始化Mongo的数据库 / static { init(); } / 获取配置文件中配置的DB对象 / public static DB getDB() { return db; } / 获取配置文件中配置的DBCollection对象 / public static DBCollection getDBCollection() { return collection; } / 根据数据库名称,得到数据库 如果不存在,则创建一个该名称的数据库,并设置用户名和密码为配置文件中的参数值 @param dbName @return DB / @SuppressWarnings("deprecation") public static DB getDBByName(String dbName) { DB db = mongogetDB(dbName); if (!mongoDBscontains(db)) { Systemoutprintln("add"); dbaddUser(cfgMapget("mongodbusername"), cfgMapget("mongodbpassword")toCharArray()); mongoDBsput(dbName, db); } return db; } // ————————————————————————————————————初始化过程———————————————————————————————————— / 获取配置文件mongedbcfgproperties的文件对象 / public static File getConfigFile() { String path = MongoDBUtilclassgetResource("/")getPath(); String fileName = path + MONGODB_RESOURCE_FILE; Systemoutprintln(fileName); File file = new File(fileName); if (fileexists()) { return file; } return null; } / 通过mongedbcfgproperties配置文件初始化配置映射集合,如果没有编写配置文件,则加载程序指定的默认配置 / @SuppressWarnings("unchecked") private static void initCfgMap() { File file = getConfigFile(); if (file != null) { Properties p = new Properties(); try { pload(new FileInputStream(file)); for (Enumeration enu = ppropertyNames(); enuhasMoreElements();) { String key = (String) enunextElement(); String value = (String) pgetProperty(key); cfgMapput(key, value); } } catch (IOException e) { Systemoutprintln("加载Mongo配置文件失败!"); eprintStackTrace(); } } else { // 如果没有编写配置文件,则加载默认配置 cfgMapput("mongodbaddress", MONGODB_ADDRESS); cfgMapput("mongodbport", StringvalueOf(MONGODB_PORT)); cfgMapput("mongodbusername", MONGODB_USERNAME); cfgMapput("mongodbpassword", MONGODB_PASSWORD); cfgMapput("mongodbdbname", MONGODB_DBNAME); cfgMapput("mongodbcollectionname", MONGODB_COLLECTIONNAME); } } / 初始化Mongo的数据库(将db指向相应对象引用,将collection指向相应对象引用,通过mongoDBs记录现有数据库对象) / @SuppressWarnings("deprecation") private static void init() { initCfgMap(); try { String address = cfgMapget("mongodbaddress"); int port = IntegerparseInt(cfgMapget("mongodbport")toString()); String dbName = cfgMapget("mongodbdbname"); String username = cfgMapget("mongodbusername"); String password = cfgMapget("mongodbpassword"); String collectionName = cfgMapget("mongodbcollectionname"); mongo = new Mongo(address, port); if (dbName != null && !""equals(dbName)) { db = mongogetDB(dbName); if (username != null && !""equals(username)) { dbaddUser(username, passwordtoCharArray()); if (collectionName != null && !""equals(collectionName)) { collection = dbgetCollection(collectionName); } } mongoDBsput(dbName, db); } } catch (Exception e) { eprintStackTrace(); } } }
MongoDB是一款为web应用程序和互联网基础设施设计的数据库管理系统。没错MongoDB就是数据库,是NoSQL类型的数据库。
(1)MongoDB提出的是文档、集合的概念,使用BSON(类JSON)作为其数据模型结构,其结构是面向对象的而不是二维表,存储一个用户在MongoDB中是这样子的。
使用这样的数据模型,使得MongoDB能在生产环境中提供高读写的能力,吞吐量较于mysql等SQL数据库大大增强。
(2)易伸缩,自动故障转移。易伸缩指的是提供了分片能力,能对数据集进行分片,数据的存储压力分摊给多台服务器。自动故障转移是副本集的概念,MongoDB能检测主节点是否存活,当失活时能自动提升从节点为主节点,达到故障转移。
(3)数据模型因为是面向对象的,所以可以表示丰富的、有层级的数据结构,比如博客系统中能把“评论”直接怼到“文章“的文档中,而不必像myqsl一样创建三张表来描述这样的关系。
(1)文档数据类型
SQL类型的数据库是正规化的,可以通过主键或者外键的约束保证数据的完整性与唯一性,所以SQL类型的数据库常用于对数据完整性较高的系统。MongoDB在这一方面是不如SQL类型的数据库,且MongoDB没有固定的Schema,正因为MongoDB少了一些这样的约束条件,可以让数据的存储数据结构更灵活,存储速度更加快。
(2)即时查询能力
MongoDB保留了关系型数据库即时查询的能力,保留了索引(底层是基于B tree)的能力。这一点汲取了关系型数据库的优点,相比于同类型的NoSQL redis 并没有上述的能力。
(3)复制能力
MongoDB自身提供了副本集能将数据分布在多台机器上实现冗余,目的是可以提供自动故障转移、扩展读能力。
(4)速度与持久性
MongoDB的驱动实现一个写入语义 fire and forget ,即通过驱动调用写入时,可以立即得到返回得到成功的结果(即使是报错),这样让写入的速度更加快,当然会有一定的不安全性,完全依赖网络。
MongoDB提供了Journaling日志的概念,实际上像mysql的bin-log日志,当需要插入的时候会先往日志里面写入记录,再完成实际的数据 *** 作,这样如果出现停电,进程突然中断的情况,可以保障数据不会错误,可以通过修复功能读取Journaling日志进行修复。
(5)数据扩展
MongoDB使用分片技术对数据进行扩展,MongoDB能自动分片、自动转移分片里面的数据块,让每一个服务器里面存储的数据都是一样大小。
MongoDB核心服务器主要是通过mongod程序启动的,而且在启动时不需对MongoDB使用的内存进行配置,因为其设计哲学是内存管理最好是交给 *** 作系统,缺少内存配置是MongoDB的设计亮点,另外,还可通过mongos路由服务器使用分片功能。
MongoDB的主要客户端是可以交互的js shell 通过mongo启动,使用js shell能使用js直接与MongoDB进行交流,像使用sql语句查询mysql数据一样使用js语法查询MongoDB的数据,另外还提供了各种语言的驱动包,方便各种语言的接入。
mongodump和mongorestore,备份和恢复数据库的标准工具。输出BSON格式,迁移数据库。
mongoexport和mongoimport,用来导入导出JSON、CSV和TSV数据,数据需要支持多格式时有用。mongoimport还能用与大数据集的初始导入,但是在导入前顺便还要注意一下,为了能充分利用好mongoDB通常需要对数据模型做一些调整。
mongosniff,网络嗅探工具,用来观察发送到数据库的 *** 作。基本就是把网络上传输的BSON转换为易于人们阅读的shell语句。
因此,可以总结得到,MongoDB结合键值存储和关系数据库的最好特性。因为简单,所以数据极快,而且相对容易伸缩还提供复杂查询机制的数据库。MongoDB需要跑在64位的服务器上面,且最好单独部署,因为是数据库,所以也需要对其进行热备、冷备处理。
因为本篇文章不是API手册,所有这里对shell的使用也是基础的介绍什么功能可以用什么语句,主要是为了展示使用MongoDB shell的方便性,如果需要知道具体的MongoDB shell语法可以查阅官方文档。
创建数据库并不是必须的 *** 作,数据库与集合只有在第一次插入文档时才会被创建,与对数据的动态处理方式是一致的。简化并加速开发过程,而且有利于动态分配命名空间。如果担心数据库或集合被意外创建,可以开启严格模式。
以上的命令只是简单实例,假设如果你之前没有学习过任何数据库语法,同时开始学sql查询语法和MongoDB 查询语法,你会发现哪一个更简单呢?如果你使用的是java驱动去 *** 作MongoDB,你会发现任何的查询都像Hibernate提供出来的查询方式一样,只要构建好一个查询条件对象,便能轻松查询(接下来会给出示例),博主之前熟悉ES6,所以入手MongoDB js shell完成没问题,也正因为这样简洁,完善的查询机制,深深的爱上了MongoDB。
使用java驱动链接MongoDB是一件非常简单的事情,简单的引用,简单的做增删改查。在使用完java驱动后我才发现spring 对MongoDB 的封装还不如官方自身提供出来的东西好用,下面简单的展示一下使用。
这里只举例了简单的链接与简单的MongoDB *** 作,可见其 *** 作的容易性。使用驱动时是基于TCP套接字与MongoDB进行通信的,如果查询结果较多,恰好无法全部放进第一服务器中,将会向服务器发送一个getmore指令获取下一批查询结果。
插入数据到服务器时间,不会等待服务器的响应,驱动会假设写入是成功的,实际是使用客户端生成对象id,但是该行为可以通过配置配置,可以通过安全模式开启,安全模式可以校验服务器端插入的错误。
要清楚了解MongoDB的基本数据单元。在关系型数据库中有带列和行的数据表。而MongoDB数据的基本单元是BSON文档,在键值中有指向不定类型值的键,MongoDB拥有即时查询,但不支持联结 *** 作,简单的键值存储只能根据单个键来获取值,不支持事务,但支持多种原子更新 *** 作。
如读写比是怎样的,需要何种查询,数据是如何更新的,会不会存在什么并发问题,数据结构化的程度是要求高还是低。系统本身的需求决定mysql还是MongoDB。
在关于schema 的设计中要注意一些原则,比如:
数据库是集合的逻辑与物理分组,MongoDB没有提供创建数据库的语法,只有在插入集合时,数据库才开始建立。创建数据库后会在磁盘分配一组数据文件,所有集合、索引和数据库的其他元数据都保存在这些文件中,查阅数据库使用磁盘状态可通过。
集合是结构上或概念上相似得文档的容器,集合的名称可以包含数字、字母或 符号,但必须以字母或数字开头,完全。
限定集合名不能超过128个字符,实际上 符号在集合中很有用,能提供某种虚拟命名空间,这是一种组织上的原则,和其他集合是一视同仁的。在集合中可以使用。
其次是键值,在MongoDB里面所有的字符串都是UTF-8类型。数字类型包括double、int、long。日期类型都是UTC格式,所以在MongoDB里面看到的时间会比北京时间慢8小时。整个文档大小会限制在16m以内,因为这样可以防止创建难看的数据类型,且小文档可以提升性能,批量插入文档理想数字范围是10~200,大小不能超过16MB。
(1)索引能显著减少获取文档的所需工作量,具体的对比可以通过 explain()方法进行对比
(2)解析查询时MongoDB通过最优计划选择一个索引进行查询,当没有最适合索引时,会先不同的使用各个索引进行查询,最终选出一个最优索引做查询
(3)如果有一个a-b的复合索引,那么仅针对a的索引是冗余的
(4)复合索引里的键的顺序是很重要的
(1)单键索引
(2)复合索引
(3)唯一性索引
(4)稀疏索引
如索引的字段会出现null的值,或是大量文档都不包含被索引的键。
如果数据集很大时,构建索引将会花费很长的时间,且会影响程序性能,可通过
当使用 mongorestore 时会重新构建索引。当曾经执行过大规模的删除时,可使用
对索引进行压缩,重建。
(1)查阅慢查询日志
(2)分析慢查询
注意新版本的MongoDB 的explain方法是需要参数的,不然只显示普通的信息。
本节同样主要简单呈现MongoDB副本集搭建的简易性,与副本集的强壮性,监控容易性
提供主从复制能力,热备能力,故障转移能力
实际上MongoDB对副本集的 *** 作跟mysql主从 *** 作是差不多的,先看一下mysql的主从数据流动过程
而MongoDB主要依赖的日志文件是oplog
写 *** 作先被记录下来,添加到主节点的oplog里。与此同时,所有从结点复制oplog。首先,查看自己oplog里最后一条的时间戳;其次,查询主节点oplog里所有大于此时间戳的条目;最后,把那些条目添加到自己的oplog里并应用到自己的库里。从节点使用长轮询立即应用来自主结点oplog的新条目。
当遇到以下情况,从节点会停止复制
local数据库保存了所有副本集元素据和oplog日志
可以使用以下命令查看复制情况
每个副本集成员每秒钟ping一次其他所有成员,可以通过rsstatus()看到节点上次的心跳检测时间戳和 健康 状况。
这个点没必要过多描述,但是有一个特殊场景,如果从节点和仲裁节点都被杀了,只剩下主节点,他会把自己降级成为从节点。
如果主节点的数据还没有写到从库,那么数据不能算提交,当该主节点变成从节点时,便会触发回滚,那些没写到从库的数据将会被删除,可以通过rollback子目录中的BSON文件恢复回滚的内容。
(1)使用单节点链接
只能链接到主节点,如果链接到从节点的话,会被拒绝写入 *** 作,但是如果没有使用安全模式,因为mongo的fire and forget 特性,会把拒绝写入的异常给吃掉。
(2)使用副本集方式链接
能根据写入的情况自动进行故障转移,但是当副本集进行新的选举时,还是会出现故障,如果不使用安全模式,依旧会出现写不进去,但现实成功的情况。
分片是数据库切分的一个概念实现,这里也是简单总结为什么要使用分片以及分片的原理, *** 作。
当数据量过大,索引和工作数据集占用的内存就会越来越多,所以需要通过分片负载来解决这个问题
(1)分片组件
(2)分片的核心 *** 作
分片一个集合:分片是根据一个属性的范围进行划分的,MongoDB使用所谓的分片键让每个文档在这些范围里找到自己的位置
块:是位于一个分片中的一段连续的分片键范围,可以理解为若干个块组成分片,分片组成MongoDB的全部数据
(3)拆分与迁移
块的拆分:初始化时只有一个块,达到最大块尺寸64MB或100000个文档就会触发块的拆分。把原来的范围一分为二,这样就有了两个块,每个块都有相同数量的文档。
迁移:当分片中的数据大小不一时会产生迁移的动作,比如分片A的数据比较多,会将分片A里面的一些块转移到分片B里面去。分片集群通过在分片中移动块来实现均衡,是由名为均衡器的软件进程管理的,任务是确保数据在各个分片中保持均匀分布,当集群中拥有块最多的分片与拥有块最少分片的块差大于8时,均衡器就会发起一次均衡处理。
启动两个副本集、三个配置服务器、一个mongos进程
配置分片
(1)分片查询类型
(2)索引
分片集合只允许在_id字段和分片键上添加唯一性索引,其他地方不行,因为这需要在分片间进行通信,实施起来很复杂。
当创建分片时,会根据分片键创建一个索引。
(1)分片键是不可修改的、分片键的选择非常重要
(2)低效的分片键
(3)理想的分片键
(1)部署拓扑
根据不同的数据中心划分
这里写描述
(2)最低要求
(3)配置的注意事项
需要估计集群大小,可使用以下命令对现有集合进行分片处理
(4)备份分片集群
备份分片时需要停止均衡器
(1)部署架构
使用64位机器、32位机器会制约mongodb的内存,使其最大值为15GB
(2)cpu
mongodb 只有当索引和工作集都可放入内存时,才会遇到CPU瓶颈,CPU在mongodb使用中的作用是用来检索数据,如果看到CPU使用饱和的情况,可以通过查询慢查询日志,排查是不是查询的问题导致的,如果是可以通过添加索引来解决问题
mongodb写入数据时会使用到CPU,但是mongodb写入时间一次只用到一个核,如果有频繁的写入行为,可以通过分片来解决这个问题
(3)内存
大内存是mongodb的保障,如果工作集大小超过内存,将会导致性能下降,因为这将会增加数据加载入内存的动作
(4)硬盘
mongodb默认每60s会与磁盘强制同步一次,称为后台刷新,会产生I/O *** 作。在重启时mongodb会将磁盘里面的数据加载至内存,高速磁盘将会减少同步的时间
(5)文件系统
使用ext4 和 xfs 文件系统
禁用最后访问时间
(6)文件描述符
linux 默认文件描述符是1024,需要大额度的提升这个额度
(7)时钟
mongodb各个节点服务器之间使用ntp服务器
(1)绑定IP
启动时使用 - -bind_ip 命令
(2)身份验证
启动时使用 - -auth 命令
(3)副本集身份认证
使用keyFile,注意keyFile文件的权限必须是600,不然会启动不起来
(1)拓扑结构
搭建副本集至少需要两个节点,其中仲裁结点不需要有自己的服务器
(2)Journaling日志
写数据时会先写入日志,而此时的数据也不是直接写入硬盘,而是写入内存
但是Journaling日志会消耗内存,所以可以在主库上面关闭,在从库上面启动
可以单独为Journaling日志使用一块固态硬盘
在插入时,可以通过驱动确保Journaling插入后再反馈,但是会非常影响性能。
logpath 选项指定日志存储地址
-vvvvv 选项(v越多,输出越详细)
dbrunCommand({logrotare:1}) 开启滚动日志
(1)serverStatus
这里写描述
(2)top
(3)dbcurrentOp()
动态展示mongodb活动数据
占用当前mongodb监听端口往上1000号的端口
(1)mongodump
把数据库内容导出成BSON文件,而mongorestore能读取并还原这些文件
(2)mongorestore
把导出的BSON文件还原到数据库
(3)备份原始数据文件
可以这么做,但是, *** 作之前需要进行锁库处理 dbrunCommand({fsync:1,lock:true})
db$cmdsysunlockfindOne() 请求解锁 *** 作,但是数据库不会立刻解锁,需要使用dbcurrentOp()验证。
(1)修复
mongd --repair 修复所有数据库
dbrunCommand({repairDatabase:1}) 修复单个数据库
修复就是根据Jourling文件读取和重写所有数据文件并重建各个索引
(2)压紧
压紧,会重写数据文件,并重建集合的全部索引,需要停机或者在从库上面运行,如果需要在主库上面运行,需要添加force参数 保证加写锁。
(1)监控磁盘状态
(2)为提升性能检查索引和查询
总的来说,扫描尽可能少的文档。
保证没有冗余的索引,冗余的索引会占用磁盘空间、消耗更多的内存,在每次写入时还需做更多工作
(3)添加内存
dataSize 数据大小 和 indexSize 索引大小,如果两者的和大于内存,那么将会影响性能。
storageSize超过dataSize 数据大小 两倍以上,就会因磁盘碎片而影响性能,需要压缩。
MongoDB是由10gen团队开发的基于分布式存储的开源数据库系统,使用C++编写。MongoDB作为一个文档型数据库,其中数据以键值对的方式来存储。
下面我们来看下MogoDB的基本使用方法。
1、连接MongoDB数据库
使用如下命令来连接MongoDB数据库
mongo
连接MongoDB数据库
2、查看目前所使用的数据库。
在MongoDB中,想查看使用的是哪个数据库,可以使用如下命令来查看。
db
查看所使用的数据库
3、查看有哪些数据库。
在MongoDB中存在着许多个数据库,对于有哪些数据库,可以使用如下命令来查看。
show db
查看MongoDB中所有的数据库
4、创建数据库。
现阶段所存在的数据库如果不能满足要求,可以使用如下命令来创建新的数据库。
use database_name
其中database_name则代表所要创建的数据库名字,下面将演示创建一个名为offcn的数据库。
use offcn
创建offcn数据库
5、删除数据库
当数据库没有作用时,可以将数据库删除从而释放所占用的空间资源。使用如下命令来进行对数据库进行删除,在删除前应该先选中所要删除的数据库。
use offcn
dbdropDatabase()
删除数据库
1:命令行中使用use 数据库名 来创建数据库。
该命令将创建一个新的数据库,如果它不存在,否则将返回现有的数据库
2:命令行中使用 dbcreateCollection(name, options)来创建集合
如果使用mongvue,rockmongo等可视化工具都有相关的菜单可以 *** 作。
MongoDB是一个面向文档的数据库,属于NoSQL数据库,它使用类似JSON的文档和schemata。
MongoDB的默认接口是(CLI)命令行,新用户很难像专业人员那样处理数据库。因此,有一些MongoDB管理工具来提供GUI界面以提高生产力。就像phpmyadmin为MySQL/MariaDB数据库提供基于>
以上就是关于java对所有mongodb表进行增删改查表名怎么设置全部的内容,包括:java对所有mongodb表进行增删改查表名怎么设置、MongoDB是什么,怎么用看完你就知道了、怎么连接mongodb的数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)