MySQL 是一个小型关系型数据库管理系统,被广泛用于各种中小 Web 应用中。常见的应用架构有:

1、单点(Single):适合小规模应用;
2、复制(Replication):适合中小规模应用;
3、集群(Cluster):适合大规模应用。

曾写过 httpd 服务端与 MySQL 数据库分开部署的情况的文章,那属于单点应用的范畴。而随着业务需求的不断增长,更高的负载量、更安全的系数、更可靠的存储,这一切都会让依然停留在单点应用的你举步维艰。

令人高兴的是,MySQL 早在 3.23.15 版本开始就提供了单向的异步复制功能。利用该功能可以实现两种数据库异步复制:主从模式(A -> B,或 A -> B、C、D)、互相备份模式(A <=> B)。后者也称“双向热备”或“双机热备”,是前者的扩展与补充。

值得注意的是,这种复制是异步的,有别于 MySQL 的同步复制实现(也称做 MySQL 集群、MySQL Cluster,本文不作讨论,感兴趣的话可参见这里)。

相关原理:当主库有更新的时候,主库会把更新操作的 SQL 写入二进制日志 (Bin log),并维护一个二进制日志文件的索引,以便于日志文件轮回(Rotate)。在从库启动异步复制的时候,从库会开启两个 I/O 线程,其中一个线程连接主库,要求主库把二进制日志的变化部分传给从库,并把传回的日志写入本地磁盘。另一个线程则负责读取本地写入的二进制日志,并在本地执行,以反映出这种变化。较老的版本在复制的时候只启用一个 I/O 线程,实现这两部分的功能。

需要注意的地方:

1、主库必须启用 Bin log,主库和从库必须有唯一的 Server Id;
2、从库必须清楚了解从主库的哪一个 Bin log 文件的哪一个偏移位置起开始复制;
3、从库可以从主库只复制指定的数据库,或者数据库的某些数据表;
4、主库和从库的数据库名称可以不一样,不过还是推荐使用一样的名称;
5、主库和从库的 MySQL 版本需保持一致。

由于 MySQL 复制功能的设置都在其配置文件 my.cnf 中体现,因此互相备份模式与主从模式大同小异。本文所涉方案为后者。

首先分别在两台服务器上下载、解压缩版本相同的 MySQL 源码包,并编译安装。此过程在此略过,并假设:

1、两台机器在同一子网内,且 IP 地址分别为 192.168.0.31(以下简称 A 机器) 与 192.168.0.15(以下简称 B 机器);
2、两台机器的数据库版本、目录、初始的库、表均一致;
3、MySQL 配置文件都位于 /etc/my.cnf;
4、需要同步的库:dbname,不需要同步的库:mysql、test。

在 A 机器上添加 mysqlrepl 为同步帐号:

GRANT REPLICATION SLAVE ON *.* TO 'mysqlrepl'@'192.168.0.15' IDENTIFIED BY '密码'; 然后:

vi /etc/my.cnf 修改:

# 日志的名称
log-bin=mysql-bin
# 主服务器 ID
server-id=1
# 需要备份的库
binlog-do-db=dbname
# 忽略的库
binlog-ignore-db=mysql
binlog-ignore-db=test
在 B 机器上:

vi /etc/my.cnf 修改:

# 日志的名称
log-bin=mysql-bin
# 从服务器 ID
server-id=2
# 主服务器的 IP 地址或者域名
master-host=192.168.0.31
# 主数据库的端口号
master-port=3306
# 同步数据库的用户
master-user=mysqlrepl
# 同步数据库的密码
master-password=
# 如果从服务器发现主服务器断开,重新连接的时间差(秒)
master-connect-retry=30
# 需要同步的库
replicate-do-db=dbname
# 忽略的库
replicate-ignore-db=mysql
replicate-ignore-db=test
重启两边的 MySQL,在 B 机器上登入 mysqld,执行:

mysql>slave start; 然后可以查看同步配置情况。在 A 机器上执行:

mysql>show master status; 在 B 机器上执行:

mysql>show slave status; 截止这里,我们只实现了 A -> B 的复制,要实现双向热备,仅需要将上面的步骤倒过来执行一遍即可。

同嘉菲猫、奥戴利·赫本等人一样,我也是个意大利面爱好者。意大利面除了很好的口感和特殊的谷香,还有很多优点。譬如不用担心煮久了,弄成一锅疙瘩汤;中午吃不完,加点油拌一拌,放到晚上味道和口感也不会有太大的变化。

除了意大利面,我也经常做香菇炖鸡面、红烧牛肉面之类的中式面条。根据马斯洛先生的理论,当人的肚皮被各式面条装满之后,脑子就会琢磨点东西。我琢磨来琢磨去,发现从面条上也可以看出些东西方文化的差异。

著名的兰州拉面从粗到细有“皮带、大宽、二宽、韭叶、二柱子、荞麦棱子、二细、细、毛细、一窝丝”之分。但是无论叫什么,你都无法从名字上知道这面到底有多宽,只是大致有个感觉:“一窝丝”,应该比较细;“皮带”,那应该和裤腰带差不多吧”。

到超市看中式面条的货柜,有“龙须面”、“银丝面”、“玉带面”、“挂面”等等。但是张老爹牌“龙须面”和李老爹牌“龙须面”肯定不一样粗,甚至吃起来感觉都完全不同。

意大利面则不然,3 号、5 号、7 号……跟螺丝刀一样,标的清清楚楚。不管是“VALDIGRANO”的 7 号面,还是“pasta ZARA”的7号面,都绝对是一样粗细,烹饪时间都是 11 分钟。为了保证面的品质,意大利法律(没错,是法律)还规定:意大利面一定要用 100% 杜兰小麦制作。只能用天然材料著色,不得使用人工色素或防腐剂……等等等等。

西方讲标准,讲规范;中国讲经验,讲感觉,讲灵活性。

咱们看洋人的菜谱,就像看中药方子:先放 30 毫升的啥,再加 80 克的啥,搅拌 2 分钟……。洋人的厨房,就像化学实验室和手工艺作坊:量杯、定时器、打蛋的、榨汁的、刨丝的、钻眼的……连煮个鸡蛋都有专门的煮蛋计时沙漏。

如果换了洋人来看咱们的菜谱,也一定会有无数的疑问:一勺料酒是用多大的勺?一撮葱末又是多少?七成热是摄氏多少度?怎么才知道已经“炸至金黄色”了呢……

虽然我很喜欢西方式的严谨,不过在饮食上还是觉得灵活些好。我琢磨之所以西餐在品种上远远比不了中餐,就和洋人太死板有关。

中国的大师傅教十个徒弟,可以教出来十个样儿。徒弟再教徒弟,不断演变,最后就有了这八方风味南北大菜。而洋师傅教多少徒弟也就那一个味儿,传上多少代,变化也不大。

就说香辣蟹吧,诞生的时间很短,但是在不同的馆子,味道就可以差很多,甚至做法都不同。而麦当劳都是一个味儿,肯德基也都是一个味儿。

要打个比方的话,中餐有点像处于强烈核辐射下的草履虫,天天发生变异,过上一两百年就进化出成堆成堆的新物种;而西餐则处于相对稳定的环境,过二百年也许个头大点,颜色变变,可还是草履虫。

PS:题目都说了“面”而且“条”,那么指的当然是 spaghetti,而不会是 pasta。

pasta 是一个大概念,除了可以用来称呼千层面之外,pizza、spaghetti 也都是它的子集。

本文原载旧版博客 2006 年 4 月 26 日。

如果要问系统管理员最痛恨的事情是什么,我敢打赌,99%的回答不是遇到棘手的问题,也不是遇到莫名其妙的情况,而是给那些该死的 Windows 系统服务器打补丁——一个一个又一个,一台一台又一台,一遍一遍又一遍……生生不息、永无止境。

不要告诉我有 WSUS 这个玩意,我知道。这个鬼东西和域控制器建在一起,那简直就是地狱。至今我依然不记得在同一台服务器上应该先安装 WSUS,还是先搭建域控制器。总之它们俩必定有一个先后顺序,不然会影响对方——我很佩服微软,真的。

幸好伟大的 M$ 公司还有一个玩意叫做批处理脚本。下面这个脚本用于批量补丁,可以帮助系统管理员节约时间,减少白头发:

FOR %%i IN (*.EXE) DO %%i /passive /norestart /nobackup 脚本需要放在那一堆补丁中间,就像羊群中的狼一样。另外参数也可以根据实际情况调整。

前几天在一台 Windows 2003 Enterprise Edition 的机器上,突然运行不了这个脚本,提示:

Windows 无法访问指定设备、路径或文件。您可能没有合适的权限访问这个项目。 我以为我在做梦,或是眼睛模糊了。再次执行,还是一样;来到 CMD 下执行,也是一样,于是我被折服了。

看了 M$ 公司伟大的帮助文档后,才知道这样的情况乃是相当罕见。应该这样解决:

回到上层目录,右键补丁和 BAT 脚本所在的目录,选择“属性”,然后“安全”选项卡,点击下面的“高级”,选择“所有者”选项卡,选中“替换子容器及对象的所有者”,然后“应用”,接着切换到“审核”选项卡,选中“允许父项的继承审核项目传播到该对象和所有子对象。包括那些在此明确定义的项目”和“用在此显示的那些可以应用到子对象的项目替代所有子对象的审核项目”,点击“应用”,确定所有对话框,一切完成。

由于某种特殊情况,前几天又重新开始写 PHP。这次遇到一个比较有意思的问题,被要求使用 PHP 脚本验证来自某个表单的一个(请注意,是一个)文本框中的数据是否为合法的国内电话号码格式或合法的国内移动电话号码格式。

我知道这样 BT 的需求不通过正则实现恐怕是南辕北辙。而我又一向不谙正则,尤其对排列组合十分感冒。无奈之下,搜索……

首先看到 phpchina 上某位兄台的博客上的文章,貌似对常用正则表达式做了一个清晰的整理。文章上对国内电话格式合法性的验证,给出了这样的公式:

\d{3}-\d{8}|\d{4}-\d{7} 很显然,它的适用范围不够广泛。

我们来重新分析一下需求:

1、合法的国内固定电话号码格式:带有前导零的长途区号、连字符“-”(念“hyphen”,具体可参考这里)、电话号码。除此之外,还应考虑分机号码的存在。

合法格式举例:

0571-88909090
0573-6262662
021-60606060-808

- 阅读剩余部分 -

案发时间:2008 年 7 月 19 日晚 19 时 30 分许。

案发地点:杭州市文三西路 638 号小尾羊 11 号包厢。

作案人员:传说中的 70 同学及其在雅虎口碑工作的朋友、feelinglucky 同学(传说中的淘宝前端工程师明城)及其夫人陆小姐(亦称老佛爷)、新钻网 ppeng 同学、LSD 刘先生(我们曾经的同事,目前是老佛爷的同事),及本报记者。

作案工具:和谐的人民币、可爱的口碑卡、牢固的牙齿。

作案动机:70 同学来杭参加雅虎口碑的面试。

作案经过:请欣赏高清、无码、激情的下述图片。

有了口碑卡,您还能忍住美食的诱惑吗?

喝的是杭州的酒:

70 同学特写(应其本人强烈要求,加盖薄码):

中间那位猥琐少男……嗯,您猜对了,一看就知道是淘宝的风格。左边那位是 lucky 的夫人老佛爷:

70 和 lucky 大谈特谈技术,还不停地用手比划:

两人一起达到了某个高潮,请看 70 同学的一阳指:

两个技术疯子的故事,已经给我们这些外行人幼小的心灵造成了深深的伤害。连老佛爷也只能用手托着下巴,深深地表示无奈:

从左往右依次是:70 那位在雅虎口碑工作的朋友、LSD 刘先生(您瞧这帅气的发型):

LSD 刘先生给 lucky 点烟,两人十分激动,本记者也忍不住激动地抖动了一下:

抽的是杭州的烟:

不知道是谁吃剩下的不知道是什么动物的什么部位的肉:

全文完毕,感谢关注,欢迎发言。