Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101396171
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Mysql/postgreSQL

2008-05-10 23:57:56

   来源:MySQL手册版本 5.0.20    作者:译者:叶金荣

问:如何强制master在slave赶上全部更新之前阻止更新操作?

答:执行以下步骤:

在master上,执行以下语句:

mysql> FLUSH TABLES WITH READ LOCK;

mysql> SHOW MASTER STATUS; 记录下结果中的日志文件名以及偏移位置,它们是同步的坐标值。

在slave上,提交以下语句,MASTER_POS_WAIT() 函数的参数的值就是前面取得的同步坐标值:

mysql> SELECT MASTER_POS_WAIT('log_name', log_offset);

SELECT 语句会阻止更新,直到slave同步到了上述日志文件及位置。在这个时候,slave就和master保持同步了,并且这个语句就会返回。

在master上,执行以下语句允许master重新处理更新操作:

mysql> UNLOCK TABLES;

问:设置一个双向复制时要注意什么问题?

答:MySQL同步目前还不支持任何在master和slave上的分布式(跨服务器)更新锁协议以保证操作的原子性。也就是说,存在这样的可能性:客户端A在并存的master 1上做了一个更新,同时,在它同步到并存master 2上之前,客户端B在master 2上可能也做了一个和客户端A在master 1上不同的更新操作。因此,当客户端A所做的更新同步到master 2时,它将产生和master 1上不同的数据表,尽管master 2上的更新操作也全都同步到master 1上去。这意味着除非能确保所有的更新都能以任何顺序安全地执行,否则不要使用双向同步,或者除非注意在客户端程序中的不知原因的无序更新操作。

同时也要意识到在所关心的更新问题上,双向同步实际上并不能很大地改善性能(甚至没有)。两个服务器都需要执行同样数量的更新操作,在一台服务器上也是。唯一区别的是,可能这样做会减少一些锁争夺,因为来自其他服务器的更新操作都会被串行地放到slave线程中。甚至这种好处还可以作为网络延迟的补偿。

问:我如何利用同步来提高系统性能?

答:需要安装一个服务器作为master并且把所有的写操作直接放在这上面。然后配置多个廉价的使用机架磁盘的slave,把读操作分配给master和slave。还可以在启动slave时使用 --skip-innodb, --skip-bdb, --low-priority-updates,和 --delay-key-write=ALL 选项来提高slave端的性能。这种情况下,slave会使用非事务的 MyISAM 表来代替 InnoDB 和 BDB 表,已取得更快速度。

问:如何准备客户端应用程序的代码来适应同步应用?

答:如果代码中负责存取数据库的部分已经被合理地抽象化/模块化了,将它们转化成适用运行于同步环境中将会很平滑和简单。只需要修改数据库存取实现部分,把所有的写操作放到master上,把所有的读操作放到master或者slave上。如果你的代码还没达到这个层次的抽象化,那么这将成为整理代码的机会和动机。可以使用类似以下函数创建封装类库或者模块:

safe_writer_connect()

safe_reader_connect()

safe_reader_statement()

safe_writer_statement()

每个函数名的 safe_ 表示它们会处理所有的错误情况。可以使用其他函数名。重要的是,要为读连接、写连接、读、写定义好统一的接口。

然后将客户端代码转换成使用封装的类库。已开始可能是很痛苦且麻烦的,不过在将来长期运行中就能得到回报了。所有使用上述方法的应用程序都会在master/slave配置中有优势,即使包含多个slave。这些代码将很容易维护,一些额外的麻烦也会很少。自豪需要修改一个或者两个函数;例如,想要记录每个语句执行了多长时间,或者在上千个语句中哪个出现错误了。

如果已经写了很多代码,你可能想要自动转换它们,那么可以使用MySQL发布的 replace 工具,或者自己写转换脚本。理想地,你的代码已经使用了统一的编程风格。如果不是,最好重写它们,或者可以遍历检查一下,手工规范化一下代码风格。

阅读(352) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~