【回复】
9tmd : 说了关键的几个部分,还有一些比如squid群、LVS或者VIP(四层交换)之类的必须考虑,数据库逻辑分表不需要master里面查id,可以定期缓存或者程序逻辑上进行控制。 跟大家分享一下我的经验: http://www.toplee.com/blog/archives/337.html (欢迎讨论) nightsailer: 楼上说的很好. 我 再说一下关于为何要在主表查询,最主要的因素是考虑到复制和维护的问题。假设按照程序逻辑,用户nightsailer应该在s1集群,但是由于种种原 因,我须要将nightsailer的数据从s1集群转移到s5集群或者某些时候,我需要将某几个集群的数据合并,此时,我维护的时候只需要更新一下主数 据库中nightsailer的cluster id从1变成5,,维护的工作可以独立进行,无需考虑更新应用程序的逻辑。也许程序的id分配逻辑可以考虑到这种情况,但是这样一来,你的这个逻辑会发散 到各个应用中,产生的代码的耦合是很高的。相反,采用查表这种方式,只需要在最初的时候进行初始分配,那么其他的应用是无需考虑这些算法和逻辑的。 当然,我最初提到的增加这次查询并不是说每次查询都需要找主数据库,缓存策略是必定要考虑的。 至于说为什么要禁用auto_increment,我想也清楚了,数据的合并和分隔,肯定是不能用auto_increment的。 nightsailer: 在闲扯一下,PHP的优化可以有很多,主要的措施: 1、使用FCGI方式,配合lighttpd,Zeus. 我个人比较喜欢Zeus,简单可靠。不过,需要¥¥¥。 lighty也不错,配置文件也很简单,比较清爽。最新的1.5,虽然不稳定,但是配合linux的aio,性能的提升 非常明显。即便现在的稳定版,使用2.6的epoll可以得到的性能是非常高。当然,lighty比zeus缺点是对于smp 的支持很有限,所以可以采用多服务器负载,或者干脆起不同的进程服务监听不同的端口。 2、专门的PHP FCGI服务器。 好处多多,在这个服务器上,就跑php的fcgi服务,你可以把一些缓存加上,比如xcache,我个人喜欢这个。 还有别的,套用大腕的话,把能装的都装上,呵呵。 另外,最主要的是,你可以只维护一个php的环境,这个环境能够被apache,zeus,lighttpd同时share, 前提是这些都使用php的fcgi模式,而且,xcache可以充分发挥! 3、apache+mod_fastcgi apache并非无用,有时候也需要。比如我用php做了一个web_dav的服务器,在其他有问题,只能跑apache. 那么,apache安装一下mod_fastcgi,通过使用externl server,使用2配置的php fastcgi。 4、优化编译 ICC是我的首选,就是intel的编译器啦,用icc重新编译php,mysql,lighty,能编的都编,会有不小的收获的。尤其是你用 intel的cpu的话。 5、php4的64位需要patch 好像没有人在linux x86_64上编译过php4吧,我曾经googleit ,别说国内了,连老外都很少用。 这里就做个提醒把,如果用php官方下载的(包括最新的php-4.4.4),统统无法编译通过。问题是出在autoconf上,需要 手工修改config.m4,一般是在mysql,gd,ldap等一些关键的extension上,还有phpize的脚本。把/usr/lib64加入到 config.m4中相关搜索的path中。 不过我估计很少人像我这样死用php4不防,呵呵。php5就没有问题。 我也考虑正在迁移到php5.2,写代码太方便了,一直忍着呢。 nightsailer: QUOTE: 原帖由 wuexp 于 2007-1-3 17:01 发表 分表会使操作数据(更改,删除,查询)边的很复杂,特别是遇到排序的时候就更麻烦了. 曾经考虑根据用户id哈希一下,插入到相应的分表里 明白你的意思。 不过我们可能讨论的不完全一样,呵呵。 我所说的分表要依据不同的业务情况来划分的, 1、可以是垂直划分, 比如依据业务实体切分,比如用户a的blog贴子,用户的tag,用户的评论都在a数据库u,甚者是完整的一套数据结构(这种情况下应该说是分数据库) 2、也可以水平划分, 一个表的数据分在不同的数据库上。 比如message表,你可能分为daily_message,history_message, dialy_meesage可能是hot对象,week_message是warm,2个月以前的帖子 可能属于cold对象了。这些对象依据访问频度不同会划分到不同的数据库群上。 3、二者结合 不过,不论如何,更改、删除并不复杂,和未分区的表没有区别。 至于查询和排序,不可能仅仅是通过select,order吧? 而是应该产生类似摘要表,索引表,参考表。。。 另外,要根据业务具体分析减少垃圾数据,有些时候,只需要最初的1万条记录,那么所有表 数据的排序就不需要了。很多传统的业务,比如零售,流水表很大,但是报表的数据 并非实时生成的,扎报表应该不陌生。 也可以参考很多网站的做法,比如technorati啊,flickr之类的。 所谓的麻烦是你设计系统的结构的时候要考虑到,在设计数据库的时候更要注意, 因此只要项目的framework最初设计比较完备,那么可以说大部分对开发人员是透明的。 前提是,你一定要设计好,而不是让程序员边写代码边设计,那会是噩梦。 我写这么多废话,并非仅仅是对程序员来说,也许对设计者更有用。 9tmd : 程序逻辑上控制表拆分只需要维护一个数据库访问的配置文件即可,对于开发来说,完全透明,可以不用关心访问的是哪里,而只需要调用通用的接口即可,曾经做过的系统里面,这样的应用经常遇到,尤其在全网passport、社区帖子等方面的处理上应用最多。 原来在yahoo工作和后来mop工作都使用了这样的架构,整体感觉来说还是值得信赖的,单表毕竟存在面对极限数据量的风险。
9tmd :前 面老是有人问auto_increment的问题,其实这是MySQL官方专门针对M/S的Replication做过的说明,因为MySQL的同步是依 靠同步MySQL的SQL日志来实现的,事实上单向的Master->Slave使用auto_increment是没有问题的,而双向的M/M模 式就会存在问题了,稍微一思考就知道怎么回事了。官方文档: http://dev.mysql.com/tech-resour ... ql-replication.htmlhttp://dev.mysql.com/doc/refman/ ... auto-increment.html另 外,在使用MySQL的同步时,需要注意在自己的代码里面,写SQL的时候不要使用MySQL自己提供的类似 NOW()之类的函数,而应该使用php程序里面计算的时间带入SQL语句里面,否则同步的时候也可能导致值不相等,这个道理可以牵涉出另外一些类似的问 题,大家可以考虑一下。
