前几天刚刚注册了博客园,我想写一些技巧性的教程,今天给大家分享一个MySQL同步常见问题解答。

Q:如果主服务器正在运行并且不想停止主服务器,怎样配置一个从服务器?

A:有多种方法。如果你在某时间点做过主服务器备份并且记录了相应快照的二进制日志名和偏移量(通过SHOW MASTER STATUS命令的输出),采用下面的步骤:

1.确保从服务器分配了一个唯一的服务器ID号。

2.在从服务器上执行下面的语句,为每个选项填入适当的值:
mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_USER='master_user_name',
-> MASTER_PASSWORD='master_pass',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;

3.在从服务器上执行START SLAVE语句。

如果你没有备份主服务器,这里是一个创建备份的快速程序。所有步骤都应该在主服务器主机上执行。

1.发出该语句:
mysql> FLUSH TABLES WITH READ LOCK;

2.仍然加锁时,执行该命令(或它的变体):
shell> tar zcf /tmp/backup.tar.gz /var/lib/mysql

3.发出该语句并且确保记录了以后用到的输出:
mysql>SHOW MASTER STATUS;

4.释放锁:
mysql> UNLOCK TABLES;

一个可选择的方法是,转储主服务器的SQL来代替前面步骤中的二进制复制。要这样做,你可以在主服务器上使用mysqldump --master-data,以后装载SQL转储到到你的从服务器。然而,这比进行二进制复制速度慢。

不管你使用这两种方法中的那一个,当你有一个快照和记录了日志名与偏移量时,后来根据说明操作。你可以使用相同的快照建立多个从服务器。一旦你拥有主服务器的一个快照,可以等待创建一个从服务器,只要主服务器的二进制日志完整。两个能够等待的时间实际的限制是指在主服务器上保存二进制日志的可用硬盘空间和从服务器同步所用的时间。

你也可以使用LOAD DATA FROM MASTER。这是一个方便的语句,它传输一个快照到从服务器并且立即调整日志名和偏移量。将来,LOAD DATA FROM MASTER将成为创建从服务器的推荐方法。然而需要注意,它只工作在MyISAM表上并且可能长时间持有读锁定。它并不象我们希望的那样高效率地执行。如果你有大表,执行FLUSH TABLES WITH READ LOCK语句后,这时首选方法仍然是在主服务器上制作二进制快照。

Q:从服务器需要始终连接到主服务器吗?

A:不,不需要。从服务器可以宕机或断开连接几个小时甚至几天,重新连接后获得更新信息。例如,你可以在通过拨号的链接上设置主服务器/从服务器关系,其中只是偶尔短时间内进行连接。这意味着,在任何给定时间,从服务器不能保证与主服务器同步除非你执行某些特殊的方法。将来,我们将使用选项来阻塞主服务器直到有一个从服务器同步。

Q:我怎样知道从服务器与主服务器的最新比较? 换句话说,我怎样知道从服务器复制的最后一个查询的日期?

A:你可以查看SHOW SLAVE STATUS语句的Seconds_Behind_Master列的结果。当从服务器SQL线程执行从主服务器读取的事件时,它根据事件时间戳修改自己的时间(这是TIMESTAMP能够很好复制的原因)。在SHOW PROCESSLIST语句输出的Time列内,为从服务器SQL线程显示的秒数是最后一个复制事件的时间戳和从服务器主机的实际时间之间相差的秒数。你可以使用它来确定最后一个复制事件的日期。注意,如果你的从服务器与主服务器连接断开一个小时,然后重新连接,在SHOW PROCESSLIST结果中,你可以立即看到从服务器SQL线程的Time值为3600。这可能是因为从服务器执行的语句是一个一小时之前的。

Q:我怎样强制主服务器阻塞更新直到从服务器同步?

A:使用下面的步骤:

1.在主服务器上,执行这些语句:
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;

记录SHOW语句的输出的日志名和偏移量。这些是复制坐标。

2.在从服务器上,发出下面的语句,其中Master_POS_WAIT()函数的参量是前面步骤中的得到的复制坐标值:
mysql> SELECT MASTER_POS_WAIT('log_name', log_offset);

SELECT语句阻塞直到从服务器达到指定的日志文件和偏移量。此时,从服务器与主服务器同步,语句返回。

3.在主服务器上,发出下面的语句允许主服务器重新开始处理更新:
mysql> UNLOCK TABLES;

Q:当设置双向复制时我应该知道发出那些语句?

A:MySQL复制目前不支持主服务器和从服务器之间的任何锁定协议来保证分布式(跨服务器)更新的原子性。换句话说,这样做是可能的:客户A根据协作-主服务器1更新,同时,在它传给协作-主服务器2之前,客户B能够根据协作-主服务器2更新,这样客户A的更新与它在协作-主服务器1的更新不同。这样,当客户A根据协作-主服务器2更新时,它产生的表与在协作-主服务器1上的不同,即使所有根据协作-主服务器2的更新已经传过来。这意味着,在双向复制关系中,你不应该把两个服务器串连在一起,除非你确信任何顺序的更新是安全的,或者除非你在客户端代码中注意怎样避免更新顺序错误。

你还必须认识到从更新角度,双向复制实际上并不能显著地提高性能(或者根本不能提高性能)。两个服务器都需要做相同数量的更新,如同在一个服务器做的那样。唯一的差别是锁竞争要少,这因为源于另一个服务器的更新在一个从线程中序列化。即使这个益处可能被网络延迟抵消。

Q:怎样通过复制来提高系统的性能?

A:你应将一个服务器设置为主服务器并且将所有写指向该服务器。然后根据预算配置尽可能多的从服务器以及栈空间,并且在主服务器和从服务器之间分发读取操作。你也可以用--skip-innodb、--skip-bdb、--low-priority-updates以及--delay-key-write=ALL选项启动从服务器,以便在从服务器端提高速度。在这种情况下,为了提高速度,从服务器使用非事务MyISAM表来代替InnoDB和BDB表。

Q:为了使用高性能的复制,我应该在自己的应用程序中怎样准备客户端代码?

A:如果你的代码中数据库访问部分已经正确地模块化,应该能够平滑和容易地转换为在复制步骤中运行的代码。仅需要更改数据库访问执行部分,以便发送所有的写操作到主服务器,以及发送读操作到主服务器或某个从服务器。如果你的代码没有这个级别,设置一个复制系统以便清除。应先通过下面的函数创建一个包装库或模块:

·safe_writer_connect()
·safe_reader_connect()
·safe_reader_statement()
·safe_writer_statement()

每个函数名的safe_意味着函数比较小心地处理所有错误。你可以使用不同名的函数。重要是对于读连接、写连接、读和写有一个统一的接口。

然后,你应该转换客户端代码使用包装库。刚开始这可能是痛苦和恐慌的过程,但从长远来看是值得的。使用刚才讨论的方法的所有应用程序都能够利用主服务器/从服务器配置的优越性,即使是含有多个从服务器的配置。代码非常容易维护,并且添加排错选项也很容易。你仅需要修改一两个函数;例如,记录每个语句执行的时间,或者你的上千个语句中哪个语句发生了错误。

如果你已经编写了许多代码,你可能想使用replace工具自动进行转换,该工具随标准MySQL一起发布,或可以自己编写转换脚本。理想情况,你的代码使用一致的程序转换风格。否则,可能最好重新编写代码,或者至少手工对其进行规则化以使用一致的风格。

Q:MySQL复制能够何时和多大程度提高系统性能?

A:MySQL复制对于频繁读和频繁写的系统具有最大好处。理论上,通过使用单个主服务器/多从服务器设置,可以通过添加更多的从服务器来扩充系统,直到用完网络带宽,或者你的更新负载已经增长到主服务器不能处理的点。

在获得的收益开始吃平之前,为了确定可以有多少从服务器,以及可以将你的站点的性能提高多少,需要知道查询模式,并且要通过基准测试并根据经验确定一个典型的主服务器和从服务器中的读取(每秒钟读取量,或者max_reads)吞吐量和写(max_writes)吞吐量的关系。通过一个假设的带有复制的系统,本例给出了一个非常简单的计算结果。

假设系统负载包括10%的写和90%的读取,并且我们通过基准测试确定max_reads是1200 –2 × max_writes。换句话说,如果没有写操作,系统每秒可以进行1,200次读取操作,平均写操作是平均读操作所用时间的两倍,并且关系是线性的。我们假定主服务器和每个从服务器具有相同的性能,并且我们有一个主服务器和N个从服务器。那么,对于每个服务器(主服务器或从服务器),我们有:

reads = 1200 – 2 × writes
reads = 9 × writes / (N + 1) (读取是分离的, 但是写入所有服务器)
9 × writes / (N + 1) + 2 × writes = 1200
writes = 1200 / (2 + 9/(N+1))

最后的等式表明了N个从服务器的最大写操作数,假设最大可能的读取速率是每分钟1,200次,读操作与写操作的比率是9。

如上分析可以得到下面的结论:

·如果N = 0(这表明没有复制),系统每秒可以处理大约1200/11 = 109个写操作。

·如果N = 1,每秒得到184个写操作。

·如果N = 8,每秒得到400个写操作。

·如果N = 17,每秒得到480个写操作。

·最后,当 N趋于无穷大(以及我们预算的负无穷大)时,可以得到非常接近每秒600个写操作,系统吞吐量增加将近5.5倍。然而,如果只用8个服务器,增加接近4倍。

请注意,这些计算假设网络带宽无穷大并忽略掉了其它一些因素,那些因素可能对系统产生重要的影响。在许多情况下,不能执行与刚才类似的计算,即如果添加N台复制从服务器,应该准确预报系统将发生哪些影响。回答下面的问题应能够帮助你确定复制是否和在多大程度上能够提高系统的性能:

·系统上的读取/写比例是什么?

·如果减少读取操作,一个服务器可以多处理多少写负载?

·网络带宽可满足多少从服务器的需求?

Q:如何使用复制来提供冗余/高可用性?

A:利用目前的可用特性,必须设置一个主服务器和一个从服务器(或多个从服务器),以及写一个脚本来监视主服务器是否启动。如果主服务器失败,通知应用程序和从服务器切换主服务器。下面是一些建议:

·告知从服务器更改其主服务器,使用CHANGE MASTER TO语句。

·通知应用程序主服务器位置的一个很好的方法是对主服务器提供动态DNS入口。用bind可以使用nsupdate动态更新DNS。

·应该用--logs-bin选项而不用 --logs-slave-updates选项运行从服务器。这样,一旦你在其它从服务器上发出STOP SLAVE; RESET MASTER, 以及CHANGE MASTER TO语句,该从服务器可以切换为主服务器。例如,假设有下面的设置:

WC
\
v
WC----> M
/ | \
/ | \
v v v
S1 S2 S3

M代表主服务器,S代表从服务器,WC代表发出数据库写和读取操作的客户;只发出数据库读取操作的客户没有给出,因为它们不需要切换。S1、S2以及S3是从服务器,用--logs-bin选项而没有用--logs-slave-updates运行。因为从服务器收到的主服务器的更新没有记录在二进制日志中,除非指定 --logs-slave-updates选项,每个从服务器上的二进制日志是空的。如果因为某些原因M 变得不可用,你可以选取一个从服务器变为新的主服务器。例如,如果你选取了S1,所有WC应该重新指向S1和S2,并且S3然后应从S1复制。

确保所有从服务器已经处理了中继日志中的所有语句。金丝阁在每个从服务器上,发出STOP SLAVE IO_THREAD语句,然后检查SHOW PROCESSLIST语句的输出,直到你看到Has read all relay log。当所有从服务器都执行完这些,它们可以被重新配置为一个新的设置。在被提升为主服务器的从服务器S1上,发出STOP SLAVE和RESET MASTER语句。

在其它从服务器S2和S3上,使用STOP SLAVE和CHANGE MASTER TO MASTER_HOST='S1'(其中'S1'表示S1实际的主机名)。为CHANGE MASTER添加关于从S2或S3如何连接到S1的所有信息(user、password、port)。在CHANGE MASTER命令中,不需要指定从其读取的S1的二进制日志名或二进制日志位置:我们知道它是第1个二进制日志,位置是4,这是CHANGE MASTER命令的默认值。最后,在S2和S3上使用START SLAVE 命令。

然后,指示所有WC把它们的语句指向S1。此后,WC发出的所有发送到S1的更新语句被写入S1的二进制日志,S1则包含M死掉之后的发送到 S1的每一个更新语句。

结果是下面的配置:

WC
/
|
WC | M(unavailable)
\ |
\ |
v v
S1<--S2 S3
^ |
+-------+

当M重新启动后,你必须在M上发出相同的CHANGE MASTER语句,与在S2和S3上发出的语句一样,以便M变为S1的从服务器并且恢复在它宕机后丢失的所有WC写操作。要把 M 再次作为主服务器(例如,因为它是功能最强的机器),使用前面的步骤,好像S1不可用并且M变为一个新的主服务器一样。在这个过程中,在S1、S2以及S3作为M的从服务器之前,不要忘记在M上运行RESET MASTER。否则,它们可能拾取M变得不可用之前的旧WC写操作。

我们目前正在MySQL集成自动主服务器选择系统,但在准备好之前,你必须创建自己的监控工具。

MySQL同步常见问题解答(自己的小心得)的更多相关文章

  1. mysql同步复制异常的常见操作-传统复制方式

    mysql同步复制异常的常见操作-传统复制方式 一.传统复制方式是基于非gtid的,常见的错误有1032和1062 1032是主键冲突,1062是从库中没有找到对应的记录. 可以查看出现错误的binl ...

  2. # ConfigureAwait常见问题解答

    原文: https://devblogs.microsoft.com/dotnet/configureawait-faq/ .NET 在七多年前在语言和类库添加了 async/await .在那个时候 ...

  3. Delphi XE5 常见问题解答

    Delphi XE5 常见问题解答 有关于新即时试用的问题吗?请看看 RAD Studio 即时试用常见问答. 常见问题 什么是 Delphi? Embarcadero? Delphi? XE5 是易 ...

  4. SSL/TLS 高强度加密: 常见问题解答

    关于这个模块 mod_ssl 简史 mod_ssl会受到Wassenaar Arrangement(瓦森纳协议)的影响吗? mod_ssl 简史 mod_ssl v1 最早在1998年4月由Ralf ...

  5. [!!!!!]Inno Setup教程-常见问题解答

    [转]Inno Setup教程-常见问题解答 功能 * 翻译 Inno Setup 文字  * 它支持 MBCS (多字节字符集) 吗?  * 将来会支持 Windows Installer 吗?   ...

  6. 我个人有关 Azure 网络 SLA、带宽、延迟、性能、SLB、DNS、DMZ、VNET、IPv6 等的 Azure 常见问题解答

    Igor Pagliai(微软)   2014 年 9月 28日上午 5:57  年 11 月 3 年欧洲 TechEd 大会新宣布的内容). 重要提示:这篇文章中我提供的信息具有时间敏感性,因为这些 ...

  7. Linux的常见问题解答和管理技巧

    Linux的常见问题解答和管理技巧 一. 如何建立多用户 提醒大家一句,别一直使用root用户,因为root用户在系统中有着至高无上的权力,一不小心就可能破坏系统.比如我们想删除/temp目录下的文件 ...

  8. 查询执行成本高(查询访问表数据行数多)而导致实例 CPU 使用率高是 MySQL 非常常见的问题

    MySQL CPU 使用率高的原因和解决方法_产品性能_常见问题_云数据库 RDS 版-阿里云 https://help.aliyun.com/knowledge_detail/51587.html ...

  9. 透明数据加密 (TDE)常见问题解答

    透明数据加密 (TDE)常见问题解答问题任何人只要有权访问加密数据就能对其进行解密吗?TDE 会带来哪些开销?哪些加密算法可与 TDE 一同使用?可以使用第三方加密算法代替 TDE 提供的算法吗?可以 ...

随机推荐

  1. js变量声明作用域问题

    1.先来看两个题 var a = 1; foo1(); function foo1(){ console.log(a); //输出1 }; foo2(); var a = 1; function fo ...

  2. 页面width与height使用百分比来划分不起作用解决办法--记录六

    有时候你写 <div style="width:80%;height:100%;border:1px solid red"></div> <div s ...

  3. react+redux教程(八)连接数据库的redux程序

    前面所有的教程都是解读官方的示例代码,是时候我们自己写个连接数据库的redux程序了! 例子 这个例子代码,是我自己写的程序,一个非常简单的todo,但是包含了redux插件的用法,中间件的用法,连接 ...

  4. C# 获取Excel中的合并单元格

    C# 获取Excel中的合并单元格 我们在制作表格时,有时经常需要合并及取消合并一些单元格.在取消合并单元格时需要逐个查找及取消,比较麻烦.这里分享一个简单的方法来识别Excel中的合并单元格,识别这 ...

  5. Oracle逻辑迁移某业务用户及数据

    1.确定基本信息 2.源数据库导出 3.目的数据库导入 4.逻辑迁移注意事项 1.确定基本信息 确定基本信息: 源数据库所在系统类型:________ 源数据库地址:__.__.__.__ 源数据库版 ...

  6. 读书笔记--SQL必知必会22--高级SQL特性

    22.1 约束 约束(constraint),管理如何插入或处理数据库数据的规则. DBMS通过在数据库表上施加约束来实施引用完整性. 大多数约束是在表定义中定义的. 22.1.1 主键 主键,用来保 ...

  7. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍

    一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...

  8. iOS: 为画板App增加 Undo/Redo(撤销/重做)操作

    这个随笔的内容以上一个随笔为基础,(在iOS中实现一个简单的画板),上一个随笔实现了一个简单的画板:   今天我们要为这个画板增加Undo/Redo操作,当画错了一笔,可以撤销它,或者撤销之后后悔了, ...

  9. RabbitMQ Config

    默认访问地址:http://localhost:15672/ 要想修改内网访问: %APPDATA%\RabbitMQ\ 目录下添加文件 rabbitmq.config [ {rabbit, [%% ...

  10. Android Studio的SVN Performing VCS Refresh/Commit 长时间不结束

    给Android Studio项目里面的一个文件改名以后,再提交SVN时总是提示冲突,没办法解决.再后来不知道怎么弄的,每次提交时停留在SVN Performing VCS Refresh始终都不会完 ...