1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 呕心沥血博一文--MySQL主从异步复制

呕心沥血博一文--MySQL主从异步复制

时间:2022-09-23 18:07:04

相关推荐

呕心沥血博一文--MySQL主从异步复制

目录

1、概述

2、主从时间同步

3、主从服务器mysql部署

4、配置、启动从服务

5、测试

6、总结

1、概述

mysql内建的复制功能是mysql应用的“水平扩展”的架构,是mysql高性能运用的基础,为一个服务器配置一个或多个备库来进行数据的同步(准备的说不应该说是“同步”,因为主从服务器的数据根本不可能做同步)。在这样一个分布式的架构中各个服务器间时间应该同步才是,能为后期日志的统计分析提供更为准备的信息,这样才能准确反应出某个时间点我们系统的访问情况。

主从复制是一种异步复制的模型,说成“主从同步”是不精确的,应说是“主从复制”,先有主,再有从。因mysql主从复制原理的限定,在从库上只有一个sql线程(即使在mysql5.6中支持多线程,但也是针对库级别的)来重放中继日志中的事件,这种在主服务器能并发的查询请求在从服务器就成了串行化来执行,这是一个从服务器会慢于主服务器的一个原因。

对主从服务器在硬件选择上的建议:如果在规划主从时考虑到有可能会把从服务器提升为主服务器,那主从服务器硬件配置建议完全相同,应选择核多、主频高的CPU,频率高、总容量大的内存,多块高速的SAS硬盘(或SSD)及带有BBU的RAID卡,在RAID级别上建议选择raid10或raid50;如果从库只是用来作为主库的一个副本,以便于数据的备份,那从服务器的CPU没必要与主服务一个规格,但硬盘的IO这一块还是不要太差,IO高有助于事务的重放效率,在一定程度上能缩小与主库的时间差。

2、主从时间同步

主服务器配置成一ntpd服务器,自身与外网的ntpd服务进行时间校准,而又对从服务器提供时间校准服务。在生产环境中最好不要用ntpdate来强行调整服务器的时间,这样会对让服务器的时间产生空白区,注意,ntpdate工具是调整时间,而不是像ntpd工具一样是校准时间,两者的差别是挺大的。

主服务器基础环境:

[root@master~]#cat/etc/issueCentOSrelease6.4(Final)Kernel\ronan\m[root@master~]#uname-r2.6.32-358.el6.x86_64[root@master~]#ifconfig|grepBcast#从服务器的系统与主服务器相同,只是IP地址是192.168.0.202inetaddr:192.168.0.201Bcast:192.168.0.255Mask:255.255.255.0

安装配置主服务器成为ntpd时间服务器:

[root@master~]#yum-yinstallntp[root@master~]#servicentpdstart#启用服务后等个1-3分钟,就可用ntpq-p命令查看是否能与远程ntpd服务器连接[root@master~]#vi/etc/ntp.conf#配置ntp配置文件,使其成为从服务器的时间服务器……略……#Hostsonlocalnetworkarelessrestricted.#restrict192.168.1.0mask255.255.255.0nomodifynotraprestrict192.168.0.0mask255.255.255.0nomodifynotrap#复制上边一行并启用,把ip修改成本地地址段#外部时间服务器不可用时,以本地时间作为时间服务server127.127.0.0fudge127.127.0.0stratum10……略……[root@master~]#servicentpdrestart#重启服务[root@master~]#chkconfig--level235ntpdon

在从服务器上安装配置ntp:

[root@slave~]#yum-yinstallntp[root@slave~]#vim/etc/f#注释掉默认的时间服务器,加上本地时间服务器……略……#project.#Pleaseconsiderjoiningthepool(http://www./join.html).server192.168.0.201#server0.centos.iburst#erver1.centos.iburst#server2.centos.iburst#server3.centos.iburst……略……[root@slave~]#servicentpdrestart[root@slave~]#chkconfigntpdon[root@slave~]#ntpq-p#监控时间校准的状态信息

测试时可以试着把从服务器的时间调慢几分钟,然后观察从服务器的时间是否会慢慢的赶上来。

3、主从服务器mysql部署

3.1、主服务器安装配置

[root@mastersoftware]#pwd/root/software[root@mastersoftware]#lsmysql-5.6.24-linux-glibc2.5-x86_64.tar.gz[root@mastersoftware]#tarxfmysql-5.6.24-linux-glibc2.5-x86_64.tar.gz-C/usr/local/[root@mastersoftware]#cd/usr/local[root@masterlocal]#ln-svmysql-5.6.24-linux-glibc2.5-x86_64mysql[root@masterlocal]#cdmysql[root@mastermysql]#chown-Rroot.mysql./*[root@mastermysql]#mkdir/mnt/mydata/dbdata#创建数据目录[root@mastermysql]#chown-Rmysql.mysql/mnt/mydata/dbdata[root@mastermysql]#scripts/mysql_install_db--user=mysql--datadir=/mnt/mydata/dbdata/#初始化数据库,如果没有mysql用户请自行创建

因mysql 5.6中的f文件太过简单,所以复制mysql 5.5中的配置文件再作一些修改:

[root@mastermysql]#cp/opt/lamp/mysql55/support-files/my-f/etc/f修改f配置文件[root@mastermysql]#vim/etc/f……#thread_concurrency=8#注释此选项,在5.6中已被放弃#指定数据目录datadir=/mnt/mydata/dbdata#基于Innodb的表让表使用单独的表空间innodb_file_per_table=1#启用慢查询日志slow_query_log=1#如果查询时间长于“long_query_time”设定的值,那就把此查询查询到“slow_query_log_file”文件中long_query_time=1slow_query_log_file=/var/log/mysql/master-slow.log#定义错误日志文件log_error=/var/log/mysql/master.error……#定义二进制日志文件log-bin=/var/log/mysql/mysql-bin#每一次事件提交就使日志同步到磁盘,默认“sync_binlog=0”,表示让系统自己来flush使在内存的日志刷到磁盘,设置为“1”是一种安全的设置,因为当系统crash时你最多丢失一个事件,但相反会增加系统的IO,即使这样也建议设置成“1”sync_binlog=1……#在5.6中已建议把二进制日志的格式修改成“row”binlog_format=row……#设置服务器ID号server-id=100

[root@mastermysql]#cpsupport-files/mysql.server/etc/rc.d/init.d/mysqld56#复制启动脚本[root@mastermysql]#servicemysqld56start[root@mastermysql]#ls/var/log/mysqlmaster.errormaster-slow.logmysql-bin.000001mysql-bin.index[root@mastermysql]#vim/etc/profile.d/mysql56.sh#导出二进制文件路径exportPATH=/usr/local/mysql/bin:$PATH[root@mastermysql]#source/etc/profile.d/mysql56.sh[root@master~]#mysql#数据库连接测试mandsendwith;or\g.YourMySQLconnectionidis22Serverversion:5.6.24-logMySQLCommunityServer(GPL)Copyright(c)2000,,Oracleand/oritsaffiliates.Allrightsreserved.OracleisaregisteredtrademarkofOracleCorporationand/oritsaffiliates.Othernamesmaybetrademarksoftheirrespectiveowners.Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.mysql>

3.2、从服务器安装配置

从服务器的安装方法与主服务器一样,只是在f配置文件有些不同:

[root@slavemysql]#vim/etc/f……#thread_concurrency=2datadir=/mnt/mydata/dbdatainnodb_file_per_table=1log_error=/var/log/mysql/slave.error#relay_logrelay_log=/var/log/mysql/mysql-relay-binsync_relay_log=1#设置让sqlthread读取中继日志中的语句并在本地运用时记录到本地的二进制日志,当然从服务器要打开“log-bin”启用二进制日志,如果此从服务器还可以作为其他从服务器的主服务器,应启用“log_slave_updates=1”log_slave_updates=1#在从服务器的数据中会多出两个文件,一个是master.info和relay-log.info,master.info文件记录了当前从服务器请求主服务器的二进制文件名与偏移量等信息,而relay.info文件记录了从服务器当前所使用的中继日志文件名与偏移量等信息,如果主服务器比较繁忙,文件中记录的偏移量这样的信息是时刻在变化的,可惜的是这些数据不是时时写入磁盘的,是先写进内存,再同步到磁盘,这样可能会对数据带来不一致的问题。在新版本中引入了下边两个变量来控制此行为,表示当每一次事件后就让数据更新到磁盘,也就是更新master.info和relay-log.info两个文件,这样尽可能让数据及时刷新到磁盘,让数据持久化,当然相应增加了系统的IO,但为了数据的安全就是值得的。sync_master_info=1sync_relay_log_info=1#security#设置从库为只读模式,但具有supper权限的用户不受此限制read_only=1#跳过当mysqld启用时自动启用slave线程skip_slave_start……log-bin=/var/log/mysql/mysql-binsync_binlog=1……server-id=200

[root@slavemysql]#servicemysqld56startStartingMySQL..SUCCESS![root@slavemysql]#ls/var/log/mysql#中继日志还没有生成,因从服务器线程没有启动mysql-bin.000001mysql-bin.indexslave.error[root@slavemysql]#ls/mnt/mydata/dbdata/#master.info和relay-log.info两个文件没有生成,因为从服务线程没有启动fibdata1ib_logfile0ib_logfile1mysqlperformance_schemaslave.pidtest[root@slavemysql]#mysql#测试mandsendwith;or\g.YourMySQLconnectionidis3Serverversion:5.6.24-logMySQLCommunityServer(GPL)Copyright(c)2000,,Oracleand/oritsaffiliates.Allrightsreserved.OracleisaregisteredtrademarkofOracleCorporationand/oritsaffiliates.Othernamesmaybetrademarksoftheirrespectiveowners.Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.mysql>

4、配置、启动从服务

上边已把主从服务器各自的f配置文件已设置完毕,要想启动mysql的主从复制功能,现在还差一个从从服务器到主服务器的连接帐户,再启用从服务器上的复制线程即可。

4.1、在主服务器上创建拥有复制权限的帐户

[root@master~]#mandsendwith;or\g.YourMySQLconnectionidis191Serverversion:5.6.24-logMySQLCommunityServer(GPL)Copyright(c)2000,,Oracleand/oritsaffiliates.Allrightsreserved.OracleisaregisteredtrademarkofOracleCorporationand/oritsaffiliates.Othernamesmaybetrademarksoftheirrespectiveowners.Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.mysql>GRANTreplicationslave,replicationclientON*.*TO'repuser'@'192.168.0.%'IDENTIFIEDBY'111111';QueryOK,0rowsaffected(0.01sec)mysql>FLUSHPRIVILEGES;QueryOK,0rowsaffected(0.01sec)mysql>SHOWMASTERSTATUS;#记录下当前主服务器所使用的二进制文件及position+------------------+----------+--------------+------------------+-------------------+|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|Executed_Gtid_Set|+------------------+----------+--------------+------------------+-------------------+|mysql-bin.000001|430||||+------------------+----------+--------------+------------------+-------------------+1rowinset(0.00sec)

4.2、从服务器连接主服务器、启动复制线程

[root@slavemysql]#mandsendwith;or\g.YourMySQLconnectionidis3Serverversion:5.6.24-logMySQLCommunityServer(GPL)Copyright(c)2000,,Oracleand/oritsaffiliates.Allrightsreserved.OracleisaregisteredtrademarkofOracleCorporationand/oritsaffiliates.Othernamesmaybetrademarksoftheirrespectiveowners.Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.mysql>CHANGEMASTERTO->MASTER_HOST='192.168.0.201',->MASTER_USER='repuser',->MASTER_PASSWORD='111111',->MASTER_LOG_FILE='mysql-bin.000001',->MASTER_LOG_POS=0;#这里的偏移量我指定为“0”,零表示从开二进制日志的开头开始进行复制mysql>SHOWSLAVESTATUS\G#查看slave的状态信息,IOthread和sqlthread线程都还没有启动***************************1.row***************************Slave_IO_State:Master_Host:192.168.0.201Master_User:repuserMaster_Port:3306Connect_Retry:60Master_Log_File:mysql-bin.000001Read_Master_Log_Pos:4Relay_Log_File:mysql-relay-bin.000001Relay_Log_Pos:4Relay_Master_Log_File:mysql-bin.000001Slave_IO_Running:NoSlave_SQL_Running:No……mysql>STARTSLAVE;#启动复制线程mysql>SHOWSLAVESTATUS\G#两个线程已启动***************************1.row***************************Slave_IO_State:WaitingformastertosendeventMaster_Host:192.168.0.201Master_User:repuserMaster_Port:3306Connect_Retry:60Master_Log_File:mysql-bin.000001Read_Master_Log_Pos:430Relay_Log_File:mysql-relay-bin.000002Relay_Log_Pos:593Relay_Master_Log_File:mysql-bin.000001Slave_IO_Running:YesSlave_SQL_Running:Yesmysql>SHOWGRANTSFOR'repuser'@'192.168.0.%';#这个复制所用的帐户已经从主服务器复制到了从服务器+--------------------------------------------------------------------------------------------------------------------------------------------------+|Grantsforrepuser@192.168.0.%|+--------------------------------------------------------------------------------------------------------------------------------------------------+|GRANTREPLICATIONSLAVE,REPLICATIONCLIENTON*.*TO'repuser'@'192.168.0.%'IDENTIFIEDBYPASSWORD'*FD571203974BA9AFE270FE62151AE967ECA5E0AA'|+--------------------------------------------------------------------------------------------------------------------------------------------------+1rowinset(0.00sec)

5、测试

在主服务器上创建、修改数据:

mysql>CREATEDATABASEmydb1;QueryOK,1rowaffected(0.00sec)mysql>USEmydb1;Databasechangedmysql>CREATETABLEtb1(idINTUNSIGNEDAUTO_INCREMENTPRIMARYKEY,nameCHAR(20)NOTNULL,ageTINYINTUNSIGNED);QueryOK,0rowsaffected(0.05sec)mysql>INSERTINTOtb1(name,age)VALUES('tom',12),('jem',23);QueryOK,2rowsaffected(0.01sec)Records:2Duplicates:0Warnings:0

在从服务器上查看在主服务器的修改:

[root@slavemysql]#mandsendwith;or\g.YourMySQLconnectionidis6Serverversion:5.6.24-logMySQLCommunityServer(GPL)Copyright(c)2000,,Oracleand/oritsaffiliates.Allrightsreserved.OracleisaregisteredtrademarkofOracleCorporationand/oritsaffiliates.Othernamesmaybetrademarksoftheirrespectiveowners.Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.mysql>SELECT*FROMmydb1.tb1;+----+------+------+|id|name|age|+----+------+------+|1|tom|12||2|jem|23|+----+------+------+2rowsinset(0.00sec)

测试证明:在主服务器上的修改已复制到了从服务器上。

6、总结

mysql的主从复制已搭建完毕,但这种复制并不能替代数据库的备份。由于从服务器是单进程模型(mysql 5.6的多线程也只能是库级别的),所以在一个比较繁忙的mysql系统上,从服务器可能会落后主服务器,这是mysql主从复制架构原生带来的特性,并不能真正做到主从的同步,所以在后期的维护工作中我们要用到一些监控工具来及时发现从服务器是否真正落后主服务器。在博文的最开始已提到在这种分布式的架构中时间同步的重要性,在用“show slave status\G”查看从服务器状态时有一个变量“Seconds_Behind_Master”这个值就是反应从服务器落后主服务器的时间,详细一点就是说明从服务器的SQL thread处理中继日志中的事件时,会把主服务器上日志中的timestamp与从服务器运行sql thread时的时间进行相关运算,这个差值就是“Seconds_Behind_Master”的值,所以主从服务器间的同步显得格外的重要。

“Seconds_Behind_Master”的值为0也不代表主服务器与从服务器已经同步,只能说sql thread已把relay log中的事件执行完了,因为主服务器的bin log不会实时的同步到从服务器上,从服务器上的relay log总会落后于主服务器的bin log,所以“Seconds_Behind_Master”这个值不具有真正意义上的参考价值。要监控主从是否一致,可以用percona-tools工具集中的pt-heartbeat工具。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。