设为首页 收藏本站
查看: 677|回复: 0

[经验分享] MySQL主从复制、基于SSL的主从复制、主主复制、半同步复制

[复制链接]

尚未签到

发表于 2016-10-22 07:35:42 | 显示全部楼层 |阅读模式
MySQL复制分为主从复制,主主复制。





什么是主从复制

主从复制指有一台器做为主服务器,一台或多台服务器做为从服务器。从服务器不写入任何数据,数据的来源是主服务器。复制的目的是为了数据同步,如果从服务器也写入数据的话,在主从架构里,主服务器是不会复制从服务器的数据的,所以会造成数据的不同步,所以,从服务器不能写入数据。MySQL复制的基础,就是二进制日志,因为二进志日志里面,记录了所有能改变或者能潜在改变数据库数据的SQL语句,当从服务器把这些SQL语句复制过来之后,再执行一遍,数据就会跟主服务器相同了。所以,从服务器的MySQL版本,一定要比主服务器高或才跟主服务器相同,最好是主从版本一样,这样就不会因为不同版本,SQL语句不同,而造成错误。

什么是主主复制

主主复制是指,两台或多台MySQL服务器,都为主服务器,大家相互复制,这样的好处是,每台服务器,都可以进行数据的写入操作,而主从里面,从服务器是不能进行写操作的。主主复制的原理,跟主从复制差不多,只不过是数据之间,是相互复制,相互同步的。

不管是主从复制,还是主主复制,其复制过程,都是异步的。可以加快数据的查询,而对数据的写入,没有任何提高。做主从或者主主复制,也可以实现对数据的冗余,当从服务器DOWN机的时候,主服务器可以正常工作而不受任何影响。当主服务器DOWN机的时候,只需要将从服务器暂时切换为主服务器即可。也方便数据的备份,备份的时候,可以停止从服务器,然后对从服务器上的数据进行备份,备份完成后,再启用。



主从复制的实现

START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让主服务器发送二进制日志。

主服务器创建一个Binlog Dump线程将二进制日志中的内容发送到从服务器。从服务器I/O 线程读取主服务

器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继

日志。第3个线程是SQL 线程,从服务器使用此线程读取中继日志并执行日志中包含的更新。

SHOW PROCESSLIST语句可以查询在主服务器上和从服务器上发生的关于复制的信息。



从服务器在数据目录中另外创建两个状态文件master.info 和relay-log.info。状态文件保存

在硬盘上,从服务器关闭时不会丢失。下次从服务器启动时,读取这些文件以确定它已经从主服

务器读取了多少二进制日志,以及处理自己的中继日志的程度。



从服务器flush tables with read lock;之后,数据暂时就不能同步了,只有解锁之后,复制过来的语句,才会被执行。

从服务器可以不用关闭二进制日志,也可以不用开户中继日志,因为服务器会自动帮你开户或关闭。不关闭二进制日志,从主服务器复制过来的SQL语句,执行的时候,也不会被记录到二进制日志,只有在本机执行的SQL语句,才会被记录到二进制日志。中继日志默认存放在数据目录下,文件名为 主机名.relay-00000N。如果想保存到其它位置,可以在配置文件里面进行指定。



1、安装MySQL数据库(略)

2、配置主从服务器

主服务器操作




  • #vim/etc/my.cnf
  • server-id=1//一定不能跟从服务器一样,这里使用默认即可
  • log-bin=mysql-bin//开户指定MySQL的二进制日志及保存位置,默认开户,保存在数据目录中
  • sync-binlog=1//立即同步到磁盘,建议开户

  • mysql>GRANTREPLICATIONCLIENT,REPLICATIONSLAVEON*.*TOrepl@'1.1.1.2'IDENTIFIEDBY'123456';
  • mysql>FLUSHPRIVILEGES;
  • REPLICATIONCLIENT允许在复制主机(Master)和从机(Slave)上使用SHOWSTATUS
  • REPLICATIONSLAVE允许复制从服务器连接到主服务器



从服务器操作




  • #vi/etc/my.cnf
  • #log-bin=mysql-bin//加#号表示关闭,也可以不关闭
  • server-id=11//ID号,一定不能跟主服务器相同
  • relay-log=relay-bin//定义中继日志保存的位置及文件名,也可以不用定义
  • relay-log-index=relay-bin-index//中继日志索引文件的名字及保存位置

  • mysql>CHANGEMASTERTOMASTER_HOST='1.1.1.1',MASTER_USER='repl',MASTER_PASSWORD='123456';
  • mysql>STARTSLAVE;
  • mysql>SHOWSLAVESTATUS;



能看到以下两项为YES,说明从服务器工作正常




  • Slave_IO_Running:Yes
  • Slave_SQL_Running:Yes






  • mysql>showprocesslist\G
  • ***************************1.row***************************
  • Id:6
  • User:systemuser
  • Host:
  • db:NULL
  • Command:Connect
  • Time:1159
  • State:Waitingformastertosendevent
  • Info:NULL
  • ***************************2.row***************************
  • Id:7
  • User:systemuser
  • Host:
  • db:NULL
  • Command:Connect
  • Time:-153412
  • State:Slavehasreadallrelaylog;waitingfortheslaveI/Othreadtoupdateit
  • Info:NULL



可以看到有两个线程,一个等待主服务器发送数据的线程,叫I/O,一个读取中继日志并执行,然后等待slave上的I/O线程更新中日志的,叫SQL线程



然后在主服务器上创建一个数据库,在从服务器上查看一下,可以看到数据库,说明是OK的。如果从服务器没有关闭二进制日志,主服务器上创建数据库,在从服务器同步完成后,可以在中从服务器的中继日志里面,看到创建数据库的SQL语句,但是在二进制日志里面,是看不到的。从服务器的二进制日志,只记录直接在从服务器上执行SQL语句,而不记录从主服务器上复制SQL语句,然后执行的语句。在从服务器上直接创建数据库,可以看到,从服务器的二进制日志记录语句的。但是主服务器,不会同步从服务器的数据,这就是主从复制。



也可以把以下配置写到从服务器里面,而不用再CHANGE MASTER TO这么麻烦了,另外还有一些其它的定义。




  • //配置slave服务器/etc/my.cnf文件,添加以下内容:
  • server-id=2#从服务器ID号,不要和主ID相同
  • master-host=1.1.1.3#指定主服务器IP地址
  • master-user=repl#指定在主服务器上可以进行同步的用户名
  • master-password=123456#密码
  • master-port=3306#同步所用端口
  • master-connect-retry=60#断点从新连接时间
  • replicate-ignore-db=mysql#屏蔽对mysql库的同步
  • replicate-do-db=test1#同步的数据库的名称



常用排错命令及其解释:




  • flushmaster;//清空二进制日志
  • flushslave;//清空二进制日志

以上命令,在主从复制出错的时候,特别是报字段重复的时候,清空一下主服务器和从服务器的二进制日志,然后再用CHANGE MASTER TO命令指向,然后再开户从服务器,应该就不会报错了。

注意:以上两个命令会清空二进制日志,在生产环境请确保已经备份了日志,并且没有数据写入。






  • showmasterstatus;//查看主服务器当前使用的二进制文件,及二进制文件的位置

说明:如果不想清空二进制日志,但是错误又不容易排查,可以在指定主服务器的时候,指定主服务器使用的二进制文件和二进制文件的位置,表示从当前二进制文件的位置,开始往后复制。不复制之前的内容。在此之前,可以通过mysqldump命令,先将数据导出,然后再导入到从服务器。来实现数据一致,然后再使用命令指定二进制文件及位置,以确保主从数据一致。



以上,到此,主从复制就结束了。




转自:http://www.iyunv.com/Linux/2012-06/61711.htm

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-289576-1-1.html 上篇帖子: 利用PowerDesigner12、MySql、JDBC反向数据库结构、生成ER图 下篇帖子: MySQL数据库服务器逐渐变慢 该如何分析与解决 【待看】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表