资源预览内容
第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
第9页 / 共18页
第10页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
高可用数据库架构设计处编码BBX968T-XBB8968-NNJ668-MM9N标准化管MySQL数据库高可用架构设计目标:MySQL数据库服务器不受单点宕机的影响,即时A服务器挂掉或者磁盘损坏物理故障导 致数据库不可用也不会导致整个系统处于不可用状态,因为还有另外一台备用的数据库服 务器可以提供服务。派宝箱采取方案双机主从热备(Mater Slave模式)背景:双机热备的概念简单说一下,就是要保持两个数据库的状态自动同步。对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一致。这样做的好处:1. 可以做灾备,其中一个坏了可以切换到另一个。2. 可以做负载均衡,可以将请求分摊到其中任何一台上,提高网站吞吐量。对于异地热备,尤其适合灾备。原理:MySQL Replication双机热备+每天自动sqldump出物理文件备份双机主从自动热备实现数据库服务的高可用加sqldump导出数据文件的方式备份。双重保险!可能遇到的问题与挑战:主从数据库数据一致性问题 宕机后主从切换的问题1复制概述Mysql内建的复制功能(MySQL REPLICATION)是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数 据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当 主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文 件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。 当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功 更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的 更新。请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须 要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间 的冲突。mysql支持的复制类型:(1):基于语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样 的语句。MySQL默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选着基于行的复制。(2):基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍.从开始支持(3):混合类型的复制:默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。复制解决的问题MySQL复制技术有以下一些特点:(1) 数据分布(Data distribution )(2) 负载平衡(load balancing)(3) 备份(Backups)(4) 高可用性和容错行 High availability and failover复制如何工作整体上来说,复制有3个步骤:(1) mas ter将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件, binary log events);(2) slave 将 mas ter 的 binary log eve nts 拷贝到它的中继日志(relay log);(3) slave重做中继日志中的事件,将改变反映它自己的数据。下图描述了复制的过程:该过程的第一部分就是mas ter记录二进制日志。在每个事务更新数据完成之前,mas ter 在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交 叉执行的。在事件写入二进制日志完成后,mas ter通知存储引擎提交事务。下一步就是slave将mas ter的binary log拷贝到它自己的中继日志。首先,slave开 始一个工作线程I/O线程。I/O线程在mas ter上打开一个普通的连接,然后开始binlog dump process。Binlog dump process 从 mas ter 的二进制日志中读取事件,如果 已经跟上mas ter,它会睡眠并等待mas ter产生新的事件。I/O线程将这些事件写入中继 日志。SQL slave thread (SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事 件,并重放其中的事件而更新slave的数据,使其与mas ter中的数据一致。只要该线程 与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。此外,在mas ter中也有一个工作线程:和其它MySQL的连接一样,slave在mas ter中 打开一个连接也会使得mas ter开始一个线程。复制过程有一个很重要的限制 复制在 slave上是串行化的,也就是说mas ter上的并行更新操作不能在slave上并行操作。2 .复制配置有两台MySQL数据库服务器Mas ter和slave,Mas ter为主服务器,slave为从服务器, 初始状态时,Mas ter和slave中的数据信息相同,当Mas ter中的数据发生变化时, slave也跟着发生相应的变化,使得mas ter和slave的数据信息同步,达到备份的目 的。要点:负责在主、从服务器传输各种修改动作的媒介是主服务器的二进制变更日志,这个日志记 载着需要传输给从服务器的各种修改动作。因此,主服务器必须激活二进制日志功能。从 服务器必须具备足以让它连接主服务器并请求主服务器把二进制变更日志传输给它的权 限。环境:Mas ter和slave的MySQL数据库版本同为操作系统:unbuntuIP地址:、创建复制帐号1、在Mas ter的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码 连接mas ter。进行复制操作的用户会授予REPLICATION SLAVE权限。用户名的密码都会 存储在文本文件中命令如下:mysql GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.*IDENTIFIED BY 1234;建立一个帐户backup,并且只能允许从这个地址上来登陆,密码是1234。(如果因为mysql版本新旧密码算法不同,可以设置:)、拷贝数据(假如是你完全新安装mysql主从服务器,这个一步就不需要。因为新安装的mas ter和 slave有相同的数据)关停Mas ter服务器,将Mas ter中的数据拷贝到B服务器中,使得Mas ter和slave中的 数据同步,并且确保在全部设置操作结束前,禁止在Mas ter和slave服务器中进行写操 作,使得两数据库中的数据一定要相同!、配置 master接下来对mas ter进行配置,包括打开二进制日志,指定唯一的servr ID。例如,在配置 文件加入如下值:serverid=1logbin二mysqlbin server-id:为主服务器A的ID值log-bin:二进制变更日值 重启 mas ter,运行 SHOW MASTER STATUS,输出如下:、配置slaveSlave的配置与mas ter类似,你同样需要重启slave的MySQL。如下:log_bin = mysql-binserver_id = 2relay_log = mysqlrelaybinlog_slave_updates = 1read_only = 1server_id是必须的,而且唯一。slave没有必要开启二进制日志,但是在 一些情况下,必须设置,例如,如果slave为其它slave的mas ter,必须设置bin_log。 在这里,我们开启了二进制日志,而且显示的命名(默认名称为hostname,但是,如果 hostname改变则会出现问题)。relay_log配置中继日志,log_slave_updates表示slave 将复制事件写进自己的二进制日志(后面会看到它的用处)。有些人开启了 slave的二进制 日志,却没有设置log_slave_updates,然后查看slave的数据是否改变,这是一种错误 的配置。所以,尽量使用read_only,它防止改变数据(除了特殊的线程)。但是, read_only并是很实用,特别是那些需要在slave上创建表的应用。、启动slave接下来就是让slave连接mas ter,并开始重做mas ter二进制日志中的事件。你不应该用 配置文件进行该操作,而应该使用CHANGE MASTER TO语句,该语句可以完全取代对配置 文件的修改,而且它可以为slave指定不同的mas ter,而不需要停止服务器。如下:mysql CHANGE MASTER TO MASTER_HOST二serverl, - MASTER_USER=repl,- MASTER_PASSWORD二p4ssword,- MASTER_LOG_FILE二,- MASTER_LOG_POS=O;MASTER_LOG_POS的值为0,因为它是日志的开始位置。你可以用SHOW SLAVE STATUS语句查看slave的设置是否正确:mysql SHOW SLAVE STATUSG* 1. row *Slave_I0_State:Master_Host: serverlMaster_User: replMaster_Port: 3306Connect_Retry: 60Master_Log_File:Read_Master_Log_Pos: 4Relay_Log_File:Relay_Log_Pos: 4Relay_Master_Log_File:Slave_IO_Running: NoSlave_SQL_Running: No.om itt ed.Seconds_Behind_Master: NULLSlave_IO_State, Slave_IO_Running,和 Slave_SQL_Running 是 No表明slave还没有开始复制过程。日志的位置为4而不是0,这是因为0只是日志文件的 开始位置,并不是日志位置。实际上,MySQL知道的第一个事件的位置是4。为了开始复制,你可以运行:mysql START SLAVE;运行SHOW SLAVE STATUS查看输出结果:mysql SHOW SLAVE STATUSG* . row *Slave_IO_State: Waiting for master to send eventMaster_Host: serverlMaster_User: replMaster_Port: 3306Connect_Retry: 60Master_Log_File:Read_Master_Log_Pos: 164Relay_Log_File:Relay_Log_Pos: 164Relay_Master_Log_FileSlave_IO_Running: YesSlave_SQL_Running: Yes.om itt ed.Seconds_Behind_Master: 0在这里主要是看:Slave_IO_Running=YesSlave_SQL_Running=Yesslave的I/O和S
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号