Month: June 2015

  • 在MongoDB的sharding cluster 追尾tailing OPLOG的缺陷和解决方法

    介绍 2个月前,我写了一篇关于您如何追尾Oplog的文章同样在分片群集上,并过滤掉从balancer process中产生的内部插入和删除。 它出版后,我收到了更多关于这个话题的反馈,指出两种scenarios目前在需要OPLOG追尾的应用仍有问题。一个还适用于非分片集群,二是仍是分片相关的问题。两者或许都比第一篇博客文章讨论的模糊,但还是很真实的问题。

  • 【MySQL学生手册】MySQL的发行版本类型

    MySQL可用于多种操作系统,其包括Windows和Unix操作平台。除非特别说明,这里”Unix”一般指包括Linux和其他Unix-like操作系统。   你可以通过使用已经包含有MySQL预编译程序的二进制发行版来进行MySQL安装,也可以自己动手编译源文件发行版来完成MySQL的安装。这里我们会对你可选择的各类MySQL发行版进行一下描述。   3.1.1 MySQL二进制发行版(Binary Distribution) 在Windows上,你可以从以下类型的预编译二进制发行版进行安装: 一个基础发行版(MySQL Installer MSI, GA Release),包含了MySQL所需安装的最通用组件及相关配置精灵。这是一个推荐大多数用户使用的版本。 一个包含了所有MySQL安装相关文件的非安装发行版(Zip Archive, GA Release),其中不含有MySQL installer及配置精灵。 你可以使用Installer选择最基本MySQL组件的安装或进行完整安装。默认,MySQL 5.x会被安装在%ProgramFiles%\MySQL\MySQL Server 5.x下,一般%ProgramFiles%值为C:\Program Files。而非安装发行版则仅是一个Zip压缩包,安装时,你只需要解压并移至你所希望的位置即可。   在Unix上,你可以选择以下类型的二进制版本: RPM包可用于Linux系统。这些文件可通过使用rpm命令进行安装。你可以使用rpm -qpl rpm_file来查看RPM软件包中所包含的安装文件。 tar包文件可用于其他各种Unix和Unix-like系统。为了安装此类发行版,你可以通过使用tar命令将tar包解压至你希望安装的目录即可。 还有许多其他Unix和Linux发行版特定安装包。你可以访问MySQL网站下载页来了解可用的安装包: http://www.mysql.com/downloads/ 注意:安装后的启动及服务配置会在本章稍后进行说明。   使用二进制发行版有这样几个好处。除了明显的,你不需要经历整个建立编译过程外,一个最大的好处是使用MySQL二进制安装文件比你自己去建立文件更高效。 MySQL团队有大量编译器使用的选择配置经验,这有助于产生最优化的二进制文件。 在多数情况下,MySQL团队使用商业编译器进行编译,相比于使用通用编译器,这样可以获得更高质量代码。 在一些情况下,MySQL团队在编译时会使用比一般标准操作系统供应商所提供的库文件更好的库文件。例如,在Linux系统上,MySQL会使用特定的C库文件以允许更大数量的并行连接。其它一些情况,使用特定库文件来临时解决供应商库文件中的存在的bug问题等。   3.1.2 MySQL源发行版 你也可以通过编译源发行版来建立MySQL。劈开使用预编译发行版进行安装所带来的好处,你可能仍然有理由选择自己编译MySQL: 你的操作平台没有对应可用的二进制发行版,你不得不选择自己通过源文件来建立MySQL。 你需要启用一个在预编译发行版中没有的功能,如全面调试支持。或你可能希望关闭一个你不需要的特性,以降低server对内存的使用。例如,你可以禁用可选的存储引擎,或仅编译那些你需要的字符集等。 二进制发行版仅会在正式版中提供下载,而最新的开发版本则仅提供源码版本。如果你希望使用当前最新的源码版本,则你必须进行编译。 你可以将源发行版安装在你所需的位置上。其默认安装位置为/usr/local/mysql。 如果你最终决定通过源文件来建立MySQL,请阅读MySQL参考手册(MySQL Reference Manual)在线文档, 其中包含了对特定平台安装的相关注意信息。  

  • 【MySQL学生手册】MySQL的内存使用

    MySQL Server内存使用中包括了用于管理与客户端之间进行沟通和处理数据库内容Server所建立的数据结构。它会在运行时为许多类型的信息分配内存,如:   线程(Thread Handler):   线程在MySQL(或其它程序)中被用于将应用的执行分成多个同步运行的任务。对每个连接到MySQL Server的客户端,Server都会建立一个独立的线程来进行连接处理。MySQL Server为了避免一些可能产生的性能问题,会分配一块小的缓存给这些线程,在客户端断开后,被分配的缓存仍然会被保持。任何新的连接会首先通过此缓存来实例化线程,而不是重新建立一个新线程。这样就能确保内存消耗始终处于最低状态。 缓存(Buffers / Cache) MySQL Server会使用多个buffers(或者称为caches),作为内存集以临时保存数据的输入或输出,目的是避免高成本的磁盘I/O访问。这些缓存主要由缓存管理子系统来进行操作,可对支持MyISAM索引块的索引缓存和持有已打开表的表述符的授权表缓存进行快速访问。此外,MySQL Server还包含了一个查询缓存(Query Cache)用于加速重复查询的处理速度。 MEMORY存储引擎 MySQL Server的一种存储引擎,此引擎允许表被存储在内存上。MEMORY表默认使用哈希索引,这对建立临时表及提高临时表处理速度很有用。然而,当服务器被关闭后,MEMORY表中的所有数据行会丢失。这些表的表结构定义会被存储在.frm文件中,当server重启后,这些表都是空表。 内部临时表 通常,我们碰到MySQL需要建立一张内部临时表的例子都是当你需要进行一个复杂查询时,这强迫你建立一个临时表来解决此类问题。系统变量tmp_table_size决定了这张临时表在转换为一张磁盘存储的MyISAM表之前所能增长的最大值,超出此值后,它将会被自动转换为一张MyISAM表。 客户特定缓存(Client specific buffers) MySQL server同时维护了多个特别设计的缓存以支持独立客户端的连接。例如包括了用于交互信息的通信缓存,用于表的读缓存及支持表连接和排序操作的缓存等。   2.5.1 数据存储 数据存储涉及到对性能调优和MySQL整体架构都非常重要的三个方面。这些方面是数据库服务器存储和检索系统的基础。   持久的数据存储: 数据存储系统要求持久性,或者说在服务重启时保留住数据的能力。这需要通过持久性数据设备如硬盘或二级存储设备来完成。此类数据存储对于数据的持续性和完整性保证是其关键,但是设备对数据的读写数据会相对慢些。   挥发性存储: 对于易挥发性存储如随机访问内存(RAM),一般处于持久性数据存储和数据库服务之间。好处是可以瞬时内存中读取数据。当然,一旦发生间歇性或非间歇性断电,这些数据会丢失。 逻辑数据呈现: 当数据从持久数据存储(硬盘)中移至易挥发性存储(内存),它必须有逻辑性地组织在一起并被保存称为页的许多块中。这些页将会由操作系统和硬件缓冲池来管理,作为操作单元被自动分配或释放。   MySQL的缓存管理子系统将和操作系统上的缓存管理一起来处理不同数据类型的缓存。每个存储引擎有不同的处理方法,我们在之后的存储引擎章节中会对其进行讨论。   2.5.2 挥发性存储(Memory) MySQL会对内部缓存的分配大致分为两类: 全局缓存将会被所有线程(连接)所共享。而本地缓存则和独立的线程相关。MySQL可对这两种分类内存进行大量的控制管理设置。   本地内存: 本地内存是针对特定会话连接并动态分配的。这些内存区在不连接后会被自动释放。本地内存大多被用于处理查询结果。 全局内存: 全局内存是那些被预先分配且可被共享使用的内存。全局内存仅分配一块缓存区。 需要注意的是不断增长的本地内存则会使用更多、甚至占用机器余下的全部内存。当所有服务器内存被使用,操作系统就会开始使用swap交换区来保存内存信息,这样性能就降低了。MySQL Server的性能最终会收到负面效果,甚至可能导致性能崩溃。  

  • MongoDB INSERT性能测试

    MongoDB INSERT性能测试       startDate=ISODate(); for(var i=0;i<1000000;i++){db.test.insert({a:1+i, b:i+2, c:i+3, d:i+4, e: [1,2,3,4,5,6,i]})} db.runCommand({getLastError:1, j:1, w:1}); print(ISODate()-startDate);

  • MongoDB中实现INSERT AS SELECT

    MongoDB中实现INSERT AS SELECT db.orders.find({ 条件: 1 }). forEach( function(i) { i.ts_imported = new Date(); db.orders1.insert(i); }); db.orders.find().forEach( function(i) { i.ts_imported = new Date(); db.orders1.insert(i); }); > db.orders1.find(); { “_id” : ObjectId(“55706f6f0fbdc5f8cdb3cf57”), “OrderID” : 10248, “CustomerID” : “VINET”, “EmployeeID” : 5, “OrderDate” : “1996-07-04 00:00:00.000”, “RequiredDate” : “1996-08-01 00:00:00.000”, “ShippedDate” : “1996-07-16 00:00:00.000”, “ShipVia” : 3,…

  • MongoDB 如何更新数组里面的一组对象的属性?

    MongoDB 如何更新数组里面的一组对象的属性?   如下面的例子 语法如下: db.collection.update( { }, { : { “array.$.field” : value } } ) db.students.insert ({ _id: 4, grades: [ { grade: 80, mean: 75, std: 8 }, { grade: 85, mean: 90, std: 5 }, { grade: 90, mean: 85, std: 3 } ] }) db.students.update( { _id: 4, “grades.grade”: 85…

  • 一个初学者的指南—MongoDB的性能优化 简介

    这是MongoDB时间系列的第二部分教程,这篇文章将致力于性能调优的讲解。在我的前一篇文章中,提到了我们的虚拟化项目需求。总之,我们有5000万次的事件,从2012年1月持续到2013年1月,使用下面这个结构进行统计:   { “_id” : ObjectId(“52cb898bed4bd6c24ae06a9e”), “created_on” : ISODate(“2012-11-02T01:23:54.010Z”) “value” : 0.19186609564349055 } 我们要统计最小值,最大值,和平均值以及条目数,离散时间样本如下: all seconds in a minute all minutes in an hour all hours in a day 这是基本测试脚本: var testFromDates = [ new Date(Date.UTC(2012, 5, 10, 11, 25, 59)),        new Date(Date.UTC(2012, 7, 23, 2, 15, 07)),        new Date(Date.UTC(2012, 9, 25, 7, 18, 46)),       …

  • 优化MongoDB索引

    要在MongoDB上使应用程序运行性能良好,好的索引必不可少。当它将你的索引放在RAM中时,将能使它达到最好的性能。减少索引的大小亦有助于得到更快的查询速度,并通过更小的内存管理更多的数据。   以下是一些用来减小MongoDB索引大小的技巧: 检查索引的大小 首先你应该做的是去了解你的索引的大小。在你做出一些改变并检查这种改变是否能减少索引大小之前,你会想先知道索引目前的大小。理想状态下,你一直在使用着你的监测工具图形化监测索引。 使用Mongo shell时,我们可以通过运行db.stats()命令来得到索引统计数据 : > db.stats(){ “db” : “examples1”, “collections” : 6, “objects” : 403787, “avgObjSize” : 121.9966467469235, “dataSize” : 49260660, “storageSize” : 66695168, “numExtents” : 20, “indexes” : 9, “indexSize” : 48524560, “fileSize” : 520093696, “nsSizeMB” : 16, “ok” : 1 }     Indexes : 在 examples1 数据库中的索引数目; indexSize : …

  • 【MySQL学生手册】MySQL的磁盘空间使用

    MySQL Server会通过几种方式使用其磁盘空间,主要的目录和文件都会放在一个称为”服务数据目录”(server’s data directory)的地方。MySQL会使用这个数据目录来存储: 数据库目录(database directory)。不管你在数据库中建立何种类型的表,每个数据库都只会对应存在一个单一目录。 在Windows中,如: C:\Program Files\MySQL\MySQL Server5.7\data 对表结构进行描述的表格式文件(.frm文件)。不管哪个存储引擎进行的表管理,每个表都有其.frm文件,存在其对应的数据库目录下。 在Windows中,如: C:\Program Files\MySQL\MySQL Server 5.7\data\<database>\<filename>.frm 对应每张表由存储引擎建立的数据和索引文件,也会被存放在相应的数据库目录下。如MyISAM存储引擎对应某张表所建立的数据文件及索引文件。 在Windows中: C:\Program Files\MySQL\MySQL Server 5.7\data\<database>\<filename>myd C:\Program Files\MySQL\MySQL Server 5.7\data\<database>\<filename>.myi InnoDB存储引擎所拥有的表空间及日志文件。 在Windows中: C:\Program Files\MySQL\MySQL Server 5.7\data\ib_logfile0 服务日志文件和状态文件。这些文件包含了MySQL Server已处理或正处理的语句信息。日志文件可用于问题排查(troubleshooting),监控,复制(replication)和数据恢复。 触发器也会和其受影响的表一起存储在相应数据库目录中。 MySQL也会将其系统数据库(mysql)存储在磁盘上,其中包含了用户,权限,插件,帮助内容,事件,时区实现等各种信息。   2.4.1 数据目录 有关数据目录的大致层级关系,我们可以从上图有进行了解。应该注意的是许多层级中都是对应特定存储引擎的。然而,不管存储引擎如何使用,所建的每个表都会有一个*.frm(包括视图view)文件。请确保MySQL server对数据目录的权限正确以进行文件建立操作。换言之,你必须保证server在其数据目录下的任何位置具有相应权限以建立数据文件或日志文件。 在MySQL数据目录中,MySQL Server会对其每个数据库匹配一个目录,并为数据库中的表匹配相应文件名。这里存在一些潜台词: 在操作系统中(如大多Unix系统),MySQL Server的数据库和表名都是大小写敏感。 标准的系统操作命令都可用于MyISAM存储引擎管理的表,进行诸如备份,重命名,移动,删除,拷贝表等操作。举个例子,我们可以通过重命名表对应的.myd, .myi和.frm文件来重命名一张MyISAM引擎表。(当然,你也可以使用RENAME TABLE或ALTER TABLE … RENAME命令来重命名文件)。 也有可能我们需要移动整个数据目录,或某些数据库,或单个表(依赖于存储引擎)到其他位置,这样通过对不同磁盘的使用以达到更好的性能。