蓝盟IT小贴士,来喽!
复制概述
内置于Mysql中的复制功能是构建大规模、高性能应用程序的基础。 将Mysql数据分布到多个系统的机制是通过将Mysql中的一台主机的数据复制到另一台主机(slaves )并再次运行来实现的。 在复制期间,一台服务器充当主服务器,一台或多台其他服务器充当辅助服务器。 主服务器将更新写入二进制日志文件,并保留文件索引以跟踪日志循环。 这些日志可以记录服务器发送的更新。 从服务器连接到主服务器后,将主服务器从日志中读取的最后一次正常更新的位置通知主服务器。 从服务器接收从该时间点发生的更新,并阻止主服务器通知新更新。
请注意,在进行复制时,必须在主服务器上更新复制过程中的所有表。 否则,必须注意避免用户对主服务表的更新和对从服务表的更新之间的冲突。
mysql支持的复制类型:
基于语句的复制:在主服务器上执行的SQL语句在从服务器上执行相同的语句。 MySQL默认采用基于语句的复制,非常高效。 如果检测到无法正确复制,则会自动选择基于行的复制。
基于行的复制:复制更改的内容,而不是在从服务器上执行一次命令。 从mysql5.0开始支持
混合型复制:默认采用基于语句的复制,如果检测到基于语句的准确复制,则采用基于行的复制。
复制解决的问题
MySQL复制技术具有以下特征:
数据分布(Data distribution )
负载平衡(load balancing )
备份(Backups )
高可用性和容错行High availability and failover
复制的机制
总体来说,复制有三个步骤。
master在二进制日志(binary log )中记录更改(这些记录称为二进制日志事件,binary log events )。
slave将master的binary log events复制到其中继日志(relay log )中
slave重做中继日志中的事件将更改以反映自己的数据。
下图显示了复制的步骤。
这个过程的第一部分是主节点记录二进制日志。 在每个事务的更新数据完成之前,master会在两个日志中记录这些更改。 即使事务中的语句交叉执行,MySQL也将事务串行写入二进制日志。 事件写入二进制日志完成后,master通知存储引擎提交事务。下一步是slave将master的binary log复制到自己的中继日志中。 首先,slave开始工作线程——I/O线程。 I/O线程在主服务器上打开正常连接,启动binlog dump process。 Binlog dump process从master的二进制日志中读取事件,赶上master后进入睡眠,等待master发生新的事件。 I/O线程将这些事件写入中继日志。
处理SQL slave thread(SQL来自线程)过程的最后一步。 SQL线程从中继日志读取事件,播放其中的事件,更新slave的数据,与master的数据一致。 只要该线程与I/O线程一致,中继日志通常就在OS的缓存中,因此中继日志的开销很小。
另外,master还有工作线程。 与其他MySQL连接一样,如果slave在master中打开连接,master将启动线程。 复制过程中重要的限制——个复制通过slave串行化。 也就是说,master中的并行更新操作在slave中不能进行并行操作。
主机从属复制配置
有两台MySQL数据库服务器Master和slave。 Master是主服务器,slave是从服务器。 初始状态下,Master和slave的数据信息相同。 当Master的数据变化时,slave也相应变化,Master和slave的数据信息同步,达到备份目的。
要点:用主从设备传输各种修正动作的介质是主服务器的二进制变更日志,该日志中记载了向从属服务器传输的各种修正动作。 因此,主服务器必须启用二进制记录功能。 从属服务器必须有足够的权限连接到主服务器,并将二进制更改日志转发到主服务器。
环境:
Master和slave的MySQL数据库版本相同,为5.0.18
IP地址: 10.100.0.100
创建帐户的副本
1、在Master数据库中创建备份帐户。 每个slave使用标准的MySQL用户名和密码连接到Master。 进行复制操作的用户将被授予复制滑动权限。 用户名的密码保存在文本文件master.info中命令如下。
mysql是GRANT REPLICATION SLAVE、RELOAD、SUPER ON *.*
to backup @’10.100.0.200’
identified by‘1234’;
创建帐户backup,只能从地址10.100.0.200登录。 密码是1234。
如果mysql版本的新旧密码算法不同,可以进行如下设置:
setpasswordfor ' backup ' @ ' 10.100.0.200 '=old _ password (' 1234 ' )
复制数据: (如果完全新安装mysql主从服务器,则不需要此步骤。 因为新安装的master和slave有相同的数据)
停止Master服务,将Master的数据复制到b服务,使Master和slave的数据同步,在所有的设定操作结束前禁止在Master和slave服务中写入,两个数据库的数据一定相同
设置主节点
然后配置主节点,例如打开二进制日志并指定唯一的servr ID。 例如,向配置文件添加以下值:
server-id=1
log-bin=mysql-bin
server-ID :主服务器a的id值
log-bin :二进制更改日期值
重新启动master,运行SHOW MASTER STATUS时,输出如下。
slave配置
Slave的配置与master类似,需要重新启动Slave的MySQL。 这样做:
log_bin=mysql-bin
server_id=2
relay_log=mysql-relay-bin
log_slave_updates=1
read_only=1
#server_id :必需且唯一。
log_bin:slave不需要打开二进制日志bin_log,但在某些情况下需要设置。 例如,如果slave是其他slave的master,则必须设置bin_log。 在此,打开二进制日志并指定显示的名称(默认名称为hostname,但如果hostname更改,则会出现问题)。relay_log :配置中继日志。 log_slave_updates表示slave将复制事件写入自己的二进制日志(稍后有用)。 有些人打开了slave的二进制日志,但没有设置log_slave_updates,确认slave的数据是否有更改是错误的配置。
read _ only :尽量使用read _ only来防止除特殊线程以外的数据更改。 但是,read_only很实用,特别是需要在slave上制作表的应用。
启动slave
然后,让slave连接到master,并重试master二进制日志事件。 必须使用CHANGE MASTER TO语句,而不是在性能分析中执行此操作。 此语句可以完全替换对配置文件的更改,并且可以在不停止服务器的情况下为slave指定不同的master。 这样做:
mysql大于changemastertomaster _ host=' server1',
大于MASTER_USER='repl '。
大于MASTER_PASSWORD='p4ssword '。
大于- master _ log _ file=' MySQL-bin.000001 '
大于MASTER_LOG_POS=0
MASTER_LOG_POS的值为0,因为它是日志的开始位置。
可以使用SHOW SLAVE STATUS语句检查slave的设置是否正确。
mysql大于SHOW SLAVE STATUS\G
**
Slave_IO_State:
master_host:服务器1
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
master _ log _ file 3360 MySQL-bin.000001
Read_Master_Log_Pos: 4
relay _ log _ file 3360 MySQL-relay-bin.000001
Relay_Log_Pos: 4relay _ master _ log _ file 3360 MySQL-bin.000001
Slave_IO_Running: No否
Slave_SQL_Running: No否
. omitted .
Seconds_Behind_Master: NULL
Slave_IO_State、Slave_IO_Running和Slave_SQL_Running为No,表示slave还没有开始复制过程。 日志的位置是4而不是0。 这是因为0是日志文件的开始位置,不是日志的位置。 事实上,MySQL知道的第一个事件的位置是4。