<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>半瓶</title>
	<atom:link href="http://www.banping.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.banping.com</link>
	<description>一瓶子不满  半瓶子晃荡</description>
	<lastBuildDate>Fri, 27 Jan 2012 05:43:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>过年</title>
		<link>http://www.banping.com/2012/01/22/2012-spring-festival/</link>
		<comments>http://www.banping.com/2012/01/22/2012-spring-festival/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 15:57:30 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[随笔]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1029</guid>
		<description><![CDATA[<p>正在过年。</p> <p>外面下着雨，冷雨。</p> <p>撑一纸雨伞，回到空旷的房子里。</p> <p>空旷而幽暗，听见金鱼的呼吸。</p> <p>感悟，想要说些什么，却不知从何说起。</p> <p>电梯里，ONLY SMS.</p> <p>不想看春晚了，没有坚持的心情和欲望。</p> <p>RT上，微博上，流淌着节日的时光。</p> <p>翻了翻前几天的日子，模糊而碎片。</p> <p>时间溜走了。</p> <p>就在那弹指一挥。</p> <p>翻看david的博客，想象他怎样的被青春打湿双眼。</p> <p>想象那无法回到的过去，之中的人和事。</p> <p>其实，一个人经历的，正是大多数人经历的，</p> <p>所以，世界上 ，才会有共鸣。</p> <p>所以，诗人才会钟爱某一种水果。（亦或植物？）</p> <p>所以，81才会面对年复一年的问题。</p> <p>所以，张导和八达才能把简单的情节演绎的刻骨，</p> <p>因为，那就是他，或他们自己。</p> <p>桌上的mac，竟然没有去折腾它的欲望，</p> <p>还一直没打开。</p> <p>鞭炮，让我想起黄洋界上的诗句。</p> <p>有时候，生活应是如此的简单，平和，感恩，幸福。</p> <p>有时候，情绪却是魔鬼。</p> <p>这正是鲜活动人生啊，</p> <p>无需去刻意的改变，和逃避。</p> <p>在纯粹的时间里看书，</p> <p>竟然获得意外的充实，</p> <p>我，其实很容易满足。</p> <p>------------------我是华丽的分割线----------------------</p> <p>一直没有心情和时间来想和看。</p> <p>我常说，不仅要埋头做事，更要抬头看路。</p> <p>方向很重要，</p> <p>得过且过的生活态度，</p> <p>会麻木一个人的心灵，</p> <p>所以，每个人要有目标，要去学习。</p> <p>为了现在，为了将来。</p> <p>为了自己，为了团队。</p> <p>那天，和古怪精灵的幸子吃全家福，</p> <p>在街上找奖状而不是荣誉证书，</p> <p>在花店里讨价还价，</p> <p>在忙碌。</p> <p>其实一直心怀感恩，</p> <p>在这样的一个团队里很开心，</p> <p>那一起走过的岁月，</p> <p>和小黑屋里的每一个人。</p> <p>无怨无悔，但是要努力。</p> <p>机会，压力，责任。</p> <p>------------------我是华丽的分割线----------------------</p> <p>想去鼓浪屿走走，</p> <p>一直有很多值得发现的痕迹，</p> <p>而以后，或许上岛的机会就不多了，</p> <p>不想遗憾，</p> [...]]]></description>
			<content:encoded><![CDATA[<p>正在过年。</p>
<p>外面下着雨，冷雨。</p>
<p>撑一纸雨伞，回到空旷的房子里。</p>
<p>空旷而幽暗，听见金鱼的呼吸。</p>
<p>感悟，想要说些什么，却不知从何说起。</p>
<p>电梯里，ONLY SMS.</p>
<p>不想看春晚了，没有坚持的心情和欲望。</p>
<p>RT上，微博上，流淌着节日的时光。</p>
<p>翻了翻前几天的日子，模糊而碎片。</p>
<p>时间溜走了。</p>
<p>就在那弹指一挥。</p>
<p>翻看david的博客，想象他怎样的被青春打湿双眼。</p>
<p>想象那无法回到的过去，之中的人和事。</p>
<p>其实，一个人经历的，正是大多数人经历的，</p>
<p>所以，世界上 ，才会有共鸣。</p>
<p>所以，诗人才会钟爱某一种水果。（亦或植物？）</p>
<p>所以，81才会面对年复一年的问题。</p>
<p>所以，张导和八达才能把简单的情节演绎的刻骨，</p>
<p>因为，那就是他，或他们自己。</p>
<p>桌上的mac，竟然没有去折腾它的欲望，</p>
<p>还一直没打开。</p>
<p>鞭炮，让我想起黄洋界上的诗句。</p>
<p>有时候，生活应是如此的简单，平和，感恩，幸福。</p>
<p>有时候，情绪却是魔鬼。</p>
<p>这正是鲜活动人生啊，</p>
<p>无需去刻意的改变，和逃避。</p>
<p>在纯粹的时间里看书，</p>
<p>竟然获得意外的充实，</p>
<p>我，其实很容易满足。</p>
<p>------------------我是华丽的分割线----------------------</p>
<p>一直没有心情和时间来想和看。</p>
<p>我常说，不仅要埋头做事，更要抬头看路。</p>
<p>方向很重要，</p>
<p>得过且过的生活态度，</p>
<p>会麻木一个人的心灵，</p>
<p>所以，每个人要有目标，要去学习。</p>
<p>为了现在，为了将来。</p>
<p>为了自己，为了团队。</p>
<p>那天，和古怪精灵的幸子吃全家福，</p>
<p>在街上找奖状而不是荣誉证书，</p>
<p>在花店里讨价还价，</p>
<p>在忙碌。</p>
<p>其实一直心怀感恩，</p>
<p>在这样的一个团队里很开心，</p>
<p>那一起走过的岁月，</p>
<p>和小黑屋里的每一个人。</p>
<p>无怨无悔，但是要努力。</p>
<p>机会，压力，责任。</p>
<p>------------------我是华丽的分割线----------------------</p>
<p>想去鼓浪屿走走，</p>
<p>一直有很多值得发现的痕迹，</p>
<p>而以后，或许上岛的机会就不多了，</p>
<p>不想遗憾，</p>
<p>亦或，</p>
<p>想度过这闲暇时间。</p>
<p>想过不一样的生活，</p>
<p>自由和梦想。</p>
<p>现在，</p>
<p>在过年，</p>
<p>这一刻，烟花绚烂。</p>
<p><a href="http://www.banping.com/wp-content/uploads/2012/01/beautiful.png"><img class="aligncenter size-full wp-image-1033" title="烟花绚烂" src="http://www.banping.com/wp-content/uploads/2012/01/beautiful.png" alt="" width="542" height="475" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2012/01/22/2012-spring-festival/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>从2011到2012</title>
		<link>http://www.banping.com/2012/01/01/from-2011-to-2012/</link>
		<comments>http://www.banping.com/2012/01/01/from-2011-to-2012/#comments</comments>
		<pubDate>Sun, 01 Jan 2012 03:42:27 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[随笔]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1027</guid>
		<description><![CDATA[<p>今天是2012年的第一天，元旦佳节，过去的2011虽然已经成为历史，但是依然是值得铭记的时光。</p> <p>昨天是2011年的最后一天，遭遇了诸多的不顺利。</p> <p>在下班的路上，车很拥堵，虽然我出来的已经很晚了，可是还是被这个车堵在了路上：</p> <p></p> <p>后来终于到了天虹，在地下二层停车场找了很久也没有找到停车位，爆满了，中间还接了Jimmy一个电话。最后终于在一个角落把车停了下来，耗时N久。</p> <p>在天虹买了些东西，结果小票不小心丢掉了，本来凭小票是可以免费停车的，没办法只能乖乖的交停车费出来。</p> <p>在出口的路上一样拥堵，各种车各种抢道，凭借极大的耐心好不容易才杀出重围。</p> <p>回家煮面吃，想开一瓶酒，结果不小心酒瓶打落在地，摔得粉碎，满屋酒气。</p> <p>希望，这些小小的不顺利就停留在2011，不再追随。</p> <p>徐志摩说：</p> <p>轻轻的，我走了，正如我轻轻的来，</p> <p>我轻轻的挥手，作别西天的云彩。</p> <p>没有人能阻挡时光匆匆的脚步，我们能做的，唯有珍惜和感恩。</p> <p>因为那曾经虚度的青春，永远永远不再回来。</p> <p>2012会更好，因为路，就在脚下，需要留下我们的足迹。</p>]]></description>
			<content:encoded><![CDATA[<p>今天是2012年的第一天，元旦佳节，过去的2011虽然已经成为历史，但是依然是值得铭记的时光。</p>
<p>昨天是2011年的最后一天，遭遇了诸多的不顺利。</p>
<p>在下班的路上，车很拥堵，虽然我出来的已经很晚了，可是还是被这个车堵在了路上：</p>
<p><img class="alignnone" title="2011的最后一天路上" src="http://ww1.sinaimg.cn/large/620a994ajw1dom24oa6dcj.jpg" alt="" width="364" height="648" /></p>
<p>后来终于到了天虹，在地下二层停车场找了很久也没有找到停车位，爆满了，中间还接了Jimmy一个电话。最后终于在一个角落把车停了下来，耗时N久。</p>
<p>在天虹买了些东西，结果小票不小心丢掉了，本来凭小票是可以免费停车的，没办法只能乖乖的交停车费出来。</p>
<p>在出口的路上一样拥堵，各种车各种抢道，凭借极大的耐心好不容易才杀出重围。</p>
<p>回家煮面吃，想开一瓶酒，结果不小心酒瓶打落在地，摔得粉碎，满屋酒气。</p>
<p>希望，这些小小的不顺利就停留在2011，不再追随。</p>
<p>徐志摩说：</p>
<p>轻轻的，我走了，正如我轻轻的来，</p>
<p>我轻轻的挥手，作别西天的云彩。</p>
<p>没有人能阻挡时光匆匆的脚步，我们能做的，唯有珍惜和感恩。</p>
<p>因为那曾经虚度的青春，永远永远不再回来。</p>
<p>2012会更好，因为路，就在脚下，需要留下我们的足迹。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2012/01/01/from-2011-to-2012/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MySQL主从复制出错案例一则</title>
		<link>http://www.banping.com/2011/12/15/mysql-replication-error/</link>
		<comments>http://www.banping.com/2011/12/15/mysql-replication-error/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 12:11:13 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1021</guid>
		<description><![CDATA[<p>有时候为了方面的导入数据，可以使用MyISAM存储引擎的表，直接把数据文件Copy一份放到对应的目录下，这样MySQL就能直接识别到，但是在主从复制的环境里这样做是有问题的，因为在从库上并没有这个表，从而导致后续的一些操作失败，比如在主库上执行导入数据的SQL语句，则在从库会报错如下：</p> <p>mysql&#62; show slave status\G<br /> Slave_IO_Running: Yes<br /> Slave_SQL_Running: No<br /> Last_Errno: 1146<br /> Last_Error: Error 'Table 'banpingdb.blog_score' doesn't exist' on query. Default database: 'banpingdb'. Query: 'replace INTO blog_score_result(id,score,avg)<br /> SELECT b.id, min(s.comment), min(s.price) FROM blog_score s,a_blog b where s.name=b.biz_name<br /> group by b.id'</p> <p>同样的信息通过日志也一样会看到：</p> <p>111215 19:17:54 [ERROR] Slave SQL: Error 'Table 'banpingdb.blog_score' doesn't [...]]]></description>
			<content:encoded><![CDATA[<p>有时候为了方面的导入数据，可以使用MyISAM存储引擎的表，直接把数据文件Copy一份放到对应的目录下，这样MySQL就能直接识别到，但是在主从复制的环境里这样做是有问题的，因为在从库上并没有这个表，从而导致后续的一些操作失败，比如在主库上执行导入数据的SQL语句，则在从库会报错如下：</p>
<blockquote><p>mysql&gt; show slave status\G<br />
Slave_IO_Running: Yes<br />
Slave_SQL_Running: No<br />
Last_Errno: 1146<br />
Last_Error: Error 'Table 'banpingdb.blog_score' doesn't exist' on query. Default database: 'banpingdb'. Query: 'replace INTO blog_score_result(id,score,avg)<br />
SELECT b.id, min(s.comment), min(s.price) FROM blog_score s,a_blog b where s.name=b.biz_name<br />
group by b.id'</p></blockquote>
<p>同样的信息通过日志也一样会看到：</p>
<blockquote><p>111215 19:17:54 [ERROR] Slave SQL: Error 'Table 'banpingdb.blog_score' doesn't exist' on query. Default database: 'banpingdb'. Query: 'replace INTO blog_score_result(id,score,avg)<br />
SELECT b.id, min(s.comment), min(s.price) FROM blog_score s,a_blog b where s.name=b.biz_name<br />
group by b.id', Error_code: 1146<br />
111215 19:17:54 [Warning] Slave: Table 'banpingdb.blog_score' doesn't exist Error_code: 1146<br />
111215 19:17:54 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log '1-bin.000001' position 130482476</p></blockquote>
<p>这种错误处理也很简单，可以直接跳过，当然要评估可能产生的影响：</p>
<blockquote><p>mysql&gt; slave stop;<br />
Query OK, 0 rows affected (0.22 sec)</p>
<p>mysql&gt; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;<br />
Query OK, 0 rows affected (0.00 sec)</p>
<p>mysql&gt; slave start;<br />
Query OK, 0 rows affected (0.00 sec)</p></blockquote>
<p>然后blog_score_result这个表的数据肯定不准确了，可以重新从主库导入数据，视应用的繁忙程度，要保证数据的一致性，先在主库上lock这个表，不让其他用户更新：</p>
<blockquote><p>mysql&gt; lock tables blog_score_result read;<br />
Query OK, 0 rows affected (0.00 sec)</p></blockquote>
<p>然后导出数据：</p>
<blockquote><p>[root@banping 3306]# bin/mysqldump --default-character-set=utf8 banpingdb blog_score_result -u root -p&gt;/tmp/blog_score_result.sql;</p></blockquote>
<p>去从库导入数据：</p>
<blockquote><p>[root@banping 3306]# bin/mysql --default-character-set=utf8 banpingdb -u root -p&lt;/tmp/blog_score_result.sql;<br />
Query OK, 0 rows affected (0.00 sec)</p></blockquote>
<p>到主库解锁这个表：</p>
<blockquote>
<pre>mysql&gt; unlock tables;
Query OK, 0 rows affected (0.00 sec)</pre>
</blockquote>
<p>这样就完成了数据一致性的操作。主从复制的同步也正常了。这种事情的处理要结合实际应用情况，不可照搬就是了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2011/12/15/mysql-replication-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>配置Postfix邮件系统的访问权限</title>
		<link>http://www.banping.com/2011/12/01/postfix-access-rule/</link>
		<comments>http://www.banping.com/2011/12/01/postfix-access-rule/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 03:43:44 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[网站架构]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1018</guid>
		<description><![CDATA[<p>Postfix邮件系统的配置主要通过main.cf文件，路径在/etc/postfix下。如果要允许其他服务器使用Postfix的服务，需要重点关注inet_interfaces和mynetworks这两个参数。</p> <p># The inet_interfaces parameter specifies the network interface<br /> # addresses that this mail system receives mail on. By default,<br /> # the software claims all active interfaces on the machine. The<br /> # parameter also controls delivery of mail to user@[ip.address].<br /> #<br /> # See also the proxy_interfaces parameter, for network addresses [...]]]></description>
			<content:encoded><![CDATA[<p>Postfix邮件系统的配置主要通过main.cf文件，路径在/etc/postfix下。如果要允许其他服务器使用Postfix的服务，需要重点关注inet_interfaces和mynetworks这两个参数。</p>
<blockquote><p># The inet_interfaces parameter specifies the network interface<br />
# addresses that this mail system receives mail on. By default,<br />
# the software claims all active interfaces on the machine. The<br />
# parameter also controls delivery of mail to user@[ip.address].<br />
#<br />
# See also the proxy_interfaces parameter, for network addresses that<br />
# are forwarded to us via a proxy or network address translator.<br />
#<br />
# Note: you need to stop/start Postfix when this parameter changes.<br />
#<br />
inet_interfaces = all</p></blockquote>
<p>要注意的是，修改这个参数必须要停止再启动Postfix，单纯的restart是不生效的。</p>
<blockquote><p># You can also specify the absolute pathname of a pattern file instead<br />
# of listing the patterns here. Specify type:table for table-based lookups<br />
# (the value on the table right-hand side is not used).<br />
#<br />
mynetworks = 11.12.13.14,127.0.0.0/8</p></blockquote>
<p>这个参数指定了要使用Postfix的IP地址，如果不设定正确，会在maillog里看到类似如下的提示信息：</p>
<blockquote><p>Dec 1 11:16:21 mail postfix/smtpd[21197]:warning: 11.12.13.14: address not listed for hostname banping.com<br />
Dec 1 11:16:21 mail postfix/smtpd[21197]: connect from unknown[11.12.13.14]<br />
Dec 1 11:16:21 mail postfix/smtpd[21197]: NOQUEUE: reject: RCPT from unknown[11.12.13.14]: 554 5.7.1: Relay access denied; from= to= proto=ESMTP helo=&lt;banping.com&gt;</p></blockquote>
<p>自己搭建邮件系统还是比较折腾的，使用Amazon ses是比较便捷的做法。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2011/12/01/postfix-access-rule/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Xtrabackup 1.6.3安装及恢复数据</title>
		<link>http://www.banping.com/2011/11/29/xtrabackup-1-6-3-install-recover-prepare/</link>
		<comments>http://www.banping.com/2011/11/29/xtrabackup-1-6-3-install-recover-prepare/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 10:21:52 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1013</guid>
		<description><![CDATA[<p>Xtrabackup是备份MySQL的很好的工具，目前最新的版本是1.6.3，和之前出过的1.6版本改进了不少，官方Percona目前对1.6.3的文档也改进了很多。安装包不再包含MySQL源码文件了，要根据需要从Percona在Amazon aws的服务器上下载，当然也可以自己下载需要的文件。</p> <p>安装Xtrabackup，可以通过源码安装，也可以拿二进制程序过来直接使用，以下是源码安装的过程：</p> <p>[root@data banping]# wget http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-1.6.3/source/xtrabackup-1.6.3.tar.gz<br /> [root@data banping]# tar zxf xtrabackup-1.6.3.tar.gz<br /> [root@data banping]# cd xtrabackup-1.6.3<br /> [root@data xtrabackup-1.6.3]# AUTO_DOWNLOAD="yes" ./utils/build.sh 5.5</p> <p>自动下载的是libtar-1.2.11.tar.gz和mysql源码文件，mysql的版本根据给定的参数识别，可选的有以下版本：</p> Value Alias Server innodb51_builtin 5.1 build against built-in InnoDB in MySQL 5.1 innodb51 plugin build agsinst InnoDB plugin in MySQL 5.1 innodb55 5.5 build against InnoDB in MySQL 5.5 xtradb51 [...]]]></description>
			<content:encoded><![CDATA[<p>Xtrabackup是备份MySQL的很好的工具，目前最新的版本是1.6.3，和之前出过的1.6版本改进了不少，官方Percona目前对1.6.3的文档也改进了很多。安装包不再包含MySQL源码文件了，要根据需要从Percona在Amazon aws的服务器上下载，当然也可以自己下载需要的文件。</p>
<p>安装Xtrabackup，可以通过源码安装，也可以拿二进制程序过来直接使用，以下是源码安装的过程：</p>
<blockquote><p>[root@data banping]# wget http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-1.6.3/source/xtrabackup-1.6.3.tar.gz<br />
[root@data banping]# tar zxf xtrabackup-1.6.3.tar.gz<br />
[root@data banping]# cd xtrabackup-1.6.3<br />
[root@data xtrabackup-1.6.3]# AUTO_DOWNLOAD="yes" ./utils/build.sh 5.5</p></blockquote>
<p>自动下载的是libtar-1.2.11.tar.gz和mysql源码文件，mysql的版本根据给定的参数识别，可选的有以下版本：</p>
<table border="1">
<thead valign="bottom">
<tr>
<th>Value</th>
<th>Alias</th>
<th>Server</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td>innodb51_builtin</td>
<td>5.1</td>
<td>build against built-in InnoDB in MySQL 5.1</td>
</tr>
<tr>
<td>innodb51</td>
<td>plugin</td>
<td>build agsinst InnoDB plugin in MySQL 5.1</td>
</tr>
<tr>
<td>innodb55</td>
<td>5.5</td>
<td>build against InnoDB in MySQL 5.5</td>
</tr>
<tr>
<td>xtradb51</td>
<td>xtradb</td>
<td>build against Percona Server with XtraDB 5.1</td>
</tr>
<tr>
<td>xtradb55</td>
<td>xtradb55</td>
<td>build against Percona Server with XtraDB 5.5</td>
</tr>
</tbody>
</table>
<p>默认libtar并不会安装，如果需要使用stream功能，需要手动安装这个程序。安装完成后，会生成一个xtrabackup_innodb55文件，可以用它恢复innodb数据，文件的路径如下：</p>
<table border="1">
<thead valign="bottom">
<tr>
<th>Target</th>
<th>Location</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td>innodb51_builtin</td>
<td>mysql-5.1/storage/innobase/xtrabackup</td>
</tr>
<tr>
<td>innodb51</td>
<td>mysql-5.1/storage/innodb_plugin/xtrabackup</td>
</tr>
<tr>
<td>innodb55</td>
<td>mysql-5.5/storage/innobase/xtrabackup</td>
</tr>
<tr>
<td>xtradb51</td>
<td>Percona-Server-5.1/storage/innodb_plugin/xtrabackup</td>
</tr>
<tr>
<td>xtradb55</td>
<td>Percona-Server-5.5/storage/innobase/xtrabackup</td>
</tr>
</tbody>
</table>
<p>恢复的方法如下：</p>
<blockquote><p>[root@data recover]# /banping/xtrabackup_innodb55 --prepare --target-dir=/banping/recover/</p></blockquote>
<p>prepare就是recover的过程，也就是通过前滚和回滚使数据一致，target-dir就是备份出来的文件路径。这一步的操作和MySQL Server是没有任何关系的。官方还建议执行两次prepare以便生成新的redo文件，个人认为是没什么必要的。</p>
<p>关于1.6版本的安装及备份和Xtrabackup的原理，请参见我以前的文章：</p>
<p><a href="http://www.banping.com/2011/04/14/xtrabackup-mysql55/">http://www.banping.com/2011/04/14/xtrabackup-mysql55/</a></p>
<p><a href="http://www.banping.com/2011/05/24/xtrabackup-stream-mysql/">http://www.banping.com/2011/05/24/xtrabackup-stream-mysql/</a></p>
<p><a href="http://www.banping.com/2011/07/01/xtrabackup-process-backgroud/">http://www.banping.com/2011/07/01/xtrabackup-process-backgroud/</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2011/11/29/xtrabackup-1-6-3-install-recover-prepare/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TechClub活动的一次分享</title>
		<link>http://www.banping.com/2011/11/28/techclub-mysql-lock/</link>
		<comments>http://www.banping.com/2011/11/28/techclub-mysql-lock/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 09:52:00 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[随笔]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1011</guid>
		<description><![CDATA[<p>10月份的<a href="http://www.tech-club.org">TechClub</a>活动上，我分享了一个话题，时间过去很久了，现在抽空放出来和大家分享。</p> <p>TechClub的活动正在吸引着越来越多的朋友参与，这是一个公益活动，希望能有更多的朋友能到这个平台上分享自己的经验。</p> <p><a title="深入解析MySQL之锁机制应用" href="http://www.slideshare.net/banping/my-sql-10360979">深入解析MySQL之锁机制应用</a></p> View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/banping">banping</a>. <p>再奉上一张活动现场照片：</p> <p></p>]]></description>
			<content:encoded><![CDATA[<p>10月份的<a href="http://www.tech-club.org">TechClub</a>活动上，我分享了一个话题，时间过去很久了，现在抽空放出来和大家分享。</p>
<p>TechClub的活动正在吸引着越来越多的朋友参与，这是一个公益活动，希望能有更多的朋友能到这个平台上分享自己的经验。</p>
<div id="__ss_10360979" style="width: 425px;">
<p><strong style="display: block; margin: 12px 0 4px;"><a title="深入解析MySQL之锁机制应用" href="http://www.slideshare.net/banping/my-sql-10360979">深入解析MySQL之锁机制应用</a></strong><object id="__sse10360979" width="425" height="355" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mysql-111128034344-phpapp02&amp;stripped_title=my-sql-10360979&amp;userName=banping" /><param name="allowscriptaccess" value="always" /><param name="allowfullscreen" value="true" /><embed id="__sse10360979" width="425" height="355" type="application/x-shockwave-flash" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mysql-111128034344-phpapp02&amp;stripped_title=my-sql-10360979&amp;userName=banping" allowFullScreen="true" allowScriptAccess="always" wmode="transparent" allowscriptaccess="always" allowfullscreen="true" /></object></p>
<div style="padding: 5px 0 12px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/banping">banping</a>.</div>
</div>
<p>再奉上一张活动现场照片：</p>
<p><img class="alignnone" title="TechClub技术沙龙" src="http://ww2.sinaimg.cn/large/91422dd8gw1dmlal9pt4aj.jpg" alt="" width="640" height="440" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2011/11/28/techclub-mysql-lock/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>优化Linux服务器的一些参数</title>
		<link>http://www.banping.com/2011/11/21/optimize-linux-core-parameters/</link>
		<comments>http://www.banping.com/2011/11/21/optimize-linux-core-parameters/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 08:42:15 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[主机及存储]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1009</guid>
		<description><![CDATA[<p>生产环境跑的Linux服务器，默认的一些参数有时候需要调整，以下是个小总结，大部分内容来源自网络上别人的经验。</p> <p>首先，调整网络方面的参数：</p> [root@banping conf]# vi /etc/sysctl.conf # add by banping net.ipv4.tcp_max_syn_backlog = 65536 net.core.netdev_max_backlog = 32768 net.core.somaxconn = 32768 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 2 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_mem = 2097152 3145728 4194304 net.ipv4.tcp_max_orphans [...]]]></description>
			<content:encoded><![CDATA[<p>生产环境跑的Linux服务器，默认的一些参数有时候需要调整，以下是个小总结，大部分内容来源自网络上别人的经验。</p>
<p>首先，调整网络方面的参数：</p>
<blockquote>
<pre>[root@banping conf]# vi /etc/sysctl.conf</pre>
<pre># add by banping
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog =  32768
net.core.somaxconn = 32768

net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 2097152 3145728 4194304
net.ipv4.tcp_max_orphans = 3276800

net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 1024  65535</pre>
</blockquote>
<p>查看网络连接状态：</p>
<blockquote>
<pre>[root@banping ~]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
SYN_RECV 3
CLOSE_WAIT 40
ESTABLISHED 73
FIN_WAIT1 6
FIN_WAIT2 2
TIME_WAIT 900</pre>
</blockquote>
<p>在OS级别设置打开文件的最大数目：</p>
<blockquote>
<pre>[root@banping conf]# vi /etc/security/limits.conf
#add by banping
* soft nofile 65536
* hard nofile 65536</pre>
</blockquote>
<p>设置单个进程能打开的句柄数：</p>
<blockquote>
<pre>[root@rtweb conf]# vi /etc/profile</pre>
<pre># add by banping
ulimit -SHn 65536</pre>
</blockquote>
<p>查看每个进程打开的句柄数：</p>
<blockquote>
<pre>[root@banping ~]# lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more
    164 4522
    163 19230
    125 25142
    ......</pre>
</blockquote>
<p>前面是打开的句柄数，后面是进程ID，可以据此判断是什么进程。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2011/11/21/optimize-linux-core-parameters/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>RedHat的yum无法使用的解决办法</title>
		<link>http://www.banping.com/2011/11/11/change-redhat-yum-to-centos/</link>
		<comments>http://www.banping.com/2011/11/11/change-redhat-yum-to-centos/#comments</comments>
		<pubDate>Fri, 11 Nov 2011 02:37:04 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[主机及存储]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1004</guid>
		<description><![CDATA[<p>最近弄了一台阿里云服务器，安装的是RedHat5.4 64位的系统。有点奇怪的是阿里云只提供CentOS 32位的系统，RH才有64位的。但是在使用yum的过程中报错：</p> <p>[root@banping mysql-5.5.10]# yum install libaio-devel</p> <p>Loaded plugins: rhnplugin, security</p> <p>This system is not registered with RHN.</p> <p>RHN support will be disabled.</p> <p>Setting up Install Process</p> <p>No package libaio-devel available.</p> <p>Nothing to do</p> <p>意思是这套RH没有在官网上注册，不能下载RH的软件包。后来我把yum替换成了CentOS的版本，过程如下：</p> <p>首先看看有哪些yum包，然后卸载掉：</p> <p>[root@banping mysql-5.5.10]# rpm -qa&#124;grep yum</p> <p>yum-rhn-plugin-0.5.4-13.el5</p> <p>yum-3.2.22-20.el5</p> <p>yum-metadata-parser-1.1.2-3.el5</p> <p>yum-security-1.1.16-13.el5</p> <p>yum-updatesd-0.9-2.el5</p> <p>卸载要使用nodeps参数，否则由于依赖关系是无法卸载成功的：</p> <p>rpm -e --nodeps yum-rhn-plugin-0.5.4-13.el5</p> <p>......</p> <p>然后可以从163的镜像下载CentOS的yum包：</p> <p>[root@banping [...]]]></description>
			<content:encoded><![CDATA[<p>最近弄了一台阿里云服务器，安装的是RedHat5.4 64位的系统。有点奇怪的是阿里云只提供CentOS 32位的系统，RH才有64位的。但是在使用yum的过程中报错：</p>
<blockquote><p>[root@banping mysql-5.5.10]# yum install libaio-devel</p>
<p>Loaded plugins: rhnplugin, security</p>
<p>This system is not registered with RHN.</p>
<p>RHN support will be disabled.</p>
<p>Setting up Install Process</p>
<p>No package libaio-devel available.</p>
<p>Nothing to do</p></blockquote>
<p>意思是这套RH没有在官网上注册，不能下载RH的软件包。后来我把yum替换成了CentOS的版本，过程如下：</p>
<p>首先看看有哪些yum包，然后卸载掉：</p>
<blockquote><p>[root@banping mysql-5.5.10]# rpm -qa|grep yum</p>
<p>yum-rhn-plugin-0.5.4-13.el5</p>
<p>yum-3.2.22-20.el5</p>
<p>yum-metadata-parser-1.1.2-3.el5</p>
<p>yum-security-1.1.16-13.el5</p>
<p>yum-updatesd-0.9-2.el5</p></blockquote>
<p>卸载要使用nodeps参数，否则由于依赖关系是无法卸载成功的：</p>
<blockquote><p>rpm -e --nodeps yum-rhn-plugin-0.5.4-13.el5</p>
<p>......</p></blockquote>
<p>然后可以从163的镜像下载CentOS的yum包：</p>
<blockquote><p>[root@banping centos]# wget http://mirrors.163.com/centos/5/os/x86_64/CentOS/yum-3.2.22-37.el5.centos.noarch.rpm</p>
<p>[root@banping centos]# wget http://mirrors.163.com/centos/5/os/x86_64/CentOS/yum-fastestmirror-1.1.16-16.el5.centos.noarch.rpm</p>
<p>[root@banping centos]# wget http://mirrors.163.com/centos/5/os/x86_64/CentOS/yum-metadata-parser-1.1.2-3.el5.centos.x86_64.rpm</p></blockquote>
<p>安装新下载的包：</p>
<blockquote><p>[root@banping centos]# rpm -ivh yum-*</p></blockquote>
<p>找一个CentOS的包资源配置库,名为CentOS-Base.repo，放到/etc/yum.repos.d/路径：</p>
<blockquote><p>wget http://www.linuxidc.com/files/2011/05/06/CentOS-Base.repo</p></blockquote>
<p>生成缓存文件到/var/cache/yum路径：</p>
<blockquote><p>[root@banping yum.repos.d]# yum makecache</p></blockquote>
<p>这样就可以使用CentOS的yum了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2011/11/11/change-redhat-yum-to-centos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>如何在Linux服务器之间ssh不需要密码？</title>
		<link>http://www.banping.com/2011/10/12/linux-ssh-not-need-password-rsa/</link>
		<comments>http://www.banping.com/2011/10/12/linux-ssh-not-need-password-rsa/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 03:25:09 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[主机及存储]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1001</guid>
		<description><![CDATA[<p>要在一台Linux上ssh到另外一台Linux服务器，而不需要每次都输入密码，其实很简单。比如要从A服务器登录到B服务器，那么首先在A服务器上生成公钥和私钥，用RSA加密算法：</p> [root@test awstats]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 9c:74:d0:05:48:c8:43:84:a8:44:8f:b6:a1:2f:8c:91 root@test.banping.com [root@test awstats]# cd /root/.ssh/ [...]]]></description>
			<content:encoded><![CDATA[<p>要在一台Linux上ssh到另外一台Linux服务器，而不需要每次都输入密码，其实很简单。比如要从A服务器登录到B服务器，那么首先在A服务器上生成公钥和私钥，用RSA加密算法：</p>
<blockquote>
<pre>[root@test awstats]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
9c:74:d0:05:48:c8:43:84:a8:44:8f:b6:a1:2f:8c:91 root@test.banping.com</pre>
<pre>[root@test awstats]# cd /root/.ssh/
[root@test .ssh]# ll
-rw------- 1 root root 1675 10-12 10:15 id_rsa
-rw-r--r-- 1 root root  397 10-12 10:15 id_rsa.pub
-rw-r--r-- 1 root root 1972 08-15 19:50 known_hosts</pre>
</blockquote>
<p>可见这里的id_rsa和id_rsa.pub就是私钥和公钥了，把公钥的内容放到B服务器的指定位置就可以了。</p>
<p>放到哪里呢？对应登录用户的home的.ssh目录下，文件名一般为authorized_keys，其实这个名字是任意的，是写在sshd_config文件里的：</p>
<blockquote><p>[root@web-04 .ssh]# cd /etc/ssh</p>
<p>[root@web-04 ssh]# vi sshd_config</p>
<p>AuthorizedKeysFile      .ssh/authorized_keys</p></blockquote>
<p>这个authorized_keys文件可以放置多个其他服务器的公钥，如果你想让多台服务器都能无需输入密码就登录上来，把它们的公钥放这里就行了。不过安全第一，切不可为了省事而忽略了安全的问题。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2011/10/12/linux-ssh-not-need-password-rsa/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Redis性能评测</title>
		<link>http://www.banping.com/2011/09/26/redis-benchmark/</link>
		<comments>http://www.banping.com/2011/09/26/redis-benchmark/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 06:38:57 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[网站架构]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=992</guid>
		<description><![CDATA[引言 <p>本篇要评测的NoSQL产品是Redis，可以把它的功能理解为一个Key-Value的数据结构操作，数据都保存在内存中定期刷新到磁盘，以极高的读写效率而备受关注。国内的新浪微博就大规模的使用了Redis来存储用户关系和计数。</p> 介绍 <p>按照官方的说法，Redis是用ANSI C开发的，能运行在大多数POSIX（Linux, *BSD, OS X 和Solaris等）系统上，官方没有支持Windows的版本。目前最新的版本是2.2.11，这个版本主要是修复了一个2.2.7版本中遍历方式优化带来的一个bug。</p> <p>和普通的Key-Value结构不同，Redis的Key支持灵活的数据结构，除了strings，还有hashes、lists、 sets 和sorted sets等结构。正是这些灵活的数据结构，丰富了Redis的应用场景，能满足更多业务上的灵活存储需求。</p> <p>Redis的数据都保存在内存中，而且底层实现上是自己写了epoll event loop部分，而没有采用开源的libevent等通用框架，所以读写效率很高。为了实现数据的持久化，Redis支持定期刷新（可通过配置实现）或写日志的方式来保存数据到磁盘。</p> 安装和使用 <p>由于没有第三方的包依赖关系，Redis的安装十分简单：</p> <p>$ wget http://redis.googlecode.com/files/redis-2.2.11.tar.gz</p> <p>$ tar xzf redis-2.2.11.tar.gz</p> <p>$ cd redis-2.2.11</p> <p>$ make</p> <p>这样就安装完毕了，执行src目录下的redis-server可以启动Redis进程，不过最好先配置一下redis.conf文件，常用的几个要注意的参数如下：</p> <p>daemonize yes</p> <p>指定Redis以守护进程的方式运行。</p> <p>pidfile /home/banping/redis/redis.pid</p> <p>当Redis以守护进程方式运行时，把pid写入指定的文件。</p> <p>port 6379</p> <p>指定监听端口，默认端口为6379。</p> <p>bind 192.168.0.35</p> <p>绑定的主机IP地址。</p> <p>logfile stdout</p> <p>指定日志的记录方式，默认为标准输出。</p> <p>databases 16</p> <p>设置数据库的数量。</p> <p>save &#60;seconds&#62; &#60;changes&#62;</p> <p>Redis默认配置文件中提供了三个条件：</p> <p>save 900 [...]]]></description>
			<content:encoded><![CDATA[<h3>引言</h3>
<p>本篇要评测的NoSQL产品是Redis，可以把它的功能理解为一个Key-Value的数据结构操作，数据都保存在内存中定期刷新到磁盘，以极高的读写效率而备受关注。国内的新浪微博就大规模的使用了Redis来存储用户关系和计数。</p>
<h3>介绍</h3>
<p>按照官方的说法，Redis是用ANSI C开发的，能运行在大多数POSIX（Linux, *BSD, OS X 和Solaris等）系统上，官方没有支持Windows的版本。目前最新的版本是2.2.11，这个版本主要是修复了一个2.2.7版本中遍历方式优化带来的一个bug。</p>
<p>和普通的Key-Value结构不同，Redis的Key支持灵活的数据结构，除了strings，还有hashes、lists、 sets 和sorted sets等结构。正是这些灵活的数据结构，丰富了Redis的应用场景，能满足更多业务上的灵活存储需求。</p>
<p>Redis的数据都保存在内存中，而且底层实现上是自己写了epoll event loop部分，而没有采用开源的libevent等通用框架，所以读写效率很高。为了实现数据的持久化，Redis支持定期刷新（可通过配置实现）或写日志的方式来保存数据到磁盘。</p>
<h3>安装和使用</h3>
<p>由于没有第三方的包依赖关系，Redis的安装十分简单：</p>
<blockquote><p>$ wget http://redis.googlecode.com/files/redis-2.2.11.tar.gz</p>
<p>$ tar xzf redis-2.2.11.tar.gz</p>
<p>$ cd redis-2.2.11</p>
<p>$ make</p></blockquote>
<p>这样就安装完毕了，执行src目录下的redis-server可以启动Redis进程，不过最好先配置一下redis.conf文件，常用的几个要注意的参数如下：</p>
<p>daemonize yes</p>
<p>指定Redis以守护进程的方式运行。</p>
<p>pidfile /home/banping/redis/redis.pid</p>
<p>当Redis以守护进程方式运行时，把pid写入指定的文件。</p>
<p>port 6379</p>
<p>指定监听端口，默认端口为6379。</p>
<p>bind 192.168.0.35</p>
<p>绑定的主机IP地址。</p>
<p>logfile stdout</p>
<p>指定日志的记录方式，默认为标准输出。</p>
<p>databases 16</p>
<p>设置数据库的数量。</p>
<p>save &lt;seconds&gt; &lt;changes&gt;</p>
<p>Redis默认配置文件中提供了三个条件：</p>
<blockquote><p>save 900 1</p>
<p>save 300 10</p>
<p>save 60 10000</p></blockquote>
<p>分别表示900秒（15分钟）内有1个更改，300秒（5分钟）内有10个更改以及60秒内有10000个更改的时候，同步数据到磁盘文件。</p>
<p>rdbcompression yes</p>
<p>指定存储至本地数据库时是否压缩数据，默认为yes。</p>
<p>dbfilename dump.rdb</p>
<p>指定本地数据库文件名。</p>
<p>dir /home/banping/redis/data</p>
<p>指定本地数据库存放目录。</p>
<p>requirepass foobared</p>
<p>设置Redis连接密码，默认关闭。</p>
<p>maxclients 128</p>
<p>设置最大客户端连接数，默认无限制。</p>
<p>maxmemory &lt;bytes&gt;</p>
<p>指定Redis能使用的最大内存。</p>
<p>其他更详细的参数说明请参见官方文档。修改完配置文件后，我们可以用指定的配置文件启动Redis服务：</p>
<blockquote><p>[root@localhost redis-2.2.10]# src/redis-server /home/banping/redis/redis-2.2.11/redis.conf</p></blockquote>
<p>这样一个redis服务进程就启动了，它监听6379端口来提供服务。</p>
<h3>测试说明</h3>
<p>一、测试环境</p>
<p>Redis部署在一台PC 服务器上，配置如下：</p>
<p>CPU为Xeon 2.80GHz *4</p>
<p>内存为4G</p>
<p>硬盘为一块400G SATA盘</p>
<p>操作系统为64位CentOS 5.3版本</p>
<p>二、测试方法</p>
<p align="left">这里仍然采用PHP客户端进行测试，Redis官方推荐了两个PHP客户端，一个是PHP程序包Predis，另一个是C开发的扩展包phpredis，我们这里采用后者，网址为<a href="https://github.com/nicolasff/phpredis">https://github.com/nicolasff/phpredis</a> ，可以编译到PHP运行环境中来使用。</p>
<p align="left">为了不对测试服务器产生额外的影响，测试客户端部署在另外一台独立的服务器上，运行的PHP的版本是5.3.5，web server是Nginx 0.8.54，通过fastcgi的方式调用PHP服务。使用apache ab工具实现多个请求和并发操作。</p>
<p>测试过程中就使用上文提到的已经启动的Redis服务，首先是进行写操作，通过500个请求，每个请求写入10000条记录，并发度为2来共写入500万条数据，key为数字1到5000000，value大小为100个字节。然后是读操作，也是用500个请求，每个请求随机根据key值读出10000条记录，并发度为10共读出500万条记录，评测的重点是写入和读出数据的时间，以及在此过程中服务器的资源使用情况。</p>
<h3>测试结果及总结</h3>
<p>一、写操作</p>
<p>成功写入500万条记录，共耗时524秒，平均每秒写入数据9542笔。磁盘上的数据文件大小134M。写入过程中，服务器内存、CPU和磁盘等资源使用情况如下图所示：</p>
<p><a href="http://www.banping.com/wp-content/uploads/2011/09/image002.gif"><img class="aligncenter size-full wp-image-993" title="image002" src="http://www.banping.com/wp-content/uploads/2011/09/image002.gif" alt="" width="482" height="289" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.banping.com/wp-content/uploads/2011/09/image004.gif"><img class="aligncenter size-full wp-image-994" title="image004" src="http://www.banping.com/wp-content/uploads/2011/09/image004.gif" alt="" width="482" height="289" /></a></p>
<p>&nbsp;</p>
<p><a href="http://www.banping.com/wp-content/uploads/2011/09/image006.gif"><img class="aligncenter size-full wp-image-995" title="image006" src="http://www.banping.com/wp-content/uploads/2011/09/image006.gif" alt="" width="482" height="289" /></a></p>
<p>可见，内存使用平稳上升，最后占用140M左右，主要用来缓存数据，对比数据文件的大小可以设想，在操作系统内存可用的情况下，内存的分配和数据文件的大小是大致相当的。内存占用会有临时的超过实际占用的几个点，而且会马上释放掉，CPU和磁盘IO都表现出周期性的上下波动，估计这些和Redis刷新数据到磁盘的实现机制有关，在高点的时候正好是数据写入磁盘的过程。总体来说占用资源很少，表现也很平稳。</p>
<p>二、读操作</p>
<p>成功读出500万条记录，共耗时184秒，平均每秒读出数据27174笔。</p>
<p>读数据过程中没有发生磁盘IO。CPU有所消耗，Idle值稳定在77左右，等待CPU资源的进程一直是1个。内存表现平稳没有波动。</p>
<p><a href="http://www.banping.com/wp-content/uploads/2011/09/image008.gif"><img class="aligncenter size-full wp-image-996" title="image008" src="http://www.banping.com/wp-content/uploads/2011/09/image008.gif" alt="" width="482" height="289" /></a></p>
<p>通过以上测试结果可以看出，Redis数据操作都在内存完成，定期刷新到磁盘，占用的磁盘空间和内存大小由实际的数据量决定，在内存可用的情况下二者是一致的。从功能角度看Redis高效的读写效率和丰富的数据结构能满足很多互联网应用场景的需求，而且在高负载的情况下，数据内存化是趋势，总体来说Redis虽然还在不断发展之中，代码量也不多，但是一个轻量级的很有潜力的NoSQL产品，肯定会有越来越多的成功案例。</p>
<p>注：本文首发在<a href="http://tech.it168.com/a2011/0627/1209/000001209844_all.shtml" target="_blank">IT168网站</a>，版权所有，转载请注明出处。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2011/09/26/redis-benchmark/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

