﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-xiaomage234-随笔分类-db tools</title><link>http://www.blogjava.net/xiaomage234/category/28166.html</link><description>生命本就是一次凄美的漂流，记忆中放不下的，永远是孩提时代的那一份浪漫与纯真！</description><language>zh-cn</language><lastBuildDate>Tue, 09 Apr 2013 02:21:34 GMT</lastBuildDate><pubDate>Tue, 09 Apr 2013 02:21:34 GMT</pubDate><ttl>60</ttl><item><title> xtrabackup备份恢复测试 </title><link>http://www.blogjava.net/xiaomage234/archive/2013/04/08/397543.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Mon, 08 Apr 2013 10:29:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2013/04/08/397543.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/397543.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2013/04/08/397543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/397543.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/397543.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 测试准备1、安装xtrabackup工具&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以下测试安装xtrabackup备份恢复工具的二进制包，进行测试。安装的路径为mysql安装路径，本次测试mysql的安装路径为：/home/q/percona-server/。tar -xzf percona-xtraback-2.0.0-x86-64.tar.gzcp p...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaomage234/archive/2013/04/08/397543.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaomage234/aggbug/397543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2013-04-08 18:29 <a href="http://www.blogjava.net/xiaomage234/archive/2013/04/08/397543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用mysqld_multi配置单机多实例 </title><link>http://www.blogjava.net/xiaomage234/archive/2013/03/27/397050.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 27 Mar 2013 05:38:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2013/03/27/397050.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/397050.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2013/03/27/397050.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/397050.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/397050.html</trackback:ping><description><![CDATA[<div style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;"><p style="word-wrap: break-word; margin: 0in; padding: 0px; font-size: 11pt;"><span style="word-wrap: break-word; font-family: 宋体;">目的 在一台服务器上做主从复制，充分利用</span><span courier=""  new""="" style="word-wrap: break-word;">CPU</span><span style="word-wrap: break-word; font-family: 宋体;">资源。下面的文档首先说明如何在一台服务器开启多个</span><span courier=""  new""="" style="word-wrap: break-word;">MySQL</span></p><p style="word-wrap: break-word; margin: 0in; padding: 0px; font-size: 11pt;"><span style="word-wrap: break-word; font-family: 宋体;">环境&nbsp;</span><span courier=""  new""="" style="word-wrap: break-word;">MySQL 5.5</span></p><p style="word-wrap: break-word; margin: 0in; padding: 0px; font-family: 宋体; font-size: 11pt;">工具</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">mysql_install_db</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">mysqld_multi</p><p style="word-wrap: break-word; margin: 0in; padding: 0px; font-family: 宋体; font-size: 11pt;">配置过程</p><ol type="1" courier=""  new";font-size:11.0pt;="" font-weight:normal;font-style:normal"="" style="word-wrap: break-word; margin: 0in 0px 0in 0.375in; padding: 0px; list-style: none; direction: ltr; unicode-bidi: embed;"><li value="1" style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: decimal outside; vertical-align: middle;"><span style="word-wrap: break-word; font-family: 宋体; font-size: 11pt;">利用</span><span courier=""  new";font-size:11.0pt;font-weight:normal;="" font-style:normal;font-family:" courier=""  new";font-size:11.0pt"="" style="word-wrap: break-word;">mysql_install_db</span><span style="word-wrap: break-word; font-family: 宋体; font-size: 11pt;">生成数据库</span></li></ol><p courier=""  new"; font-size:=""  11.0pt;color:#c00000"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">mysql_install_db --datadir=/var/lib/mysql2 --user=mysql</p><p courier=""  new"; font-size:=""  11.0pt;color:#c00000"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"><span style="word-wrap: break-word;">mysql_install_db --datadir=/var/lib/mysql</span><span style="word-wrap: break-word;">3</span><span style="word-wrap: break-word;">&nbsp;--user=mysql</span></p><p style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px; font-family: 宋体; font-size: 11pt;">&#8230;&#8230;</p><p style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px; font-size: 11pt;"><span courier=""  new""="" style="word-wrap: break-word;">mysql_install_db</span><span style="word-wrap: break-word; font-family: 宋体;">命令会自动创建</span><span courier=""  new""="" style="word-wrap: break-word;">datadir</span><span style="word-wrap: break-word; font-family: 宋体;">目录。</span></p><ol type="1" courier=""  new";font-size:11.0pt;="" font-weight:normal;font-style:normal"="" style="word-wrap: break-word; margin: 0in 0px 0in 0.375in; padding: 0px; list-style: none; direction: ltr; unicode-bidi: embed;"><li value="2" style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: decimal outside; vertical-align: middle;"><span style="word-wrap: break-word; font-family: 宋体; font-size: 11pt;">利用</span><span courier=""  new";font-size:11.0pt;font-weight:normal;="" font-style:normal;font-family:" courier=""  new";font-size:11.0pt"="" style="word-wrap: break-word;">mysqld_multi</span><span style="word-wrap: break-word; font-family: 宋体; font-size: 11pt;">工具生成配置文件</span></li></ol><p courier=""  new"; font-size:=""  11.0pt;color:#c00000"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">[root@ora01 ~]# mysqld_multi --example</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"># This is an example of a my.cnf file for mysqld_multi.</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"># Usually this file is located in home dir ~/.my.cnf or /etc/my.cnf</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"># SOME IMPORTANT NOTES FOLLOW:</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"># 1.COMMON USER</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>Make sure that the MySQL user, who is stopping the mysqld services, has</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>the same password to all MySQL servers being accessed by mysqld_multi.</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>This user needs to have the 'Shutdown_priv' -privilege, but for security</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>reasons should have no other privileges. It is advised that you create a</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>common 'multi_admin' user for all MySQL servers being controlled by</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>mysqld_multi. Here is an example how to do it:</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>GRANT SHUTDOWN ON *.* TO multi_admin@localhost IDENTIFIED BY 'password'</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>You will need to apply the above to all MySQL servers that are being</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>controlled by mysqld_multi. 'multi_admin' will shutdown the servers</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>using 'mysqladmin' -binary, when 'mysqld_multi stop' is being called.</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"># 2.PID-FILE</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>If you are using mysqld_safe to start mysqld, make sure that every</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>MySQL server has a separate pid-file. In order to use mysqld_safe</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>via mysqld_multi, you need to use two options:</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>mysqld=/path/to/mysqld_safe</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>ledir=/path/to/mysqld-binary/</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>ledir (library executable directory), is an option that only mysqld_safe</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>accepts, so you will get an error if you try to pass it to mysqld directly.</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>For this reason you might want to use the above options within [mysqld#]</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>group directly.</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"># 3.DATA DIRECTORY</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>It is NOT advised to run many MySQL servers within the same data directory.</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>You can do so, but please make sure to understand and deal with the</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>underlying caveats. In short they are:</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>- Speed penalty</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>- Risk of table/data corruption</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>- Data synchronising problems between the running servers</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>- Heavily media (disk) bound</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>- Relies on the system (external) file locking</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>- Is not applicable with all table types. (Such as InnoDB)</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>Trying so will end up with undesirable results.</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"># 4.TCP/IP Port</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>Every server requires one and it must be unique.</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"># 5.[mysqld#] Groups</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>In the example below the first and the fifth mysqld group was</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>intentionally left out. You may have 'gaps' in the config file. This</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>gives you more flexibility.</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"># 6.MySQL Server User</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>You can pass the user=... option inside [mysqld#] groups. This</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>can be very handy in some cases, but then you need to run mysqld_multi</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>as UNIX root.</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"># 7.A Start-up Manage Script for mysqld_multi</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>In the recent MySQL distributions you can find a file called</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>mysqld_multi.server.sh. It is a wrapper for mysqld_multi. This can</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>be used to start and stop multiple servers during boot and shutdown.</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>You can place the file in /etc/init.d/mysqld_multi.server.sh and</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>make the needed symbolic links to it from various run levels</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>(as per Linux/Unix standard). You may even replace the</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>/etc/init.d/mysql.server script with it.</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>Before using, you must create a my.cnf file either in /usr/my.cnf</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>or /root/.my.cnf and add the [mysqld_multi] and [mysqld#] groups.</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>The script can be found from support-files/mysqld_multi.server.sh</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>in MySQL distribution. (Verify the script before using)</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">#</p><p style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px; font-size: 11pt; color: #c00000;"><span style="word-wrap: break-word; font-family: 宋体;">上面是</span><span courier=""  new""="" style="word-wrap: break-word;">mysqld_multi</span><span style="word-wrap: break-word; font-family: 宋体;">工具的简单说明，下面是根据实际情况，修改的配置文件。为方便测试，将多实例的配置文件命名为</span></p><p style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px; font-size: 11pt; color: #c00000;"><span courier=""  new""="" style="word-wrap: break-word;">mysqld_multi</span><span courier=""  new""="" style="word-wrap: break-word;">.cnf</span><span style="word-wrap: break-word; font-family: 宋体;">。未指定的其他</span><span courier=""  new""="" style="word-wrap: break-word;">MySQL</span><span style="word-wrap: break-word; font-family: 宋体;">参数，将使用默认的。</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">&nbsp;</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">[mysqld_multi]</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">mysqld<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>= /usr/bin/mysqld_safe</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">mysqladmin = /usr/bin/mysqladmin</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"><span style="word-wrap: break-word;">#</span><span style="word-wrap: break-word;">user<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>= multi_admin</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"><span style="word-wrap: break-word;">#</span><span style="word-wrap: break-word;">password<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>= my_password</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">&nbsp;</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">[mysqld2]</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"><span style="word-wrap: break-word;">socket<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>= /var/lib/mysql2</span><span style="word-wrap: break-word;">/</span><span style="word-wrap: break-word;">mysql</span><span style="word-wrap: break-word;">2</span><span style="word-wrap: break-word;">.sock</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">port<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>= 3307</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"><span style="word-wrap: break-word;">#</span><span style="word-wrap: break-word;">pid-file<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>= /var/lib/mysql2/hostname.pid2</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">datadir<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;</span>= /var/lib/mysql2</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"><span style="word-wrap: break-word;">#</span><span style="word-wrap: break-word;">language<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>= /usr/share/mysql/mysql/english</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"><span style="word-wrap: break-word;">user<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>=&nbsp;</span><span style="word-wrap: break-word;">mysql</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">&nbsp;</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">[mysqld3]</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"><span style="word-wrap: break-word;">socket<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>= /var/lib/mysql</span><span style="word-wrap: break-word;">3/</span><span style="word-wrap: break-word;">mysql</span><span style="word-wrap: break-word;">3</span><span style="word-wrap: break-word;">.sock</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">port<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>= 3308</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"><span style="word-wrap: break-word;">#</span><span style="word-wrap: break-word;">pid-file<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>= /var/lib/mysql3/hostname.pid3</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">datadir<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;</span>= /var/lib/mysql3</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"><span style="word-wrap: break-word;">#</span><span style="word-wrap: break-word;">language<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;</span>= /usr/share/mysql/mysql/swedish</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"><span style="word-wrap: break-word;">user<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>=&nbsp;</span><span style="word-wrap: break-word;">mysql</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">&nbsp;</p><p style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px; font-size: 11pt; color: #c00000;"><span style="word-wrap: break-word; font-family: 宋体;">注：我做测试的时候，把</span><span courier=""  new""="" style="word-wrap: break-word;">pid-file</span><span style="word-wrap: break-word; font-family: 宋体;">和</span><span courier=""  new""="" style="word-wrap: break-word;">language</span><span style="word-wrap: break-word; font-family: 宋体;">选项注释掉了。</span></p><ol type="1" style="word-wrap: break-word; margin: 0in 0px 0in 0.375in; padding: 0px; list-style: none; direction: ltr; unicode-bidi: embed; font-family: 宋体; font-size: 11pt;"><li value="3" style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: decimal outside; vertical-align: middle;"><span style="word-wrap: break-word; font-size: 11pt;">启动</span></li></ol><p courier=""  new"; font-size:=""  11.0pt;color:#c00000"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"># mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf report</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">Reporting MySQL servers</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">MySQL server from group: mysqld2 is not running</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">MySQL server from group: mysqld3 is not running</p><p courier=""  new"; font-size:=""  11.0pt;color:#c00000"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"># mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf start</p><p style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px; font-size: 11pt;"><span style="word-wrap: break-word; font-family: 宋体;">等一会儿&#8230;&#8230;&#8230;&#8230;，注意</span><span courier=""  new""="" style="word-wrap: break-word;">start</span><span style="word-wrap: break-word; font-family: 宋体;">后面跟具体的数字，比如</span><span courier=""  new""="" style="word-wrap: break-word;">start 2</span><span style="word-wrap: break-word; font-family: 宋体;">，则单独开启</span><span courier=""  new""="" style="word-wrap: break-word;">mysqld2</span><span style="word-wrap: break-word; font-family: 宋体;">这个实例。</span></p><p courier=""  new"; font-size:=""  11.0pt;color:#c00000"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;"># mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf report</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">Reporting MySQL servers</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">MySQL server from group: mysqld2 is running</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">MySQL server from group: mysqld3 is running</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">[root@ora01 mysql2]# netstat -tunlp</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">Active Internet connections (only servers)</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">Proto Recv-Q Send-Q Local Address<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>Foreign Address<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>State<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>PID/Program name<span style="word-wrap: break-word;">&nbsp;&nbsp;</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">tcp<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>0<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>0 192.168.122.1:53<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>0.0.0.0:*<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>LISTEN<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>3808/dnsmasq<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">tcp<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>0<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>0 :::3307<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>:::*<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>LISTEN<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>24335/mysqld<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">tcp<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>0<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>0 :::3308<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>:::*<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>LISTEN<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>24241/mysqld<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">tcp<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>0<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>0 :::22<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>:::*<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>LISTEN<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>3537/sshd<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">udp<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>0<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>0 192.168.122.1:53<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>0.0.0.0:*<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>3808/dnsmasq<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">udp<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>0<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>0 0.0.0.0:67<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>0.0.0.0:*<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>3808/dnsmasq<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px; font-family: 宋体; font-size: 11pt;">连接</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">mysql -uroot -p -h127.0.0.1 -P3307</p><ol type="1" style="word-wrap: break-word; margin: 0in 0px 0in 0.375in; padding: 0px; list-style: none; direction: ltr; unicode-bidi: embed; font-family: 宋体; font-size: 11pt;"><li value="4" style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: decimal outside; vertical-align: middle;"><span style="word-wrap: break-word; font-size: 11pt;">测试</span></li></ol><p style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px; font-size: 11pt; color: #c00000;"><span style="word-wrap: break-word; font-family: 宋体;">如果</span><span courier=""  new""="" style="word-wrap: break-word;">--defaults-extra-file</span><span style="word-wrap: break-word; font-family: 宋体;">选项指定的配置文件中，未具体设置路径</span><span courier=""  new""="" style="word-wrap: break-word;">socket</span><span style="word-wrap: break-word; font-family: 宋体;">，则会用</span><span courier=""  new""="" style="word-wrap: break-word;">mysql</span><span style="word-wrap: break-word; font-family: 宋体;">默认的路径。</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">mysql&gt; show variables like 'socket';</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">+---------------+---------------------------+</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">| Variable_name | Value<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>|</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">+---------------+---------------------------+</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">| socket<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>| /var/lib/mysql/mysql.sock |</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">+---------------+---------------------------+</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">1 row in set (0.00 sec)</p><p style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px; font-size: 11pt; color: #c00000;"><span style="word-wrap: break-word; font-family: 宋体;">但是</span><span courier=""  new""="" style="word-wrap: break-word;">pid</span><span style="word-wrap: break-word; font-family: 宋体;">文件，会自动在数据目录内生成</span></p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">mysql&gt; show variables like '%pid%';</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">+---------------+---------------------------------+</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">| Variable_name | Value<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>|</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">+---------------+---------------------------------+</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">| pid_file<span style="word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>| /var/lib/mysql2/ora01.dh.cn.pid |</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">+---------------+---------------------------------+</p><p courier=""  new"; font-size:=""  11.0pt"="" style="word-wrap: break-word; margin: 0in 0in 0in 0.375in; padding: 0px;">1 row in set (0.00 sec)</p></div><div blog_con3_2"="" style="word-wrap: break-word; margin-top: 50px; position: relative; line-height: 22px; color: #666666; font-family: 宋体, Arial; font-size: 12px; background-color: #ffffff;"><div style="word-wrap: break-word;"><div icon-medium-plus"="" style="word-wrap: break-word; font-size: 16px; line-height: 26px !important;"><a title="分享到QQ空间" style="word-wrap: break-word; color: #333333; padding-left: 35px; height: 32px; display: inline-block; zoom: 1; vertical-align: middle; cursor: pointer; margin-right: 3px; opacity: 1; background-image: url(http://static.bshare.cn/frame/images/logos/mp2/sprite/top_logos_sprite.gif); background-position: 0px -442px; background-repeat: no-repeat no-repeat;"></a><a title="分享到新浪微博" style="word-wrap: break-word; color: #333333; padding-left: 35px; height: 32px; display: inline-block; zoom: 1; vertical-align: middle; cursor: pointer; margin-right: 3px; opacity: 1; background-image: url(http://static.bshare.cn/frame/images/logos/mp2/sprite/top_logos_sprite.gif); background-position: 0px -510px; background-repeat: no-repeat no-repeat;"></a><a title="分享到人人网" style="word-wrap: break-word; color: #333333; padding-left: 35px; height: 32px; display: inline-block; zoom: 1; vertical-align: middle; cursor: pointer; margin-right: 3px; opacity: 1; background-image: url(http://static.bshare.cn/frame/images/logos/mp2/sprite/top_logos_sprite.gif); background-position: 0px -476px; background-repeat: no-repeat no-repeat;"></a><a title="分享到腾讯微博" style="word-wrap: break-word; color: #333333; padding-left: 35px; height: 32px; display: inline-block; zoom: 1; vertical-align: middle; cursor: pointer; margin-right: 3px; opacity: 1; background-image: url(http://static.bshare.cn/frame/images/logos/mp2/sprite/top_logos_sprite.gif); background-position: 0px -374px; background-repeat: no-repeat no-repeat;"></a><a title="分享到豆瓣" style="word-wrap: break-word; color: #333333; padding-left: 35px; height: 32px; display: inline-block; zoom: 1; vertical-align: middle; cursor: pointer; margin-right: 3px; opacity: 1; background-image: url(http://static.bshare.cn/frame/images/logos/mp2/sprite/top_logos_sprite.gif); background-position: 0px -68px; background-repeat: no-repeat no-repeat;"></a><a bshare-more-icon=""  more-style-addthis"="" title="更多平台" style="word-wrap: break-word; height: 32px; display: inline-block; zoom: 1; vertical-align: middle; cursor: pointer; margin-right: 3px; opacity: 1; background-image: url(http://static.bshare.cn/frame/images/logos/mp2/more-style-addthis.gif); color: #333333 !important; padding-left: 35px !important; background-repeat: no-repeat no-repeat;"></a></div></div></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/397050.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2013-03-27 13:38 <a href="http://www.blogjava.net/xiaomage234/archive/2013/03/27/397050.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL主从复制（Master-Slave）与读写分离（MySQL-Proxy）实践【转】</title><link>http://www.blogjava.net/xiaomage234/archive/2013/03/26/397004.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Tue, 26 Mar 2013 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2013/03/26/397004.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/397004.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2013/03/26/397004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/397004.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/397004.html</trackback:ping><description><![CDATA[<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">Mysql作为目前世界上使用最广泛的免费数据库，相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中，由单台Mysql作为独立的数据库是完全不能满足实际需求的，无论是在安全性，高可用性以及高并发等各个方面。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">因此，一般来说都是通过 主从复制（Master-Slave）的方式来同步数据，再通过读写分离（MySQL-Proxy）来提升数据库的并发负载能力 这样的方案来进行部署与实施的。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">如下图所示：<br style="margin: 0px; padding: 0px;" /><img src="http://heylinux.com/wp-content/uploads/2011/06/mysql-master-salve-proxy.jpg" size-full=""  wp-image-1006"="" alt="" height="423" width="584" style="margin: 0px; padding: 0px; border: 0px;" /></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">下面是我在实际工作过程中所整理的笔记，在此分享出来，以供大家参考。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">一、MySQL的安装与配置</strong><br style="margin: 0px; padding: 0px;" />具体的安装过程，建议参考我的这一篇文章：<a href="http://heylinux.com/archives/993.html" style="margin: 0px; padding: 0px; color: #3b5999; text-decoration: none;">http://heylinux.com/archives/993.html</a><br style="margin: 0px; padding: 0px;" />值得一提的是，我的安装过程都是源码包编译安装的，并且所有的配置与数据等都统一规划到了/opt/mysql目录中，因此在一台服务器上安装完成以后，可以将整个mysql目录打包，然后传到其它服务器上解包，便可立即使用。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">二、MySQL主从复制</strong><br style="margin: 0px; padding: 0px;" />场景描述：<br style="margin: 0px; padding: 0px;" />主数据库服务器：192.168.10.130，MySQL已经安装，并且无应用数据。<br style="margin: 0px; padding: 0px;" />从数据库服务器：192.168.10.131，MySQL已经安装，并且无应用数据。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">2.1 主服务器上进行的操作</strong><br style="margin: 0px; padding: 0px;" />启动mysql服务<br style="margin: 0px; padding: 0px;" />/opt/mysql/init.d/mysql start</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">通过命令行登录管理MySQL服务器<br style="margin: 0px; padding: 0px;" />/opt/mysql/bin/mysql -uroot -p'new-password'</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">授权给从数据库服务器192.168.10.131<br style="margin: 0px; padding: 0px;" />mysql&gt; GRANT REPLICATION SLAVE ON *.* to 'rep1'@'192.168.10.131' identified by &#8216;password&#8217;;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">查询主数据库状态<br style="margin: 0px; padding: 0px;" />Mysql&gt; show master status;<br style="margin: 0px; padding: 0px;" />+------------------+----------+--------------+------------------+<br style="margin: 0px; padding: 0px;" />| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |<br style="margin: 0px; padding: 0px;" />+------------------+----------+--------------+------------------+<br style="margin: 0px; padding: 0px;" />| mysql-bin.000005 | 261 | | |<br style="margin: 0px; padding: 0px;" />+------------------+----------+--------------+------------------+</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">记录下 FILE 及 Position 的值，在后面进行从服务器操作的时候需要用到。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">2.2 配置从服务器</strong><br style="margin: 0px; padding: 0px;" />修改从服务器的配置文件/opt/mysql/etc/my.cnf<br style="margin: 0px; padding: 0px;" />将 server-id = 1修改为 server-id = 10，并确保这个ID没有被别的MySQL服务所使用。<br style="margin: 0px; padding: 0px;" /></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">启动mysql服务<br style="margin: 0px; padding: 0px;" />/opt/mysql/init.d/mysql start</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">通过命令行登录管理MySQL服务器<br style="margin: 0px; padding: 0px;" />/opt/mysql/bin/mysql -uroot -p'new-password'</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">执行同步SQL语句<br style="margin: 0px; padding: 0px;" />mysql&gt; change master to<br style="margin: 0px; padding: 0px;" />master_host=&#8217;192.168.10.130&#8217;,<br style="margin: 0px; padding: 0px;" />master_user=&#8217;rep1&#8217;,<br style="margin: 0px; padding: 0px;" />master_password=&#8217;password&#8217;,<br style="margin: 0px; padding: 0px;" />master_log_file=&#8217;mysql-bin.000005&#8217;,<br style="margin: 0px; padding: 0px;" />master_log_pos=261;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">正确执行后启动Slave同步进程<br style="margin: 0px; padding: 0px;" />mysql&gt; start slave;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">主从同步检查<br style="margin: 0px; padding: 0px;" />mysql&gt; show slave status\G<br style="margin: 0px; padding: 0px;" />==============================================<br style="margin: 0px; padding: 0px;" />**************** 1. row *******************<br style="margin: 0px; padding: 0px;" />Slave_IO_State:<br style="margin: 0px; padding: 0px;" />Master_Host: 192.168.10.130<br style="margin: 0px; padding: 0px;" />Master_User: rep1<br style="margin: 0px; padding: 0px;" />Master_Port: 3306<br style="margin: 0px; padding: 0px;" />Connect_Retry: 60<br style="margin: 0px; padding: 0px;" />Master_Log_File: mysql-bin.000005<br style="margin: 0px; padding: 0px;" />Read_Master_Log_Pos: 415<br style="margin: 0px; padding: 0px;" />Relay_Log_File: localhost-relay-bin.000008<br style="margin: 0px; padding: 0px;" />Relay_Log_Pos: 561<br style="margin: 0px; padding: 0px;" />Relay_Master_Log_File: mysql-bin.000005<br style="margin: 0px; padding: 0px;" />Slave_IO_Running: YES<br style="margin: 0px; padding: 0px;" />Slave_SQL_Running: YES<br style="margin: 0px; padding: 0px;" />Replicate_Do_DB:<br style="margin: 0px; padding: 0px;" />&#8230;&#8230;&#8230;&#8230;&#8230;省略若干&#8230;&#8230;&#8230;&#8230;&#8230;<br style="margin: 0px; padding: 0px;" />Master_Server_Id: 1<br style="margin: 0px; padding: 0px;" />1 row in set (0.01 sec)<br style="margin: 0px; padding: 0px;" />==============================================</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">其中Slave_IO_Running 与 Slave_SQL_Running 的值都必须为YES，才表明状态正常。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">如果主服务器已经存在应用数据，则在进行主从复制时，需要做以下处理：</strong><br style="margin: 0px; padding: 0px;" />(1)主数据库进行锁表操作，不让数据再进行写入动作<br style="margin: 0px; padding: 0px;" />mysql&gt; FLUSH TABLES WITH READ LOCK;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">(2)查看主数据库状态<br style="margin: 0px; padding: 0px;" />mysql&gt; show master status;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">(3)记录下 FILE 及 Position 的值。<br style="margin: 0px; padding: 0px;" />将主服务器的数据文件（整个/opt/mysql/data目录）复制到从服务器，建议通过tar归档压缩后再传到从服务器解压。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">(4)取消主数据库锁定<br style="margin: 0px; padding: 0px;" />mysql&gt; UNLOCK TABLES;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">2.3 验证主从复制效果</strong></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">主服务器上的操作</strong><br style="margin: 0px; padding: 0px;" />在主服务器上创建数据库first_db<br style="margin: 0px; padding: 0px;" />mysql&gt; create database first_db;<br style="margin: 0px; padding: 0px;" />Query Ok, 1 row affected (0.01 sec)</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">在主服务器上创建表first_tb<br style="margin: 0px; padding: 0px;" />mysql&gt; create table first_tb(id int(3),name char(10));<br style="margin: 0px; padding: 0px;" />Query Ok, 1 row affected (0.00 sec)</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">在主服务器上的表first_tb中插入记录<br style="margin: 0px; padding: 0px;" />mysql&gt; insert into first_tb values (001,&#8217;myself&#8217;);<br style="margin: 0px; padding: 0px;" />Query Ok, 1 row affected (0.00 sec)</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">在从服务器上查看</strong><br style="margin: 0px; padding: 0px;" />mysql&gt; show databases;<br style="margin: 0px; padding: 0px;" />=============================<br style="margin: 0px; padding: 0px;" />+--------------------+<br style="margin: 0px; padding: 0px;" />| Database |<br style="margin: 0px; padding: 0px;" />+--------------------+<br style="margin: 0px; padding: 0px;" />| information_schema |<br style="margin: 0px; padding: 0px;" />| first_db |<br style="margin: 0px; padding: 0px;" />| mysql |<br style="margin: 0px; padding: 0px;" />| performance_schema |<br style="margin: 0px; padding: 0px;" />| test |<br style="margin: 0px; padding: 0px;" />+--------------------+<br style="margin: 0px; padding: 0px;" />5 rows in set (0.01 sec)<br style="margin: 0px; padding: 0px;" />=============================<br style="margin: 0px; padding: 0px;" />数据库first_db已经自动生成</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">mysql&gt; use first_db<br style="margin: 0px; padding: 0px;" />Database chaged</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">mysql&gt; show tables;<br style="margin: 0px; padding: 0px;" />=============================<br style="margin: 0px; padding: 0px;" />+--------------------+<br style="margin: 0px; padding: 0px;" />| Tables_in_first_db |<br style="margin: 0px; padding: 0px;" />+--------------------+<br style="margin: 0px; padding: 0px;" />| first_tb |<br style="margin: 0px; padding: 0px;" />+--------------------+<br style="margin: 0px; padding: 0px;" />1 row in set (0.02 sec)<br style="margin: 0px; padding: 0px;" />=============================<br style="margin: 0px; padding: 0px;" />数据库表first_tb也已经自动创建</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">mysql&gt; select * from first_tb;<br style="margin: 0px; padding: 0px;" />=============================<br style="margin: 0px; padding: 0px;" />+------+------+<br style="margin: 0px; padding: 0px;" />| id | name |<br style="margin: 0px; padding: 0px;" />+------+------+<br style="margin: 0px; padding: 0px;" />| 1 | myself |<br style="margin: 0px; padding: 0px;" />+------+------+<br style="margin: 0px; padding: 0px;" />1 rows in set (0.00 sec)<br style="margin: 0px; padding: 0px;" />=============================<br style="margin: 0px; padding: 0px;" />记录也已经存在</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">由此，整个MySQL主从复制的过程就完成了，接下来，我们进行MySQL读写分离的安装与配置。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">三、MySQL读写分离</strong><br style="margin: 0px; padding: 0px;" />场景描述：<br style="margin: 0px; padding: 0px;" />数据库Master主服务器：192.168.10.130<br style="margin: 0px; padding: 0px;" />数据库Slave从服务器：192.168.10.131<br style="margin: 0px; padding: 0px;" />MySQL-Proxy调度服务器：192.168.10.132</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">以下操作，均是在192.168.10.132即MySQL-Proxy调度服务器 上进行的。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">3.1 MySQL的安装与配置</strong><br style="margin: 0px; padding: 0px;" />具体的安装过程与上文相同。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">3.2 检查系统所需软件包</strong><br style="margin: 0px; padding: 0px;" />通过 rpm -qa | grep name 的方式验证以下软件包是否已全部安装。<br style="margin: 0px; padding: 0px;" />gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libmcrypt* libtool* flex* pkgconfig*<br style="margin: 0px; padding: 0px;" />libevent* glib*</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">若缺少相关的软件包，可通过yum -y install方式在线安装，或直接从系统安装光盘中找到并通过rpm -ivh方式安装。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">3.3 编译安装lua</strong><br style="margin: 0px; padding: 0px;" />MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的，因此需要安装lua。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">lua可通过以下方式获得<br style="margin: 0px; padding: 0px;" />从http://www.lua.org/download.html下载源码包</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">从rpm.pbone.net搜索相关的rpm包<br style="margin: 0px; padding: 0px;" />download.fedora.redhat.com/pub/fedora/epel/5/i386/lua-5.1.4-4.el5.i386.rpm<br style="margin: 0px; padding: 0px;" />download.fedora.redhat.com/pub/fedora/epel/5/x86_64/lua-5.1.4-4.el5.x86_64.rpm</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">这里我们建议采用源码包进行安装<br style="margin: 0px; padding: 0px;" />cd /opt/install<br style="margin: 0px; padding: 0px;" />wget http://www.lua.org/ftp/lua-5.1.4.tar.gz<br style="margin: 0px; padding: 0px;" />tar zvfx lua-5.1.4.tar.gz<br style="margin: 0px; padding: 0px;" />cd lua-5.1.4</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">vi src/Makefile<br style="margin: 0px; padding: 0px;" />在 CFLAGS= -O2 -Wall $(MYCFLAGS) 这一行记录里加上-fPIC，更改为 CFLAGS= -O2 -Wall -fPIC $(MYCFLAGS) 来避免编译过程中出现错误。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">make linux<br style="margin: 0px; padding: 0px;" />make install</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">cp etc/lua.pc /usr/lib/pkgconfig/<br style="margin: 0px; padding: 0px;" />export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/pkgconfig</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">3.4 安装配置MySQL-Proxy</strong><br style="margin: 0px; padding: 0px;" />MySQL-Proxy可通过以下网址获得：<br style="margin: 0px; padding: 0px;" /><a href="http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/" style="margin: 0px; padding: 0px; color: #3b5999; text-decoration: none;">http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/</a></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">推荐采用已经编译好的二进制版本，因为采用源码包进行编译时，最新版的MySQL-Proxy对automake，glib以及libevent的版本都有很高的要求，而这些软件包都是系统的基础套件，不建议强行进行更新。<br style="margin: 0px; padding: 0px;" />并且这些已经编译好的二进制版本在解压后都在统一的目录内，因此建议选择以下版本：<br style="margin: 0px; padding: 0px;" />32位RHEL5平台：<br style="margin: 0px; padding: 0px;" /><a href="http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz" style="margin: 0px; padding: 0px; color: #3b5999; text-decoration: none;">http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz</a><br style="margin: 0px; padding: 0px;" />64位RHEL5平台：<br style="margin: 0px; padding: 0px;" /><a href="http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1-linux-rhel5-x86-64bit.tar.gz" style="margin: 0px; padding: 0px; color: #3b5999; text-decoration: none;">http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1-linux-rhel5-x86-64bit.tar.gz</a></p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">测试平台为RHEL5 32位，因此选择32位的软件包<br style="margin: 0px; padding: 0px;" />wget http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">tar xzvf mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz<br style="margin: 0px; padding: 0px;" />mv mysql-proxy-0.8.1-linux-rhel5-x86-32bit /opt/mysql-proxy</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">创建mysql-proxy服务管理脚本<br style="margin: 0px; padding: 0px;" />mkdir /opt/mysql-proxy/init.d/</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">vim mysql-proxy</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">&nbsp;</p><div style="margin: 5px 0px; font-size: 12px;"><div style="margin: 5px 0px 0px;"><span style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5;"><a href="" title="复制代码" style="margin: 0px; padding: 0px; color: #3b5999; text-decoration: none; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; border: none !important;" /></a></span></div><div style="margin: 0px;">01&nbsp;&nbsp;&nbsp;&nbsp;#!/bin/sh<br style="margin: 0px; padding: 0px;" />02&nbsp;&nbsp;&nbsp;&nbsp;#<br style="margin: 0px; padding: 0px;" />03&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;mysql-proxy&nbsp;This&nbsp;script&nbsp;starts&nbsp;and&nbsp;stops&nbsp;the&nbsp;mysql-proxy&nbsp;daemon<br style="margin: 0px; padding: 0px;" />04&nbsp;&nbsp;&nbsp;&nbsp;#<br style="margin: 0px; padding: 0px;" />05&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;chkconfig:&nbsp;-&nbsp;78&nbsp;30<br style="margin: 0px; padding: 0px;" />06&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;processname:&nbsp;mysql-proxy<br style="margin: 0px; padding: 0px;" />07&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;description:&nbsp;mysql-proxy&nbsp;is&nbsp;a&nbsp;proxy&nbsp;daemon&nbsp;to&nbsp;mysql<br style="margin: 0px; padding: 0px;" />08&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />09&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Source&nbsp;function&nbsp;library.<br style="margin: 0px; padding: 0px;" />10&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;/etc/rc.d/init.d/functions<br style="margin: 0px; padding: 0px;" />11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />12&nbsp;&nbsp;&nbsp;&nbsp;#PROXY_PATH=/usr/local/bin<br style="margin: 0px; padding: 0px;" />13&nbsp;&nbsp;&nbsp;&nbsp;PROXY_PATH=/opt/mysql-proxy/bin<br style="margin: 0px; padding: 0px;" />14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />15&nbsp;&nbsp;&nbsp;&nbsp;prog="mysql-proxy"<br style="margin: 0px; padding: 0px;" />16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />17&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Source&nbsp;networking&nbsp;configuration.<br style="margin: 0px; padding: 0px;" />18&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;/etc/sysconfig/network<br style="margin: 0px; padding: 0px;" />19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />20&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Check&nbsp;that&nbsp;networking&nbsp;is&nbsp;up.<br style="margin: 0px; padding: 0px;" />21&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;${NETWORKING}&nbsp;=&nbsp;"no"&nbsp;]&nbsp;&amp;&amp;&nbsp;exit&nbsp;0<br style="margin: 0px; padding: 0px;" />22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />23&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Set&nbsp;default&nbsp;mysql-proxy&nbsp;configuration.<br style="margin: 0px; padding: 0px;" />24&nbsp;&nbsp;&nbsp;&nbsp;#PROXY_OPTIONS="--daemon"<br style="margin: 0px; padding: 0px;" />25&nbsp;&nbsp;&nbsp;&nbsp;PROXY_OPTIONS="--admin-username=root&nbsp;--admin-password=password&nbsp;--proxy-read-only-backend-addresses=192.168.10.131:3306&nbsp;--proxy-backend-addresses=192.168.10.130:3306&nbsp;&nbsp;--admin-lua-script=/opt/mysql-proxy/lib/mysql-proxy/lua/admin.lua&nbsp;--proxy-lua-script=/opt/mysql-proxy/scripts/rw-splitting.lua"<br style="margin: 0px; padding: 0px;" />26&nbsp;&nbsp;&nbsp;&nbsp;PROXY_PID=/opt/mysql-proxy/run/mysql-proxy.pid<br style="margin: 0px; padding: 0px;" />27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />28&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Source&nbsp;mysql-proxy&nbsp;configuration.<br style="margin: 0px; padding: 0px;" />29&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[&nbsp;-f&nbsp;/etc/sysconfig/mysql-proxy&nbsp;];&nbsp;then<br style="margin: 0px; padding: 0px;" />30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;/etc/sysconfig/mysql-proxy<br style="margin: 0px; padding: 0px;" />31&nbsp;&nbsp;&nbsp;&nbsp;fi<br style="margin: 0px; padding: 0px;" />32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />33&nbsp;&nbsp;&nbsp;&nbsp;PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH<br style="margin: 0px; padding: 0px;" />34&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />35&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;By&nbsp;default&nbsp;it's&nbsp;all&nbsp;good<br style="margin: 0px; padding: 0px;" />36&nbsp;&nbsp;&nbsp;&nbsp;RETVAL=0<br style="margin: 0px; padding: 0px;" />37&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />38&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;See&nbsp;how&nbsp;we&nbsp;were&nbsp;called.<br style="margin: 0px; padding: 0px;" />39&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;"$1"&nbsp;in<br style="margin: 0px; padding: 0px;" />40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start)<br style="margin: 0px; padding: 0px;" />41&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Start&nbsp;daemon.<br style="margin: 0px; padding: 0px;" />42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;-n&nbsp;$"Starting&nbsp;$prog:&nbsp;"<br style="margin: 0px; padding: 0px;" />43&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$NICELEVEL&nbsp;$PROXY_PATH/mysql-proxy&nbsp;$PROXY_OPTIONS&nbsp;--daemon&nbsp;--pid-file=$PROXY_PID&nbsp;--user=mysql&nbsp;--log-level=warning&nbsp;--log-file=/opt/mysql-proxy/log/mysql-proxy.log<br style="margin: 0px; padding: 0px;" />44&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETVAL=$?<br style="margin: 0px; padding: 0px;" />45&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo<br style="margin: 0px; padding: 0px;" />46&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[&nbsp;$RETVAL&nbsp;=&nbsp;0&nbsp;];&nbsp;then<br style="margin: 0px; padding: 0px;" />47&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;touch&nbsp;/var/lock/subsys/mysql-proxy<br style="margin: 0px; padding: 0px;" />48&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br style="margin: 0px; padding: 0px;" />49&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br style="margin: 0px; padding: 0px;" />50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stop)<br style="margin: 0px; padding: 0px;" />51&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Stop&nbsp;daemons.<br style="margin: 0px; padding: 0px;" />52&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;-n&nbsp;$"Stopping&nbsp;$prog:&nbsp;"<br style="margin: 0px; padding: 0px;" />53&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;killproc&nbsp;$prog<br style="margin: 0px; padding: 0px;" />54&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETVAL=$?<br style="margin: 0px; padding: 0px;" />55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo<br style="margin: 0px; padding: 0px;" />56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;[&nbsp;$RETVAL&nbsp;=&nbsp;0&nbsp;];&nbsp;then<br style="margin: 0px; padding: 0px;" />57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;-f&nbsp;/var/lock/subsys/mysql-proxy<br style="margin: 0px; padding: 0px;" />58&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;-f&nbsp;$PROXY_PID<br style="margin: 0px; padding: 0px;" />59&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br style="margin: 0px; padding: 0px;" />60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br style="margin: 0px; padding: 0px;" />61&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;restart)<br style="margin: 0px; padding: 0px;" />62&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$0&nbsp;stop<br style="margin: 0px; padding: 0px;" />63&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep&nbsp;3<br style="margin: 0px; padding: 0px;" />64&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$0&nbsp;start<br style="margin: 0px; padding: 0px;" />65&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br style="margin: 0px; padding: 0px;" />66&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;condrestart)<br style="margin: 0px; padding: 0px;" />67&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;-e&nbsp;/var/lock/subsys/mysql-proxy&nbsp;]&nbsp;&amp;&amp;&nbsp;$0&nbsp;restart<br style="margin: 0px; padding: 0px;" />68&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br style="margin: 0px; padding: 0px;" />69&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status)<br style="margin: 0px; padding: 0px;" />70&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;mysql-proxy<br style="margin: 0px; padding: 0px;" />71&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETVAL=$?<br style="margin: 0px; padding: 0px;" />72&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br style="margin: 0px; padding: 0px;" />73&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*)<br style="margin: 0px; padding: 0px;" />74&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"Usage:&nbsp;$0&nbsp;{start|stop|restart|status|condrestart}"<br style="margin: 0px; padding: 0px;" />75&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RETVAL=1<br style="margin: 0px; padding: 0px;" />76&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;<br style="margin: 0px; padding: 0px;" />77&nbsp;&nbsp;&nbsp;&nbsp;esac<br style="margin: 0px; padding: 0px;" />78&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />79&nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;$RETVAL</div><div style="margin: 5px 0px 0px;"><span style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5;"><a href="" title="复制代码" style="margin: 0px; padding: 0px; color: #3b5999; text-decoration: none; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; border: none !important;" /></a></span></div></div><strong style="margin: 0px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">脚本参数详解：</strong><br style="margin: 0px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;" /><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">==============================================<br style="margin: 0px; padding: 0px;" />PROXY_PATH=/opt/mysql-proxy/bin //定义mysql-proxy服务二进制文件路径</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">PROXY_OPTIONS="--admin-username=root \ //定义内部管理服务器账号<br style="margin: 0px; padding: 0px;" />--admin-password=password \ //定义内部管理服务器密码<br style="margin: 0px; padding: 0px;" />--proxy-read-only-backend-addresses=192.168.10.131:3306 \ //定义后端只读从服务器地址<br style="margin: 0px; padding: 0px;" />--proxy-backend-addresses=192.168.10.130:3306 \ //定义后端主服务器地址<br style="margin: 0px; padding: 0px;" />--admin-lua-script=/opt/mysql-proxy/lib/mysql-proxy/lua/admin.lua \ //定义lua管理脚本路径<br style="margin: 0px; padding: 0px;" />--proxy-lua-script=/opt/mysql-proxy/scripts/rw-splitting.lua" \ //定义lua读写分离脚本路径</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">PROXY_PID=/opt/mysql-proxy/run/mysql-proxy.pid //定义mysql-proxy PID文件路径</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">$NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS \<br style="margin: 0px; padding: 0px;" />--daemon \ //定义以守护进程模式启动<br style="margin: 0px; padding: 0px;" />--keepalive \ //使进程在异常关闭后能够自动恢复<br style="margin: 0px; padding: 0px;" />--pid-file=$PROXY_PID \ //定义mysql-proxy PID文件路径<br style="margin: 0px; padding: 0px;" />--user=mysql \ //以mysql用户身份启动服务<br style="margin: 0px; padding: 0px;" />--log-level=warning \ //定义log日志级别，由高到低分别有(error|warning|info|message|debug)<br style="margin: 0px; padding: 0px;" />--log-file=/opt/mysql-proxy/log/mysql-proxy.log //定义log日志文件路径<br style="margin: 0px; padding: 0px;" />==============================================</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">cp mysql-proxy /opt/mysql-proxy/init.d/<br style="margin: 0px; padding: 0px;" />chmod +x /opt/mysql-proxy/init.d/mysql-proxy</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">mkdir /opt/mysql-proxy/run<br style="margin: 0px; padding: 0px;" />mkdir /opt/mysql-proxy/log</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">mkdir /opt/mysql-proxy/scripts</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">配置并使用rw-splitting.lua读写分离脚本</strong><br style="margin: 0px; padding: 0px;" />最新的脚本我们可以从最新的mysql-proxy源码包中获取<br style="margin: 0px; padding: 0px;" />cd /opt/install</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">wget http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1.tar.gz</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">tar xzvf mysql-proxy-0.8.1.tar.gz<br style="margin: 0px; padding: 0px;" />cd mysql-proxy-0.8.1<br style="margin: 0px; padding: 0px;" />cp lib/rw-splitting.lua /opt/mysql-proxy/scripts</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">修改读写分离脚本rw-splitting.lua<br style="margin: 0px; padding: 0px;" />修改默认连接，进行快速测试，不修改的话要达到连接数为4时才启用读写分离<br style="margin: 0px; padding: 0px;" />vim /opt/mysql-proxy/scripts/rw-splitting.lua<br style="margin: 0px; padding: 0px;" />=============================<br style="margin: 0px; padding: 0px;" />-- connection pool<br style="margin: 0px; padding: 0px;" />if not proxy.global.config.rwsplit then<br style="margin: 0px; padding: 0px;" />proxy.global.config.rwsplit = {<br style="margin: 0px; padding: 0px;" />min_idle_connections = 1, //默认为4<br style="margin: 0px; padding: 0px;" />max_idle_connections = 1, //默认为8<br style="margin: 0px; padding: 0px;" />is_debug = false<br style="margin: 0px; padding: 0px;" />}<br style="margin: 0px; padding: 0px;" />end<br style="margin: 0px; padding: 0px;" />=============================</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">修改完成后，启动mysql-proxy<br style="margin: 0px; padding: 0px;" />/opt/mysql-proxy/init.d/mysql-proxy start</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">3.5 测试读写分离效果</strong><br style="margin: 0px; padding: 0px;" />创建用于读写分离的数据库连接用户<br style="margin: 0px; padding: 0px;" />登陆主数据库服务器192.168.10.130，通过命令行登录管理MySQL服务器<br style="margin: 0px; padding: 0px;" />/opt/mysql/bin/mysql -uroot -p'new-password'<br style="margin: 0px; padding: 0px;" />mysql&gt; GRANT ALL ON *.* TO 'proxy1'@'192.168.10.132' IDENTIFIED BY 'password';<br style="margin: 0px; padding: 0px;" />由于我们配置了主从复制功能，因此从数据库服务器192.168.10.131上已经同步了此操作。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">为了清晰的看到读写分离的效果，需要暂时关闭MySQL主从复制功能<br style="margin: 0px; padding: 0px;" />登陆从数据库服务器192.168.10.131，通过命令行登录管理MySQL服务器<br style="margin: 0px; padding: 0px;" />/opt/mysql/bin/mysql -uroot -p'new-password'</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">关闭Slave同步进程<br style="margin: 0px; padding: 0px;" />mysql&gt; stop slave;<br style="margin: 0px; padding: 0px;" />Query OK, 0 rows affected (0.00 sec)</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">连接MySQL-Proxy<br style="margin: 0px; padding: 0px;" />/opt/mysql/bin/mysql -uproxy1 -p'password' -P4040 -h192.168.10.132</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">登陆成功后，在first_db数据的first_tb表中插入两条记录<br style="margin: 0px; padding: 0px;" />mysql&gt; use first_db;<br style="margin: 0px; padding: 0px;" />Database changed<br style="margin: 0px; padding: 0px;" />mysql&gt; insert into first_tb values (007,&#8217;first&#8217;);<br style="margin: 0px; padding: 0px;" />Query Ok, 1 row affected (0.00 sec)<br style="margin: 0px; padding: 0px;" />mysql&gt; insert into first_tb values (110,&#8217;second&#8217;);<br style="margin: 0px; padding: 0px;" />Query Ok, 1 row affected (0.00 sec)</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">查询记录<br style="margin: 0px; padding: 0px;" />mysql&gt; select * from first_tb;<br style="margin: 0px; padding: 0px;" />=============================<br style="margin: 0px; padding: 0px;" />+------+------+<br style="margin: 0px; padding: 0px;" />| id | name |<br style="margin: 0px; padding: 0px;" />+------+------+<br style="margin: 0px; padding: 0px;" />| 1 | myself |<br style="margin: 0px; padding: 0px;" />+------+------+<br style="margin: 0px; padding: 0px;" />1 rows in set (0.00 sec)<br style="margin: 0px; padding: 0px;" />=============================<br style="margin: 0px; padding: 0px;" />通过读操作并没有看到新记录</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">mysql&gt; quit<br style="margin: 0px; padding: 0px;" />退出MySQL-Proxy</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">下面，分别登陆到主从数据库服务器，对比记录信息<br style="margin: 0px; padding: 0px;" />首先，检查主数据库服务器<br style="margin: 0px; padding: 0px;" />mysql&gt; select * from first_tb;<br style="margin: 0px; padding: 0px;" />=============================<br style="margin: 0px; padding: 0px;" />+------+------+<br style="margin: 0px; padding: 0px;" />| id | name |<br style="margin: 0px; padding: 0px;" />+------+------+<br style="margin: 0px; padding: 0px;" />| 1 | myself |<br style="margin: 0px; padding: 0px;" />+------+------+<br style="margin: 0px; padding: 0px;" />| 007 | first |<br style="margin: 0px; padding: 0px;" />+------+------+<br style="margin: 0px; padding: 0px;" />| 110 | second |<br style="margin: 0px; padding: 0px;" />+------+------+<br style="margin: 0px; padding: 0px;" />3 rows in set (0.00 sec)<br style="margin: 0px; padding: 0px;" />=============================<br style="margin: 0px; padding: 0px;" />两条新记录都已经存在</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">然后，检查从数据库服务器<br style="margin: 0px; padding: 0px;" />mysql&gt; select * from first_tb;<br style="margin: 0px; padding: 0px;" />=============================<br style="margin: 0px; padding: 0px;" />+------+------+<br style="margin: 0px; padding: 0px;" />| id | name |<br style="margin: 0px; padding: 0px;" />+------+------+<br style="margin: 0px; padding: 0px;" />| 1 | myself |<br style="margin: 0px; padding: 0px;" />+------+------+<br style="margin: 0px; padding: 0px;" />1 rows in set (0.00 sec)<br style="margin: 0px; padding: 0px;" />=============================<br style="margin: 0px; padding: 0px;" />没有新记录存在</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">由此验证，我们已经实现了MySQL读写分离，目前所有的写操作都全部在Master主服务器上，用来避免数据的不同步；<br style="margin: 0px; padding: 0px;" />另外，所有的读操作都分摊给了其它各个Slave从服务器上，用来分担数据库压力。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">经验分享：</strong><br style="margin: 0px; padding: 0px;" />1.当MySQL主从复制在 show slave status\G 时出现Slave_IO_Running或Slave_SQL_Running 的值不为YES时，需要首先通过 stop slave 来停止从服务器，然后再执行一次本文 2.1与2.2 章节中的步骤即可恢复，但如果想尽可能的同步更多的数据，可以在Slave上将master_log_pos节点的值在之前同步失效的值的基础上增大一 些，然后反复测试，直到同步OK。因为MySQL主从复制的原理其实就是从服务器读取主服务器的binlog，然后根据binlog的记录来更新数据库。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">2.MySQL-Proxy的rw-splitting.lua脚本在网上有很多版本，但是最准确无误的版本仍然是源码包中所附带的lib/rw-splitting.lua脚本，如果有lua脚本编程基础的话，可以在这个脚本的基础上再进行优化；</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">3.MySQL-Proxy实际上非常不稳定，在高并发或有错误连接的情况下，进程很容易自动关闭，因此打开--keepalive参数让进程自动 恢复是个比较好的办法，但还是不能从根本上解决问题，因此通常最稳妥的做法是在每个从服务器上安装一个MySQL-Proxy供自身使用，虽然比较低效但 却能保证稳定性；</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">4.一主多从的架构并不是最好的架构，通常比较优的做法是通过程序代码和中间件等方面，来规划，比如设置对表数据的自增id值差异增长等方式来实现两个或多个主服务器，但一定要注意保证好这些主服务器数据的完整性，否则效果会比多个一主多从的架构还要差；</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">5.MySQL-Cluster 的稳定性也不是太好；</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">6.Amoeba for MySQL 是一款优秀的中间件软件，同样可以实现读写分离，负载均衡等功能，并且稳定性要大大超过MySQL-Proxy，建议大家用来替代MySQL-Proxy，甚至MySQL-Cluster。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: verdana, 'ms song', 宋体, Arial, 微软雅黑, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;">原文出处：http://heylinux.com/archives/1004.html</p><img src ="http://www.blogjava.net/xiaomage234/aggbug/397004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2013-03-26 15:41 <a href="http://www.blogjava.net/xiaomage234/archive/2013/03/26/397004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>淘宝数据魔方技术架构解析【转】</title><link>http://www.blogjava.net/xiaomage234/archive/2012/12/13/392923.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 13 Dec 2012 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/12/13/392923.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/392923.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/12/13/392923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/392923.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/392923.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">from:<a href="http://blog.jobbole.com/1194/">http://blog.jobbole.com/1194/</a>&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;淘宝网拥有国内最具商业价值的海量数据。截至当前，每天有超过30亿的店铺、商品浏览记录，10亿在线商品数，上千万的成交、收藏和评价数据。如何从这些数据中挖掘出真正的商业价值，进而帮助淘宝、商家进行企业的数据化运营，帮助消费者进行理性的购物决策，是淘宝数据平台与产品部的使命。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">为此，我们进行了一系列数据产品的研发，比如为大家所熟知的量子统计、数据魔方和淘宝指数等。尽管从业务层面来讲，数据产品的研发难度并不高；但在 &#8220;海量&#8221;的限定下，数据产品的计算、存储和检索难度陡然上升。本文将以数据魔方为例，向大家介绍淘宝在海量数据产品技术架构方面的探索。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "><strong style="margin: 0px; padding: 0px; ">淘宝海量数据产品技术架构</strong></p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">数据产品的一个最大特点是数据的非实时写入，正因为如此，我们可以认为，在一定的时间段内，整个系统的数据是只读的。这为我们设计缓存奠定了非常重要的基础。</p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3861"  aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a href="http://blog.jobbole.com/wp-content/uploads/2011/08/1-taobao-shuju-mofan.jpg" rel="lightbox[1194]" title="淘宝海量数据产品技术架构" style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3861"="" title="淘宝海量数据产品技术架构" src="http://blog.jobbole.com/wp-content/uploads/2011/08/1-taobao-shuju-mofan.jpg" alt="淘宝海量数据产品技术架构" width="500" height="273" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">图1 淘宝海量数据产品技术架构</dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">&nbsp;</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">按照数据的流向来划分，我们把淘宝数据产品的技术架构分为五层（如图1所示），分别是数据源、计算层、存储层、查询层和产品层。位于架构顶端的是我们的数据来源层，这里有淘宝主站的用户、店铺、商品和交易等数据库，还有用户的浏览、搜索等行为日志等。这一系列的数据是数据产品最原始的生命力所在。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">在数据源层实时产生的数据，通过淘宝自主研发的数据传输组件DataX、DbSync和Timetunnel准实时地传输到一个有1500个节点的 Hadoop集群上，这个集群我们称之为&#8220;云梯&#8221;，是计算层的主要组成部分。在&#8220;云梯&#8221;上，我们每天有大约40000个作业对1.5PB的原始数据按照产品需求进行不同的MapReduce计算。这一计算过程通常都能在凌晨两点之前完成。相对于前端产品看到的数据，这里的计算结果很可能是一个处于中间状态的结果，这往往是在数据冗余与前端计算之间做了适当平衡的结果。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">不得不提的是，一些对实效性要求很高的数据，例如针对搜索词的统计数据，我们希望能尽快推送到数据产品前端。这种需求再采用&#8220;云梯&#8221;来计算效率将是比较低的，为此我们做了流式数据的实时计算平台，称之为&#8220;银河&#8221;。&#8220;银河&#8221;也是一个分布式系统，它接收来自TimeTunnel的实时消息，在内存中做实时计算，并把计算结果在尽可能短的时间内刷新到<span style="margin: 0px; padding: 0px; "><a href="http://blog.jobbole.com/1344/" title="8种Nosql数据库系统对比" target="_blank" style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; ">NoSQL</a></span>存储设备中，供前端产品调用。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">容易理解，&#8220;云梯&#8221;或者&#8220;银河&#8221;并不适合直接向产品提供实时的数据查询服务。这是因为，对于&#8220;云梯&#8221;来说，它的定位只是做离线计算的，无法支持较高的性能和并发需求；而对于&#8220;银河&#8221;而言，尽管所有的代码都掌握在我们手中，但要完整地将数据接收、实时计算、存储和查询等功能集成在一个分布式系统中，避免不了分层，最终仍然落到了目前的架构上。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">为此，我们针对前端产品设计了专门的存储层。在这一层，我们有基于MySQL的分布式关系型数据库集群MyFOX和基于HBase的NoSQL存储集群Prom，在后面的文字中，我将重点介绍这两个集群的实现原理。除此之外，其他第三方的模块也被我们纳入存储层的范畴。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">存储层异构模块的增多，对前端产品的使用带来了挑战。为此，我们设计了通用的数据中间层&#8212;&#8212;glider&#8212;&#8212;来屏蔽这个影响。glider以HTTP协议对外提供restful方式的接口。数据产品可以通过一个唯一的URL获取到它想要的数据。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">以上是淘宝海量数据产品在技术架构方面的一个概括性的介绍，接下来我将重点从四个方面阐述数据魔方设计上的特点。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "><strong style="margin: 0px; padding: 0px; ">关系型数据库仍然是王道</strong></p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">关系型数据库（RDBMS）自20世纪70年代提出以来，在工业生产中得到了广泛的使用。经过三十多年的长足发展，诞生了一批优秀的数据库软件，例如Oracle、MySQL、DB2、Sybase和SQL Server等。</p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3862"  aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a href="http://blog.jobbole.com/wp-content/uploads/2011/08/2-curve-of-myfox.jpg" rel="lightbox[1194]" title="图2 MyFOX中的数据增长曲线" style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3862"="" title="图2 MyFOX中的数据增长曲线" src="http://blog.jobbole.com/wp-content/uploads/2011/08/2-curve-of-myfox.jpg" alt="图2 MyFOX中的数据增长曲线" width="500" height="208" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">图2 MyFOX中的数据增长曲线</dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">&nbsp;</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">尽管相对于非关系型数据库而言，关系型数据库在分区容忍性（Tolerance to Network Partitions）方面存在劣势，但由于它强大的语义表达能力以及数据之间的关系表达能力，在数据产品中仍然占据着不可替代的作用。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">淘宝数据产品选择MySQL的MyISAM引擎作为底层的数据存储引擎。在此基础上，为了应对海量数据，我们设计了分布式MySQL集群的查询代理层&#8212;&#8212;MyFOX，使得分区对前端应用透明。</p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3863"  aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a href="http://blog.jobbole.com/wp-content/uploads/2011/08/3-data-searche-process-of-taobao.jpg" rel="lightbox[1194]" title="图3 MyFOX的数据查询过程" style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3863"="" title="图3 MyFOX的数据查询过程" src="http://blog.jobbole.com/wp-content/uploads/2011/08/3-data-searche-process-of-taobao.jpg" alt="图3 MyFOX的数据查询过程" width="500" height="282" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">图3 MyFOX的数据查询过程</dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">&nbsp;</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">目前，存储在MyFOX中的统计结果数据已经达到10TB，占据着数据魔方总数据量的95%以上，并且正在以每天超过6亿的增量增长着（如图2所示）。这些数据被我们近似均匀地分布到20个MySQL节点上，在查询时，经由MyFOX透明地对外服务（如图3所示）。</p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3864"  aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a href="http://blog.jobbole.com/wp-content/uploads/2011/08/4-node-of-taobao-mofang.jpg" rel="lightbox[1194]" title="图4 MyFOX节点结构" style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3864"="" title="图4 MyFOX节点结构" src="http://blog.jobbole.com/wp-content/uploads/2011/08/4-node-of-taobao-mofang.jpg" alt="图4 MyFOX节点结构" width="500" height="289" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">图4 MyFOX节点结构</dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">&nbsp;</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">值得一提的是，在MyFOX现有的20个节点中，并不是所有节点都是&#8220;平等&#8221;的。一般而言，数据产品的用户更多地只关心&#8220;最近几天&#8221;的数据，越早的数据，越容易被冷落。为此，出于硬件成本考虑，我们在这20个节点中分出了&#8220;热节点&#8221;和&#8220;冷节点&#8221;（如图4所示）。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">顾名思义，&#8220;热节点&#8221;存放最新的、被访问频率较高的数据。对于这部分数据，我们希望能给用户提供尽可能快的查询速度，所以在硬盘方面，我们选择了每分钟15000转的SAS硬盘，按照一个节点两台机器来计算，单位数据的存储成本约为4.5W/TB。相对应地，&#8220;冷数据&#8221;我们选择了每分钟7500转的 SATA硬盘，单碟上能够存放更多的数据，存储成本约为1.6W/TB。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">将冷热数据进行分离的另外一个好处是可以有效降低内存磁盘比。从图4可以看出，&#8220;热节点&#8221;上单机只有24GB内存，而磁盘装满大约有 1.8TB（300 * 12 * 0.5 / 1024），内存磁盘比约为4:300，远远低于MySQL服务器的一个合理值。内存磁盘比过低导致的后果是，总有一天，即使所有内存用完也存不下数据的索引了&#8212;&#8212;这个时候，大量的查询请求都需要从磁盘中读取索引，效率大打折扣。<br style="margin: 0px; padding: 0px; " /><strong style="margin: 0px; padding: 0px; ">NoSQL是SQL的有益补充</strong></p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">在MyFOX出现之后，一切都看起来那么完美，开发人员甚至不会意识到MyFOX的存在，一条不用任何特殊修饰的SQL语句就可以满足需求。这个状态持续了很长一段时间，直到有一天，我们碰到了传统的关系型数据库无法解决的问题&#8212;&#8212;全属性选择器（如图5所示）。</p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3865"  aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a href="http://blog.jobbole.com/wp-content/uploads/2011/08/5-selector-of-taobao-mofang.jpg" rel="lightbox[1194]" title="图5 全属性选择器" style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3865"="" title="图5 全属性选择器" src="http://blog.jobbole.com/wp-content/uploads/2011/08/5-selector-of-taobao-mofang.jpg" alt="图5 全属性选择器" width="500" height="262" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">图5 全属性选择器</dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">&nbsp;</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">这是一个非常典型的例子。为了说明问题，我们仍然以关系型数据库的思路来描述。对于笔记本电脑这个类目，用户某一次查询所选择的过滤条件可能包括 &#8220;笔记本尺寸&#8221;、&#8220;笔记本定位&#8221;、&#8220;硬盘容量&#8221;等一系列属性（字段），并且在每个可能用在过滤条件的属性上，属性值的分布是极不均匀的。在图5中我们可以看到，笔记本电脑的尺寸这一属性有着10个枚举值，而&#8220;蓝牙功能&#8221;这个属性值是个布尔值，数据的筛选性非常差。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">在用户所选择的过滤条件不确定的情况下，解决全属性问题的思路有两个：一个是穷举所有可能的过滤条件组合，在&#8220;云梯&#8221;上进行预先计算，存入数据库供查询；另一个是存储原始数据，在用户查询时根据过滤条件筛选出相应的记录进行现场计算。很明显，由于过滤条件的排列组合几乎是无法穷举的，第一种方案在现实中是不可取的；而第二种方案中，原始数据存储在什么地方？如果仍然用关系型数据库，那么你打算怎样为这个表建立索引？</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">这一系列问题把我们引到了&#8220;创建定制化的存储、现场计算并提供查询服务的引擎&#8221;的思路上来，这就是Prometheus（如图6所示）。</p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3867"  aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a href="http://blog.jobbole.com/wp-content/uploads/2011/08/6-structure-of-taobao-mofang.jpg" rel="lightbox[1194]" title="图6 Prom的存储结构" style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3867"="" title="图6 Prom的存储结构" src="http://blog.jobbole.com/wp-content/uploads/2011/08/6-structure-of-taobao-mofang.jpg" alt="图6 Prom的存储结构" width="500" height="265" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">图6 Prom的存储结构</dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">&nbsp;</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">从图6可以看出，我们选择了HBase作为Prom的底层存储引擎。之所以选择HBase，主要是因为它是建立在HDFS之上的，并且对于 MapReduce有良好的编程接口。尽管Prom是一个通用的、解决共性问题的服务框架，但在这里，我们仍然以全属性选择为例，来说明Prom的工作原理。这里的原始数据是前一天在淘宝上的交易明细，在HBase集群中，我们以属性对（属性与属性值的组合）作为row-key进行存储。而row-key 对应的值，我们设计了两个column-family，即存放交易ID列表的index字段和原始交易明细的data字段。在存储的时候，我们有意识地让每个字段中的每一个元素都是定长的，这是为了支持通过偏移量快速地找到相应记录，避免复杂的查找算法和磁盘的大量随机读取请求。</p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3868"  aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a href="http://blog.jobbole.com/wp-content/uploads/2011/08/7-query-of-porm.jpg" rel="lightbox[1194]" title="图7 Prom查询过程" style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3868"="" title="图7 Prom查询过程" src="http://blog.jobbole.com/wp-content/uploads/2011/08/7-query-of-porm.jpg" alt="图7 Prom查询过程" width="500" height="268" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">图7 Prom查询过程</dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">&nbsp;</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">图7用一个典型的例子描述的Prom在提供查询服务时的工作原理，限于篇幅，这里不做详细描述。值得一提的是，Prom支持的计算并不仅限于求和 SUM运算，统计意义上的常用计算都是支持的。在现场计算方面，我们对Hbase进行了扩展，Prom要求每个节点返回的数据是已经经过&#8220;本地计算&#8221;的局部最优解，最终的全局最优解只是各个节点返回的局部最优解的一个简单汇总。很显然，这样的设计思路是要充分利用各个节点的并行计算能力，并且避免大量明细数据的网络传输开销。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "><strong style="margin: 0px; padding: 0px; ">用中间层隔离前后端</strong></p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">上文提到过，MyFOX和Prom为数据产品的不同需求提供了数据存储和底层查询的解决方案，但随之而来的问题是，各种异构的存储模块给前端产品的使用带来了很大的挑战。并且，前端产品的一个请求所需要的数据往往不可能只从一个模块获取。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">举个例子，我们要在数据魔方中看昨天做热销的商品，首先从MyFOX中拿到一个热销排行榜的数据，但这里的&#8220;商品&#8221;只是一个ID，并没有ID所对应的商品描述、图片等数据。这个时候我们要从淘宝主站提供的接口中去获取这些数据，然后一一对应到热销排行榜中，最终呈现给用户。</p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3869"  aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a href="http://blog.jobbole.com/wp-content/uploads/2011/08/8-architecture-of-glider.jpg" rel="lightbox[1194]" title="图8 glider的技术架构" style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3869"="" title="图8 glider的技术架构" src="http://blog.jobbole.com/wp-content/uploads/2011/08/8-architecture-of-glider.jpg" alt="图8 glider的技术架构" width="500" height="284" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">图8 glider的技术架构</dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">&nbsp;</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">有经验的读者一定可以想到，从本质上来讲，这就是广义上的异构&#8220;表&#8221;之间的JOIN操作。那么，谁来负责这个事情呢？很容易想到，在存储层与前端产品之间增加一个中间层，它负责各个异构&#8220;表&#8221;之间的数据JOIN和UNION等计算，并且隔离前端产品和后端存储，提供统一的数据查询服务。这个中间层就是glider（如图8所示）。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "><strong style="margin: 0px; padding: 0px; ">缓存是系统化的工程</strong></p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">除了起到隔离前后端以及异构&#8220;表&#8221;之间的数据整合的作用之外，glider的另外一个不容忽视的作用便是缓存管理。上文提到过，在特定的时间段内，我们认为数据产品中的数据是只读的，这是利用缓存来提高性能的理论基础。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">在图8中我们看到，glider中存在两层缓存，分别是基于各个异构&#8220;表&#8221;（datasource）的二级缓存和整合之后基于独立请求的一级缓存。除此之外，各个异构&#8220;表&#8221;内部可能还存在自己的缓存机制。细心的读者一定注意到了图3中MyFOX的缓存设计，我们没有选择对汇总计算后的最终结果进行缓存，而是针对每个分片进行缓存，其目的在于提高缓存的命中率，并且降低数据的冗余度。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">大量使用缓存的最大问题就是数据一致性问题。如何保证底层数据的变化在尽可能短的时间内体现给最终用户呢？这一定是一个系统化的工程，尤其对于分层较多的系统来说。</p><div mceiecenter"="" style="margin: 0px; color: #383838; font-family: Arial, Helvetica, sans-serif; line-height: normal; text-align: center; "><dl id="attachment_3870"  aligncenter"="" style="margin: 0px auto; padding: 0px; clear: both; width: 510px; "><dt style="margin: 0px; padding: 0px; "><a href="http://blog.jobbole.com/wp-content/uploads/2011/08/9-system-of-cache.jpg" rel="lightbox[1194]" title="图9 缓存控制体系" style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; "><img wp-image-3870"="" title="图9 缓存控制体系" src="http://blog.jobbole.com/wp-content/uploads/2011/08/9-system-of-cache.jpg" alt="图9 缓存控制体系" width="500" height="288" style="margin-top: 5px !important; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding: 5px; border: 1px solid #d4d4d4; background-color: #ffffff; border-top-left-radius: 6px; border-top-right-radius: 6px; border-bottom-right-radius: 6px; border-bottom-left-radius: 6px; background-position: initial initial; background-repeat: initial initial; " /></a></dt><dd style="margin: 0px; padding: 0px; ">图9 缓存控制体系</dd></dl></div><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">&nbsp;</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">图9向我们展示了数据魔方在缓存控制方面的设计思路。用户的请求中一定是带了缓存控制的&#8220;命令&#8221;的，这包括URL中的query string，和 HTTP头中的&#8220;If-None-Match&#8221;信息。并且，这个缓存控制&#8220;命令&#8221;一定会经过层层传递，最终传递到底层存储的异构&#8220;表&#8221;模块。各异构&#8220;表&#8221; 除了返回各自的数据之外，还会返回各自的数据缓存过期时间（ttl），而glider最终输出的过期时间是各个异构&#8220;表&#8221;过期时间的最小值。这一过期时间也一定是从底层存储层层传递，最终通过HTTP头返回给用户<span style="margin: 0px; padding: 0px; "><a href="http://blog.jobbole.com/12749/" title="浏览器" style="margin: 0px; padding: 0px; color: #0b5c77; outline: none; border: none; text-decoration: none; ">浏览器</a></span>的。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">缓存系统不得不考虑的另一个问题是缓存穿透与失效时的雪崩效应。缓存穿透是指查询一个一定不存在的数据，由于缓存是不命中时被动写的，并且出于容错考虑，如果从存储层查不到数据则不写入缓存，这将导致这个存在的数据每次请求都要到存储层去查询，失去了缓存的意义。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">有很多种方法可以有效地解决缓存穿透问题，最常见的则是采用布隆过滤器，将所有可能存在的数据哈希到一个足够大的bitmap中，一个一定不存在的数据会被这个bitmap拦截掉，从而避免了对底层存储系统的查询压力。在数据魔方里，我们采用了一个更为简单粗暴的方法，如果一个查询返回的数据为空（不管是数据不存在，还是系统故障），我们仍然把这个空结果进行缓存，但它的过期时间会很短，最长不超过五分钟。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">缓存失效时的雪崩效应对底层系统的冲击非常可怕。遗憾的是，这个问题目前并没有很完美的解决方案。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线程（进程）写，从而避免失效时大量的并发请求落到底层存储系统上。在数据魔方中，我们设计的缓存过期机制理论上能够将各个客户端的数据失效时间均匀地分布在时间轴上，一定程度上能够避免缓存同时失效带来的雪崩效应。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; "><strong style="margin: 0px; padding: 0px; ">结束语</strong></p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">正是基于本文所描述的架构特点，数据魔方目前已经能够提供压缩前80TB的数据存储空间，数据中间层glider支持每天4000万的查询请求，平均响应时间在28毫秒（6月1日数据），足以满足未来一段时间内的业务增长需求。</p><p style="margin: 0px; padding: 0px 0px 10px; text-indent: 2em; line-height: 22px; color: #383838; font-family: Arial, Helvetica, sans-serif; ">尽管如此，整个系统中仍然存在很多不完善的地方。一个典型的例子莫过于各个分层之间使用短连接模式的HTTP协议进行通信。这样的策略直接导致在流量高峰期单机的TCP连接数非常高。所以说，一个良好的架构固然能够在很大程度上降低开发和维护的成本，但它自身一定是随着数据量和流量的变化而不断变化的。我相信，过不了几年，淘宝数据产品的技术架构一定会是另外的样子。</p><img src ="http://www.blogjava.net/xiaomage234/aggbug/392923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-12-13 10:16 <a href="http://www.blogjava.net/xiaomage234/archive/2012/12/13/392923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】淘宝TFS分布式文件系统 + php接口</title><link>http://www.blogjava.net/xiaomage234/archive/2012/11/15/391374.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 15 Nov 2012 04:43:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/11/15/391374.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/391374.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/11/15/391374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/391374.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/391374.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 2012-05-05 01:15:57|&nbsp;&nbsp;分类：&nbsp;分布式文件系统&nbsp;|&nbsp;&nbsp;标签：淘宝tfs&nbsp;&nbsp;tfs&nbsp;&nbsp;tfs分布式文件系统&nbsp;&nbsp;分布式文件系统&nbsp;&nbsp;|字号&nbsp;订阅from:http://blog.163.com/a12333a_li/blog/stati...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaomage234/archive/2012/11/15/391374.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaomage234/aggbug/391374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-11-15 12:43 <a href="http://www.blogjava.net/xiaomage234/archive/2012/11/15/391374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下，我安装的mysql没有innodb引擎，怎么加上</title><link>http://www.blogjava.net/xiaomage234/archive/2012/10/29/390395.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Mon, 29 Oct 2012 04:28:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/10/29/390395.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/390395.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/10/29/390395.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/390395.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/390395.html</trackback:ping><description><![CDATA[<div>首先确定，在mysql的'plugin_dir'下有ha_innodb_plugin.so和ha_innodb.so两个文件 <br />查询'plugin_dir'的路径可以用以下命令 <br />mysql&gt; show variables like 'plugin_dir'; <br />+---------------+-----------------------------------+ <br />| Variable_name | Value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />+---------------+-----------------------------------+ <br />| plugin_dir&nbsp;&nbsp;&nbsp; | /usr/local/mysql/lib/mysql/plugin | <br />+---------------+-----------------------------------+ <br />1 row in set (0.01 sec) <br />如果没有找到，在您的mysql编译目录里有下面的目录文件(内置的innodb和innodb_plugin) <br />storage/innobase/.libs/ha_innodb.so <br />storage/innodb_plugin/.libs/ha_innodb_plugin.so <br />您需要把它们(ha_innodb_plugin.so和ha_innodb.so)拷贝到mysql的plugin目录中(/usr/local/mysql/lib/mysql/plugin) <br />接下来就是在mysql命令行安装一下 <br /># mysql <br />Welcome to the MySQL monitor.&nbsp; Commands end with ; or \g. <br />Your MySQL connection id is 18 <br />Server version: 5.1.36-log Source distribution <br />Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. <br />mysql&gt; show engines; <br />+------------+---------+-----------------------------------------------------------+--------------+------+------------+ <br />| Engine&nbsp;&nbsp;&nbsp;&nbsp; | Support | Comment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Transactions | XA&nbsp;&nbsp; | Savepoints | <br />+------------+---------+-----------------------------------------------------------+--------------+------+------------+ <br />| MRG_MYISAM | YES&nbsp;&nbsp;&nbsp;&nbsp; | Collection of identical MyISAM tables&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />| CSV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | YES&nbsp;&nbsp;&nbsp;&nbsp; | CSV storage engine&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />| MEMORY&nbsp;&nbsp;&nbsp;&nbsp; | YES&nbsp;&nbsp;&nbsp;&nbsp; | Hash based, stored in memory, useful for temporary tables | NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />| MyISAM&nbsp;&nbsp;&nbsp;&nbsp; | DEFAULT | Default engine as of MySQL 3.23 with great performance&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />+------------+---------+-----------------------------------------------------------+--------------+------+------------+ <br />4 rows in set (0.00 sec) <br />mysql&gt; INSTALL PLUGIN InnoDB SONAME 'ha_innodb.so'; <br />Query OK, 0 rows affected (0.69 sec) <br />mysql&gt; show engines; <br />+------------+---------+------------------------------------------------------------+--------------+------+------------+ <br />| Engine&nbsp;&nbsp;&nbsp;&nbsp; | Support | Comment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Transactions | XA&nbsp;&nbsp; | Savepoints | <br />+------------+---------+------------------------------------------------------------+--------------+------+------------+ <br />| InnoDB&nbsp;&nbsp;&nbsp;&nbsp; | YES&nbsp;&nbsp;&nbsp;&nbsp; | Supports transactions, row-level locking, and foreign keys | YES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | YES&nbsp; | YES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />| CSV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | YES&nbsp;&nbsp;&nbsp;&nbsp; | CSV storage engine&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />| MRG_MYISAM | YES&nbsp;&nbsp;&nbsp;&nbsp; | Collection of identical MyISAM tables&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />| MyISAM&nbsp;&nbsp;&nbsp;&nbsp; | DEFAULT | Default engine as of MySQL 3.23 with great performance&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />| MEMORY&nbsp;&nbsp;&nbsp;&nbsp; | YES&nbsp;&nbsp;&nbsp;&nbsp; | Hash based, stored in memory, useful for temporary tables&nbsp; | NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | NO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br />+------------+---------+------------------------------------------------------------+--------------+------+------------+ <br />5 rows in set (0.00 sec) <br /><br />OK,大功告成</div><img src ="http://www.blogjava.net/xiaomage234/aggbug/390395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-10-29 12:28 <a href="http://www.blogjava.net/xiaomage234/archive/2012/10/29/390395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下源码编译安装mongodb2</title><link>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383403.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 18 Jul 2012 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383403.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/383403.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/383403.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/383403.html</trackback:ping><description><![CDATA[<div><strong></strong> <p>MongoDB的源代码依赖了一些基础组件，如js引擎Spider Monkey，正则表达式引擎PCRE，安装构建工具Scons，以及C++的boost库等</p> <p><strong>1、准备</strong></p> <blockquote><p>wget <a href="http://downloads.mongodb.org/src/mongodb-src-r1.8.2.tar.gz">http://downloads.mongodb.org/src/mongodb-src-r1.8.2.tar.gz</a><br /> wget <a href="http://sourceforge.net/projects/scons/files/scons/2.1.0.alpha.20101125/scons-2.1.0.alpha.20101125.tar.gz/download">http://sourceforge.net/projects/scons/files/scons/2.1.0.alpha.20101125/scons-2.1.0.alpha.20101125.tar.gz/download</a><br /> wget <a href="http://ftp.mozilla.org/pub/mozilla.org/js/js-1.7.0.tar.gz">http://ftp.mozilla.org/pub/mozilla.org/js/js-1.7.0.tar.gz</a><br /> wget <a href="http://sourceforge.net/projects/pcre/files/pcre/7.4/pcre-7.4.tar.gz/download">http://sourceforge.net/projects/pcre/files/pcre/7.4/pcre-7.4.tar.gz/download</a><br /> wget <a href="http://downloads.sourceforge.net/project/boost/boost/1.42.0/boost_1_42_0.tar.gz?use_mirror=cdnetworks-kr-1">http://downloads.sourceforge.net/project/boost/boost/1.42.0/boost_1_42_0.tar.gz?use_mirror=cdnetworks-kr-1</a></p></blockquote> <p><strong>2、scons编译安装</strong></p> <blockquote><p>tar zxvf scons-2.1.0.alpha.20101125.tar.gz<br /> cd scons-2.1.0.alpha.20101125<br /> python setup.py install</p></blockquote> <p><strong>3、pcre编译安装</strong></p> <blockquote><p>tar zxvf pcre-7.4.tar.gz<br /> cd pcre-7.4<br /> configure --enable-unicode-properties<br /> make -j 2 &amp;&amp; make install</p></blockquote> <p>configure中要加入--enable-unicode-properties支持，要不运行mongod会出现下面错误</p> <blockquote><p>Fri Dec 30 23:53:45 Assertion: 10342:pcre not compiled with utf8 support<br /> 0x53f16a 0x5cfda1 0x8945f3 0x338101d994 0x4c0e49<br /> /usr/local/mongodb/bin/mongod(_ZN5mongo11msgassertedEiPKc+0x12a) [0x53f16a]<br /> /usr/local/mongodb/bin/mongod(_ZN5mongo6RXTest3runEv+0x3b1) [0x5cfda1]<br /> /usr/local/mongodb/bin/mongod(main+0x5c73) [0x8945f3]<br /> /lib64/libc.so.6(__libc_start_main+0xf4) [0x338101d994]<br /> /usr/local/mongodb/bin/mongod(__gxx_personality_v0+0x451) [0x4c0e49]</p></blockquote> <p><strong>4、js编译安装</strong></p> <blockquote><p>tar zxvf js-1.7.0.tar.gz<br /> cd js/src<br /> export CFLAGS="-DJS_C_STRINGS_ARE_UTF8"<br /> make -f Makefile.ref<br /> JS_DIST=/usr make -f Makefile.ref export</p></blockquote> <p><strong>5、boost编译安装</strong></p> <blockquote><p>tar -zxvf boost_1_42_0.tar.gz<br /> cd boost_1_42_0/<br /> #使用下面的命令创建boost自己的编译工具bjam（目的是保证Boost在任何平台上都能用bjam编译），类似于GNU Make。<br /> ./bootstrap.sh<br /> #会安装头文件和库文件到相应指定目录，头文件安装到/usr/local/include下，库文件安装到/usr/local/lib下<br /> install<br /> #最后执行的创建命令：<br /> ./bjam &#8211;without-python &#8211;layout=tagged variant=debug,release link=static,shared runtime-link=shared threading=multi stage</p></blockquote> <p><strong>6、mongodb编译安装</strong></p> <blockquote><p>tar -xzvf mongodb-src-r1.8.2.tar.tar<br /> cd mongodb-src-r1.8.2/<br /> scons all<br /> scons --prefix=/usr/local/mongodb --full install</p></blockquote> <p>安装成功后 安装到/usr/local/mongodb下</p> <p>文件结果</p> <blockquote><p>bin<br /> GNU-AGPL-3.0<br /> include<br /> lib64<br /> README<br /> THIRD-PARTY-NOTICES</p></blockquote> <p><strong>7、加入环境变量</strong></p> <p>/etc/profile 加入</p> <blockquote><p>CLASSPATH=.:/usr/local/lib<br /> export CLASSPATH</p></blockquote> <p>然后source /etc/profile</p> <p>完成后就可以运行mongodb。</p> <blockquote><p>[root@test_192.168.4.95 mongodb]# bin/mongo<br /> MongoDB shell version: 1.8.2<br /> connecting to: test</p></blockquote> <p>运行可能会出现下面错误</p> <blockquote><p>/usr/local/mongodb/bin/mongod: error while loading shared  libraries: libboost_system.so.1.42.0: cannot open shared object file:  No such file or directory</p></blockquote> <p>解决方法</p> <blockquote><p>echo "/usr/local/lib" &gt; /etc/ld.so.conf.d/usr_local_lib.conf<br /> /sbin/ldconfig</p></blockquote></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/383403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-07-18 15:20 <a href="http://www.blogjava.net/xiaomage234/archive/2012/07/18/383403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MongoDB master-slave replication测试</title><link>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383392.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 18 Jul 2012 04:52:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383392.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/383392.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/383392.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/383392.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 我们有项目用到了MongoDB，在正式运营时数据需要做实时备份，而目前资源也有限，只有两台机器用于MongoDB,所以选用MongoDB的Master-Slave Replication来实现实时备份，其实我是比较看好Replica Sets的，因为其可以实现自动切换，但我目前因为机器少只能做罢。两台机器一台为Master(192.168.1.173),一台为Slave(192.168.1.174...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaomage234/archive/2012/07/18/383392.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaomage234/aggbug/383392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-07-18 12:52 <a href="http://www.blogjava.net/xiaomage234/archive/2012/07/18/383392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于mongodb 的Oplog</title><link>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383393.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 18 Jul 2012 04:52:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383393.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/383393.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383393.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/383393.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/383393.html</trackback:ping><description><![CDATA[<div><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">mongodb的Replication是通过一个日志来存储写操作的，这个日志就叫做Oplog。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">在默认情况下,对于64位的mongodb,oplogs都相当大-可能是5%的磁盘空间。通常而言,这是一种合理的设置。可以通过mongod --oplogSize来改变Oplog的日志大小。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">Oplog的collectio为：</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">local.oplog.$main for master/slave replication;</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">local.oplog.rs for replica sets</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">如 master/slave replication：</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">&gt; use local&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />switched to db local<br />&gt; db.oplog.$main.help()<br />DBCollection help<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.find().help() - show DBCursor help<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.count()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.dataSize()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.distinct( key ) - eg. db.oplog.$main.distinct( 'x' )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.drop() drop the collection<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.dropIndex(name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.dropIndexes()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.ensureIndex(keypattern,options) - options should be an object with these possible fields: name, unique, dropDups<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.reIndex()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.find( [query] , [fields]) - first parameter is an optional query filter. second parameter is optional set of fields to return.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.g. db.oplog.$main.find( { x : 77 } , { name : 1 , x : 1 } )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.find(...).count()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.find(...).limit(n)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.find(...).skip(n)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.find(...).sort(...)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.findOne([query])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.findAndModify( { update : ... , remove : bool [, query: {}, sort: {}, 'new': false] } )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.getDB() get DB object associated with collection<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.getIndexes()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.group( { key : ..., initial: ..., reduce : ...[, cond: ...] } )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.mapReduce( mapFunction , reduceFunction , &lt;optional params&gt; )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.remove(query)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.renameCollection( newName , &lt;dropTarget&gt; ) renames the collection.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.runCommand( name , &lt;options&gt; ) runs a db command with the given name where the first param is the collection name<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.save(obj)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.stats()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.storageSize() - includes free space allocated to this collection<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.totalIndexSize() - size in bytes of all the indexes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.totalSize() - storage allocated for all data and indexes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.update(query, object[, upsert_bool, multi_bool])<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.validate() - SLOW<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.oplog.$main.getShardVersion() - only for use with sharding<br />&gt; db.oplog.$main.find()<br />{ "ts" : { "t" : 1294582140000, "i" : 14 }, "op" : "d", "ns" : "mixi_top_city.building_90", "b" : true, "o" : { "_id" : "6380690_441_30_29" } }<br />{ "ts" : { "t" : 1294582140000, "i" : 15 }, "op" : "i", "ns" : "mixi_top_city.building_90", "o" : { "_id" : "6380690_441_24_24", "uid" : "6380690", "x" : 24, "y" : 24, "pos" : 1, "btime" : 1294154452, "ntime" : 1294154452, "bid" : 71, "extprop" : 0, "status" : 0, "ucid" : 441 } }<br />{ "ts" : { "t" : 1294582140000, "i" : 16 }, "op" : "u", "ns" : "mixi_top_city.building_64", "o2" : { "_id" : "16702364_459_14_14" }, "o" : { "$set" : { "status" : 1 } } }<br />{ "ts" : { "t" : 1294582140000, "i" : 17 }, "op" : "u", "ns" : "mixi_top_city.building_08", "o2" : { "_id" : "6223408_391_30_28" }, "o" : { "$set" : { "ntime" : 1294582321 } } }<br />{ "ts" : { "t" : 1294582140000, "i" : 18 }, "op" : "u", "ns" : "mixi_top_city.building_03", "o2" : { "_id" : "9882403_353_28_20" }, "o" : { "$set" : { "ntime" : 1294600141 } } }<br />{ "ts" : { "t" : 1294582140000, "i" : 19 }, "op" : "u", "ns" : "mixi_top_city.building_24", "o2" : { "_id" : "4162924_365_32_28" }, "o" : { "$set" : { "ntime" : 1294582321 } } }<br />{ "ts" : { "t" : 1294582141000, "i" : 1 }, "op" : "u", "ns" : "mixi_top_city.building_49", "o2" : { "_id" : "32797749_285_28_30" }, "o" : { "$set" : { "ntime" : 1294583341 } } }<br />{ "ts" : { "t" : 1294582141000, "i" : 2 }, "op" : "u", "ns" : "mixi_top_city.building_50", "o2" : { "_id" : "33768850_425_28_32" }, "o" : { "$set" : { "ntime" : 1294582561 } } }<br />{ "ts" : { "t" : 1294582141000, "i" : 3 }, "op" : "u", "ns" : "mixi_top_city.building_35", "o2" : { "_id" : "28235635_333_28_36" }, "o" : { "$set" : { "ntime" : 1294582741 } } }<br />{ "ts" : { "t" : 1294582141000, "i" : 4 }, "op" : "u", "ns" : "mixi_top_city.building_04", "o2" : { "_id" : "25178304_3_32_28" }, "o" : { "$set" : { "ntime" : 1294594141 } } }<br />{ "ts" : { "t" : 1294582141000, "i" : 5 }, "op" : "u", "ns" : "mixi_top_city.building_18", "o2" : { "_id" : "7304918_445_32_26" }, "o" : { "$set" : { "ntime" : 1294582321 } } }<br />{ "ts" : { "t" : 1294582141000, "i" : 6 }, "op" : "u", "ns" : "mixi_top_city.building_93", "o2" : { "_id" : "5003293_453_20_24" }, "o" : { "$set" : { "status" : 1 } } }<br />{ "ts" : { "t" : 1294582141000, "i" : 7 }, "op" : "u", "ns" : "mixi_top_city.building_59", "o2" : { "_id" : "19601459_485_28_30" }, "o" : { "$set" : { "ntime" : 1294582741 } } }<br />{ "ts" : { "t" : 1294582141000, "i" : 8 }, "op" : "u", "ns" : "mixi_top_city.building_47", "o2" : { "_id" : "23744647_273_22_46" }, "o" : { "$set" : { "ntime" : 1294582741 } } }<br />{ "ts" : { "t" : 1294582141000, "i" : 9 }, "op" : "u", "ns" : "mixi_top_city.building_50", "o2" : { "_id" : "3549050_451_20_30" }, "o" : { "$set" : { "ntime" : 1294583041 } } }<br />{ "ts" : { "t" : 1294582141000, "i" : 10 }, "op" : "d", "ns" : "mixi_top_city.building_77", "b" : true, "o" : { "_id" : "8577977_215_44_38" } }<br />{ "ts" : { "t" : 1294582141000, "i" : 11 }, "op" : "i", "ns" : "mixi_top_city.building_77", "o" : { "_id" : "8577977_215_44_38", "uid" : "8577977", "x" : 44, "y" : 38, "pos" : 1, "btime" : 1293955498, "ntime" : 1294486420, "bid" : 18, "extprop" : 0, "status" : 0, "ucid" : 215 } }<br />{ "ts" : { "t" : 1294582141000, "i" : 12 }, "op" : "u", "ns" : "mixi_top_city.building_89", "o2" : { "_id" : "21405489_541_20_24" }, "o" : { "$set" : { "status" : 1 } } }<br />{ "ts" : { "t" : 1294582141000, "i" : 13 }, "op" : "u", "ns" : "mixi_top_city.building_60", "o2" : { "_id" : "6479060_395_16_32" }, "o" : { "$set" : { "ntime" : 1294582321 } } }<br />{ "ts" : { "t" : 1294582141000, "i" : 14 }, "op" : "u", "ns" : "mixi_top_city.building_38", "o2" : { "_id" : "12696438_1037_28_40" }, "o" : { "$set" : { "ntime" : 1294583042 } } }<br />has more<br />&gt;</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">Oplog日志中：</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">ts:Timestamp 这个操作的时间戳</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">op:operation 操作</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">i &#8211; insert<br />d &#8211; delete<br />u &#8211; update<br />c &#8211; command<br />n &#8211; no-op</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">ns:Namespace也就是操作的collection name</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">o:Document</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">查看master的Oplog信息：</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">[root@tc-03 cacti]# mongo<br />MongoDB shell version: 1.6.4<br />connecting to: test<br />&gt; db.printReplicationInfo();<br />configured oplog size:&nbsp;&nbsp; 7503.049113600001MB<br />log length start to end: 3566227secs (990.62hrs)<br />oplog first event time:&nbsp; Tue Jan 11 2011 12:17:03 GMT+0900 (KST)<br />oplog last event time:&nbsp;&nbsp; Mon Feb 21 2011 18:54:10 GMT+0900 (KST)<br />now:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mon Feb 21 2011 18:54:10 GMT+0900 (KST)</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">查看slave的同步状态：</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">&gt; db.printSlaveReplicationInfo()<br />source:&nbsp;&nbsp; 192.168.8.173<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; syncedTo: Mon Feb 21 2011 18:55:19 GMT+0900 (KST)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 31secs ago (0.01hrs)</p></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/383393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-07-18 12:52 <a href="http://www.blogjava.net/xiaomage234/archive/2012/07/18/383393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编译安装MongoDB</title><link>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383388.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 18 Jul 2012 03:43:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383388.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/383388.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/383388.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/383388.html</trackback:ping><description><![CDATA[<div><p><strong>一、安装PCRE库</strong><br /> PCRE(Perl Compatible Regular Expressions)，提供高速的正则表达式匹配api。</p> <pre>yum install pcre-devel</pre> <p>或者到ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/下载合适的pcre源码包，然后configure/make/make install</p> <p><strong>二、安装Spider Monkey库</strong><br /> SpiderMonkey是JavaScript的C实现，可以提供JavaScript的代码解释功能。<br /> 到ftp://ftp.mozilla.org/pub/mozilla.org/js/下载js压缩包，解压后进入src目录，并按照如下步骤进行编译安装：</p> <pre>export CFLAGS=&#8221;-DJS_C_STRINGS_ARE_UTF8&#8243;  make -f Makefile.ref JS_DIST=/usr make -f Makefile.ref export</pre> <p><strong>三、安装SCons</strong><br /> Scons是一个Python写的自动化构建工具，比传统的GNU make更加简便、可靠以及高效。<br /> 到http://sourceforge.net/projects/scons/files/scons/下载源码压缩包，解压之后按照如下步骤进行安装：</p> <pre>python setup.py install</pre> <p><strong>四、安装MongoDB</strong><br /> 先到http://www.mongodb.org/downloads/下载想要的MongoDB版本。建议下载1.6以上，有很多架构和功能方面的改进。<br /> 解压缩之后按照如下步骤进行安装：</p> <pre>scons all scons &#8211;prefix=/usr/local/mongodb install</pre> <p>如果想要头文件和lib包，执行</p> <pre>scons &#8211;prefix=/usr/local/mongodb &#8211;full install</pre> <p><strong>五，让MongoDB跑起来</strong><br /> 虽然MongoDB支持在命令行里面添加所有参数，但是为了管理方便，还是应该添加一个配置文件的。然后在命令行里面指定配置文件的位置。<br /> 下面是一个简单的配置文件：</p> <pre>vim /usr/local/mongodb/config/mongodb</pre> <pre>#Directory and relavent set dbpath = /usr/local/mongodb/data logpath = /usr/local/mongodb/log/mongodb.log repairpath = /usr/local/mongodb/repair pidfilepath = /usr/local/mongodb/mongodb.pid directoryperdb = true #sysinfo = true #verbose = true logappend = true #cpu = true #Network and security set noauth = true port = 8888 maxConns = 1024 fork = true #Management #nohttpinterface = true rest = true quota = true quotaFiles = 1024 nssize = 16 #syncdelay = 5</pre> <p>值得注意的是，类似 nohttpinterface = false 的配置是无效的。因为这些选项默认为false，不需要配置。</p> <p>运行MongDB：</p> <pre>mongod &#8211;config /usr/local/mongodb/config/mongodb</pre> <p>启动脚本 mongodb-start.sh</p> <pre>#!/bin/sh /usr/local/mongodb/bin/mongod --config /usr/local/mongodb/config/mongodb ## --upgrade \ ##runs a database upgrade option if needed \</pre> <p>关闭脚本 mongodb-stop.sh</p> <pre>#!/bin/bash pid=`ps -o pid,command ax | grep mongod | awk '!/awk/ &amp;&amp; !/grep/ {print $1}'`; if [ "${pid}" != "" ]; then kill -2 ${pid}; fi</pre> <p><strong>六，做服务</strong></p> <p>启动脚本init-rpm.sh</p> <pre>#! /bin/sh # # mongodb &#8211; this script starts and stops the mongodb daemon # # chkconfig: - 85 15 # description: MongoDB is a non-relational database storage system. # processname: mongodb # config: /opt/config/mongodb # pidfile: /opt/mongodb/mongo.pid PATH=/opt/mongodb/bin:/sbin:/bin:/usr/sbin:/usr/bin NAME=mongodb test -x $DAEMON || exit 0 set -e case "$1" in start) echo -n "Starting MongoDB... " su - mongodb -c "/opt/bin/mongodb-start" ;; stop) echo -n "Stopping MongoDB" /opt/bin/mongodb-stop ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop}" &gt;&amp;2 exit 1 ;; esac exit 0</pre> <p>把以上启动脚本做成服务</p> <pre>#mv init-rpm.sh /etc/init.d/mongodb #chmod +x /etc/init.d/mongodb #chkconfig --add mongodb #chkconfig -&#8211;level 345 mongodb on</pre> <p>&nbsp;</p> <p><strong>MongoDB与sql语句对照表</strong></p>               <table style="clear: left; padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; width: 616px; color: #000000; line-height: 13pt; padding-top: 0px; border-collapse: collapse; background-color: #ffffff"><tbody style="margin: 0px"><tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <th style="padding-right: 0px; padding-left: 0px; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #003366; line-height: 13pt; padding-top: 0px; background-color: #f0f0f0;">SQL Statement&nbsp;</th>             <th style="padding-right: 0px; padding-left: 0px; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #003366; line-height: 13pt; padding-top: 0px; background-color: #f0f0f0;">Mongo Query Language Statement&nbsp;</th>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>CREATE TABLE USERS (a <span style="margin: 0px; color: #910091">Number</span>, b <span style="margin: 0px; color: #910091">Number</span>)</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>implicit; can be done&nbsp;<a href="http://www.cnblogs.com/display/DOCS/createCollection+Command" style="margin: 0px; color: #375fa0; text-decoration: none" title="createCollection Command">explicitly</a></pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>INSERT INTO USERS VALUES(1,1)</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.insert({a:1,b:1})</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT a,b FROM users</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.find({}, {a:1,b:1})</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT * FROM users</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.find()</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT * FROM users WHERE age=33</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.find({age:33})</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT a,b FROM users WHERE age=33</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.find({age:33}, {a:1,b:1})</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT * FROM users WHERE age=33 ORDER BY name</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.find({age:33}).sort({name:1})</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT * FROM users WHERE age&gt;33</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.find({'age':{$gt:33}})})</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT * FROM users WHERE age&lt;33</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.find({'age':{$lt:33}})})</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT * FROM users WHERE name LIKE <span style="margin: 0px; color: #009100">"%Joe%"</span></pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.find({name:/Joe/})</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT * FROM users WHERE name LIKE <span style="margin: 0px; color: #009100">"Joe%"</span></pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.find({name:/^Joe/})</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT * FROM users WHERE age&gt;33 AND age&lt;=40</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.find({'age':{$gt:33,$lte:40}})})</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT * FROM users ORDER BY name DESC</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.find().sort({name:-1})</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>CREATE INDEX idx_name ON users(name)</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.ensureIndex({name:1})</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>CREATE INDEX idx_name ON users(name,ts DESC)</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.ensureIndex({name:1,ts:-1})</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT * FROM users WHERE a=1 and b='q'</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.find({a:1,b:'q'})</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT * FROM users LIMIT 10 SKIP 20</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.find().limit(10).skip(20)</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT * FROM users WHERE a=1 or b=2</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.find( { $or : [ { a : 1 } , { b : 2 } ] } )</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT * FROM users LIMIT 1</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.findOne()</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>EXPLAIN SELECT * FROM users WHERE z=3</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.find({z:3}).explain()</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT DISTINCT last_name FROM users</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.distinct('last_name')</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT COUNT(*y) FROM users</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.count()</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT COUNT(*y) FROM users where AGE &gt; 30</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.find({age: {'$gt': 30}}).count()</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>SELECT COUNT(AGE) from users</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.find({age: {'$exists': <span style="margin: 0px; color: #000091">true</span>}}).count()</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>UPDATE users SET a=1 WHERE b='q'</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.update({b:'q'}, {$set:{a:1}}, <span style="margin: 0px; color: #000091">false</span>, <span style="margin: 0px; color: #000091">true</span>)</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>UPDATE users SET a=a+2 WHERE b='q'</pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.update({b:'q'}, {$inc:{a:2}}, <span style="margin: 0px; color: #000091">false</span>, <span style="margin: 0px; color: #000091">true</span>)</pre>             </td>         </tr>         <tr style="font-weight: normal; font-size: 10pt; margin: 0px; color: #000000; line-height: 13pt">             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>DELETE FROM users WHERE z=<span style="margin: 0px; color: #009100">"abc"</span></pre>             </td>             <td style="padding-right: 0px; padding-left: 0px; font-weight: normal; font-size: 10pt; padding-bottom: 0px; margin: 0px; vertical-align: top; color: #000000; line-height: 13pt; padding-top: 0px">             <pre>db.users.remove({z:'abc'});</pre></td></tr></tbody></table></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/383388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-07-18 11:43 <a href="http://www.blogjava.net/xiaomage234/archive/2012/07/18/383388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于mongodb 的日志轮询</title><link>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383382.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 18 Jul 2012 02:58:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383382.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/383382.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383382.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/383382.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/383382.html</trackback:ping><description><![CDATA[<div><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">mongod每天要产生大量的日志，如果不去管它，我这边一周大约有10~20G的日志出来，可见日志轮询是必须的。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">mongodb本身支持日志轮询的信号，所以我的日志轮询脚本如下：</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">#!/bin/sh<br /><br />log_dir="/var/log/mongo/"<br />killall -SIGUSR1 mongod<br />/usr/bin/find ${log_dir} -name 'mongod.log.*' -mtime +5&nbsp; -exec rm -f {} \;</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">然后每天零点零分跑一下。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">我有6台mongodb,上面的脚本跑了一两个月一直挺正常。但是最近其中一台在做日志轮询的时候可能是产生了死锁，因为我首先收到了读写锁过多的报警，日志轮询没有成功，客户端也连不进去。收到报警后就连到服务器去看，查查日志，确定问题后重启mongodb就正常了。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">这个脚本造成服务中断14分钟，mongodb用的是最新的稳定版本1.8.1，mongodb的稳定性还有待提高。</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">&nbsp;</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">发生这个问题之后，上面的脚本就不敢再用了，对脚本进行了更改：</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">#!/bin/sh<br /><br />log_dir="/var/log/mongo/"<br />date=`date +%Y-%m-%d`</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; "><br />cat ${log_dir}/mongod.log &gt;&gt; ${log_dir}/mongod.log.${date}<br />cat /dev/null &gt; ${log_dir}/mongod.log</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; "><br />/usr/bin/find ${log_dir} -name 'mongod.log.*' -mtime +5&nbsp; -exec rm -f {} \;</p><p style="margin: 0px; padding: 0px; color: #454545; font-family: Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">然后让他一小时跑一次，目前看还行，就是要多占一点磁盘IO，但是稳定第一，可以确保不会出现上面的问题了。</p></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/383382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-07-18 10:58 <a href="http://www.blogjava.net/xiaomage234/archive/2012/07/18/383382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】【译】mongodb分布式之数据复制</title><link>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383374.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 18 Jul 2012 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383374.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/383374.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/383374.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/383374.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在之前的《MongoDB分布式部署》中已经提到，同一组数据库服务器上的数据是支持复制的。mongodb支持两种方式的数据复制，简单的主从配置和互为主从的配置。MongoDB分布式部署之分片配置可见http://hi.baidu.com/lzpsky/blog/item/644e083d6bbd920cbaa16793.html&nbsp;&nbsp; 一、主从配置（Master Slave）主从数...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaomage234/archive/2012/07/18/383374.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaomage234/aggbug/383374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-07-18 10:19 <a href="http://www.blogjava.net/xiaomage234/archive/2012/07/18/383374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LevelDB、TreeDB、SQLite3性能对比测试</title><link>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383371.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Wed, 18 Jul 2012 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383371.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/383371.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/07/18/383371.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/383371.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/383371.html</trackback:ping><description><![CDATA[<div><p style="margin: 0px; padding: 0px 0px 10px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">下面<span style="margin: 0px; padding: 0px; "><a href="http://blog.nosqlfan.com/tags/%e6%80%a7%e8%83%bd" title="查看 性能 的全部文章" target="_blank" style="margin: 0px; padding: 0px; color: #000000; text-decoration: none; font-weight: normal; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">性能</a></span>测试对比来自<span style="margin: 0px; padding: 0px; "><a href="http://blog.nosqlfan.com/tags/leveldb" title="查看 LevelDB 的全部文章" target="_blank" style="margin: 0px; padding: 0px; color: #000000; text-decoration: none; font-weight: normal; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">LevelDB</a></span>官方，由 NoSQLFan 进行翻译整理。从结果上看，这不像某些田忌赛马式的性能对比，总体来说还是比较客观全面。通过多种场景下的不同性能测试结果的对比，我们也能对这三个数据库分别擅长和适用的场合有所了解。同时对其性能调优的方法理解也有一定的帮助。</p><p style="margin: 0px; padding: 0px 0px 10px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">原文链接：<a href="http://leveldb.googlecode.com/svn/trunk/doc/benchmark.html" style="margin: 0px; padding: 0px; color: #000000; text-decoration: none; font-weight: normal; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">leveldb.googlecode.com</a></p><blockquote style="margin: 0px 15px 20px 30px; padding: 5px 10px; border-left-width: 2px; border-left-style: solid; border-left-color: #eeeeee; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 25px; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; "><p style="margin: 0px; padding: 0px 0px 10px; ">下面是对LevelDB、<span style="margin: 0px; padding: 0px; "><a href="http://blog.nosqlfan.com/tags/treedb" title="查看 TreeDB 的全部文章" target="_blank" style="margin: 0px; padding: 0px; color: #000000; text-decoration: none; font-weight: normal; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">TreeDB</a></span>、<span style="margin: 0px; padding: 0px; "><a href="http://blog.nosqlfan.com/tags/sqlite" title="查看 SQLite 的全部文章" target="_blank" style="margin: 0px; padding: 0px; color: #000000; text-decoration: none; font-weight: normal; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">SQLite</a></span>3 这几个数据库的性能对比测试，分别使用了LevelDB (revision 39)&nbsp;<a href="http://www.sqlite.org/" style="margin: 0px; padding: 0px; color: #000000; text-decoration: none; font-weight: normal; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">SQLite3</a>&nbsp;(version 3.7.6.3) 及&nbsp;<a href="http://fallabs.com/kyotocabinet/spex.html" style="margin: 0px; padding: 0px; color: #000000; text-decoration: none; font-weight: normal; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">Kyoto Cabinet&#8217;s</a>&nbsp;(version 1.2.67)这三个版本的数据库。</p><p style="margin: 0px; padding: 0px 0px 10px; ">测试机器配置：six-core Intel(R) Xeon(R) CPU X5650 @ 2.67GHz, with 12288 KB of total L3 cache and 12 GB of DDR3 RAM at 1333 MHz</p><p style="margin: 0px; padding: 0px 0px 10px; ">文件系统：测试脚本分别跑在两台机器上，其文件系统一台为ext3（磁盘为 SATA Hitachi HDS721050CLA362），一台为ext4（配备磁盘 SATA Samsung HD502HJ）</p><p style="margin: 0px; padding: 0px 0px 10px; ">性能测试源码：</p><ul style="margin: 0px 0px 0px 25px; padding: 0px; "><li style="margin: 0px 0px 5px; padding: 0px; font-size: 14px; line-height: 19px; "><strong style="margin: 0px; padding: 0px; ">LevelDB:</strong>&nbsp;<a href="http://code.google.com/p/leveldb/source/browse/trunk/db/db_bench.cc" style="margin: 0px; padding: 0px; color: #000000; text-decoration: none; font-weight: normal; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">db/db_bench.cc</a>.</li><li style="margin: 0px 0px 5px; padding: 0px; font-size: 14px; line-height: 19px; "><strong style="margin: 0px; padding: 0px; ">SQLite:</strong>&nbsp;<a href="http://code.google.com/p/leveldb/source/browse/#svn%2Ftrunk%2Fdoc%2Fbench%2Fdb_bench_sqlite3.cc" style="margin: 0px; padding: 0px; color: #000000; text-decoration: none; font-weight: normal; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">doc/bench/db_bench_sqlite3.cc</a>.</li><li style="margin: 0px 0px 5px; padding: 0px; font-size: 14px; line-height: 19px; "><strong style="margin: 0px; padding: 0px; ">Kyoto TreeDB:</strong>&nbsp;<a href="http://code.google.com/p/leveldb/source/browse/#svn%2Ftrunk%2Fdoc%2Fbench%2Fdb_bench_tree_db.cc" style="margin: 0px; padding: 0px; color: #000000; text-decoration: none; font-weight: normal; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">doc/bench/db_bench_tree_db.cc</a>.</li></ul><h3>基本测试</h3><p style="margin: 0px; padding: 0px 0px 10px; ">基本测试的条件如下：</p><ul style="margin: 0px 0px 0px 25px; padding: 0px; "><li style="margin: 0px 0px 5px; padding: 0px; font-size: 14px; line-height: 19px; ">每个数据库使用4GB内存</li><li style="margin: 0px 0px 5px; padding: 0px; font-size: 14px; line-height: 19px; ">数据库都处于异步写模式(LevelDB&#8217;s sync option, TreeDB&#8217;s OAUTOSYNC option, SQLite3&#8217;s synchronous options 都关闭)，也就是说写操作不用等数据真正写到磁盘上才返回。</li><li style="margin: 0px 0px 5px; padding: 0px; font-size: 14px; line-height: 19px; ">Key 的长度为16字节</li><li style="margin: 0px 0px 5px; padding: 0px; font-size: 14px; line-height: 19px; ">Value 的长度为100字节 (这个长度才能让数据库的压缩算法能够起作用，将数据压缩至50％大小左右)</li><li style="margin: 0px 0px 5px; padding: 0px; font-size: 14px; line-height: 19px; ">顺序读写时Key值递增变化</li><li style="margin: 0px 0px 5px; padding: 0px; font-size: 14px; line-height: 19px; ">随机读时生成随机的Key值</li></ul><p style="margin: 0px; padding: 0px 0px 10px; ">测试结果：</p><p style="margin: 0px; padding: 0px 0px 10px; "><img src="http://pic.yupoo.com/iammutex/BiuHcJ10/medium.jpg" alt="" style="margin: 0px; padding: 4px; border: 1px solid #cccccc; " /><br style="margin: 0px; padding: 0px; " /><span style="margin: 0px; padding: 0px; font-size: small; "><span style="margin: 0px; padding: 0px; line-height: normal; "><br style="margin: 0px; padding: 0px; " /></span></span></p><p style="margin: 0px; padding: 0px 0px 10px; ">结果显示，在顺序读写和随机写上，LevelDB 在性能上都遥遥领先，在随机读上面 Kyoto Cabinet 引擎稍快一些。</p><h3>在几种不同策略下进行写操作测试</h3><h4><span style="margin: 0px; padding: 0px; color: #ff0000; ">A. Values 为长数据（数据长度为100,000字节）</span></h4><p style="margin: 0px; padding: 0px 0px 10px; "><img src="http://pic.yupoo.com/iammutex/BiuHcOrI/medium.jpg" alt="" style="margin: 0px; padding: 4px; border: 1px solid #cccccc; " /></p><p style="margin: 0px; padding: 0px 0px 10px; ">LevelDB在Value较长时性能比较低，这是由于LevelDB对每一次写操作都会至少进行两次写动作，一次是写数据文件，另一次是写日志文件。这里慢的主要原因是LevelDB在进行这些操作时对值进行了过多的Copy。</p><h4><span style="margin: 0px; padding: 0px; color: #ff0000; ">B. 批量写操作</span></h4><p style="margin: 0px; padding: 0px 0px 10px; ">一次写操作写1000条100字节的数据，由于TreeDB不支持批量写入，故未对其进行对比测试</p><p style="margin: 0px; padding: 0px 0px 10px; "><img src="http://pic.yupoo.com/iammutex/BiuHcpQX/medium.jpg" alt="" style="margin: 0px; padding: 4px; border: 1px solid #cccccc; " /></p><p style="margin: 0px; padding: 0px 0px 10px; ">上面结果是由于LevelDB数据的组织方式，导致顺序写和随机写在性能上都变化不大。</p><h4><span style="margin: 0px; padding: 0px; color: #ff0000; ">C. 同步进行写操作</span></h4><ul style="margin: 0px 0px 0px 25px; padding: 0px; "><li style="margin: 0px 0px 5px; padding: 0px; font-size: 14px; line-height: 19px; ">对 LevelDB, 设置 WriteOptions.sync = true.</li><li style="margin: 0px 0px 5px; padding: 0px; font-size: 14px; line-height: 19px; ">对 TreeDB, 将 TreeDB&#8217;s OAUTOSYNC 选项开启.</li><li style="margin: 0px 0px 5px; padding: 0px; font-size: 14px; line-height: 19px; ">对 SQLite3, 设置 &#8220;PRAGMA synchronous = FULL&#8221;.</li></ul><p style="margin: 0px; padding: 0px 0px 10px; "><img src="http://pic.yupoo.com/iammutex/BiuIBAX6/medium.jpg" alt="" style="margin: 0px; padding: 4px; border: 1px solid #cccccc; " /></p><p style="margin: 0px; padding: 0px 0px 10px; ">如果你看一下ext4文件系统下的测试数据，你会发现ext3和ext4在表现上非常不同。</p><h4><span style="margin: 0px; padding: 0px; color: #ff0000; ">D. 无压缩的写操作</span></h4><p style="margin: 0px; padding: 0px 0px 10px; ">LevelDB 和 TreeDB 都支持相应的数据压缩算法(LevelDB 使用的是&nbsp;<a href="http://code.google.com/p/snappy/" style="margin: 0px; padding: 0px; color: #000000; text-decoration: none; font-weight: normal; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">Snappy</a>&nbsp;, TreeDB 使用的是&nbsp;<a href="http://www.oberhumer.com/opensource/lzo/" style="margin: 0px; padding: 0px; color: #000000; text-decoration: none; font-weight: normal; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">LZO</a>)，由于SQLite不支持压缩，所以这里的测试数据只是从上面的基本测试结果copy过来的。</p><p style="margin: 0px; padding: 0px 0px 10px; "><img src="http://pic.yupoo.com/iammutex/BiuHfC0b/medium.jpg" alt="" style="margin: 0px; padding: 4px; border: 1px solid #cccccc; " /></p><p style="margin: 0px; padding: 0px 0px 10px; ">LevelDB开启压缩比不开启压缩效率更高，而TreeDB则相反，这可能是由于TreeDB采用的压缩算法（LZO）与LevelDB采用的压缩算法（Snappy）相比计算代价更高。</p><h4><span style="margin: 0px; padding: 0px; color: #ff0000; ">E. 使用更大内存</span></h4><p style="margin: 0px; padding: 0px 0px 10px; ">将每个独立库的内存增大到128MB，对LevelDB来说，其中120MB用来做 write buffer，另外8MB用来做 cache（原来是2MB的 write buffer 和2MB的cache），对SQLite来说，我们不改变其page size，还是保持为1kb，但是我们增大其page数量从4k增加到128k，对TreeDB来说，我们同样不改变其page大小，也只是增大其cache，从4MB增大到128MB。</p><p style="margin: 0px; padding: 0px 0px 10px; "><img src="http://pic.yupoo.com/iammutex/BiuHgE0Z/medium.jpg" alt="" style="margin: 0px; padding: 4px; border: 1px solid #cccccc; " /></p><p style="margin: 0px; padding: 0px 0px 10px; ">SQLite 在采用了大内存后性能变化并不大，而 LevelDB 和 TreeDB 的随机写性能却有显著提高。LevelDB 在增大内存后性能提升的原因是其write buffer 更大，从而减少了创建的sorted file的次数。减少了磁盘IO。而 TreeDB 的性能提升原因是由于其数据库的更大部分被映射到内存中了。</p><h3><strong style="margin: 0px; padding: 0px; ">在几种不同策略下进行读操作测试</strong></h3><h4><span style="margin: 0px; padding: 0px; color: #ff0000; ">A. 大的Cache空间</span></h4><p style="margin: 0px; padding: 0px 0px 10px; ">我们分配128MB给每个数据库，对LevelDB来说，我们分配8MB给 write buffer，120MB给cache，对另外两个数据库，由于它们不支持区分 write buffer 和cache，所以统一将 cache size设置成128MB。</p><p style="margin: 0px; padding: 0px 0px 10px; "><img src="http://pic.yupoo.com/iammutex/BiuHeol9/medium.jpg" alt="" style="margin: 0px; padding: 4px; border: 1px solid #cccccc; " /></p><p style="margin: 0px; padding: 0px 0px 10px; ">从结果可以看到，增大Cache在数据库读性能上都有所提升，其中最为显著的是TreeDB，其随机读性能大幅提升。主要是由于有足够的内存使得其所有读操作都几乎是在内存中进行。</p><h4><span style="margin: 0px; padding: 0px; color: #ff0000; ">B. 无压缩的读操作</span></h4><p style="margin: 0px; padding: 0px 0px 10px; ">下面结果是我们对预先无压缩状态写入的100万条key为16字节、value为100字节的数据后进行的读性能测试。同样的 SQLite 由于不支持压缩，所以下面数据是直接从其基本测试上copy过来的。</p><p style="margin: 0px; padding: 0px 0px 10px; "><img src="http://pic.yupoo.com/iammutex/BiuHeU4b/medium.jpg" alt="" style="margin: 0px; padding: 4px; border: 1px solid #cccccc; " /></p><p style="margin: 0px; padding: 0px 0px 10px; ">结果可以看到，取消压缩对读取性能提升不是特别大，当然，如果你的数据都在内存中的话，执行解压操作也不会对性能造成太大影响。</p></blockquote></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/383371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-07-18 10:16 <a href="http://www.blogjava.net/xiaomage234/archive/2012/07/18/383371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Vertica 简介</title><link>http://www.blogjava.net/xiaomage234/archive/2012/07/17/383330.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Tue, 17 Jul 2012 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/07/17/383330.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/383330.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/07/17/383330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/383330.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/383330.html</trackback:ping><description><![CDATA[<div><p style="word-break: break-all; line-height: 21px; margin: 0px; color: #333333; font-family: 宋体; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #678a9d; font-size: 12px; padding: 0px; ">基于列存储的<a target="_self" style="word-break: break-all; text-decoration: underline; color: #000000; line-height: normal !important; "><u style="word-break: break-all; line-height: normal !important; "><strong style="word-break: break-all; line-height: normal !important; ">数据库</strong></u></a>的优点&#182;<br style="word-break: break-all; line-height: normal !important; " />a)对于聚集操作，比如求sum，明显基于列存储的要比基于行存储的快；<br style="word-break: break-all; line-height: normal !important; " />b)对于update操作，不须接触其他列值；<br style="word-break: break-all; line-height: normal !important; " />c)基于行存储的数据库在查询每行记录的多个列值更高效的条件是，row-size比较小，这样一次磁盘读取就可以获取整行；<br style="word-break: break-all; line-height: normal !important; " />d)基于行存储的数据库在insert一行的时候相对更高效，毕竟可一次写入一个连续空间，即一次single disk seek；</p><p style="word-break: break-all; line-height: 21px; margin: 0px; color: #333333; font-family: 宋体; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #678a9d; font-size: 12px; padding: 0px; ">&nbsp;<wbr style="word-break: break-all; line-height: normal !important; "></p><p style="word-break: break-all; line-height: 21px; margin: 0px; color: #333333; font-family: 宋体; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #678a9d; font-size: 12px; padding: 0px; ">从实际情况上来看，基于行存储的数据库更适合OLTP（联机事务处理系统），基于列存储的数据库更适合OLAP（联机分析处理系统），比如数据仓库。除此之外，同一列必定是同一类型大小，基于列存储的数据库更容易使用高效的存储方式，与之相对，基于行存储的数据库则只能采用随机方式处理列值了。</p><p style="word-break: break-all; line-height: 21px; margin: 0px; color: #333333; font-family: 宋体; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #678a9d; font-size: 12px; padding: 0px; "><br style="word-break: break-all; line-height: normal !important; " />Vertica 数据库的设计特点&#182;<br style="word-break: break-all; line-height: normal !important; " />a)它是基于列的存储结构，提高了连续的record处理的性能，但是在一般事务中增加了对单独record进行update和delete的开销；<br style="word-break: break-all; line-height: normal !important; " />b)&#8220;单独&#8221;更新（out-of-place updates）和混合存储结构，提高了查询、插入的性能，但增加了update和delete的开销；<br style="word-break: break-all; line-height: normal !important; " />c)压缩，减少存储开销和IO带宽开销；<br style="word-break: break-all; line-height: normal !important; " />d)完全无共享架构，降低对共享资源的系统竞争；</p><p style="word-break: break-all; line-height: 21px; margin: 0px; color: #333333; font-family: 宋体; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #678a9d; font-size: 12px; padding: 0px; ">Vertica数据库运行在基于Linux的网格<a target="_self" style="word-break: break-all; text-decoration: underline; color: #000000; line-height: normal !important; "><u style="word-break: break-all; line-height: normal !important; "><strong style="word-break: break-all; line-height: normal !important; ">服务器</strong></u></a>上，目前应用于Amazon Elastic Compute Cloud的数据库<a target="_self" style="word-break: break-all; text-decoration: underline; color: #000000; line-height: normal !important; "><u style="word-break: break-all; line-height: normal !important; "><strong style="word-break: break-all; line-height: normal !important; ">管理</strong></u></a>系统。</p><p style="word-break: break-all; line-height: 21px; margin: 0px; color: #333333; font-family: 宋体; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #678a9d; font-size: 12px; padding: 0px; ">&nbsp;<wbr style="word-break: break-all; line-height: normal !important; "></p><p style="word-break: break-all; line-height: 21px; margin: 0px; color: #333333; font-family: 宋体; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #678a9d; font-size: 12px; padding: 0px; ">The Vertica Analytic Databas&#182;<br style="word-break: break-all; line-height: normal !important; " />a)重申三大特点：压缩、基于列、表分解；<br style="word-break: break-all; line-height: normal !important; " />b)混合数据存储模式，当insert时候，按照写优先分配原则，实现insert与query的高并发操作；<br style="word-break: break-all; line-height: normal !important; " />c)自动化数据库结构设计工具，多节点集群系统，所有的数据都会保存在不止一个节点上，即所谓的k-safety，这样可防止单点故障造成的损失；<br style="word-break: break-all; line-height: normal !important; " />d)高性能，支持ACID，轻量级事务和并发控制更加适合load和query操作。Vertica的故障<a target="_self" style="word-break: break-all; text-decoration: underline; color: #000000; line-height: normal !important; "><u style="word-break: break-all; line-height: normal !important; "><strong style="word-break: break-all; line-height: normal !important; ">恢复</strong></u></a>模型是基于多节点拷贝，而不是传统的基于日志；<br style="word-break: break-all; line-height: normal !important; " />e)灵活部署；<br style="word-break: break-all; line-height: normal !important; " />f)监视和管理工具和API；</p><p style="word-break: break-all; line-height: 21px; margin: 0px; color: #333333; font-family: 宋体; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #678a9d; font-size: 12px; padding: 0px; ">对于一个node上的vertica数据库，数据存储分为两个部分，一个是读优存储（read-optimized store，ROS），另一个是写优存储（write-optimized store，WOS），每次更新和插入的数据临时放在WOS部分，<a target="_self" style="word-break: break-all; text-decoration: underline; color: #000000; line-height: normal !important; "><u style="word-break: break-all; line-height: normal !important; "><strong style="word-break: break-all; line-height: normal !important; ">SQL</strong></u></a>查询会访问ROS部分，并且ROS存放已经经过压缩和排序的数据，这样就做到了读写并发两不误，通过tuple mover进程定期将WOS的数据压缩排序后拷贝到ROS区域。</p><p style="word-break: break-all; line-height: 21px; margin: 0px; color: #333333; font-family: 宋体; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #678a9d; font-size: 12px; padding: 0px; ">对于多个node，一个表的schema首先会按列拆分为多个映射，将每个列排序保存在不同磁盘上。</p><p style="word-break: break-all; line-height: 21px; margin: 0px; color: #333333; font-family: 宋体; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #678a9d; font-size: 12px; padding: 0px; ">Vertica数据库设计本身就适合基于列的查询，虽然一些基于行的数据库经过预处理和内部关系视图等操作也可以优化常见查询的速度，但仍和vertica能应付更多不同查询的高性能无法相比，尤其是vertica的的列主动压缩（aggressive compression）。主动压缩，简单的说就是将一个列不同的值的一维存储转换为二维元组（tuple），格式为&lt;个数，列值&gt;，这样的话，即使是date类型的百万条数据，一年最多也只有365个数对，好处不言而喻，节省空间、提高查询速度、方便聚集函数操作。另外，对应浮点数和时间这样的连续数值，也采用了某些处理方式实现了一些排序和压缩（具体没看懂）。</p><p style="word-break: break-all; line-height: 21px; margin: 0px; color: #333333; font-family: 宋体; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #678a9d; font-size: 12px; padding: 0px; ">在读优存储（ROS）区域，除了排序压缩外，还有些别的优化处理。比如数据是致密填充（dense packed）的，即占用的磁盘分页内没有空闲，不用考虑后来insert的数据放哪的问题，因为那是tuple mover做的事情。另一个优化是，vertica会提前取出一大块数据用以减少多次磁盘扫描。 Vertica对于各节点上冗余存储的列数据可采用不同排序顺序存储，这样不但利用多拷贝实现了故障恢复，还利用多种排序顺序提高了查询速度，对于每一个给定的sql操作，vertica都会选择一个最合适的排序顺序。</p><p style="word-break: break-all; line-height: 21px; margin: 0px; color: #333333; font-family: 宋体; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #678a9d; font-size: 12px; padding: 0px; ">DB designer 根据数据样本和查询样本将逻辑schema映射为多个物理schema，说白了就是将一个行映射拆分为多个行映射，同时保证每个查询的from部分都只来自一个映射。 k-safety，简单的说就是，对于数据库中的每一列，都会在k+1个节点上存储，这样即使k个节点坏掉了也没事。</p><p style="word-break: break-all; line-height: 21px; margin: 0px; color: #333333; font-family: 宋体; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #678a9d; font-size: 12px; padding: 0px; ">Vertica开发，支持标准SQL语句，支持JDBC和ODBC，支持perl和python编程，支持PostgreSQL等数据库的应用代码向其平滑移植。但是vertica对于update这样的操作实在是笨拙。</p></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/383330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-07-17 17:46 <a href="http://www.blogjava.net/xiaomage234/archive/2012/07/17/383330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为什么要用非关系数据库？</title><link>http://www.blogjava.net/xiaomage234/archive/2012/06/28/381715.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 28 Jun 2012 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/06/28/381715.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/381715.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/06/28/381715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/381715.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/381715.html</trackback:ping><description><![CDATA[<div><span style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; display: inline !important; float: none; ">随着互联网web2.0网站的兴起，非关系型的数据库现在成了一个极其热门的新领域，非关系数据库产品的发展非常迅速。而传统的关系数据库在应付web2.0网站，特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心，暴露了很多难以克服的问题，例如：</span><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">&nbsp;</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">1、High performance &#8211; 对数据库高并发读写的需求<br />web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息，所以基本上无法使用动态页面静态化技术，因此数据库并发负载非常高，往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住，但是应付上万次SQL写数据请求，硬盘IO就已经无法承受了。其实对于普通的BBS网站，往往也存在对高并发写请求的需求，例如像JavaEye网站的实时统计在线用户状态，记录热门帖子的点击次数，投票计数等，因此这是一个相当普遍的需求。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">2、Huge Storage &#8211; 对海量数据的高效率存储和访问的需求<br />类似Facebook，twitter，Friendfeed这样的SNS网站，每天用户产生海量的用户动态，以Friendfeed为例，一个月就达到了2.5亿条用户动态，对于关系数据库来说，在一张2.5亿条记录的表里面进行SQL查询，效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统，例如腾讯，盛大，动辄数以亿计的帐号，关系数据库也很难应付。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">3、High Scalability &amp;&amp; High Availability- 对数据库的高可扩展性和高可用性的需求<br />在基于web的架构当中，数据库是最难进行横向扩展的，当一个应用系统的用户量和访问量与日俱增的时候，你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说，对数据库系统进行升级和扩展是非常痛苦的事情，往往需要停机维护和数据迁移，为什么数据库不能通过不断的添加服务器节点来实现扩展呢？</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">在上面提到的&#8220;三高&#8221;需求面前，关系数据库遇到了难以克服的障碍，而对于web2.0网站来说，关系数据库的很多主要特性却往往无用武之地，例如：</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">1、数据库事务一致性需求<br />很多web实时系统并不要求严格的数据库事务，对读一致性的要求很低，有些场合对写一致性要求也不高。因此数据库事务管理成了数据库高负载下一个沉重的负担。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">2、数据库的写实时性和读实时性需求<br />对关系数据库来说，插入一条数据之后立刻查询，是肯定可以读出来这条数据的，但是对于很多web应用来说，并不要求这么高的实时性，比方说我（JavaEye的robbin）发一条消息之后，过几秒乃至十几秒之后，我的订阅者才看到这条动态是完全可以接受的。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">3、对复杂的SQL查询，特别是多表关联查询的需求<br />任何大数据量的web系统，都非常忌讳多个大表的关联查询，以及复杂的数据分析类型的复杂SQL报表查询，特别是SNS类型的网站，从需求以及产品设计角度，就避免了这种情况的产生。往往更多的只是单表的主键查询，以及单表的简单条件分页查询，SQL的功能被极大的弱化了。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">因此，关系数据库在这些越来越多的应用场景下显得不那么合适了，为了解决这类问题的非关系数据库应运而生，现在这两年，各种各样非关系数据库，特别是键值数据库(Key-Value Store DB)风起云涌，多得让人眼花缭乱。前不久国外刚刚举办了<a href="http://journal.uggedal.com/nosql-east-2009---summary-of-day-1" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">NoSQL Conference</span></a>，各路NoSQL数据库纷纷亮相，加上未亮相但是名声在外的，起码有超过10个开源的NoSQLDB，例如：</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">Redis，Tokyo Cabinet，Cassandra，Voldemort，<a title="View all posts in MongoDB" href="http://www.hebaodans.com/tag/mongodb/" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">MongoDB</span></a>，Dynomite，HBase，<a title="View all posts in CouchDB" href="http://www.hebaodans.com/tag/couchdb/" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">CouchDB</span></a>，Hypertable， Riak，Tin， Flare， Lightcloud， KiokuDB，Scalaris， Kai， ThruDB，&nbsp; &#8230;&#8230;</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">这些NoSQL数据库，有的是用C/C++编写的，有的是用Java编写的，还有的是用Erlang编写的，每个都有自己的独到之处，看都看不过来了，<a href="http://robbin.javaeye.com/" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">我(robbin)</span></a>也只能从中挑选一些比较有特色，看起来更有前景的产品学习和了解一下。这些NoSQL数据库大致可以分为以下的三类：</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">一、满足极高读写性能需求的Kye-Value数据库：Redis，Tokyo Cabinet， Flare</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">高性能Key-Value数据库的主要特点就是具有极高的并发读写性能，Redis，Tokyo Cabinet， Flare，这3个Key-Value DB都是用C编写的，他们的性能都相当出色，但出了出色的性能，他们还有自己独特的功能：</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">1、<a href="http://code.google.com/p/redis/" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">Redis</span></a><br />Redis是一个很新的项目，刚刚发布了1.0版本。Redis本质上是一个Key-Value类型的内存数据库，很像memcached，整个数据库统统加载在内存当中进行操作，定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作，Redis的性能非常出色，每秒可以处理超过10万次读写操作，是我知道的性能最快的Key-Value DB。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">Redis的出色之处不仅仅是性能，Redis最大的魅力是支持保存List链表和Set集合的数据结构，而且还支持对List进行各种操作，例如从List两端push和pop数据，取List区间，排序等等，对Set支持各种集合的并集交集操作，此外单个value的最大限制是1GB，不像memcached只能保存1MB的数据，因此Redis可以用来实现很多有用的功能，比方说用他的List来做FIFO双向链表，实现一个轻量级的高性能消息队列服务，用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间，因此也可以被当作一个功能加强版的memcached来用。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">Redis的主要缺点是数据库容量受到物理内存的限制，不能用作海量数据的高性能读写，并且它没有原生的可扩展机制，不具有scale（可扩展）能力，要依赖客户端来实现分布式读写，因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。目前使用Redis的网站有github，Engine Yard。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">2、<a href="http://1978th.net/" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">Tokyo Cabinet和Tokoy Tyrant</span></a><br />TC和TT的开发者是日本人Mikio Hirabayashi，主要被用在日本最大的SNS网站mixi.jp上，TC发展的时间最早，现在已经是一个非常成熟的项目，也是Kye-Value数据库领域最大的热点，现在被广泛的应用在很多很多网站上。TC是一个高性能的存储引擎，而TT提供了多线程高并发服务器，性能也非常出色，每秒可以处理4-5万次读写操作。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">TC除了支持Key-Value存储之外，还支持保存Hashtable数据类型，因此很像一个简单的数据库表，并且还支持基于column的条件查询，分页查询和排序功能，基本上相当于支持单表的基础查询功能了，所以可以简单的替代关系数据库的很多操作，这也是TC受到大家欢迎的主要原因之一，有一个Ruby的项目<a href="http://github.com/tsukasaoishi/miyazakiresistance" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">miyazakiresistance</span></a>将TT的hashtable的操作封装成和ActiveRecord一样的操作，用起来非常爽。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">TC/TT在mixi的实际应用当中，存储了2000万条以上的数据，同时支撑了上万个并发连接，是一个久经考验的项目。TC在保证了极高的并发读写性能的同时，具有可靠的数据持久化机制，同时还支持类似关系数据库表结构的hashtable以及简单的条件，分页和排序操作，是一个很棒的NoSQL数据库。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">TC的主要缺点是在数据量达到上亿级别以后，并发写数据性能会大幅度下降，<a href="http://bjclark.me/2009/08/04/nosql-if-only-it-was-that-easy/" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">NoSQL: If Only It Was That Easy</span></a>提到，他们发现在TC里面插入1.6亿条2-20KB数据的时候，写入性能开始急剧下降。看来是当数据量上亿条的时候，TC性能开始大幅度下降，从TC作者自己提供的mixi数据来看，至少上千万条数据量的时候还没有遇到这么明显的写入性能瓶颈。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">这个是Tim Yang做的一个<a href="http://timyang.net/data/mcdb-tt-redis/" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">Memcached，Redis和Tokyo Tyrant的简单的性能评测，仅供参考</span></a></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">3、<a href="http://labs.gree.jp/Top/OpenSource/Flare-en.html" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">Flare</span></a><br />TC是日本第一大SNS网站mixi开发的，而Flare是日本第二大SNS网站green.jp开发的，有意思吧。Flare简单的说就是给TC添加了scale功能。他替换掉了TT部分，自己另外给TC写了网络服务器，Flare的主要特点就是支持scale能力，他在网络服务端之前添加了一个node server，来管理后端的多个服务器节点，因此可以动态添加数据库服务节点，删除服务器节点，也支持failover。如果你的使用场景必须要让TC可以scale，那么可以考虑flare。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">flare唯一的缺点就是他只支持memcached协议，因此当你使用flare的时候，就不能使用TC的table数据结构了，只能使用TC的key-value数据结构存储。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">二、满足海量存储需求和访问的面向文档的数据库：<a title="View all posts in MongoDB" href="http://www.hebaodans.com/tag/mongodb/" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">MongoDB</span></a>，<a title="View all posts in CouchDB" href="http://www.hebaodans.com/tag/couchdb/" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">CouchDB</span></a></p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">面向文档的非关系数据库主要解决的问题不是高性能的并发读写，而是保证海量数据存储的同时，具有良好的查询性能。<a title="View all posts in MongoDB" href="http://www.hebaodans.com/tag/mongodb/" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">MongoDB</span></a>是用C++开发的，而<a title="View all posts in CouchDB" href="http://www.hebaodans.com/tag/couchdb/" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">CouchDB</span></a>则是Erlang开发的：</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">1、<a href="http://www.mongodb.org/display/DOCS/Home" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">MongoDB</span></a><br />MongoDB是一个介于关系数据库和非关系数据库之间的产品，是非关系数据库当中功能最丰富，最像关系数据库的。他支持的数据结构非常松散，是类似json的bjson格式，因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大，其语法有点类似于面向对象的查询语言，几乎可以实现类似关系数据库单表查询的绝大部分功能，而且还支持对数据建立索引。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">Mongo主要解决的是海量数据的访问效率问题，根据官方的文档，当数据量达到50GB以上的时候，Mongo的数据库访问速度是MySQL的10倍以上。Mongo的并发读写效率不是特别出色，根据官方提供的性能测试表明，大约每秒可以处理0.5万－1.5次读写请求。对于Mongo的并发读写性能，我（robbin）也打算有空的时候好好测试一下。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">因为Mongo主要是支持海量数据存储的，所以Mongo还自带了一个出色的分布式文件系统GridFS，可以支持海量的数据存储，但我也看到有些评论认为GridFS性能不佳，这一点还是有待亲自做点测试来验证了。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">最后由于Mongo可以支持复杂的数据结构，而且带有强大的数据查询功能，因此非常受到欢迎，很多项目都考虑用MongoDB来替代MySQL来实现不是特别复杂的Web应用，比方说<a href="http://blog.boxedice.com/2009/07/25/choosing-a-non-relational-database-why-we-migrated-from-mysql-to-mongodb/" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">why we migrated from MySQL to MongoDB</span></a>就是一个真实的从MySQL迁移到MongoDB的案例，由于数据量实在太大，所以迁移到了Mongo上面，数据查询的速度得到了非常显著的提升。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">MongoDB也有一个ruby的项目<a href="http://github.com/jnunemaker/mongomapper" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">MongoMapper</span></a>，是模仿Merb的DataMapper编写的MongoDB的接口，使用起来非常简单，几乎和DataMapper一模一样，功能非常强大易用。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">2、CouchDB<br />CouchDB现在是一个非常有名气的项目，似乎不用多介绍了。但是我却对CouchDB没有什么兴趣，主要是因为CouchDB仅仅提供了基于HTTP REST的接口，因此CouchDB单纯从并发读写性能来说，是非常糟糕的，这让我立刻抛弃了对CouchDB的兴趣。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">三、满足高可扩展性和可用性的面向分布式计算的数据库：Cassandra，Voldemort</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">面向scale能力的数据库其实主要解决的问题领域和上述两类数据库还不太一样，它首先必须是一个分布式的数据库系统，由分布在不同节点上面的数据库共同构成一个数据库服务系统，并且根据这种分布式架构来提供online的，具有弹性的可扩展能力，例如可以不停机的添加更多数据节点，删除数据节点等等。因此像Cassandra常常被看成是一个开源版本的Google BigTable的替代品。Cassandra和Voldemort都是用Java开发的：</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">1、<a href="http://incubator.apache.org/cassandra/" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">Cassandra</span></a><br />Cassandra项目是Facebook在2008年开源出来的，随后Facebook自己使用Cassandra的另外一个不开源的分支，而开源出来的Cassandra主要被Amazon的Dynamite团队来维护，并且Cassandra被认为是Dynamite2.0版本。目前除了Facebook之外，twitter和digg.com都在使用Cassandra。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">Cassandra的主要特点就是它不是一个数据库，而是由一堆数据库节点共同构成的一个分布式网络服务，对Cassandra的一个写操作，会被复制到其他节点上去，对Cassandra的读操作，也会被路由到某个节点上面去读取。对于一个Cassandra群集来说，扩展性能是比较简单的事情，只管在群集里面添加节点就可以了。我看到有文章说Facebook的Cassandra群集有超过100台服务器构成的数据库群集。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">Cassandra也支持比较丰富的数据结构和功能强大的查询语言，和MongoDB比较类似，查询功能比MongoDB稍弱一些，twitter的平台架构部门领导Evan Weaver写了一篇文章介绍Cassandra：<a href="http://blog.evanweaver.com/articles/2009/07/06/up-and-running-with-cassandra/" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">http://blog.evanweaver.com/articles/2009/07/06/up-and-running-with-cassandra/</span></a>，有非常详细的介绍。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">Cassandra以单个节点来衡量，其节点的并发读写性能不是特别好，有文章说评测下来Cassandra每秒大约不到1万次读写请求，我也看到一些对这个问题进行质疑的评论，但是评价Cassandra单个节点的性能是没有意义的，真实的分布式数据库访问系统必然是n多个节点构成的系统，其并发性能取决于整个系统的节点数量，路由效率，而不仅仅是单节点的并发负载能力。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">2、<a href="http://project-voldemort.com/" target="_blank" style="color: #336699; text-decoration: none; "><span style="color: #2970a6; ">Voldemort</span></a><br />Voldemort是个和Cassandra类似的面向解决scale问题的分布式数据库系统，Cassandra来自于Facebook这个SNS网站，而Voldemort则来自于Linkedin这个SNS网站。说起来SNS网站为我们贡献了n多的NoSQL数据库，例如Cassandar，Voldemort，Tokyo Cabinet，Flare等等。Voldemort的资料不是很多，因此我没有特别仔细去钻研，Voldemort官方给出Voldemort的并发读写性能也很不错，每秒超过了1.5万次读写。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">从Facebook开发Cassandra，Linkedin开发Voldemort，我们也可以大致看出国外大型SNS网站对于分布式数据库，特别是对数据库的scale能力方面的需求是多么殷切。前面我（robbin）提到，web应用的架构当中，web层和app层相对来说都很容易横向扩展，唯有数据库是单点的，极难scale，现在Facebook和Linkedin在非关系型数据库的分布式方面探索了一条很好的方向，这也是为什么现在Cassandra这么热门的主要原因。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">如今，NoSQL数据库是个令人很兴奋的领域，总是不断有新的技术新的产品冒出来，改变我们已经形成的固有的技术观念，我自己（robbin）稍微了解了一些，就感觉自己深深的沉迷进去了，可以说NoSQL数据库领域也是博大精深的，我（robbin）也只能浅尝辄止，我（robbin）写这篇文章既是自己一点点钻研心得，也是抛砖引玉，希望吸引对这个领域有经验的朋友来讨论和交流。</p><p style="color: #333333; font-family: Arial; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 26px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #ffffff; ">从我（robbin）个人的兴趣来说，分布式数据库系统不是我能实际用到的技术，因此不打算花时间深入，而其他两个数据领域（高性能NoSQLDB和海量存储NoSQLDB）都是我很感兴趣的，特别是Redis，TT/TC和MongoDB这3个NoSQL数据库，因此我接下来将写三篇文章分别详细介绍这3个数据库</p></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/381715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-06-28 14:28 <a href="http://www.blogjava.net/xiaomage234/archive/2012/06/28/381715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mongodb查询的语法</title><link>http://www.blogjava.net/xiaomage234/archive/2012/06/28/381714.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 28 Jun 2012 06:15:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/06/28/381714.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/381714.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/06/28/381714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/381714.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/381714.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文参考自官方的手册：http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ConditionalOperators%3A%3C%2C%3C%3D%2C%3E%2C%3E%3D1 ) . 大于，小于，大于或等于，小于或等于$gt:大于$lt:小于$gte:大于或等于$lte:小于或等于例子：db.collectio...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaomage234/archive/2012/06/28/381714.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaomage234/aggbug/381714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-06-28 14:15 <a href="http://www.blogjava.net/xiaomage234/archive/2012/06/28/381714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mongodb的update操作</title><link>http://www.blogjava.net/xiaomage234/archive/2012/06/28/381713.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 28 Jun 2012 06:14:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/06/28/381713.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/381713.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/06/28/381713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/381713.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/381713.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在前面的文章&#8220;mongodb&nbsp;查询的语法&#8221;里，我介绍了Mongodb的常用查询语法，Mongodb的update操作也有点复杂，我结合自己的使用经验，在这里介绍一下，给用mongodb的朋友看看，也方便以后自己用到的时候查阅：注：在这篇文章及上篇文章内讲的语法介绍都是在mongodb&nbsp;shell环境内的，和真正运用语言编程（如java,php等）使用时，...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaomage234/archive/2012/06/28/381713.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaomage234/aggbug/381713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-06-28 14:14 <a href="http://www.blogjava.net/xiaomage234/archive/2012/06/28/381713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MongoDB的php应用开发 [转]</title><link>http://www.blogjava.net/xiaomage234/archive/2012/06/25/381437.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Mon, 25 Jun 2012 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/06/25/381437.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/381437.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/06/25/381437.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/381437.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/381437.html</trackback:ping><description><![CDATA[<div><div id="blog_text"><div><div><div><strong>一、连接数据库主机</strong></div><div>连接本地主机，端口为27017:</div><div>$connection = new Mongo();</div><div></div><div>连接远程主机，端口为默认端口:</div><div>$connection= new Mongo( "192.168.2.1" );</div><div></div><div>连接远程主机，端口为指定端口:</div><div>$connection = new Mongo( "192.168.2.1:65432" );</div><div></div><div>选择数据库，如果指定的数据库不存在，则会自动创建一个新的数据库，有2种方法：</div><div>$db = $connection-&gt;selectDB('dbname');</div><div>或</div><div>$db = $connection-&gt;dbname;</div><div></div><div>选择集合(collection)，与使用关系型数据库中的表类似，有2种方法：</div><div>$collection = $db-&gt;selectCollection('people');</div><div>或</div><div>$collection = $db-&gt;people;</div><div></div><div><strong>二、插入新文档(document)</strong></div><div>collection对象用来执行信息管理，例如，想存储一个关于某人的信息，可以如下编码：</div><div>$person = array(</div><div>&nbsp;'name' =&gt; 'Cesar Rodas',</div><div>&nbsp;'email' =&gt; 'crodas@php.net',</div><div>&nbsp;'address' =&gt; array(</div><div>&nbsp;&nbsp;array(</div><div>&nbsp;&nbsp; 'country' =&gt; 'PY',</div><div>&nbsp;&nbsp; 'zip' =&gt; '2160',</div><div>&nbsp;&nbsp; 'address1' =&gt; 'foo bar'</div><div>&nbsp;&nbsp;),</div><div>&nbsp;&nbsp;array(</div><div>&nbsp;&nbsp; 'country' =&gt; 'PY',</div><div>&nbsp;&nbsp; 'zip' =&gt; '2161',</div><div>&nbsp;&nbsp; 'address1' =&gt; 'foo bar bar foo'</div><div>&nbsp;&nbsp;),</div><div>&nbsp;),</div><div>&nbsp;'sessions' =&gt; 0,</div><div>);</div><div></div><div>$safe_insert = true;</div><div>$collection-&gt;insert($person, $safe_insert);</div><div>$person_identifier = $person['_id'];</div><div></div><div>其中：</div><div>$safe_insert参数用于等待MongoDB完成操作，以便确定是否成功，默认值为false,当有大量记录插入时使用该参数会比较有用。</div><div>插入新文档后，MongoDB会返回一个记录标识。</div><div></div><div><strong>三、更新文档</strong></div><div>例如，更新上面已经创建的个人信息，增加sessions属性值，在第1个address处增加address2属性，删除第2个address，代码如下：</div><div>首先，定义一个filter(过滤器)告诉MongoDB要更新一个指定的文档</div><div>$filter = array('email' =&gt; 'crodas@php.net');</div><div>$new_document = array(</div><div>&nbsp;'$inc' =&gt; array('sessions' =&gt; 1),</div><div>&nbsp;'$set' =&gt; array(</div><div>&nbsp;&nbsp; 'address.0.address2' =&gt; &nbsp;'Some foobar street',</div><div>&nbsp;),</div><div>&nbsp;'$unset' =&gt; array('address.1' =&gt; 1),</div><div>);</div><div>$options['multiple'] = false;</div><div>$collection-&gt;update(</div><div>&nbsp;$filter,</div><div>&nbsp;$new_document,</div><div>&nbsp;$options</div><div>);</div><div></div><div>MongoDB也支持批量更新，与关系型数据库类似，可以更新给定条件的所有文档，如果想这么做的话，就需要设置options的multiple的值为true.</div><div></div><div><strong>四、查询文档</strong></div><div>定义一个符合给定标准的条件过滤器，通过使用查询选择器来获取文档。</div><div>例，通过e-mail address来获取信息：</div><div>$filter = array('email' =&gt; 'crodas@php.net');</div><div>$cursor = $collection-&gt;find($filter);</div><div>foreach ($cursor as $user)&nbsp;</div><div>{</div><div>&nbsp;&nbsp;var_dump($user);</div><div>}</div><div></div><div>例，获取sessions大于10的信息：</div><div>$filter = array('sessions' =&gt; array('$gt' =&gt; 10));</div><div>$cursor = $collection-&gt;find($filter);</div><div></div><div>例，获取没有设置sessions属性的信息：</div><div>$filter = array(</div><div>&nbsp;'sessions' =&gt; array('$exists' =&gt; false)</div><div>);</div><div>$cursor = $collection-&gt;find($filter);</div><div></div><div>例，获取地址在PY并且sessions大于15的信息：</div><div>$filter = array(</div><div>&nbsp;'address.country' =&gt; 'PY',</div><div>&nbsp;'sessions' =&gt; array('$gt' =&gt; 10)</div><div>);</div><div>$cursor = $collection-&gt;find($filter);</div><div></div><div>有一个重要的细节需要注意，只有当需要结果的时候查询才会被执行，在第1个例子中，当foreach循环开始时，查询才被执行。</div><div>这是个很有用的特性，因为这可以通过在游标(cursor)中增加选项来取回结果，恰好在定义查询后，执行查询前这个时刻。例如，可以设置选项来执行分页，或者获取指定数目的匹配的文档。</div><div>$total = $cursor-&gt;total();</div><div>$cursor-&gt;limit(20)-&gt;skip(40);</div><div>foreach($cursor as $user) {</div><div>}</div><div></div><div><strong>五、获取文档的聚类</strong></div><div>MongoDB支持结果的聚类，类似于关系数据库，可以使用count,distinct和group等聚类操作。</div><div>聚类查询返回数组(array)，而不是整个文档对象。</div><div>分组操作允许定义用Javascript编写的MongoDB服务器端功能，该操作执行分组属性。因为可以执行许多带有分组值的操作类型，所以会更灵活，但是相比SQL执行例如SUM(),AVG()等</div><div>简单的分组操作来说，这还是有些困难。</div><div>下面这个例子演示了如何获取国家的的地址列表，以及匹配地址的国家出现的次数：</div><div>$countries = $collection-&gt;distinct(</div><div>&nbsp;array("address.country")</div><div>);</div><div>$result = $collection-&gt;group(</div><div>&nbsp;</div><div>&nbsp;array("address.country" =&gt; True),</div><div></div><div>&nbsp;</div><div>&nbsp;array("sum" =&gt; 0), &nbsp; &nbsp;</div><div></div><div>&nbsp; &nbsp;&nbsp;</div><div>&nbsp;"function (obj, prev) { prev.sum += 1; }",</div><div></div><div>&nbsp;</div><div>&nbsp;array("session" =&gt; array('$gt' =&gt; 10))</div><div></div><div>);</div><div></div><div><strong>六、删除文档</strong></div><div>删除文档与获取或更新文档很类似。</div><div>$filter = array('field' =&gt; 'foo');</div><div>$collection-&gt;remove($filter);</div><div></div><div>要注意，默认所有符合条件的文档都会被删除，如果只想删除符合条件的第1个文档，那么在给remove函数的第二个参数赋值为true。</div><div></div><div><strong>七、索引支持</strong></div><div>有一个很重要的特点，使得决定选择MongoDB，而不是选择其它的类似的面向文档的数据库，这个特点就是对索引的支持，这和关系型数据库的表索引很类似，并不是所有的面向文档的数据库都</div><div>提供内置的索引支持。</div><div>使用MongoDB的创建索引功能可以避免在查询期间在所有文档中进行操作，这就象关系数据库中使用索引来避免全表查询一样。这可以加速那些涉及到索引属性的符合条件的文档的查询。</div><div>例如，如果想在e-mail地址属性上建立唯一的索引，如下所示：</div><div>$collection-&gt;ensureIndex(</div><div>&nbsp;array('email' =&gt; 1),</div><div>&nbsp;array('unique' =&gt; true, 'background' =&gt; true)</div><div>);</div><div></div><div>第1个数组参数描述将要成为索引的所有属性，可以是1个或多个属性。</div><div>默认情况下，索引的创建是一个同步操作，所以，如果文档数目很大的话，把索引的创建放在后台运行会是个好主意，就象上面例子所演示的。</div><div>只有一个属性的索引可能不够用，下面这个例子演示如何通过在2个属性上定义索引来加速查询。</div><div>$collection-&gt;ensureIndex( &nbsp;</div><div>&nbsp;&nbsp;array('address.country' =&gt; 1, 'sessions' =&gt; 1),</div><div>&nbsp;&nbsp;array('background' =&gt; true)</div><div>);</div><div></div><div>每个索引的值定义了索引的顺序：1表示降序(descending），-1表示升序(ascending)</div><div>索引顺序在有排序选项的查询优化中是有用的，如下例所示：</div><div>$filter = array( &nbsp; &nbsp;</div><div>&nbsp;'address.country' =&gt; 'PY',</div><div>);</div><div>$cursor = $collection-&gt;find($filter)-&gt;order(</div><div>&nbsp;&nbsp;array('sessions' =&gt; -1)</div><div>);</div><div></div><div>$collection-&gt;ensureIndex(</div><div>&nbsp;array('address.country' =&gt; 1, 'sessions' =&gt; -1),</div><div>&nbsp;array('background' =&gt; true)</div><div>);</div></div><p>&nbsp;</p><p>&nbsp;</p><div>八、实际应用</div><div>一些开发人员可能害怕使用一种新型的数据库，因为它和他们以前工作中用过的那些不同。</div><div>在理论上学习新事物不同于在实践中学习如何使用，所以，这部分内容将通过比较基于SQL的关系型数据库，比如MySQL，来解释如何用MongoDB来开发实际应用，这样就可以熟悉这两种途径</div><div>的不同。</div><div>例如，我们将构建一个blog系统，有用户，提交和评论功能。在使用关系型数据库的时候，你可以象下面这样通过定义表模式来实现它。</div><div><img src="http://hiphotos.baidu.com/bsdgo/pic/item/ead84b33e61ab8cea8018e1d.jpg"  alt="" /><br /><br />在MongoDB中实现同样的文档定义如下：</div><div>$users = array(</div><div>&nbsp;'username' =&gt; 'crodas', &nbsp;&nbsp;</div><div>&nbsp;'name' =&gt; 'Cesar Rodas',</div><div>);</div><div></div><div>$posts = array(</div><div>&nbsp;'uri' =&gt; '/foo-bar-post',</div><div>&nbsp;'author_id' =&gt; $users-&gt;_id,</div><div>&nbsp;'title' =&gt; 'Foo bar post',</div><div>&nbsp;'summary' =&gt; 'This is a summary text',</div><div>&nbsp;'body' =&gt; 'This is the body',</div><div>&nbsp;'comments' =&gt; array(</div><div>&nbsp;&nbsp;array(</div><div>&nbsp;&nbsp; 'name' =&gt; 'user',</div><div>&nbsp;&nbsp; 'email' =&gt; 'foo@bar.com',</div><div>&nbsp;&nbsp; 'content' =&gt; 'nice post'</div><div>&nbsp;&nbsp;)&nbsp;</div><div>&nbsp;)</div><div>);</div><div></div><div>你可能注意到，我们只用一个文档就代替了posts和comments两个表，这是因为comments是post文档的子文档。这样做使实现更简单，在你想存取发布内容和它的评论时，会节省查询数据库的时间。</div><div>为了更简洁，用户所做评论的细节可以和评论的定义合并，所以你可以用一个查询来获取所发布的内容，评论和用户这些信息。</div><div>$posts = array(</div><div>&nbsp;'uri' =&gt; '/foo-bar-post',</div><div>&nbsp;'author_id' =&gt; $users-&gt;_id,</div><div>&nbsp;'author_name' =&gt; 'Cesar Rodas',</div><div>&nbsp;'author_username' =&gt; 'crodas',</div><div>&nbsp;'title' =&gt; 'Foo bar post',</div><div>&nbsp;'summary' =&gt; 'This is a summary text',</div><div>&nbsp;'body' =&gt; 'This is the body',</div><div>&nbsp;'comments' =&gt; array(</div><div>&nbsp;&nbsp;array(</div><div>&nbsp;&nbsp; 'name' =&gt; 'user',</div><div>&nbsp;&nbsp; 'email' =&gt; 'foo@bar.com',</div><div>&nbsp;&nbsp; 'comment' =&gt; 'nice post'</div><div>&nbsp;&nbsp;),&nbsp;</div><div>&nbsp;)</div><div>);</div><div></div><div>这意味着会存在一些重复信息，但现在磁盘空间比CPU的RAM要便宜得多，以空间换时间，网站访问者的耐心和时间更重要。如果你关注重复信息的同步，那么在更新author信息的时候，你可以执行下面这个更新查询来解决这个问题。</div><div>$filter = array( &nbsp;&nbsp;</div><div>&nbsp;'author_id' =&gt; $author['_id'],</div><div>);</div><div></div><div>$data = array(</div><div>&nbsp;'$set' =&gt; array(</div><div>&nbsp;&nbsp;'author_name' =&gt; 'Cesar D. Rodas',</div><div>&nbsp;&nbsp;'author_username' =&gt; 'cesar',</div><div>&nbsp;)</div><div>);</div><div></div><div>$collection-&gt;update($filter, $data, array(</div><div>&nbsp;&nbsp;'multiple' =&gt; true)</div><div>);</div><div></div><div>以上是我们对数据模型的转换和优化，下面将重写一些用在MongoDB中的和SQL等价的查询。</div><div>SELECT * FROM posts</div><div>&nbsp;INNER JOIN users ON users.id = posts.user_id</div><div>&nbsp;WHERE URL = :url;</div><div>SELECT &nbsp;* FROM comments WHERE post_id = $post_id;</div><div></div><div>首先，增加索引：</div><div>$collection-&gt;ensureIndex(&nbsp;</div><div>&nbsp;array('uri' =&gt; 1),</div><div>&nbsp;array('unique' =&gt; 1, 'background')</div><div>);</div><div></div><div>$collection-&gt;find(array('uri' =&gt; '&lt;uri&gt;'));</div><div></div><div>INSERT INTO comments(post_id, name, email, contents)</div><div>&nbsp;VALUES(:post_id, :name, :email, :comment);</div><div></div><div></div><div>$comment = array( &nbsp;&nbsp;</div><div>&nbsp;'name' =&gt; $_POST['name'], &nbsp;&nbsp;</div><div>&nbsp;'email' =&gt; $_POST['email'], &nbsp;&nbsp;</div><div>&nbsp;'comment' =&gt; $_POST['comment'],</div><div>);</div><div></div><div>$filter = array(</div><div>&nbsp;'uri' =&gt; $_POST['uri'],&nbsp;</div><div>);</div><div></div><div>$collection-&gt;update($filter, array(</div><div>&nbsp;'$push' =&gt; array('comments' =&gt; $comment))</div><div>);</div><div></div><div>SELECT * FROM posts WHERE id IN (</div><div>&nbsp;SELECT DISTINCT post_id FROM comments WHERE email = :email</div><div>);</div><div></div><div>首先，增加索引：</div><div>$collection-&gt;ensureIndex(</div><div>&nbsp;array('comments.email' =&gt; 1),</div><div>&nbsp;array('background' =&gt; 1)</div><div>);</div><div>$collection-&gt;find( array('comments.email' =&gt; $email) );</div><div></div><div>九、用MongoDB存储文件</div><div>MongoDB也提供许多超过基本数据库操作的特点。例如，它提供了在数据库中存储小文件和大文件的解决方案。</div><div>文件被自动分块(块)。如果MongoDB运行在自动分片(auto-sharded)环境，文件块也会被跨多个服务器复制。</div><div>有效地解决文件的存储是一个相当困难的问题，尤其是当你需要管理大量的文件时。把文件保存在本地文件系统中通常不是个好的方案。</div><div>一个困难的例子是YouTube必须有效地服务那些上百万视频的小图片，或者由Facebook为数十亿图片提供的高效运行服务。</div><div>MongoDB通过创建两个内部集合(collections)来解决这个问题：文件集合保存关于文件元数据的信息，块集合保存关于文件块的信息。</div><div>如果你想存储一个大的视频文件，你可以使用如下这样的代码：</div><div>$metadata = array(</div><div>&nbsp;"filename" =&gt; "path.avi",</div><div>&nbsp;"downloads" =&gt; 0, &nbsp;&nbsp;</div><div>&nbsp;"comment" =&gt; "This file is foo bar", &nbsp;&nbsp;</div><div>&nbsp;"permissions" =&gt; array(</div><div>&nbsp;&nbsp;"crodas" =&gt; "write", &nbsp;</div><div>&nbsp;&nbsp;"everybody" =&gt; "read",</div><div>&nbsp;)</div><div>);</div><div>$grid = $db-&gt;getGridFS();</div><div>$grid-&gt;storeFile("/file/to/path.avi", $metadata);</div><div></div><div>正如你所看到的，这很简单且容易理解。</div><div></div><div>十、Map-Reduce</div><div>Map-Reduce是一种处理大量信息的操作手段。map操作应用于每个文档并产生一套新的key-value数据对。reduce操作使用map功能产生的结果并产生基本每个key的单一结果。</div><div>MongoDB Map-Reduce功能可以应用到集合上用于数据转换，这和Hadoop很类似。</div><div>当map处理完成后，结果被保存并且通过键值(key value)被分组。对每个结果键(key)，使用2个参数来调用reduce功能：键(key)及其所有值的数组。</div><div>为了更好地理解它的工作原理，我们假设有了前面定义过的blog的提交文档，接下来你想使每个提交的内容有一系列的tag，如果你想获得关于这些tag的统计情况，你只需要像下面这样计算一下即可：</div><div>首先定义map和reduce功能代码，</div><div>$map = new &nbsp;MongoCode("function () {</div><div>&nbsp;&nbsp;var i;</div><div></div><div>&nbsp;&nbsp;for (i=0; i &lt; this.tags.length; i++) {</div><div>&nbsp;&nbsp;</div><div>&nbsp;&nbsp; emit(this.tags[i], {count: 1});</div><div>&nbsp;&nbsp;}</div><div>}");</div><div></div><div>$reduce = new MongoCode("function (key, values) {</div><div>&nbsp;&nbsp;var i, total=0;</div><div></div><div>&nbsp;&nbsp;for (i=0; i &lt; values.length; i++) {</div><div>&nbsp;&nbsp; total = values[i].count;</div><div>&nbsp;&nbsp;}</div><div>&nbsp;&nbsp;return {count: total}</div><div>}");</div><div></div><div>然后执行map-reduce命令:</div><div></div><div>$map_reduce = array(</div><div>&nbsp;</div><div>&nbsp;'out' =&gt; 'tags_info',</div><div></div><div>&nbsp;</div><div>&nbsp;'verbose' =&gt; true,</div><div></div><div>&nbsp;</div><div>&nbsp;'mapreduce' =&gt; 'posts',</div><div>&nbsp;'map' =&gt; $map,</div><div>&nbsp;'reduce' =&gt; $reduce,</div><div>);</div><div></div><div>$information = $db-&gt;command($map_reduce);</div><div>var_dump($information);</div><div></div><div>如果MongoDB运行在切片(sharded)环境，那么这个数据处理功能将会在所有shard节点上并行。</div><div>要知道执行map-reduce处理通常是很慢的。它的目的是把大量的数据分布在许多服务器上。所以，如果你有许多服务器，你就可以把这个操作分布在这些服务器上进行处理并获得结果，这会比在一台服务器上运行所需的时间要少得多。</div><div>建议在后台运行map-reduce处理，因为它们需要花比较长的时候才能完成。在这种情况下，如果通过Gearman来异步管理启动它是个不错的方法。</div><div></div><div>十一、Auto-sharding</div><div>在前面多次提到sharding，但你可能并不熟悉这个概念。</div><div>Data sharding是一种把数据分布在多个服务器上的数据库技术手段。</div><div>MongoDB只需要很少的配置就可完成auto-sharding。然而，安装和配置一个shard已超出本文章的范围。</div><div>下面这张图展示了工作在shard环境中的MongoDB,这样你会在你使用sharding时都发生了什么有个了解。</div><div><img src="http://hiphotos.baidu.com/bsdgo/pic/item/2bc4ec9ab83f4c5f6f068c1d.jpg"  alt="" /><br /><br />&nbsp;十二、其它</div><div>正则表达式使用面面的格式：</div><div>"/&lt;regex&gt;/&lt;flags&gt;"</div><div></div><div>和SQL语句中的 username LIKE '%bar%'等价的方式如下：</div><div>&lt;?php</div><div>$filter = array(</div><div>'username' =&gt; new MongoRegex("/.*bar.*/i"),</div><div>);</div><div></div><div>$collection-&gt;find($filter);</div><div>?&gt;</div><div></div><div>在使用Regex时要小心，大多时候它不能使用索引，因此它将对整个数据扫描，所以比较好的方法是对文档的数目进行限制。</div><div>&lt;?php</div><div>$filter = array(</div><div>'username' =&gt; new MongoRegex("/.*bar.*/i"),</div><div>'karma' =&gt; array('$gt' =&gt; 10),</div><div>);</div><div></div><div>$collection-&gt;find($filter);</div><div>?&gt;</div><div></div><div>使用Regex可以完成如下这个复杂的查询：</div><div>&lt;?php</div><div>$filter = array(</div><div>'username' =&gt; new MongoRegex("/[a-z][a-z0-9\_]+(\_[0-9])?/i"),</div><div>'karma' =&gt; array('$gt' =&gt; 10),</div><div>);</div><div></div><div>$collection-&gt;find($filter);</div><div><div>?&gt;</div></div></div></div></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/381437.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-06-25 17:13 <a href="http://www.blogjava.net/xiaomage234/archive/2012/06/25/381437.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MongoDB建立索引 </title><link>http://www.blogjava.net/xiaomage234/archive/2012/06/15/380868.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Fri, 15 Jun 2012 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/06/15/380868.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/380868.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/06/15/380868.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/380868.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/380868.html</trackback:ping><description><![CDATA[<div><p>查看索引：<br />db.user_info.getIndexes();</p>  <p>&nbsp;</p>  <p>建立索引：<br />db.user_info.ensureIndex({"name":1});</p><div fc05="" fc11="" nbw-blog="" ztag=""  js-fs2"=""><wbr>  <p>----------------------------------------------------------------------------------</p><br />  <p style="text-indent: 2em;">mongodb 删除数据库</p>  <p style="text-indent: 2em;">use test;</p>  <p style="text-indent: 2em;">&nbsp;db.dropDatabase();</p>  <p style="text-indent: 2em;">&nbsp;mongodb删除表</p>  <p style="text-indent: 2em;">&nbsp;db.mytable.drop();</p>  <p>----------------------------------------------------------------------------------</p>  <p style="text-indent: 2em;">MongoDB用户权限分配的操作是针对某个库来说的。--这句话很重要。</p>  <p style="text-indent: 2em;">&nbsp;</p>  <p style="text-indent: 2em;">1、 进入ljc 数据库：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>  <p style="text-indent: 2em;">use ljc;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --ljc为数据库名称。</p>  <p style="text-indent: 2em;">2、添加用户（读写权限，readOnly--&gt;false）：</p>  <p style="text-indent: 2em;">&nbsp;db.addUser("java","java");</p>  <p style="text-indent: 2em;">3、&nbsp;查看一下所有的用户</p>  <p style="text-indent: 2em;">db.system.users.find();</p>  <p style="text-indent: 2em;"><br />{ "_id" : ObjectId("4e02a89fb841deb5fda3e5e2"), "user" : "java", "readOnly" : fa<br />lse, "pwd" : "59cf7cc156874cbd35cb00869126f569" }</p>  <p style="text-indent: 2em;">4、用户授权。</p>  <p style="text-indent: 2em;">db.auth("java","java");</p>  <p style="text-indent: 2em;">1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示为1 表示授权成功，0表示不成功。</p>  <p style="text-indent: 2em;"><br />&nbsp;<br />5、 添加用户（只读权限，readOnly--&gt;true）：</p>  <p style="text-indent: 2em;">db.addUser("java1","java1",true);<br />db.system.users.find();<br />{ "_id" : ObjectId("4e02a89fb841deb5fda3e5e2"), "user" : "java", "readOnly" : fa<br />lse, "pwd" : "59cf7cc156874cbd35cb00869126f569" }<br />{ "_id" : ObjectId("4e02aae6b841deb5fda3e5e3"), "user" : "java1", "readOnly" : t<br />rue, "pwd" : "fca6bda05c87a72cce0a4a6458d1e266" }</p>  <p style="text-indent: 2em;">注意上面标红的位置的readOnly 只读于可写是有区别的。</p>  <p style="text-indent: 2em;">&nbsp;</p>  <p style="text-indent: 2em;">6、更改密码（为已经存在的用户更改密码）：</p>  <p style="text-indent: 2em;">&nbsp;db.addUser("java","java1");</p>  <p style="text-indent: 2em;">&nbsp;</p>  <p style="text-indent: 2em;">7、删除用户：</p>  <p style="text-indent: 2em;">db.system.users.remove({user:"java1"});</p></div></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/380868.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-06-15 15:51 <a href="http://www.blogjava.net/xiaomage234/archive/2012/06/15/380868.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mongodb亿级数据量的性能测试【转】</title><link>http://www.blogjava.net/xiaomage234/archive/2012/06/07/380279.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 07 Jun 2012 14:44:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/06/07/380279.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/380279.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/06/07/380279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/380279.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/380279.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: from:http://www.cnblogs.com/lovecindywang/archive/2011/03/02/1969324.html&nbsp;进行了一下Mongodb亿级数据量的性能测试，分别测试如下几个项目：（所有插入都是单线程进行，所有读取都是多线程进行）1） 普通插入性能 （插入的数据每条大约在1KB左右）2） 批量插入性能 （使用的是官方C#客户端的InsertBatch）...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaomage234/archive/2012/06/07/380279.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaomage234/aggbug/380279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-06-07 22:44 <a href="http://www.blogjava.net/xiaomage234/archive/2012/06/07/380279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MongoDB分布式部署</title><link>http://www.blogjava.net/xiaomage234/archive/2012/06/07/380277.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 07 Jun 2012 14:37:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/06/07/380277.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/380277.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/06/07/380277.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/380277.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/380277.html</trackback:ping><description><![CDATA[<p style="line-height: normal; color: #555b6e; font-family: Arial; font-size: 12px; background-color: #ffffff; ">from:<a href="http://hi.baidu.com/lzpsky/blog/category/Mongodb">http://hi.baidu.com/lzpsky/blog/category/Mongodb</a>&nbsp;<br />MongoDB 支持分布式部署，自然也支持自动分片。</p><p style="line-height: normal; color: #555b6e; font-family: Arial; font-size: 12px; background-color: #ffffff; ">一、<strong>MongoDB集群包括一定数量的mongod（分片存储数据）、mongos（路由处理）、config server、clients</strong>。以下会一一介绍。</p><p style="line-height: normal; color: #555b6e; font-family: Arial; font-size: 12px; background-color: #ffffff; "><img src="http://hiphotos.baidu.com/lzpsky/pic/item/535e06234c450572ac34de3d.jpg" small="0"  alt="" /></p><p style="line-height: normal; color: #555b6e; font-family: Arial; font-size: 12px; background-color: #ffffff; ">1、<strong>shards</strong>：一个shard为一组mongod，通常一组为两台，主从或互为主从，这一组mongod中的数据时相同的，具体可见<a href="http://hi.baidu.com/lzpsky/blog/item/8f9f9e2430d8cf27d5074232.html" target="_blank" style="color: #004f61; font-family: Verdana, Arial, Helvetica, sans-serif; text-decoration: none; ">《mongodb分布式之数据复制》</a>。数据分割按有序分割方式，每个分片上的数据为某一范围的数据块，故可支持指定分片的范围查询，这同google的BigTable 类似。数据块有指定的最大容量，一旦某个数据块的容量增长到最大容量时，这个数据块会切分成为两块；当分片的数据过多时，数据块将被迁移到系统的其他分片中。另外，新的分片加入时，数据块也会迁移。</p><p style="line-height: normal; color: #555b6e; font-family: Arial; font-size: 12px; background-color: #ffffff; ">2、<strong>mongos</strong>：可以有多个，相当于一个控制中心，负责路由和协调操作，使得集群像一个整体的系统。mongos可以运行在任何一台服务器上，有些选择放在shards服务器上，也有放在client 服务器上的。mongos启动时需要从config servers上获取基本信息，然后接受client端的请求，路由到shards服务器上，然后整理返回的结果发回给client服务器。</p><p style="line-height: normal; color: #555b6e; font-family: Arial; font-size: 12px; background-color: #ffffff; ">3、<strong>config server</strong>：存储集群的信息，包括分片和块数据信息。主要存储块数据信息，每个config server上都有一份所有块数据信息的拷贝，以保证每台config server上的数据的一致性。</p><p style="line-height: normal; color: #555b6e; font-family: Arial; font-size: 12px; background-color: #ffffff; ">4、<strong>shard key</strong>：为了分割数据集，需要制定分片key的格式，类似于用于索引的key格式，通常由一个或多个字段组成以分发数据，比如：</p><p style="line-height: normal; color: #555b6e; font-family: Arial; font-size: 12px; background-color: #ffffff; ">{ name : 1 }<br />{ _id : 1 }<br />{ lastname : 1, firstname : 1 }<br />{ tag : 1, timestamp : -1 }</p><p style="line-height: normal; color: #555b6e; font-family: Arial; font-size: 12px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mongoDB的分片为有序存储(1为升序，-1为降序)，shard key相邻的数据通常会存在同一台服务器（数据块）上。config server的db中存储的信息如下：</p><p style="line-height: normal; color: #555b6e; font-family: Arial; font-size: 12px; background-color: #ffffff; "><img src="http://hiphotos.baidu.com/lzpsky/pic/item/fb4bea1e9066abc21ad57659.jpg" small="0"  alt="" /><br /><br /></p><span style="line-height: normal; color: #555b6e; font-family: Arial; font-size: 12px; background-color: #ffffff; "><p><strong>二、服务器部署可以有多种方式</strong>。首先，每台config server、mongos、mongod都可以是单独的服务器，但这样会导致某些服务器的浪费，比如config server。下图为物理机共享的集群部署，不需要额外加机器。</p><p><img src="http://hiphotos.baidu.com/lzpsky/pic/item/f491002b842090cce6cd4083.jpg" small="0"  alt="" /><br /></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然也有其他的方案，比如把mongos部署在所有的mongod（server1-6）上，又或者在每个运用服务器（server7）上部署mongos。这样部署有个好处在于，appserver和mongos之间的通信建立在localhost interface上，减少了通信成本。当然，此乃官方说法，但本人有想法，尽管减少了appserver和mongos之间的通信成本，但mongos与mongod之间的通信成本却增加了，而且把mongos部署在appserver上并不是很利于sa管理，mongoDB应该是一个相对独立的系统，与应用的耦合度应该尽量降到最低，万一应用想要换数据库，也能多少减少些工作量。当然，视个人习惯了。</p></span><img src ="http://www.blogjava.net/xiaomage234/aggbug/380277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-06-07 22:37 <a href="http://www.blogjava.net/xiaomage234/archive/2012/06/07/380277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mongodb 阶段性技术总结 【转】</title><link>http://www.blogjava.net/xiaomage234/archive/2012/06/07/380276.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 07 Jun 2012 14:26:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/06/07/380276.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/380276.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/06/07/380276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/380276.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/380276.html</trackback:ping><description><![CDATA[<div style="text-align: left;"><div><span style="font-size: 12px;">from:</span>
<a href="http://space.itpub.net/133735/viewspace-710117">http://space.itpub.net/133735/viewspace-710117</a>&nbsp;<br /><span style="font-size: 12px;">联合开发，运维，对mongodb 做了一个技术总结。 其中一些关于公司的数据，就擦去了，各位见谅。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">生产环境最佳实践</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">1.linux 系统：</span></div><div><span style="font-size: 12px;">1】关闭文件系统/分区的atime 选项</span></div><div><span style="font-size: 12px;">Vi /etc/fstab</span></div><div><span style="font-size: 12px;">在对应的分区项后面添加noatime ,nodiratime</span></div><div><span style="font-size: 12px;">LABEL=/1 / ext3 defaults 1 1</span></div><div><span style="font-size: 12px;">LABEL=/data1 /data ext4 defaults,noatime,nodiratime 1 2</span></div><div><span style="font-size: 12px;">2】设置文件句柄４ｋ＋，目前该配置已经集成到启动脚本中。</span></div><div><span style="font-size: 12px;">Vi /etc/security/limit.conf</span></div><div><span style="font-size: 12px;">* soft nproc 65536</span></div><div><span style="font-size: 12px;">* hard nproc 65536</span></div><div><span style="font-size: 12px;">* soft nofile 65536</span></div><div><span style="font-size: 12px;">* hard nofile 65536</span></div><div><span style="font-size: 12px;">3】不要使用large vm page （不要使用大内存页选项）</span></div><div><span style="font-size: 12px;">Linux 大内存页参考：http://linuxgazette.net/155/krishnakumar.html</span></div><div><span style="font-size: 12px;">4】用dmesg 查看主机的信息。</span></div><div><span style="font-size: 12px;">2.linux 文件系统的选择：</span></div><div><span style="font-size: 12px;">Mongodb 采用预分配的大文件来存储数据,我们推荐</span></div><div><span style="font-size: 12px;">1】ext4</span></div><div><span style="font-size: 12px;">2】xfs</span></div><div><span style="font-size: 12px;">3.内核版本：</span></div><div><span style="font-size: 12px;">网络上对2.6.33-31 以及2.6.32 的表现持怀疑度， 而强力推荐2.6.36</span></div><div><span style="font-size: 12px;">4.线程堆栈的尺寸</span></div><div><span style="font-size: 12px;">默认的线程堆栈尺寸为10m ，调整为1m ，已经集成在启动脚本中。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">项目过程中的总结与建议</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">1.大小写问题</span></div><div><span style="font-size: 12px;">mongodb 是默认区分大小写的，但是这会不会衍生出跟mysql 一样的问题？（mysql 区</span></div><div><span style="font-size: 12px;">分大小写，导致windows 与linux 下的表名，字段名不一致）。</span></div><div><span style="font-size: 12px;">如果无特别用途，建议表名，字段名全部用小写字母。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">2.尽可能的缩短字段名的长度</span></div><div><span style="font-size: 12px;">mongodb 的schema free 导致了每笔数据都要存储他的key 以及属性，这导致了这些数</span></div><div><span style="font-size: 12px;">据的大量冗余。开发同事也许考虑到，从易读性出发设计的key 基本比较长，基本都是按</span></div><div><span style="font-size: 12px;">照起字面意思去设计的。这导致key 很长。对应的数据存储占用了很大的空间。</span></div><div><span style="font-size: 12px;">必要的时候，可以考虑建立一个key 与实际意义的map 表，尽量降低key 的长度。</span></div><div><span style="font-size: 12px;">示例定义：</span></div><div><span style="font-size: 12px;">// 基本信息</span></div><div><span style="font-size: 12px;">static final String _ID = "_id";</span></div><div><span style="font-size: 12px;">static final String STATUS_CODE = "sc";</span></div><div><span style="font-size: 12px;">// 缓冲</span></div><div><span style="font-size: 12px;">static final String DATE = "date";</span></div><div><span style="font-size: 12px;">static final String MAX_AGE = "age";</span></div><div><span style="font-size: 12px;">// 内容</span></div><div><span style="font-size: 12px;">static final String CONTENT = "content";</span></div><div><span style="font-size: 12px;">static final String CONTENT_TYPE = "ctype";</span></div><div><span style="font-size: 12px;">static final String CONTENT_LENGTH = "clen";</span></div><div><span style="font-size: 12px;">static final String ZIP = "zip";</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">3. mongodb 单表最大索引数为64</span></div><div><span style="font-size: 12px;">无索引排序的最大数据量为4M, 超过则报错退出。</span></div><div><span style="font-size: 12px;">建议where 条件尽量落在索引字段上，排序字段需要建立索引，索引的使用原则与oracle</span></div><div><span style="font-size: 12px;">mysql 一致，尽量降低索引数量，索引长度。</span></div><div><span style="font-size: 12px;">mongodb 的查询每次只能用到一个索引，对数据的查询不会&#8220;并发&#8221;执行</span></div><div><span style="font-size: 12px;">例如： db.tab.find({'id'=1,'name'=2}) 如果&#8216;id&#8217;，&#8216;name' 列上分别有索引</span></div><div><span style="font-size: 12px;">对查询效率提升意义不大，如果索引为（'id','name') 则大幅提升效率。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">4.mongodb 添加字段</span></div><div><span style="font-size: 12px;">如果添加字段且带有default 值，需要全部数据都要修改，这也是设计阶段需要考虑的</span></div><div><span style="font-size: 12px;">事情，这个问题的另外一种解法是应用代码里做一次判断。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">5.测试过程的密码问题</span></div><div><span style="font-size: 12px;">对于用作数据库使用的Mongodb，在代码测试阶段都应加上密码验证，目前上线阶段基</span></div><div><span style="font-size: 12px;">本都会在密码验证方面出现问题（做缓存使用的可以不做密码验证)。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">6.数据源连接方式</span></div><div><span style="font-size: 12px;">使用连接池模式，尽量减少认证带来的性能额外消耗</span></div><div><span style="font-size: 12px;">建议采用标准的uri 连接方式： mongodb://user:passwd@host:port,host:port/db</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">7.Mongodb日志量</span></div><div><span style="font-size: 12px;">正常情况下不需要开启-v 日志选项。</span></div><div><span style="font-size: 12px;">Mongodb 的-v 日志适合在开发环境的调试线上部署不建议采用这个参数，目前线上</span></div><div><span style="font-size: 12px;">部署的情况，-v 日志一天也会有几个G 的日志量，去掉这个参数，跟数据查询相关的操作</span></div><div><span style="font-size: 12px;">就不会记日志了，数据库的内部的重要操作还是会写日志的。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">8.连接数大小的设置</span></div><div><span style="font-size: 12px;">Mongodb 驱动程序采用的连接池的方式连接到数据库，目前从观察到的情况是应用一</span></div><div><span style="font-size: 12px;">开启便根据变量的设置，建立全部连接，然后提供给程序使用，并且一旦其中某个连接</span></div><div><span style="font-size: 12px;">到数据库的访问失败，则会清空整个连接池到这台数据库的连接，并重新建立连接。</span></div><div><span style="font-size: 12px;">而mongodb 对中断连接的垃圾清理工作则是懒惰的被动清理方式，如果驱动程序端配</span></div><div><span style="font-size: 12px;">置的连接数过大，一旦发生重连，则会导致mongo 端堆积大量的垃圾连接数据，导致</span></div><div><span style="font-size: 12px;">主机资源耗尽。</span></div><div><span style="font-size: 12px;">建议： mongodb 驱动的连接池大小的设置一般应该控制100 以下，一般情况30-50 足</span></div><div><span style="font-size: 12px;">够支撑应用访问。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">9.锁的问题</span></div><div><span style="font-size: 12px;">Mongodb 对数据库的访问全部加锁，如果是查询请求则设置共享锁，数据修改请求，</span></div><div><span style="font-size: 12px;">则设置全局排他锁，并且是实例级别的排他锁。并且写锁会阻塞读请求，如果长时间持有</span></div><div><span style="font-size: 12px;">写锁，会阻塞整个实例的读请求。</span></div><div><span style="font-size: 12px;">部署建议：</span></div><div><span style="font-size: 12px;">1】一般情况下，建议不同的应用不要合用一套示例。</span></div><div><span style="font-size: 12px;">2】如果资源不满足，需要合用，应该具有相同属性的应用合用一套实例。</span></div><div><span style="font-size: 12px;">例如合同mongo 的应用都是读多写少，防止一台写多应用阻塞读请求。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">10.关于map/reduce问题</span></div><div><span style="font-size: 12px;">mongodb 对map/reduce 的支持是单线程的，我们不建议在前台使用该功能， group by</span></div><div><span style="font-size: 12px;">是通过map/reduce 实现的，开发过程中，要慎用。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">11.安全问题</span></div><div><span style="font-size: 12px;">1】Mongodb 运行在mongodb 用户之上，并禁止mongodb 用户登录</span></div><div><span style="font-size: 12px;">2】使用Mongodb 自带的认证方法（adduser、auth）限制用户访问行为</span></div><div><span style="font-size: 12px;">3】将Mongodb 置于内网环境中</span></div><div><span style="font-size: 12px;">4】Mongodb 必须暴露在外网环境中的时候，使用IPTABLES 等网络层技术进行防护</span></div><div><span style="font-size: 12px;">5】网络层面内容为明文传输，可以考虑存储加密文档，应用端，加解密。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">12.性能监控</span></div><div><span style="font-size: 12px;">Mongodb 自带有性能数据收集系统</span></div><div><span style="font-size: 12px;">Mongostat 实时采集数据库的多项指标,提供http console 端口号为应用端口号+1000。</span></div><div><span style="font-size: 12px;">关注的主要性能指标：</span></div><div><span style="font-size: 12px;">1】Faults：显示Mongodb 每秒页面故障的数量，这个是mongoDB 映射到虚拟地址空间，</span></div><div><span style="font-size: 12px;">而不是物理内存，这个值如果飙高的话，可能意味着机器没有足够的内存来</span></div><div><span style="font-size: 12px;">存储数据和索引。</span></div><div><span style="font-size: 12px;">2】Flushes：每秒做了多少次fsync，显示多少次数据被刷新进了磁盘</span></div><div><span style="font-size: 12px;">3】locked：写锁</span></div><div><span style="font-size: 12px;">4】idx miss：索引未命中比例</span></div><div><span style="font-size: 12px;">5】qr | qw：读写锁的请求队列长度。</span></div><div><span style="font-size: 12px;">6】conn： 当前已经建立的连接数。</span></div><div><span style="font-size: 12px;">其他命令：</span></div><div><span style="font-size: 12px;">Db.stat()</span></div><div><span style="font-size: 12px;">db.serverStatuse()</span></div><div><span style="font-size: 12px;">Db.collection.stats()</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">13.碎片问题</span></div><div><span style="font-size: 12px;">Mongodb 数据库如果数据修改很频繁，会出现比较严重的空间碎片问题，表现在磁盘</span></div><div><span style="font-size: 12px;">文件扩张与实际数据量不相符，内存不够用，索引命中率低，查询效率降低。</span></div><div><span style="font-size: 12px;">碎片整理，目前我们采用的版本没有太有效的方法。</span></div><div><span style="font-size: 12px;">可以用db.repaireDatabase() 来整理数据库，这个过程非常的慢</span></div><div><span style="font-size: 12px;">如果是Master-slave 模式则相当于执行一次主从切换，然后从新建立从库。</span></div><div><span style="font-size: 12px;">如果是replSet 架构可以停掉数据库，然后删除数据目录，从新从复制复制组中全同步数据，</span></div><div><span style="font-size: 12px;">这个时候要考虑oplog 的尺寸。</span></div><div><span style="font-size: 12px;">一个大体的步骤：</span></div><div><span style="font-size: 12px;">1.】先调用rs.freeze(1200),将每个不想让它成为primary 的机器让它在1200 秒内无法成为</span></div><div><span style="font-size: 12px;">primary(这步也可以不做)</span></div><div><span style="font-size: 12px;">2. 】将primary stepDown,不出意外新的primary 会起来.</span></div><div><span style="font-size: 12px;">3. 】将原primary kill 掉.</span></div><div><span style="font-size: 12px;">4. 】删掉所有data 数据(调用repair 很慢,真不如干掉重新来)</span></div><div><span style="font-size: 12px;">5. 】再重启动原primary 的进程</span></div><div><span style="font-size: 12px;">6. 】以此循环完成整个复制组的全部重建。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">14.系统备份：</span></div><div><span style="font-size: 12px;">Mongodb 目前不支持在线备份，只能离线备份。</span></div><div><span style="font-size: 12px;">我们采用的架构为replSet 和Master-slave .</span></div><div><span style="font-size: 12px;">基于我们目前的架构以及数据一致性要求，我们没有安排相关的备份系统。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">15.应用代码中Mongodb连接问题</span></div><div><span style="font-size: 12px;">在有些应用在使用Mongodb 过程中会存在以下两个小问题：</span></div><div><span style="font-size: 12px;">1. 在应用启动过程中，应用存在要求连接池中所有的连接都建立成功才让应用正</span></div><div><span style="font-size: 12px;">常启动，这种做法不可取，因为存在网络问题、Mongodb 拒绝连接或Mongodb 假死情况，如</span></div><div><span style="font-size: 12px;">果没加外部try catch 做防护，则Resin 不断重启也不能正常启动端口。</span></div><div><span style="font-size: 12px;">2.有些应用在使用Mongodb 中连接池配置了safe=true，w=1；这种配置意味着客户端在</span></div><div><span style="font-size: 12px;">插入数据或更新数据的时候，要求mongodb 必须将所更新的数据写入磁盘并返回更新成功</span></div><div><span style="font-size: 12px;">的信息给程序。如果碰上应用程序访问压力大，mongodb 就会反应迟钝，并会发生假死可能，</span></div><div><span style="font-size: 12px;">针对此情况，需要评估数据的一致性需求，做出合适调整。我们一般建议关闭此选项。</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">16.补充开发方面的一些问题</span></div><div><span style="font-size: 12px;">1】skip+limit翻页，越往后面越慢，有资料说用数组元素的分页可以解决，目前还没</span></div><div><span style="font-size: 12px;">试过，比较靠谱的做法是，先找出上次的id，翻页的时候不用skip：</span></div><div><span style="font-size: 12px;">last_row_id = ObjectId(&#8216;....&#8217;);</span></div><div><span style="font-size: 12px;">db.activity_stream-&gt;find({_id:{$lt: last_row_id },</span></div><div><span style="font-size: 12px;">user_id:20 } ).sort( {_id:-1} ).limit(10);</span></div><div><span style="font-size: 12px;">2】.只有真正需要的字段才select出来</span></div><div><span style="font-size: 12px;">3】.更新的某条数据的时候，先查出来再更新会减小锁的时间</span></div><div><span style="font-size: 12px;">4】.只有返回很少结果的查询才用索引，否则会加载太多数据，比没有用索引还慢</span></div><div><span style="font-size: 12px;">5】.属性比较多的时候，建立分层的关系能够提高查询效率，否则每个记录都要过一遍</span></div><div><span style="font-size: 12px;">才能找到要的属性</span></div><div><span style="font-size: 12px;"><br /></span></div><div><span style="font-size: 12px;">17.关于硬件资源的选择：</span></div><div><span style="font-size: 12px;">虚拟机可以很好的隔离资源，并可动态的扩展。</span></div><div><span style="font-size: 12px;">我们建议mongodb 的部署采用虚拟机的方式，每个虚拟机部署一个实例，使各节点分</span></div><div><span style="font-size: 12px;">散在不同的物理机上,根据应用的前期预测，平衡虚拟机的之间的i/o。</span></div></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/380276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-06-07 22:26 <a href="http://www.blogjava.net/xiaomage234/archive/2012/06/07/380276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安装couchDB</title><link>http://www.blogjava.net/xiaomage234/archive/2012/03/23/372524.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Fri, 23 Mar 2012 03:12:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/03/23/372524.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/372524.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/03/23/372524.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/372524.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/372524.html</trackback:ping><description><![CDATA[<p style="line-height: 20px; color: #46412d; font-family: Tahoma; font-size: 12px; background-color: #505050; "></p><div>去apache下载到couchDB 1.1.1版本，在debian上解压到目录couchDB，进入目录，命令：</div><div></div><div>./configure</div><div></div><div>报错：</div><div></div><div>configure: error: Could not find the js library.</div><div></div><div>Is the Mozilla SpiderMonkey library installed?</div><div></div><div>需要先安装SpiderMonkey，这是一个JS的引擎由Mozilla基金维护，安装不难，下载地址</div><div></div><div>http://ftp.mozilla.org/pub/mozilla.org/js/</div><div></div><div>下载了1.7那个，然后在debian上解压，进入js/src，命令：</div><div></div><div>make BUILD_OPT=1 -f Makefile.ref</div><div></div><div>命令：</div><div></div><div>make BUILD_OPT=1 JS_DIST=/usr/local -f Makefile.ref export</div><div></div><div>然后再去couchDB那儿</div><div></div><div>./configure</div><div></div><div>报错：</div><div></div><div>configure: error: Your SpiderMonkey library is too new.</div><div></div><div>真让人难受不是，现在卸载1.7的SM，根据当时make的信息，在usr/local/的目录下bin，lib，included子目录下删除make命令拷贝进去的东西，然后回过来把整个SpiderMonkey都删除了。接着下载js185-1.0.0版本，解压，进入到src目录，命令</div><div></div><div>./configure</div><div></div><div>make</div><div></div><div>编译完成后，回去配置couchDB，说找不到spider的库，因为，这个185xx的版本没有那个拷贝库到usr/local/lib的流程，所以，在configure的时候设置库路径参数，命令：</div><div></div><div>&nbsp;./configure --with-js-lib=/usr/local/spidermonkey/lib --with-js-include=/usr/local/spidermonkey/include</div><div></div><div>把路径改成到src目录的路径。这样之后报错：</div><div></div><div>The icu-config script could not be found.</div><div></div><div>安装icu似乎很简单，命令</div><div></div><div>apt-get install libicu-dev</div><div></div><div>然后在像上面那样configure，报错：</div><div></div><div>Could not find the `erl' executable. Is Erlang installed?</div><div></div><div>安装erl，，命令：</div><div></div><div>apt-get install erlang-nox erlang-dev</div><div></div><div>安装好了，在按上面的命令configure，哦yeah，提示：You have configured Apache CouchDB, time to relax.，接下来，命令</div><div></div><div>make install</div><div></div><div>然后，哈哈！提示我：You have installed Apache CouchDB, time to relax.</div><p style="line-height: 20px; color: #46412d; font-family: Tahoma; font-size: 12px; background-color: #505050; "></p><img src ="http://www.blogjava.net/xiaomage234/aggbug/372524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-03-23 11:12 <a href="http://www.blogjava.net/xiaomage234/archive/2012/03/23/372524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CouchDB 的最好教程</title><link>http://www.blogjava.net/xiaomage234/archive/2012/03/23/372522.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Fri, 23 Mar 2012 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/03/23/372522.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/372522.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/03/23/372522.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/372522.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/372522.html</trackback:ping><description><![CDATA[<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">在 NoSQL 的<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.nosqlfan.com/tags/%e6%96%87%e6%a1%a3%e5%9e%8b" title="查看 文档型 的全部文章" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">文档型</a></span>分支中，有两个杰出的代表，一个当然是被称为下代mySQL的&nbsp;<a href="http://mongodb.org/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">MongoDB</a>，而另一个就是<a href="http://couchdb.apache.org/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">CouchDB</a>，同是文档型存储，<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.nosqlfan.com/tags/couchdb" title="查看 CouchDB 的全部文章" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">CouchDB</a></span>&nbsp;与MongoDB 在应用层面上走了两条截然不同的路线，下面推荐的一篇文文章，是一篇非常好的CouchDB教程，想了解CouchDB的话，非常值得一看：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #ff0000; ">CouchDB 特性介绍：</span></strong></p><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 25px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">CouchDB is a JSON&nbsp;<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.nosqlfan.com/tags/document" title="查看 document 的全部文章" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">document</a></span>-oriented database written in&nbsp;<a title="Read more about Erlang" href="http://erlang.org/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">Erlang</a>.CouchDB是一个用<a title="Read more about Erlang" href="http://erlang.org/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">Erlang</a>&nbsp;写的文档型数据库。</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">It is a highly concurrent database designed to be easily replicable, horizontally, across numerous devices and be fault tolerant.支持高并发访问，支持数据同步，高容错性的分布式存储</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">It is part of the NoSQL generation of databases.它是NoSQL 体系中的一员</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">It is an open source Apache foundation project. 它是一个Apache 基金下的开源项目</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">It allows applications to store JSON documents via its RESTful interface. 它支持JSON 数据的存储，支持RESTful方式的接口。</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">It makes use of map/reduce to index and query the database.他使用map/reduce 来构建索引及进行数据查询操作</li></ul><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #ff0000; ">CouchDB的优势：</span></strong></p><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 25px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">JSON Documents</strong>&nbsp;&#8211; 文档在CouchDB中以JSON格式存储.</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">RESTful Interface</strong>&nbsp;&#8211; 对CouchDB的所有操作，包括数据CRUD，数据库管理及数据同步，都可能通过HTTP方式进行。</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">N-Master Replication</strong>&nbsp;&#8211; 你可以使用无限多个 master 机器，这样可能会让你能够构建很有意思的数据网络拓扑。</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Built for Offline</strong>&nbsp;&#8211; CouchDB 能够运行在移动设备上（Android 系统），他可以让你的移动设备在离线时存储数据，在接入网络时再同步到云端存储。</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Replication Filters</strong>&nbsp;&#8211; 可以在同步复制操作中加上一个过滤器，让你有选择性的同步数据。</li></ul><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #ff0000; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">CouchDB：为Internet而生：</strong></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">使用CouchDB，你不仅可以把它当作一个存储，更推荐的方式是完全使用它来构建应用程序，你可以把工作代码直接写在CouchDB 中，完全不需要另外的WEB Server，可以减少开销。这也是CouchDB将自己称为是为Internet而生的原因。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #ff0000; ">CouchDB的数据查询：</span></strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">与其他很多存储设备不同的是，CouchDB并不支持动态查询，相反的，它需要事先换需要查询的条件构建<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.nosqlfan.com/tags/view" title="查看 view 的全部文章" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">view</a></span>，view通常是一个map函数，在已有数据基础上生成一个数据子集，在查询这个view时，如果数据有变更，会触发map函数增量更新view的内容并返回。这种方式也被称作惰性索引机制。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #ff0000; ">使用教程：</span></strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">文章接下来的部分还列出了一个详细的CouchDB 使用教程：</p><ol style="margin-top: 0px; margin-right: 0px; margin-bottom: 15px; margin-left: 25px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; "><li style="margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 16px; ">安装CouchDB</li><li style="margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 16px; ">使用CouchDB 强大的 WEB 管理工具：FUTON</li><li style="margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 16px; ">CouchDB 用户管理</li><li style="margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 16px; ">创建一个数据文档</li><li style="margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 16px; ">更新数据文档</li><li style="margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 16px; ">通过CURL创建文档</li><li style="margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 16px; ">查询所有文档</li><li style="margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 16px; ">创建一个map函数</li><li style="margin-top: 10px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 16px; ">运行一个reduce函数</li></ol><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">原文链接：<a href="http://goo.gl/WK7q0" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">http://goo.gl/WK7q0</a></p><img src ="http://www.blogjava.net/xiaomage234/aggbug/372522.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-03-23 11:04 <a href="http://www.blogjava.net/xiaomage234/archive/2012/03/23/372522.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MongoDB 与 CouchDB 全方位对比</title><link>http://www.blogjava.net/xiaomage234/archive/2012/03/23/372520.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Fri, 23 Mar 2012 03:02:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/03/23/372520.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/372520.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/03/23/372520.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/372520.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/372520.html</trackback:ping><description><![CDATA[<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">本文见于<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.nosqlfan.com/tags/mongodb" title="查看 MongoDB 的全部文章" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">MongoDB</a></span>官方网站，MongoDB与<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.nosqlfan.com/tags/couchdb" title="查看 CouchDB 的全部文章" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">CouchDB</a></span>&nbsp;很相似，他们都是文档型存储，数据存储格式都是JSON型的，都使用Javascript进行操作，都支持Map/Reduce。但是其实二者有着很多本质的区别，本文透过现象追寻本质，让你更好的理解MongoDB 与CouchDB。nosqlfan 翻译如下：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">原文链接：<a href="http://www.mongodb.org/display/DOCS/Comparing+Mongo+DB+and+Couch+DB" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">Comparing Mongo DB and Couch DB</a></p><h2>1.<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.nosqlfan.com/tags/mvcc" title="查看 MVCC 的全部文章" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">MVCC</a></span>（Multiversion concurrency control）</h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">MongoDB 与 CouchDB 的一大区别就是CouchDB 是一个<a href="http://en.wikipedia.org/wiki/Multiversion_concurrency_control" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">MVCC</a>的系统，而MongoDB是一个update-in-place 的系统。这二者的区别就是，MongoDB 进行写操作时都是即时完成写操作，写操作成功则数据就写成功了，而CouchDB 一个支持多版本控制的系统，此类系统通常支持多个结点写，而系统会检测到多个系统的写操作之间的冲突并以一定的算法规则予以解决。</p><h2>2.水平扩展性</h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">在扩展性方面，CouchDB 使用replication 去做，而MongoDB 的replication 仅仅用来增强数据的可靠性，MongoDB 在实现水平扩展性方面使用的是Sharding。（据说CouchDB 也有开发分片功能的计划）</p><h2>3.数据查询操作</h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">这个区别在用户接口上了，MongoDB 与传统的数据库系统类似，支持动态查询，即使在没有建立索引的行上，也能进行任意的查询。而 CouchDB 不同，CouchDB 不支持动态查询，你必须为你的每一个查询模式建立相应的<a href="http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">view</a>，并在此view的基础上进行查询。</p><h2>4.原子性</h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">这一点上两者比较一致，都支持针对行的原子性修改（<a title="Atomic Operations" href="http://www.mongodb.org/display/DOCS/Atomic+Operations" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">concurrent modifications of single documents</a>），但不支持更多的复杂事务操作。</p><h2>5.数据可靠性</h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">CouchDB 是一个&#8221;crash-only&#8221; 的系统，你可以在任何时候停掉CouchDB 并能保证数据的一致性。而MongoDB 在不正常的停掉后需要运行 repairDatabase() 命令来修复数据文件，在1.7.5 版本后支持单机可靠的 &#8211;dur命令。</p><h2>6.Map/Reduce</h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">MongoDB 和 CouchDB 都支持Map/Reduce ，不同的是MongoDB 只有在数据统计操作中会用到，而CouchDB 在变通查询时也是使用 Map/Reduce。</p><h2>7.使用&nbsp;<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.nosqlfan.com/tags/javascript" title="查看 javascript 的全部文章" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">javascript</a></span></h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">MongoDB 和CouchDB 都支持javascript，CouchDb 用javascript来创建view。MongoDB 使用JSON作为普通数据库操作的表达式。当然你也可以在操作中包含<a href="http://www.mongodb.org/display/DOCS/Server-Side+Processing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">javascript语句</a>。MongoDB还支持服务端的javascript脚本（<a title="Server-Side Processing" href="http://www.mongodb.org/display/DOCS/Server-Side+Processing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">running arbitrary javascript functions server-side</a>），当然，MongoDB 的Map/Reduce 函数也是javascript 格式的。</p><h2>8.REST</h2><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">CouchDB 是一个<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.nosqlfan.com/tags/restful" title="查看 RESTFul 的全部文章" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">RESTFul</a></span>&nbsp;的数据库，其操作完全走HTTP协议，而MongoDB是走的自己的二进制协议。MongoDB Server在启动时可以开放一个HTTP 的接口供状态监控。</p><h2>9.性能</h2><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 25px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">此处主要列举了MongoDB 自己具有高性能的原因</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">采用二进制协议，而非CouchDB REST的HTTP 协议</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">使用Momary Map 内存映射的做法</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">collection-oriented，面向集合的存储，同一个collection的数据是连续存储的</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">update-in-place 直接修改，而非使用MVCC的机制</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">使用C＋＋ 编写</li></ul><h2>10.适用场景</h2><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 25px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">如果你在构建一个 Lotus Notes 型的应用，我们推荐使用CouchDB，主要是由于它的MVCC机制。另外如果我们需要master-master 的架构，需要基于地理位置的数据分布，或者在数据结点可能不在线的情况下，我们推荐使用CouchDB。</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">如果你需要高性能的存储服务，那我们推荐 MongoDB，比如用于存储大型网站的用户个人信息，比如用于构建在其它存储层之上的Cache层。</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">如果你的需求中有大量 update 操作，那么使用MongoDB吧。就像我们在例子<a href="http://blog.mongodb.org/post/171353301/using-mongodb-for-real-time-analytics" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">updating real time analytics counters</a>&nbsp;中的一样，对于那种经常变化的数据，比如浏览量，访问数之类的数据存储。</li></ul><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; "></p><table id="anyShare" style="margin-top: 20px; margin-right: auto; margin-bottom: 20px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; width: 613px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; box-shadow: #eeeeee 0px 0px 5px; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; border-top-width: 0px !important; border-right-width: 0px !important; border-bottom-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; border-top-left-radius: 9px; border-top-right-radius: 9px; border-bottom-right-radius: 9px; border-bottom-left-radius: 9px; border-collapse: collapse; color: #383838; font-size: 15px; line-height: 25px; "><tbody style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><tr style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td id="AS-TXT" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px !important; padding-right: 0px !important; padding-bottom: 0px !important; padding-left: 0px !important; border-bottom-width: 0px !important; border-top-width: 0px !important; border-right-width: 0px !important; border-left-width: 0px !important; border-style: initial !important; border-color: initial !important; vertical-align: middle; "><em style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; float: right; color: #eeeeee; font-size: 10px; ">anyShare</em><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; font-family: 微软雅黑; font-size: 16px; display: block; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #eeeeee; ">一切看了好文章不转的行为，都是耍流氓！</strong></td></tr></tbody></table><img src ="http://www.blogjava.net/xiaomage234/aggbug/372520.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-03-23 11:02 <a href="http://www.blogjava.net/xiaomage234/archive/2012/03/23/372520.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cassandra、MongoDB、CouchDB、Redis、Riak、HBase比较</title><link>http://www.blogjava.net/xiaomage234/archive/2012/03/23/372512.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Fri, 23 Mar 2012 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/03/23/372512.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/372512.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/03/23/372512.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/372512.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/372512.html</trackback:ping><description><![CDATA[<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">本文有标题党之嫌。在NoSQL如日中天的今天，各种NoSQL产品可谓百花齐放，但每一个产品都有自己的特点，有长处也有不适合的场景。本文对<a href="http://cassandra.apache.org/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">Cassandra</a>,&nbsp;<a href="http://www.mongodb.org/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">Mongodb</a>,&nbsp;<a href="http://couchdb.apache.org/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">CouchDB</a>,&nbsp;<a href="http://redis.io/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">Redis</a>,&nbsp;<a href="http://www.basho.com/Riak.html" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">Riak</a>&nbsp;以及&nbsp;<a href="http://hbase.apache.org/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">HBase</a>&nbsp;进行了多方面的特点分析，希望看完此文的您能够对这些NoSQL产品的特性有所了解。</p><table border="1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; "><tbody style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><tr style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><h2><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.nosqlfan.com/tags/couchdb" title="查看 CouchDB 的全部文章" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">CouchDB</a></span></h2></td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 25px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Written in:</strong>&nbsp;Erlang</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Main point:</strong>&nbsp;DB consistency, ease of use</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">License:</strong>&nbsp;Apache</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Protocol:</strong>&nbsp;HTTP/REST</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Bi-directional (!) replication,</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">continuous or ad-hoc,</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">with conflict detection,</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">thus, master-master replication. (!)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">MVCC &#8211; write operations do not block reads</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Previous versions of documents are available</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Crash-only (reliable) design</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Needs compacting from time to time</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Views: embedded map/reduce</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Formatting views: lists &amp; shows</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Server-side document validation possible</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Authentication possible</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Real-time updates via _changes (!)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Attachment handling</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">thus,&nbsp;<a href="http://couchapp.org/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">CouchApps</a>&nbsp;(standalone js apps)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">jQuery library included</li></ul><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Best used:</strong>&nbsp;For accumulating, occasionally changing data, on which pre-defined queries are to be run. Places where versioning is important.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">For example:</strong>&nbsp;CRM, CMS systems. Master-master replication is an especially interesting feature, allowing easy multi-site deployments.</p></td></tr><tr style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><h2><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.nosqlfan.com/tags/redis" title="查看 Redis 的全部文章" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">Redis</a></span></h2></td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 25px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Written in:</strong>&nbsp;C/C++</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Main point:</strong>&nbsp;Blazing fast</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">License:</strong>&nbsp;BSD</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Protocol:</strong>&nbsp;Telnet-like</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Disk-backed in-memory database,</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">but since 2.0, it can swap to disk.</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Master-slave replication</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Simple keys and values,</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">but&nbsp;<a href="http://redis.io/commands" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">complex operations</a>&nbsp;like ZREVRANGEBYSCORE</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">INCR &amp; co (good for rate limiting or statistics)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Has sets (also union/diff/inter)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Has lists (also a queue; blocking pop)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Has hashes (objects of multiple fields)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Of all these databases, only Redis does transactions (!)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Values can be set to expire (as in a cache)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Sorted sets (high score table, good for range queries)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Pub/Sub and WATCH on data changes (!)</li></ul><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Best used:</strong>&nbsp;For rapidly changing data with a foreseeable database size (should fit mostly in memory).</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">For example:</strong>&nbsp;Stock prices. Analytics. Real-time data collection. Real-time communication.</p></td></tr><tr style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><h2><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.nosqlfan.com/tags/mongodb" title="查看 MongoDB 的全部文章" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">MongoDB</a></span></h2></td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 25px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Written in:</strong>&nbsp;C++</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Main point:</strong>&nbsp;Retains some friendly properties of SQL. (Query, index)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">License:</strong>&nbsp;AGPL (Drivers: Apache)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Protocol:</strong>&nbsp;Custom, binary (BSON)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Master/slave replication</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Queries are javascript expressions</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Run arbitrary javascript functions server-side</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Better update-in-place than CouchDB</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Sharding built-in</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Uses memory mapped files for data storage</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Performance over features</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">After crash, it needs to repair tables</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Better durablity coming in V1.8</li></ul><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Best used:</strong>&nbsp;If you need dynamic queries. If you prefer to define indexes, not map/reduce functions. If you need good performance on a big DB. If you wanted CouchDB, but your data changes too much, filling up disks.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">For example:</strong>&nbsp;For all things that you would do with MySQL or PostgreSQL, but having predefined columns really holds you back.</p></td></tr><tr style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><h2><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.nosqlfan.com/tags/cassandra" title="查看 Cassandra 的全部文章" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">Cassandra</a></span></h2></td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 25px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Written in:</strong>&nbsp;Java</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Main point:</strong>&nbsp;Best of BigTable and Dynamo</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">License:</strong>&nbsp;Apache</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Protocol:</strong>&nbsp;Custom, binary (Thrift)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Tunable trade-offs for distribution and replication (N,&nbsp;R,&nbsp;W)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Querying by column, range of keys</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">BigTable-like features: columns, column families</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Writes are much faster than reads (!)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Map/reduce possible with Apache Hadoop</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">I admit being a bit biased against it, because of the bloat and complexity it has partly because of Java (configuration, seeing exceptions, etc)</li></ul><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Best used:</strong>&nbsp;When you write more than you read (logging). If every component of the system must be in Java. (&#8220;No one gets fired for choosing Apache&#8217;s stuff.&#8221;)</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">For example:</strong>&nbsp;Banking, financial industry (though not necessarily for financial transactions, but these industries are much bigger than that.) Writes are faster than reads, so one natural niche is real time data analysis.</p></td></tr><tr style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><h2><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.nosqlfan.com/tags/riak" title="查看 Riak 的全部文章" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">Riak</a></span></h2></td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 25px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Written in:</strong>&nbsp;Erlang &amp; C, some Javascript</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Main point:</strong>&nbsp;Fault tolerance</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">License:</strong>&nbsp;Apache</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Protocol:</strong>&nbsp;HTTP/REST</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Tunable trade-offs for distribution and replication (N,&nbsp;R,&nbsp;W)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Pre- and post-commit hooks,</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">for validation and security.</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Built-in full-text search</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Map/reduce in javascript or Erlang</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Comes in &#8220;open source&#8221; and &#8220;enterprise&#8221; editions</li></ul><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Best used:</strong>&nbsp;If you want something Cassandra-like (Dynamo-like), but no way you&#8217;re gonna deal with the bloat and complexity. If you need very good single-site scalability, availability and fault-tolerance, but you&#8217;re ready to pay for multi-site replication.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">For example:</strong>&nbsp;Point-of-sales data collection. Factory control systems. Places where even seconds of downtime hurt.</p></td></tr><tr style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><h2>HBase</h2></td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 25px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Written in:</strong>&nbsp;Java</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Main point:</strong>&nbsp;Billions of rows X millions of columns</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">License:</strong>&nbsp;Apache</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Protocol:</strong>&nbsp;HTTP/REST (also Thrift)</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Modeled after BigTable</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Map/reduce with Hadoop</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Query predicate push down via server side scan and get filters</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Optimizations for real time queries</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">A high performance Thrift gateway</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">HTTP supports XML, Protobuf, and binary</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Cascading, hive, and pig source and sink modules</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Jruby-based (JIRB) shell</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">No single point of failure</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Rolling restart for configuration changes and minor upgrades</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 19px; ">Random access performance is like MySQL</li></ul><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Best used:</strong>&nbsp;If you&#8217;re in love with BigTable.&nbsp;<img src="http://blog.nosqlfan.com/wp-includes/images/smilies/icon_smile.gif" alt=":)" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; float: none; border-width: initial; border-color: initial; " />&nbsp;And when you need random, realtime read/write access to your Big Data.</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">For example:</strong>&nbsp;Facebook Messaging Database (more general example coming soon)</p></td></tr></tbody></table><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">原文链接：<a href="http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase comparison</a></p><img src ="http://www.blogjava.net/xiaomage234/aggbug/372512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-03-23 10:28 <a href="http://www.blogjava.net/xiaomage234/archive/2012/03/23/372512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CouchDB，反Redis的产物？－Redis与CouchDB特性对比【转】</title><link>http://www.blogjava.net/xiaomage234/archive/2012/03/23/372509.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Fri, 23 Mar 2012 02:18:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/03/23/372509.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/372509.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/03/23/372509.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/372509.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/372509.html</trackback:ping><description><![CDATA[<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">本文是一篇转载翻译文章，原文标题是 Is&nbsp;<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.nosqlfan.com/tags/couchdb" title="查看 CouchDB 的全部文章" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">CouchDB</a></span>&nbsp;The Anti-<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.nosqlfan.com/tags/redis" title="查看 Redis 的全部文章" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">Redis</a></span>? 作者在对比了Redis和CouchDB之后得出这样一个结论，这两家伙是反着来的，当然，这个反着来没有对和错，只是适合的应用场景不同，本人觉得其评价还是比较中肯，下面是对其主要内容的摘录和翻译，希望对你有用。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; "><a href="http://blog.nosqlfan.com/wp-content/uploads/2011/08/couchdbredis.jpg" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; "><img wp-image-2758=""  alignnone"="" title="couchdbredis" src="http://blog.nosqlfan.com/wp-content/uploads/2011/08/couchdbredis.jpg" alt="" width="491" height="111" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-width: initial; border-color: initial; border-image: initial; background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; display: inline; background-position: initial initial; background-repeat: initial initial; " /></a></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">相比来看，CouchDB 的长处正是Redis的短处：存储大量的不易变但会被经常查询的数据。Redis的长处正是CouchDB的短处：存储小量的常变数据。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">以一个博客系统为例，CouchDB作为一个文档型数据库，可以用来存储文章，评论，模板及附件等，而Redis以其丰富的数据类型的数据结构，更适合用来存储评论列表，网站实时状态，过滤spam，用户session信息以及页面缓存。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">作为一个内存数据库，Redis提供了快速对其数据结构进行复杂操作的功能，另外通过一份顺序的日志来保证其数据可靠性。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">CouchDB使用了一种<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://blog.nosqlfan.com/tags/append-only" title="查看 append-only 的全部文章" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">append-only</a></span>的数据模型，不仅在数据库数据存储上，包括其B-tree和R-tree索引都是append-only的，所以如果你的数据修改操作太多（比如计数器应用），那么CouchDB的数据文件会飞速膨胀。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">Redis采用定时将内存数据Flush成RDB文件的方法来实现数据的持久化，而CouchDB的数据需要定时做数据压缩以缩减数据文件的大小，这一过程会把数据文件读入，压缩后再写成新的文件。是一个非常耗时的过程。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">Redis提供了简单的索引机制和复杂的数据结构，而CouchDB提供的是复杂的索引和简单的数据结构。Redis适合用来存储实时数据，而CouchDB适合用来存储大量的文档型数据。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">下面是一个更详细的各方面对比表格：</p><table border="1" cellspacing="0" cellpadding="0" width="620" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; "><tbody style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td width="210" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></td><td width="210" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Couchdb</td><td width="210" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Redis</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Written in</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Erlang</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">C</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">License</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Apache</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">BSD</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Release</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">1.1.0, 2.0 preview</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">2.2.12, 2.4.0RC5</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">API</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">REST</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Telnet-style</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">API Speed</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Slow</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Fast</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Data</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">JSON documents, binary attachments</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Text, binary, hash, list, set, sorted set</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Indexes</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">B-tree, R-tree, Full-text (with Lucene), any combination of data types via map/reduce</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Hash only</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Queries</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Predefined view/list/show model, ad-hoc queries require table scans</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Individual keys</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Storage</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Append-only on disk</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">In-memory, append-only log</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Updates</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">MVCC</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">In-place</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Transactions</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Yes, all-or-nothing batches</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Yes, with conditional commands</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Compaction</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">File rewrite</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Snapshot</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Threading</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Many threads</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Single-threaded, forks for snapshots</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Multi-Core</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Yes</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">No</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Memory</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Tiny</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Large (all data)</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">SSD-Friendly</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Yes</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Yes</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Robust</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Yes</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Yes</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Backup</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Just copy the files</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Just copy the files</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Replication</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Master-master, automatic</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Master-slave, automatic</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Scaling</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Clustering (BigCouch)</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Clustering (Redis cluster*)</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Scripting</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">JavaScript, Erlang, others via plugin</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Lua*</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Files</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">One per database</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">One per database</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Virtual Files</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Attachments</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">No</td></tr><tr height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><td height="20" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Other</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Changes feed, Standalone applications</td><td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Pub/Sub, Key expiry</td></tr></tbody></table><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; color: #383838; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 15px; line-height: 25px; background-color: #ffffff; ">来源：<a href="http://ai.mee.nu/is_couchdb_the_anti-redis" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000000; text-decoration: none; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #cccccc; ">ai.mee.nu</a></p><img src ="http://www.blogjava.net/xiaomage234/aggbug/372509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-03-23 10:18 <a href="http://www.blogjava.net/xiaomage234/archive/2012/03/23/372509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP程序员最常犯的11个MySQL错误</title><link>http://www.blogjava.net/xiaomage234/archive/2012/03/22/372425.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Thu, 22 Mar 2012 02:03:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2012/03/22/372425.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/372425.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2012/03/22/372425.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/372425.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/372425.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">对于大多数web应用来说，</span><span style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">数据库</span><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">都是一个十分基础性的部分。如果你在使用</span><span style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">PHP</span><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">，那么你很可能也在使用My</span><span style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">SQL</span><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">&#8212;LAMP系列中举足轻重的一份子。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">对于很多新手们来说，使用PHP可以在短短几个小时之内轻松地写出具有特定功能的代码。但是，构建一个稳定可靠的数据库却需要花上一些时日和相关技能。下面列举了我曾经犯过的最严重的11个</span><span style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">MySQL</span><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">相关的错误（有些同样也反映在其他语言/数据库的使用上）。。。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><strong style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">1、使用MyISAM而不是InnoDB</strong><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">MySQL有很多数据库引擎，但是你最可能碰到的就是MyISAM和InnoDB。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">MySQL 默认使用的是MyISAM。但是，很多情况下这都是一个很糟糕的选择，除非你在创建一个非常简单抑或实验性的数据库。外键约束或者事务处理对于数据完整性 是非常重要的，但MyISAM都不支持这些。另外，当有一条记录在插入或者更新时，整个数据表都被锁定了，当使用量增加的时候这会产生非常差的运行效率。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">结论很简单：使用InnoDB。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><strong style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">2、使用PHP的mysql函数</strong><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">PHP自产生之日就提供了MySQL库函数（or near as makes no difference）。很多应用仍然在使用类似mysql_connect、mysql_query、mysql_fetch_assoc等的函数，尽管PHP</span><span style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">手册</span><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">上说：</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">如果你在使用MySQL v4.1.3或者更新版本，强烈推荐使用您使用mysqli扩展。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">mysqli（MySQL的加强版扩展）有以下几个优点：</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">可选的面向对象接口&nbsp;</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">prepared表达式，这有利于阻止SQL注入攻击，还能提高性能&nbsp;</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">支持更多的表达式和事务处理&nbsp;</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">另外，如果你想支持多种数据库</span><span style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">系统</span><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">，你还可以考虑PDO。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><strong style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">3、没有处理<span style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">用户</span>输入</strong><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">这或者可以这样说#1：永远不要相信用户的输入。用</span><span style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">服务器</span><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">端的PHP验证每个字符串，不要寄希望与</span><span style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">Java</span><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">Script。最简单的SQL注入攻击会利用如下的代码：</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">$username = $_POST["name"];&nbsp; &nbsp;$password = $_POST["password"];&nbsp; &nbsp;$sql = "SELECT userid FROM usertable WHERE username='$username' AND password='$password';";&nbsp; &nbsp;// run query...&nbsp;&nbsp;</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">只要在username字段输入&#8220;admin';--&#8221;，这样就会被黑到，相应的SQL语句如下：</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">SELECT userid FROM usertable WHERE username='admin';</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">狡猾的黑客可以以admin登录，他们不需要知道密码，因为密码段被注释掉了。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><strong style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">4、没有使用UTF-8</strong><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">美国、英国和澳大利亚的我们很少考虑除</span><span style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">英语</span><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">之外的其他语言。我们很得意地完成了自己的&#8220;杰作&#8221;却发现它们并不能在其他地方正常运行。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">UTF-8</span><span style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">解决</span><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">了很多国际化问题。虽然在PHP v6.0之前它还不能很好地被支持，但这并不影响你把MySQL字符集设为UTF-8。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><strong style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">5、相对于SQL，偏爱PHP</strong><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">如果你接触MySQL不久，那么你会偏向于使用你已经掌握的语言来解决问题，这样会导致写出一些冗余、低效率的代码。比如，你不会使用MySQL自带的AVG()函数，却会先对记录集中的值求和然后用PHP循环来计算平均值。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">此外，请注意PHP循环中的SQL查询。通常来说，执行一个查询比在结果中迭代更有效率。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">所以，在分析数据的时候请利用数据库系统的优势，懂一些SQL的知识将大有裨益。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><strong style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">6、没有优化数据库查询</strong><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">99%的PHP性能问题都是由数据库引起的，仅仅一个糟糕的SQL查询就能让你的web应用彻底瘫痪。MySQL的EXPLAIN statement、Query Profiler，还有很多其他的</span><span style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">工具</span><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">将会帮助你找出这些万恶的SELECT。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><strong style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">7、不能正确使用数据类型</strong><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">MySQL提供了诸如numeric、string和date等的数据类型。如果你想存储一个</span><span style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">时间</span><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">，那么使用DATE或者DATETIME类型。如果这个时候用INTEGER或者STRING类型的话，那么将会使得SQL查询非常复杂，前提是你能使用INTEGER或者STRING来定义那个类型。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">很多人倾向于擅自自定义一些数据的格式，比如，使用string来存储序列化的PHP对象。这样的话数据库管理起来可能会变得简单些，但会使得MySQL成为一个糟糕的数据存储而且之后很可能会引起故障。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><strong style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">8、在查询中使用*</strong><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">永远不要使用*来返回一个数据表所有列的数据。这是懒惰：你应该提取你需要的数据。就算你需要所有字段，你的数据表也不可避免的会产生变化。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><strong style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">9、不使用索引或者过度使用索引</strong><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">一般性原则是这样的：select语句中的任何一个where子句表示的字段都应该使用索引。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">举 个例子，假设我们有一个user表，包括numeric ID（主键）和email address。登录的时候，MySQL必须以一个email为依据查找正确的ID。如果使用了索引的话（这里指email），那么MySQL就能够使用 更快的搜索算法来定位email，甚至可以说是即时实现。否则，MySQL就只能顺序地检查每一条记录直到找到正确的email address。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">有的人会在每个字段上都添加索引，遗憾的是，执行了INSERT或者UPDATE之后这些索引都需要重新生成，这样就会影响性能。所以，只在需要的时候添加索引。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><strong style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">10、忘记备份！</strong><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">虽然比较罕见，但是数据库还是有崩溃的危险。硬盘有可能损坏，服务器有可能崩溃，web主机提供商有可能会破产！丢失MySQL数据将会是灾难性的，所以请确保你已经使用了自动备份或者已经复制到位。</span><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><strong style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">11、Bonus mistake-不考虑使用其他数据库</strong><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><br style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; " /><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">对于PHP</span><span style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">开发</span><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">人员来说，MySQL可能是使用最广泛的数据库系统，但并不是唯一的选择。PostgreSQL和Firebird是最强有力的竞争者：这个两者都是开源的，而且都没有被公司收购。</span><span style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">微软</span><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">提供了sql server Express，甲骨文提供了10g Express，这两者都是企业级数据库的免费版本。有时候，对于一个较小的web应用或者</span><span style="word-wrap: break-word; word-break: break-all; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">嵌入式</span><span style="color: #333333; font-family: 宋体, serif; font-size: 12px; background-color: #ffffff; ">应用，SQLite也不失为一个可行的替代方案。</span>&nbsp;<img src ="http://www.blogjava.net/xiaomage234/aggbug/372425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2012-03-22 10:03 <a href="http://www.blogjava.net/xiaomage234/archive/2012/03/22/372425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL 5.6的新特性</title><link>http://www.blogjava.net/xiaomage234/archive/2011/12/16/366520.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Fri, 16 Dec 2011 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2011/12/16/366520.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/366520.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2011/12/16/366520.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/366520.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/366520.html</trackback:ping><description><![CDATA[<div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 12px; line-height: 18px; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 6px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; word-break: break-all; word-wrap: break-word; text-indent: 2em; font-size: 14px; line-height: 25px; text-align: left; ">如果你正在使用<a href="http://www.phpchina.com/?action-viewnews-itemid-40298" target="_self" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-break: break-all; word-wrap: break-word; color: #617b85; text-decoration: none; "><u style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-break: break-all; word-wrap: break-word; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-break: break-all; word-wrap: break-word; font-style: normal; font-weight: 700; ">MySQL</strong></u></a>，你应该了解下一个版本将会有<a href="http://www.phpchina.com/?action-viewnews-itemid-40298" target="_self" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-break: break-all; word-wrap: break-word; color: #617b85; text-decoration: none; "><u style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-break: break-all; word-wrap: break-word; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-break: break-all; word-wrap: break-word; font-style: normal; font-weight: 700; ">什</strong></u></a>么新特性，例如更好的伸缩性、高性能以及灵活性的提升之类的。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 6px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; word-break: break-all; word-wrap: break-word; text-indent: 2em; font-size: 14px; line-height: 25px; text-align: left; ">MySQL的下一个版本是5.6，这里列出了该版本的5大新特性：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 6px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; word-break: break-all; word-wrap: break-word; text-indent: 2em; font-size: 14px; line-height: 25px; text-align: left; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-break: break-all; word-wrap: break-word; font-style: normal; font-weight: 700; ">优化器的改进</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 6px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; word-break: break-all; word-wrap: break-word; text-indent: 2em; font-size: 14px; line-height: 25px; text-align: left; ">MySQL Optimizer团队做了大量的工作为了不断的提升SQL查询的效率，主要体现在索引条件pushdown以及多范围的读数据。索引条件的pushdown的意思是将WHERE条件语句移到存储引擎中去处理，可降低过载；而多范围读意味着当查询使用第二索引时，将进行磁盘块的排序。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 6px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; word-break: break-all; word-wrap: break-word; text-indent: 2em; font-size: 14px; line-height: 25px; text-align: left; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-break: break-all; word-wrap: break-word; font-style: normal; font-weight: 700; ">InnoDB改进</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 6px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; word-break: break-all; word-wrap: break-word; text-indent: 2em; font-size: 14px; line-height: 25px; text-align: left; ">MySQL InnoDB存储引擎团队主要提供了NoSQL的访问接口，可通过<a href="http://www.oschina.net/p/memcached" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-break: break-all; word-wrap: break-word; color: #015fb6; text-decoration: none; ">Memcached</a>的API直接访问InnoDB的表。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 6px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; word-break: break-all; word-wrap: break-word; text-indent: 2em; font-size: 14px; line-height: 25px; text-align: left; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-break: break-all; word-wrap: break-word; font-style: normal; font-weight: 700; ">使用memcached API直接访问NoSQL</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 6px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; word-break: break-all; word-wrap: break-word; text-indent: 2em; font-size: 14px; line-height: 25px; text-align: left; ">此举可大幅提升Web应用中的数据访问性能，适合一些简单的查询。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 6px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; word-break: break-all; word-wrap: break-word; text-indent: 2em; font-size: 14px; line-height: 25px; text-align: left; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-break: break-all; word-wrap: break-word; font-style: normal; font-weight: 700; ">更好的复制</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 6px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; word-break: break-all; word-wrap: break-word; text-indent: 2em; font-size: 14px; line-height: 25px; text-align: left; ">MySQL复制模块团队主要改进了数据完整性和可用性以及性能方面的提升。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 6px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; word-break: break-all; word-wrap: break-word; text-indent: 2em; font-size: 14px; line-height: 25px; text-align: left; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-break: break-all; word-wrap: break-word; font-style: normal; font-weight: 700; ">Performance Schema</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 6px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; word-break: break-all; word-wrap: break-word; text-indent: 2em; font-size: 14px; line-height: 25px; text-align: left; ">Performance Schema是在5.5版本中引入的，5.6做了改进，提供新功能包括：表锁、表I/O以及表锁等待。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 6px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; word-break: break-all; word-wrap: break-word; text-indent: 2em; font-size: 14px; line-height: 25px; text-align: left; ">英文出自：<a href="http://creativedev.in/2011/12/new-features-in-mysql-5-6/" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-break: break-all; word-wrap: break-word; color: #015fb6; text-decoration: none; ">creativedev</a></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 6px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; word-break: break-all; word-wrap: break-word; text-indent: 2em; font-size: 14px; line-height: 25px; text-align: left; ">译文出自：<a href="http://www.oschina.net/news/24013/new-features-in-mysql-5-6" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-break: break-all; word-wrap: break-word; color: #015fb6; text-decoration: none; ">oschina</a></p></span></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/366520.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2011-12-16 14:20 <a href="http://www.blogjava.net/xiaomage234/archive/2011/12/16/366520.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>select into outfile access deny问题</title><link>http://www.blogjava.net/xiaomage234/archive/2011/11/04/362677.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Fri, 04 Nov 2011 04:36:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2011/11/04/362677.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/362677.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2011/11/04/362677.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/362677.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/362677.html</trackback:ping><description><![CDATA[<div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; ">为应用建立了rnd的帐号，专门为他们查询线上数据库用的，当然，只有他们上了生产网络以后才能连上数据库，安全方面我们还是很注意的，呵呵。&nbsp;<br />授权的语句如下：&nbsp;<br />grant select on armory.* to rnd;&nbsp;<br />flush privileges;&nbsp;<br /><br />select查询数据没有问题，但是有的用户有了更多的需求，他想把数据导出来，简单的处理的话，可以用select into outfile导出来。自己指定字段的分隔，行分隔等等。&nbsp;<br />但是用户一查询就报：access deny的错误，权限不对。&nbsp;<br />rnd@localhost : armory 09:26:31&gt; select * into outfile &#8216;/tmp/1.txt&#8217; from os limit 5;&nbsp;<br />ERROR 1045 (28000): Access denied for user &#8216;rnd&#8217;@'%&#8217; (using password: NO)&nbsp;<br />郁闷的是MySQL没有说缺少了那个权限。&nbsp;<br /><br />在本机测试了一下，&nbsp;<br />grant all on armory.* to rnd;&nbsp;<br />flush privileges;&nbsp;<br />给rnd所有的权限以后，还是报权限错误。这个就奇怪了，所有的权限都给它了，还报错？不可理喻阿。&nbsp;<br />实在搞不定，最后让用户：&nbsp;<br />mysql -urnd -p -e &#8216;select * from os limit 5;&#8217; &gt;1.txt&nbsp;<br />的变通方法。&nbsp;<br /><br />一直被这个纠结着，突然后来有一天，查询了一下MySQL的文档，找到是file的权限没有加上去，但是当时MySQL对应的库的所有权限我都加上去了阿。灵光一闪，file是全局的权限，在MySQL中对单个库是没有这个权限概念的，所以就算我把库上的所有权限给了rnd，file的权限其实还是没有附权给它的。不信的话，我们这就试试：&nbsp;<br />root@localhost : (none) 09:55:14&gt; grant file on armory.* to rnd;&nbsp;<br />ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES&nbsp;<br />果然，File权限是GLOBAL权限，不能附权给数据库。&nbsp;<br />GLOBAL FILE附权以后&nbsp;<br />root@localhost : mysql 09:58:21&gt; grant file on *.* to rnd;&nbsp;<br />Query OK, 0 rows affected (0.00 sec)&nbsp;<br />select查询就可以执行了：&nbsp;<br />rnd@localhost : armory 10:00:42&gt; select * into outfile &#8216;/tmp/1.txt&#8217; from os limit 5;&nbsp;<br />Query OK, 5 rows affected (0.00 sec)&nbsp;<br /><br />其实MySQL的权限可能比较拗，让我们一下子适应不过来。MySQL的权限可以精细到列，权限判断是根据GLOBAL，DB，TABLE，COLUMN来授权的，可以简单的理解为他们对应到mysql库中的四个表：user,db,tables_priv,columns_priv这几个表。当然，MySQL没有这么简单拉。有兴趣的话可以好好看一下MySQL的reference或者其他介绍。举个例子：&nbsp;<br />rnd@localhost : armory 10:00:43&gt; show grants for rnd;&nbsp;<br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&nbsp;<br />| Grants for rnd@%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;<br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&nbsp;<br />| GRANT FILE ON *.* TO &#8216;rnd&#8217;@'%&#8217;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;<br />| GRANT ALL PRIVILEGES ON `armory`.* TO &#8216;rnd&#8217;@'%&#8217; |&nbsp;<br />+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&nbsp;<br />2 rows in set (0.00 sec)&nbsp;<br />grant对同一个用户就分了两行，分别对应着user和db里面的两行：&nbsp;<br />root@localhost : mysql 10:18:34&gt; select * from mysql.user where user=&#8217;rnd&#8217;\G&nbsp;<br />*************************** 1. row ***************************&nbsp;<br />Host: %&nbsp;<br />User: rnd&nbsp;<br />Password:&nbsp;<br />Select_priv: N&nbsp;<br />Insert_priv: N&nbsp;<br />Update_priv: N&nbsp;<br />Delete_priv: N&nbsp;<br />Create_priv: N&nbsp;<br />Drop_priv: N&nbsp;<br />Reload_priv: N&nbsp;<br />Shutdown_priv: N&nbsp;<br />Process_priv: N&nbsp;<br />File_priv: Y&nbsp;<br />Grant_priv: N&nbsp;<br />References_priv: N&nbsp;<br />Index_priv: N&nbsp;<br />Alter_priv: N&nbsp;<br />Show_db_priv: N&nbsp;<br />Super_priv: N&nbsp;<br />Create_tmp_table_priv: N&nbsp;<br />Lock_tables_priv: N&nbsp;<br />Execute_priv: N&nbsp;<br />Repl_slave_priv: N&nbsp;<br />Repl_client_priv: N&nbsp;<br />Create_view_priv: N&nbsp;<br />Show_view_priv: N&nbsp;<br />Create_routine_priv: N&nbsp;<br />Alter_routine_priv: N&nbsp;<br />Create_user_priv: N&nbsp;<br />Event_priv: N&nbsp;<br />Trigger_priv: N&nbsp;<br />ssl_type:&nbsp;<br />ssl_cipher:&nbsp;<br />x509_issuer:&nbsp;<br />x509_subject:&nbsp;<br />max_questions: 0&nbsp;<br />max_updates: 0&nbsp;<br />max_connections: 0&nbsp;<br />max_user_connections: 0&nbsp;<br />1 row in set (0.00 sec)&nbsp;<br /><br />root@localhost : mysql 10:18:41&gt; select * from mysql.db where user=&#8217;rnd&#8217;\G&nbsp;<br />*************************** 1. row ***************************&nbsp;<br />Host: %&nbsp;<br />Db: armory&nbsp;<br />User: rnd&nbsp;<br />Select_priv: Y&nbsp;<br />Insert_priv: Y&nbsp;<br />Update_priv: Y&nbsp;<br />Delete_priv: Y&nbsp;<br />Create_priv: Y&nbsp;<br />Drop_priv: Y&nbsp;<br />Grant_priv: N&nbsp;<br />References_priv: Y&nbsp;<br />Index_priv: Y&nbsp;<br />Alter_priv: Y&nbsp;<br />Create_tmp_table_priv: Y&nbsp;<br />Lock_tables_priv: Y&nbsp;<br />Create_view_priv: Y&nbsp;<br />Show_view_priv: Y&nbsp;<br />Create_routine_priv: Y&nbsp;<br />Alter_routine_priv: Y&nbsp;<br />Execute_priv: Y&nbsp;<br />Event_priv: Y&nbsp;<br />Trigger_priv: Y&nbsp;<br />1 row in set (0.00 sec)&nbsp;<br />MySQL的权限检查也是通过检查这两个表来进行判断的。&nbsp;<br /><br />附上tables_priv和columns_priv的两个表的字段，和user和db还是有点不同的，用到了set类型。&nbsp;<br />root@localhost : mysql 10:18:58&gt; desc tables_priv;&nbsp;<br />+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&nbsp;<br />| Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Null | Key | Default&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;<br />+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&nbsp;<br />| Host&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | char(60)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | PRI |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;<br />| Db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | char(64)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | PRI |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;<br />| User&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | char(16)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | PRI |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;<br />| Table_name&nbsp; | char(64)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | PRI |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;<br />| Grantor&nbsp;&nbsp;&nbsp;&nbsp; | char(77)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | MUL |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;<br />| Timestamp&nbsp;&nbsp; | timestamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |&nbsp;<br />| Table_priv&nbsp; | set(&#8216;Select&#8217;,'Insert&#8217;,'Update&#8217;,'Delete&#8217;,'Create&#8217;,'Drop&#8217;,'Grant&#8217;,'References&#8217;,'Index&#8217;,'Alter&#8217;,'Create View&#8217;,'Show view&#8217;,'Trigger&#8217;) | NO&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;<br />| Column_priv | set(&#8216;Select&#8217;,'Insert&#8217;,'Update&#8217;,'References&#8217;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;<br />+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&nbsp;<br />8 rows in set (0.00 sec)&nbsp;<br /><br />root@localhost : mysql 10:21:24&gt; desc columns_priv;&nbsp;<br />+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&nbsp;<br />| Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Null | Key | Default&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Extra&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;<br />+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&nbsp;<br />| Host&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | char(60)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | PRI |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;<br />| Db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | char(64)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | PRI |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;<br />| User&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | char(16)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | PRI |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;<br />| Table_name&nbsp; | char(64)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | PRI |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;<br />| Column_name | char(64)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; | PRI |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;<br />| Timestamp&nbsp;&nbsp; | timestamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | NO&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |&nbsp;<br />| Column_priv | set(&#8216;Select&#8217;,'Insert&#8217;,'Update&#8217;,'References&#8217;) | NO&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;<br />+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&nbsp;<br />7 rows in set (0.00 sec)&nbsp;<br /><br />may your success.&nbsp;<br /><br /><br />-------------------------------------&nbsp;<br />我理清是什么问题了。&nbsp;<br />在red hat系列的linux中selinux对哪些daemon可以进行怎么样的操作是有限制的，mysql的select into outfile的命令是mysql的daemon来负责写文件操作的。写文件之前当然要具有写文件的权限。而selinux对这个权限做了限制。如果selinux是关闭的吧，这个命令执行是没有问题的&nbsp;<br />mysql&gt; select user from user into outfile '/home/test.txt';&nbsp;<br />Query OK, 2 rows affected (0.02 sec)&nbsp;<br />当时selinux开启时&nbsp;<br />selinux对mysql的守护进程mysqld进行了限制。&nbsp;<br />mysql&gt; select user from user into outfile '/home/test.txt';&nbsp;<br />ERROR 1 (HY000): Can't create/write to file '/home/test.txt' (Errcode: 13)&nbsp;&nbsp;<br />出现了没有权限写的error。&nbsp;<br />解决方法，可以关闭selinux。&nbsp;<br />可以在/etc/selinux中找到config&nbsp;<br />root用户，&nbsp;<br />shell&gt;vi /etc/selinux/config&nbsp;<br /><br /># This file controls the state of SELinux on the system.&nbsp;<br /># SELINUX= can take one of these three values:&nbsp;<br /># enforcing - SELinux security policy is enforced.&nbsp;<br /># permissive - SELinux prints warnings instead of enforcing.&nbsp;<br /># disabled - SELinux is fully disabled.&nbsp;<br />SELINUX=enforcing&nbsp;<br /><br />修改SELINUX=disabled关闭selinux就可以了，这个问题就可以解决了。&nbsp;<br />不过全部关闭SELINUX有带来一些安全问题。&nbsp;<br />当然也可以，单独给mysql的守护进程权限，&nbsp;<br />shell&gt;getsebool -a可以查看当前的对系统一系列守护进程的权限情况。&nbsp;<br /><br />lpd_disable_trans --&gt; off&nbsp;<br />mail_read_content --&gt; off&nbsp;<br />mailman_mail_disable_trans --&gt; off&nbsp;<br />mdadm_disable_trans --&gt; off&nbsp;<br />mozilla_read_content --&gt; off&nbsp;<br />mysqld_disable_trans --&gt; off&nbsp;<br />nagios_disable_trans --&gt; off&nbsp;<br />named_disable_trans --&gt; off&nbsp;<br />named_write_master_zones --&gt; off&nbsp;<br />nfs_export_all_ro --&gt; on&nbsp;<br />nfs_export_all_rw --&gt; on&nbsp;<br />nfsd_disable_trans --&gt; off&nbsp;<br />nmbd_disable_trans --&gt; off&nbsp;<br />nrpe_disable_trans --&gt; off&nbsp;<br /><br />shell&gt;setsebool -P mysqld_disable_trans=1&nbsp;<br />开启对mysql守护进程的权限，这样&nbsp;<br />mysql&gt; select user from user into outfile '/home/test.txt';&nbsp;<br />写入到自定义的目录就没有问题了。&nbsp;<br />-P表示 是永久性设置，否则重启之后又恢复预设值。&nbsp;<br />getsebool setsebool命令在root用户下有权限。&nbsp;<br /><br />除了对selinux的权限，当然首先要保证该目录拥有读写权限。&nbsp;<br /><br /><br />在ubuntu下 ，可以对AppArmor(/etc/apparmor.d/usr.sbin.mysqld) 修改，类似selinux。&nbsp;<br />添加/etc/squid/lists/eighties.txt w,类似。&nbsp;<br /><br />---------------------------------------------&nbsp;<br /><br /><br />root用户登录下：&nbsp;<br />grant file on *.* to webgametest@10.3.18.158;&nbsp;<br /><br />改为生成在tmp文件夹下。&nbsp;</span></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/362677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2011-11-04 12:36 <a href="http://www.blogjava.net/xiaomage234/archive/2011/11/04/362677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>