June 26, 2010
转型:产品团队与架构师——金山WPS架构师手记
"\u003cp\u003e与国外大型软件公司相比,在金山,架构师的发展还处于一个学习阶段,我们也正在实践中摸索适合我们的方法。借此机会,我想和大家分享一下WPS项目 中架构师的发展历程和经验教训,共同探讨适合中国软件业的架构师之路。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWPS项目架构师发展回顾\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eWPS项目架构师的发展是随着V6(内部代号,指WPS Office 2005即后续版本)开始的,在此之前,开发团队并没有明确的架构师角色,开发人员在自发的、简单的模块分工交流之后,即开始各自的编码。从2002年下 半年开始,由包括许式伟在内的一个团队开始V6的前期工作。通过半年的原型开发,确定了模块划分和接口。我觉得,这是我们第一次实施由架构师主导的软件开 发过程。\u003c/p\u003e\n\u003cp\u003e我是在表格组成为架构师的。在此之前,我在表格组作为核心程序员,负责关键模块的开发。大约一年后,随着软件规模不断扩大,项目组成员不断增多,依 靠程序员自发协调的开发模式开始成为项目瓶颈。再加上我自己的兴趣,于是我开始向架构师方向发展。2004 年,系统架构组成立,正式确立了架构师岗位。大致上WPS的架构师与程序员的比例约为1:10,与管理人员相当。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e架构师的定位和职能\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e虽然当前架构师岗位已经非常 …\u003c/p\u003e"
June 26, 2010
软件架构师应该知道的97件事
"\u003cp\u003e软件架构师是个让人羡慕的职业,在市场经济成熟的国家,其薪酬已经达到医生、律师、注册会计师、建筑设计师的水平。但是薪酬高低与职业成熟度没有直 接的关系。重赏之下必有勇夫,高薪往往造成培养机制不健全的行业出现暂时的良莠不齐。目前我们还没有培养软件架构师的成熟机制,架构师大多是程序员自学成 材。程序员擅长和电脑打交道,却不善于处理工作中的人际关系。然而经验表明,除了技术特长,沟通协作的技巧、领导协调的能力、统筹取舍的经验在指挥开发项 目的过程中起着更重要的作用,而这些内容在计算机学院的课本里压根找不到。刚刚升任软件架构师的人,都有一段时间觉得茫然失措,因为有太多非技术问题困扰 着他们。\u003c/p\u003e\n\u003cp\u003e****软件架构师是IT 行业里独一无二的职业,既要精通软件开发技术,又要掌握业务知识,还要周旋于公司不同部门之间,协调各种予盾。做到这些绝非易事, \u003ca href=\"http://blog.csdn.net/bvbook\"\u003e博文视点\u003c/a\u003e 即将翻译出版的新书《软件 架构师应该知道的97 件事》( \u003ca href=\"http://architect.97things.oreilly.com/wiki/index.php/97_Things_Every_Software_Architect_Should_Know_-_The_Book\"\u003e97 Things Every Software Architect Should Know\u003c/a\u003e )探讨的就是这个主题。\u003c/p\u003e\n\u003cp\u003e本书的编辑Richard Monson-Haefel 是畅销书《 …\u003c/p\u003e"
June 26, 2010
如何选择合适的MySQL存储引擎
"\u003cp\u003e本文将讲述MySQL中多种存储引擎的特点,希望可以给你在选择 MySQL存储引擎时带来帮助。\u003c/p\u003e\n\u003cp\u003eMySQL有多种存储引擎:\u003c/p\u003e\n\u003cp\u003eMyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、 ARCHIVE、CSV、BLACKHOLE。\u003c/p\u003e\n\u003cp\u003eMySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎:\u003c/p\u003e\n\u003cp\u003e◆ MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置 MySQL默认使用另外一个引擎。\u003c/p\u003e\n\u003cp\u003e◆ MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样,MEMORY 和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。\u003c/p\u003e\n\u003cp\u003e注释:MEMORY存储引擎正式地被确定为HEAP引擎。\u003c/p\u003e\n\u003cp\u003e◆ InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分 …\u003c/p\u003e"
June 26, 2010
MySQL Cluster的常见问题
"\u003cp\u003eMySQL Cluster是MySQL适合于分布式计算环境的高实用、高冗余版本。它采用了NDB Cluster存储引擎,允许在1个Cluster中运行多个MySQL服务器。\u003c/p\u003e\n\u003cp\u003eMySQL Cluster是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的Cluster。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬 件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。\u003c/p\u003e\n\u003cp\u003e总结了些移植到MySQL Cluster要注意的常见问题。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e关于连接\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMySQL集群适合用于高速带宽的环境中,采用TCP/IP方式 连接。它的性能跟主机间的连接速率有直接关系。集群中的最小速率要求是常规的100Mb以太网或者等同的网络。我们建议可能的话就采用G级网络。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e关于内存\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eMySQL集群可以运行在任何启用NDB的平台上。显然,CPU 越快,内存越大,对集群性能提升越明显,64位的CPU也可能比32位的处理器更快。每个作为数据节点的机器都必须有足够的内存来保存共享数据库。\u003c/p\u003e\n\u003cp\u003e在MySQL 5.0中,集群只能基于内存。意思是所有表的数据(包括索引)都保存在内存中。如果你的数据有1GB那么大, …\u003c/p\u003e"
June 26, 2010
关于 I/O 的五分钟法则(Five-Minute Rule)
"\u003cp\u003e去年在对 SSD 做调查的时候就关注过这个\u003ca href=\"http://queue.acm.org/detail.cfm?id=1413264\"\u003e五分钟法则\u003c/a\u003e,今天又发现了\u003ca href=\"http://cacm.acm.org/magazines/2009/7/32091-the-five-minute-rule-20-years-later/fulltext#R15\"\u003e这 篇文章\u003c/a\u003e的修订版(为了纪念 Jim Gray),这个话题倒是可以简单介绍一下,对架构师衡量 I/O 能力、Cache 评估和做硬件选型还是会有一些帮助的。\u003c/p\u003e\n\u003cp\u003e在 1987 年,\u003ca href=\"http://en.wikipedia.org/wiki/Jim_Gray_%28computer_scientist%29\"\u003eJim Gray\u003c/a\u003e 与 Gianfranco Putzolu 发表了这个”五分钟法则”的观点,简而言之,如果一条记录频繁被访问,就应该放到内存里,否则的话就应该待在硬盘上按需要再访问。这个临界点就是五分钟。 看上去像一条经验性的法则,实际上五分钟的评估标准是根据投入成本判断的,根据当时的硬件发展水准,在内存中保持 1KB 的数据成本相当于硬盘中存储同样大小数据 400 秒的开销(接近五分钟)。这个法则在 1997 年左右的时候进行过一次回顾,证实了五分钟法则依然有效(硬盘、内存实际上没有质的飞跃),而这次的回顾则是针对 SSD 这个”新的旧硬件”可能带来的影响。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/06/Five-Minute-Rule.gif\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/Five-Minute-Rule.gif\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e随着闪存时代的来临,五分钟法则一分为二:是把 SSD 当成较慢的内存(extended buffer pool )使用还是当成较快的硬盘(extended disk)使用。小内存页在内存和 …\u003c/p\u003e"
June 26, 2010
Memcached深度分析
"\u003cp\u003eMemcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减 少数据库负载,提升性能。关于这个东西,相信很多人都用 过,本文意在通过对memcached的实现及代码分析,获得对这个出色的开源软件更深入的了解,并可以根据我们的需要对其进行更进一步的优化。末了将通 过对BSM_Memcache扩展的分析,加深对memcached的使用方式理解。\u003c/p\u003e\n\u003cp\u003e本文的部分内容可能需要比较好的数学基础作为辅助。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e◎Memcached是什么\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在阐述这个问题之前,我们首先要清楚它“不是什么”。很多人把它当作和SharedMemory那种形式的存储载体来使用,虽然memcached使用了 同样的“Key=\u0026gt;Value”方式组织数据,但是它和共享内存、APC等本地缓存有非常大的区别。Memcached是分布式的,也就是说它不是 本地的。它基于网络连接(当然它也可以使用localhost)方式完 成服务,本身它是一个独立于应用的程序或守护进程(Daemon方式)。\u003c/p\u003e\n\u003cp\u003eMemcached使用libevent库实现网络连接服务,理论上可以处理无限多 …\u003c/p\u003e"
June 25, 2010
MySQL 集群在Server1与Server2上如何安装MySQL
"\u003cp\u003e我们今天主要向大家介绍的是MySQL 集群,其中包括对MySQL 集群的概念介绍,以及如何在Server1与Server2上正确对MySQL进行安装 ,还有对安装与配置管理节点服务器(Server3)的正确操作 ,配置集群服务器并启动MySQL 。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、介绍\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行。\u003c/p\u003e\n\u003cp\u003e注意!\u003c/p\u003e\n\u003cp\u003e虽然这是基于2台服务器的MySQL集群,但也必须有额外的第三台服务器作为管理节点,但这台服务器可以在集群启动完成后关闭。同时需要注意的是并 不推荐在集群启动完成后关闭作为管理节点的服务器。尽管理论上可以建立基于只有2台服务器的MySQL集群,但是这样的架构,一旦一台服务器宕机之后集群 就无法继续正常工作了,这样也就失去了集群的意义了。出于这个原因,就需要有第三台服务器作为管理节点运行。\u003c/p\u003e\n\u003cp\u003e另外,可能很多朋友都没有3台服务器的实际环境,可以考虑在VMWare或其他虚拟机中进行实验。\u003c/p\u003e\n\u003cp\u003e下面假设这3台服务的情况:\u003c/p\u003e\n\u003cp\u003eServer1: MySQL1.vmtest.net 192.168.0.1 …\u003c/p\u003e"
June 25, 2010
Mysql 集群简介和配置
"\u003cp\u003e1. 先了解一下你是否应该用 mysql 集群。\u003c/p\u003e\n\u003cp\u003e减少数据中心结点压力和大数据量处理,采用把 mysql 分布,一个或多个 application 对应一个 mysql 数据库。把几个 mysql 数据库公用的数据做出共享数据,例如购物车,用户对象等等,存在数据结点里面。 其他不共享的数据还维持在各自分布的 mysql 数据库本身中。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2010/06/cluster-components-1.png\"\u003e\u003cimg src=\"http://blog.haohtml.com/wp-content/uploads/2010/06/cluster-components-1.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e2. 集群 Mysql 中名称概念 .( 如上图 )\u003c/p\u003e\n\u003cp\u003e1 ) Sql 结点( SQL node– 上图对应为 mysqld ) : 分布式数据库。包括自身数据和查询中心结点数据 .\u003c/p\u003e\n\u003cp\u003e2 )数据结点 (Data node — ndbd): 集群共享数据 ( 内存中 ).\u003c/p\u003e\n\u003cp\u003e3 )管理服务器 (Management Server – ndb_mgmd): 集群管理 SQL node,Data node.\u003c/p\u003e\n\u003cp\u003e3 .配置\u003c/p\u003e\n\u003cp\u003emysql-max 版本,当然现在 mysql 集群系统 windonws 平台上面不被支持 .\u003c/p\u003e\n\u003cp\u003e安装 mysql 就不多说了,网上一打堆,简明扼要。\u003c/p\u003e\n\u003cp\u003eA:192.168.1.251 – Data node 和 Management …\u003c/p\u003e"
June 25, 2010
MySQL Cluster集群配置方案
"\u003cp\u003e在为某证券公司设计其OA架构时,初期客户是30万用户在线;然而在项目实施中,客户又提出50万用户同时在线的需求,而且都有写的需求;这样初始的设计 master-master-slave,读写分离满足不了客户的要求,所以我们打算采用Mysql Cluster方案;MySQL Cluster 是MySQL适合于分布式计算环境的高实用、高冗余版本。它采用了NDB Cluster 存储引擎,允许在1个Cluster中运行多个MySQL服务器。在MyQL 5.0及以上的二进制版本中、以及与最新的Linux版本兼容的RPM中提供了该存储引擎。\u003c/p\u003e\n\u003cp\u003e一、MySQL Cluster概述\u003c/p\u003e\n\u003cp\u003eMySQL Cluster 是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的 Cluster 。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。\u003c/p\u003e\n\u003cp\u003eMySQL Cluster 由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB Cluster 的数据节点,管理服务器,以及(可能)专门的数据访问程序。\u003c/p\u003e\n\u003cp\u003e所有的这些节点 …\u003c/p\u003e"
June 25, 2010
MySQL如何修改表格的字符集,如何修改某个字段的字符集
"\u003cp\u003e如果用户想改变表的默认字符集和所有的字符列的字符集到一个新的字符集,使用下面的语句:\nALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;\u003c/p\u003e\n\u003cp\u003e警告:\n上述操作是在字符集中转换列值。如果 用户在字符集(如 gb2312)中有一个列,但存储的值使用的是其它的一些不兼容的字符集(如 utf8),那么该操作将不会得到用户期望的结果。在这种情况下,用户必须对每一列做如下操作:\u003c/p\u003e\n\u003cp\u003eALTER TABLE t1 CHANGE c1 c1 BLOB;\nALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;\u003c/p\u003e\n\u003cp\u003e这样做的原因是:从 BLOB 列转换或转换到 BLOB 列没有转换发生。\u003c/p\u003e\n\u003cp\u003e如果用户指定以二进制进行 CONVERT TO CHARACTER SET,则 CHAR、VARCHAR 和 TEXT 列将转换为它们对应的二进制字符串类型(BINARY,VARBINARY,BLOB)。这意味着这些列将不再有字符集,随后的 CONVERT TO 操作也将不会作用到它们上。\u003c/p\u003e\n\u003cp\u003e如果仅仅改变一个表的缺省字 …\u003c/p\u003e"
June 25, 2010
Mysql InnoDB和MyISAM的区别
"\u003cp\u003eInnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等 高级处 理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已 经外部键等高级数据库功能。\u003c/p\u003e\n\u003cp\u003eMyIASM是IASM表的新版本,有如下扩展:\u003c/p\u003e\n\u003cp\u003e1、二进制层次的可移植性。\u003c/p\u003e\n\u003cp\u003e2、NULL列索引。\u003c/p\u003e\n\u003cp\u003e3、对变长行比ISAM表有更少的碎片。\u003c/p\u003e\n\u003cp\u003e4、支持大文件。\u003c/p\u003e\n\u003cp\u003e5、更好的索引压缩。\u003c/p\u003e\n\u003cp\u003e6、更好的键码统计分布。\u003c/p\u003e\n\u003cp\u003e7、更好和更快的auto_increment处理。\u003c/p\u003e\n\u003cp\u003eInnoDB 是 MySQL 上第一个提供外键约束的引擎,除了提供事务处理外,InnoDB 还支持行锁,提供和 Oracle 一样的一致性的不加锁读取,能增加并发读的用户数量并提高性能,不会增加锁的数量。\u003c/p\u003e\n\u003cp\u003eInnoDB 的设计目标是处理大容量数据时最大化性能,它的 CPU 利用率是其他所有基于磁盘的关系数据库引擎中最有效率的。\u003c/p\u003e\n\u003cp\u003eInnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 有它自己的缓冲池, …\u003c/p\u003e"
June 24, 2010
FreeBSD portupgrade升级你的FreeBSD软件
"\u003cp\u003e\u003cstrong\u003eportupgrade\u003c/strong\u003e 是一个软件,用于快捷便利地升级软件,安装办法:\u003c/p\u003e\n\u003cp\u003e#cd /usr/ports/sysutils/portupgrade\u003c/p\u003e\n\u003cp\u003e#make install clean\u003c/p\u003e\n\u003cp\u003e然后用cvsup更新ports树,最后运行:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e#portupgrade -r\u003c/strong\u003e pkg_name 升级单个软件和与其相关的,其中 pkg_name 是 pkg_info 中显示的名字\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eportupgrade\u003c/strong\u003e -ar 就会自动更新全部了。\u003c/p\u003e\n\u003cp\u003e如果加上 P 参数,则先看是否有已经编译好的 pkg 下载,直接从 pkg 升级,省去自己编译。\u003c/p\u003e\n\u003cp\u003e下载站点可以通过修改 /usr/local/etc/pkgtools.conf 更改。\u003c/p\u003e\n\u003cp\u003eportupgrade -arR 升级所有已经安装的软件,并且检查依赖关系。\u003c/p\u003e"
June 24, 2010
Five Minutes程延辉 介绍开心农场架构
"\u003cp\u003eFive Minutes 公司程延辉(小名康天) 介绍开心农场架构,social game的技术挑战,支持千万级DAU的social game技术架构。这是一个对于开发者来说,非常精彩,非常有实用性指导的一次演讲,详细介绍了很多技术内幕。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://www.javaeye.com/topics/download/e4f72cf2-2baa-3f4b-9578-d220b6bceea9\"\u003e\u0026raquo;猛击这里下载演讲ppt\u0026laquo;\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eFive Minutes 公司的著名social game 开心农场,目前非常受用户欢迎,包括国外的Facebook,国内的开心网都是如此,是全球最大的social game,台下热烈掌声。呵呵。开心农场这个游戏从介绍看,相当成功,最早是08年9月在xiaonei上线,而后在51等平台推广,包括Facebook。现在已经有1570万游戏用户了,其中包括50万的Facebook用户。\u003c/p\u003e\n\u003cp\u003e开心农场架构主要难点:1。如何存储大规模的用户数据千万级2。如果应对大量访问每天数亿请求量3。如果应对数据的频繁修改,每秒数万次数据修改。\u003c/p\u003e\n\u003cp\u003e解决的方式\u003c/p\u003e\n\u003cp\u003e优化:\u003c/p\u003e\n\u003cp\u003e1。负载均衡,web服务器平行扩展。\u003c/p\u003e\n\u003cp\u003e2。服务器性能优化。\u003c/p\u003e\n\u003cp\u003e3。异步处理,缓存数据接口,Linux内核参数优化,挖掘PHP的效率,用fastcgi模式运行php, …\u003c/p\u003e"
June 24, 2010
UPDATE 时主键冲突引发的思考
"\u003cp\u003e假设有一个表,结构如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt; CREATE TABLE `a` (\n `id` int(10) unsigned NOT NULL AUTO_INCREMENT,\n `id2` int(10) unsigned NOT NULL DEFAULT \u0026#39;0\u0026#39;,\n PRIMARY KEY (`id`)\n) ENGINE=MyISAM;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e该表中只有6条记录,如下:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt; select * from a;\n+----+---------+\n| id | city_id |\n+----+---------+\n| 2 | 2 |\n| 3 | 3 |\n| 5 | 5 |\n| 4 | 4 |\n| 6 | 6 |\n| 7 | 7 |\n+----+---------+\n注意上面id的显示顺序,由于没有指定排序字段,myisam表引擎是随机显示记录列表的。\n现在想要把id字段分别-1,执行以下语句,得到报错:\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt; update a set id=id-1; …\u003c/code\u003e\u003c/pre\u003e"
June 20, 2010
开源数据库 Sharding 技术 (Share Nothing)
"\u003cp\u003e注:此文首发于 《程序员》杂志 2008 年 7 月刊。\u003c/p\u003e\n\u003ch4 id=\"从-shard-到-sharding\"\u003e从 Shard 到 Sharding\u003c/h4\u003e\n\u003cp\u003e“Shard” 这个词英文的意思是”碎片”,而作为数据库相关的技术用语,似乎最早见于大型多人在线角色扮演游戏(MMORPG)中。”Sharding” 姑且称之为”分片”。\u003c/p\u003e\n\u003cp\u003eSharding 不是一门新技术,而是一个相对简朴的软件理念。如您所知,MySQL 5 之后才有了数据表分区功能,那么在此之前,很多 MySQL 的潜在用户都对 MySQL 的扩展性有所顾虑,而是否具备分区功能就成了衡量一个数据库可扩展性与否的一个关键指标(当然不是唯一指标)。数据库扩展性是一个永恒的话题,MySQL 的推广者经常会被问到:如在单一数据库上处理应用数据捉襟见肘而需要进行分区化之类的处理,是如何办到的呢? 答案是:Sharding。\u003c/p\u003e\n\u003cp\u003eSharding 不是一个某个特定数据库软件附属的功能,而是在具体技术细节之上的抽象处理,是水平扩展(Scale Out,亦或横向扩展、向外扩展)的解决方案,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。\u003c/p\u003e\n\u003ch4 id=\"事关数据库扩展性\"\u003e事关数据库扩展性\u003c/h4\u003e\n\u003cp\u003e说起数据库扩展性,这是 …\u003c/p\u003e"