司马刘的日志

分享工作,分享生活。

Skip to: Content | Sidebar | Footer

MySQL 的 master-slave 复制实施细节

19 十二月, 2009 (18:34) | 杂项 | By: 司马 刘

很多 WEB 站点使用 MySQL 的 master-slave 结构,写请求都在 master 数据库上操作,读请求都在 slave 数据库上操作,这样就减轻了单台数据库的读写压力。MySQL 是如何实现数据从 master 到 slave 的同步呢?

当 slave 发起了 START SLAVE 指令时,slave 会创建一个线程来连接 master,让 master 发送二进制的更新日志。当然这里有两点要明确的:1)master 必须记录二进制更新日志;2)slave 必须告知 master 要从哪个点开始复制二进制日志。master 收到 slave 的请求后,也会创建一个线程,从指定的点开始给 slave 发送二进制日志。slave 会有另外一个线程根据接收到的二进制日志来更新本地数据。这样就实现了 master 到 slave 之间的数据同步。

PHP APC 到底有多快

19 十二月, 2009 (18:33) | 开发 | By: 司马 刘

APC(Alternative PHP Cache)是一个免费开放的 PHP 代码缓存模块。很多 WEB 站点都使用 APC 来加速,APC 的效果到底如何呢?笔者作了如下实验。

两个 PHP 文件,内容分别为:

开启 APC 模块和禁用 APC 模块,分别执行 b.php 文件,结果如下:

[root@localhost ~]# time php b.php

real    0m0.059s
user    0m0.031s
sys     0m0.019s

[root@localhost ~]# time php b.php

real    0m0.123s
user    0m0.036s
sys     0m0.069s

从上面的数据可以看出使用 APC 加速后,效果还是很可观的。

大规模并行计算简介

29 十一月, 2009 (18:35) | 开发, 杂项 | By: 司马 刘

当今信息化时代,计算机需要处理的信息量呈几何级数增加,但是由于 CPU 架构本身的局限,CPU 时钟频率提升已经遇到了瓶颈.而最初只作为图形处理的 GPU 的可编程性日益增加使得很多科学家开始使用 GPU 来运行通用的计算程序.今天我给大家简单介绍一下 GPU 以及 CUDA 架构.

为什么 GPU 适合做大规模并行计算?
GPU 当初设计就是用来做图形处理的,而图形处理本身就是高密度,高并行的计算.请看下图:

a

GPU 的计算单元非常密集,可以让多个线程在多个不同的计算单元上同时运行,而 CPU 上的进程切换是一个很耗资源的操作,进程内的多个线程共享一份内存和寄存器,CPU 上的多线程并行和 GPU 的多线程并行性能必定有很大的差距.但是 CPU 的复杂的指令流控制是 GPU 的弱项.所以目前大多采用若干个 CPU 和若干个 GPU 来构建大规模并行计算系统,应用程序的顺序部分在 CPU 上运行,计算密集型部分在 GPU 上运行.

CUDA 是什么?
简单来说 CUDA 就是通用的并行计算架构.包括硬件指令集和并行编程模型.请看下图:

b

目前应用程序可以通过 C 语言来使用 CUDA 架构,从而解决很多复杂的计算问题.其他的诸如 FORTRAN,C++,OpenGL 和 DirectX 等语言或者编程接口会陆续支持.

如何在 CUDA 的编程模型上开发并行运行的程序?
CUDA 编程模型扩展了 C 语言,可以使用扩展语法调用 C 语言定义的特殊函数(这种特殊函数称作 kernel).请看下面的代码:

当用 CUDA 扩展语法调用 kernel 时,kernel 会被 N 个不同的线程同时执行.

CUDA 的硬件是如何实现的?
简单来说当 kernel 被调用时,GPU 会自动分配线程到各个 GPU 计算单元去执行并处理线程的共享资源.因为 GPU 拥有大量的计算单元,当大量的线程在各自的计算单元上运行时,偶尔的共享资源访问延时也可以忽略了.

更多详细信息可以查看 NVIDIA 公司的站点.

google 出错了……

29 十一月, 2009 (00:14) | 杂项 | By: 司马 刘

2009 年 11 月 29 日临晨 0 点 10 分左右打开 www.google.cn 出现了 502 错误,持续了几分钟……

hello

这次应该不是实习生搞的吧?

MySQL 优化总结

24 十一月, 2009 (20:18) | 开发 | By: 司马 刘

有很多人都问过我如何优化 MySQL,苦于自己一直没有好好总结,总是不能有条理的讲出来,今天就来总结一下.

安装和配置
如果没有充分的理由请不要自己动手编译 MySQL,官网上提供的编译好的包就够用了, MySQL 文档中提出用 ICC 编译的 MySQL 性能要优于用 GCC 编译的.如果你的服务器是 Intel 架构,请下载用 ICC 编译的包.安装好了肯定是要做一些配置的,我通常都是用 MyISAM 表引擎的,所以只总结关于 MyISAM 的配置优化.MyISAM 主要有以下参数需要注意:

  • query_cache,开启 query_cache,MySQL 会缓存 SELECT 查询语句和查询结果,当遇到相同的查询语句时不用解析查询语句而直接返回查询结果.query_cache 在互联网应用中有不错的表现.
  • key_buffer_size,这个选项指定索引的缓冲区大小,适当增加这个选项的值会得到更好的索引处理性能.
  • sort_buffer_size,这个选项指定用于排序的缓冲区大小,适当增加这个选项可以提高 ORDER BY 和 GROUP BY 的效率.
  • read_buffer_size,这个选项指定扫描表时的缓冲区大小.

最后别忘记开启慢查询日志和没有使用索引的查询日志,这些日志在改善查询性能非常重要.

设计数据库/表
这绝对是个相当重要的环节,在开发过程中发现数据库设计不合理再返工绝对是要命的.MySQL 非常善于处理数字类型字段和固定长度类型字段,单表记录大于千万时性能表现不佳.所以我们设计数据库时最好遵循下面几条原则:

  • 主键/ 唯一键/ORDER BY 字段/GROUP BY 字段使用数字类型字段
  • 除非有必要,否则数字类型字段请用无符号数字类型
  • 除非有必要,否则字符串类型字段请用 latin1_bin 编码方式
  • 权衡选择固定长度类型和可变长度类型
  • 预估一个表的记录数和字段数目,如有必要请横向/纵向拆分表
  • 不要给字段设置 NULL 值
  • 建立必要的索引

设计 SQL

很多开发人员觉得能写出很复杂,很酷的 SQL 是一件值得骄傲的事情,这里我要说的是”醒悟吧,孩子”.尽量用最简单的 SQL 来完成任务,如果你的 SQL 不能写的简单,那说明你的数据库设计的不合理.设计 SQL 也有一些原则:

  • SQL 只查询需要的记录的行/列
  • 不要在列上作计算,数据库不是做计算用的,请在程序里想办法
  • 尽量不要用 GROUP BY 和 JOIN
  • 查询尽量能用到索引

在生产环境中观察

项目上线了,真正的烦恼才刚刚开始.MySQL 既然记录了日志,就经常看看,看看哪些 SQL 执行慢,哪些 SQL 没有使用索引.拿到这些 SQL 后可以用 phpMyAdmin 里的 profile 功能来分析其执行情况.

使用缓存机制

所有的大中型网站都不会直接用数据库扛所有的压力,为了减轻数据库压力必定要使用缓存机制,有些人也使用 MySQL 的 Master-Slave 架构来分散数据库压力,但是数据不能及时同步的情况时有发生.手机之家 自主研发了一款中间件 DAL(Data Access Layer) 来解决访问数据库遇到的诸多问题,关于 DAL 的详细内容请看 超前博客.

数据库优化是个很大的话题,涉及的内容也是很多很多,本文只是对笔者日常工作的总结,如果你有更多,更好的想法请给我留言.非常感谢!

看《2012》后

18 十一月, 2009 (22:49) | 电影&剧集 | By: 司马 刘

昨天晚上和老婆还有公司同事,朋友共16人去看传说中的<<2012>>,片子太长了,有2小时40分钟,看的实在很累啊.故事情节和老片子<<后天>>一个套路,没有太多吸引人的地方.

一个团队花了很久制作出壮观炫丽的特效,导演自己看了都觉得哪部分都不好咔掉,结果导致剧情有点拖沓,时间偏长.我觉得如果把情节稍微压缩一下,效果会更好.

引用一个朋友的话”40块钱看这么长一部电影,好实惠啊!”.

读《定位》之后

18 十一月, 2009 (22:27) | 读书 | By: 司马 刘

这本书是从定位角度讲产品营销的.其实我对这本书的兴趣不大,书后的”给你自己和你的职业定位”这部分内容是我最大的收获.如何从定位的角度成功推销自己呢?有这么几点:

  • 任何值得一座的事情都值得去乱做一气,不要等到你能做得尽善尽美以后才去做
  • 更加努力的工作很少会成为通往成功之路,干得更加聪明才是更好的办法
  • 要选择好公司,上司,朋友,要独立思考,有信心

手机之家站内搜索改进

11 十一月, 2009 (22:23) | 开发 | By: 司马 刘

刚接到手机之家站内搜索 (项目名: batu, 基于 lucene 的站内搜索系统) 的时候真是有几天几夜没睡好,原因是这样的:

1) 有几位前人 hack 过这个项目的代码,代码结构和风格有很大差异;
2) 有部分逻辑是用 bash 脚本实现的,虽然是短短的 200 多行脚本,读起来真是很晦涩;
3) bash 脚本太多,部署非常麻烦;
4) 没有文档,小公司从来都是这样的.

代码大体浏览过一遍,开始定一个目标,大概是这样的:

1) 变量,函数命名标准化;
2) 减少脚本数量使部署更简单;
3) 各个子系统直接采用 socket 通信,而不是目前的写 FLAG 文件的方式;
4) 去掉 lucene 的 QueryParser,用各种子 Query  组装目标 Query;
5) 升级到最新版的 java NIO 框架 — monkey ;

目标定下来就开始写代码,除了一些工具类,其他代码基本都重写了,历时近两月.上周在生产机上部署 batu,没发现大的问题.新的 batu 优点如下:

1) 代码结构更清晰,变量名,方法名,文件名等更加规范,代码也更容易阅读和维护;
2)每台机器只要执行一个脚本就完成了部署工作,大大减轻了运维工作;
3)各个子系统采用 socket 通信,方便把各个子系统部署在不同机器,也降低了子系统直接的耦合;

在这两个月的开发过程中总结出来几点经验和大家分享:

1) 记详细的日志(log4j),便于跟踪代码的执行流程;
2) 做好自动化测试工具(脚本),代码改过后跑一下脚本看看日志就知道大概的情况了;
3) 制定小目标,逐步迭代,避免长时间闷头开发失去目标;
4) 遇到难题时主动向高人请教,别人稍微一指点或许你就茅舍顿开;

接手别人的代码真是”如人喝汤,冷热自知”啊.

电梯出轨

5 十一月, 2009 (00:27) | 生活 | By: 司马 刘

我住的楼最高是24楼,我住18楼.今天中午吃饭后准备下楼,看电梯刚好停在18楼,但是上面显示的是10楼,不管它,直接上去关门.结果电梯迅速直上,大概遇到什么东西卡住了终于停下了.

怎么办?捶了几下门,把电梯里的所有按钮都按了一遍,还是没反应,当时很害怕,难道今天就死在这里了?我仿佛看到了摔得血肉模糊的司马刘.

在一个角落里发现紧急电话!”我困在电梯里了,!@#$%^&*”,过了很久(其实没几分钟),几个物业的人把我救出去了.出去看到电梯已经在24层之外了……

人类发明了电梯,可以很方便把人送到很高处,同时也把生命很轻易送到了高处.

2009年的第一场雪

1 十一月, 2009 (10:51) | 生活 | By: 司马 刘

今天是11月的第一天,早上起来觉得很冷,到阳台上一看,居然下雪了.

DSC01258

DSC01264