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

[经验分享] MySQL主从复制原理深入讲解

[复制链接]

尚未签到

发表于 2018-10-5 07:50:17 | 显示全部楼层 |阅读模式
  利用MySQL自身提供的主从复制技术,在企业生产场景中,可以很好的对数数据进行多处自动备份,并且实现数据库的扩展。比如:在做定时备份时,备份的过程可能需要锁表操作,在备份锁表期间,用户无法访问数据,虽然可以选择在业务低谷期进行备份,但是多少都会有影响,这时可以通过主从复制的从库进行锁表备份。在主从复制的基础上通过读写分离技术还能提升数据库的负载性能(主库写,从库读)。
  主从复制模型
  一主一从
  一主多从
  双主
  线性级联
  环状级联
  这次用来讲解的是一主一从模型
  主从复制原理图
DSC0000.jpg

  主从复制过程存在三个线程,Master端的I/O线程,Slave的I/O线程与SQL线程。Master端需要开启binlog日志,Slave端需要开启relay日志。
  1、Slave端的I/O读取master.info文件,获取binlog文件名和位置点,然后向Master端的I/O线程请求,该binlog文件名和位置点的binlog信息。
  (master.info文件在配置主从复制时使用change master命令来指定生成)
  2、Master端的I/O线程会根据Slave端的I/O线程请求的信息来读取Master的binlog日志信息与及读取到最新的binlog文件名和位置点一同返回给Slave的I/O线程。
  3、Slave端的I/O线程会把获取到的binlog日志写入relay日志(中继日志)文件中,并且更新master.info文件信息。(把读取到Master最新的binlog日志文件名和位置点更新到master.info文件中,下一次当前位置去读取Master的binlog日志)
  4、Slave端的SQL线程会定期读取relay日志,把二进制的日志解析成SQL语句,并执行这些SQL语句,同步数据到从库中。
  主从复制实战配置
  配置小结
  Master端
  1、同步Master端的原始数据到所有Slave端
  2、开启binlog日志,保持server-id唯一
  3、配置Slave验证授权用户,权限replication slave
  Slave端
  1、执行change master语句,生成master.info文件
  2、开启relay日志,保持server-id唯一
  3、启动Slave复制(start slave)
  Master端全备数据库同步到Slave端
  在开始做主从复制之前,需要把Master原有的数据都先同步到所有的Slave,否则在做同步复制之时,因为原有数据不一致导致同步失败。(注意,如果使用原来备份时间点比如昨天凌晨的全备数据同步所有Slave数据时,还需要把当前时间点之前的所有binlog增量备份同步,使在截取主从复制时间点时,Master和所有Slave的数据保持一致)
  原有数据不一致导致主从复制失败
  

mysql> show slave status\G  
Last_Error: Error 'Table 'ricky.test' doesn't exist' on query. Default database: 'ricky'. Query: 'insert into test values(987654,9,'gogo',30)'
  

  并且全备时,要锁表备份,并导入所有Slave,保证截取的时间点数据一致,同时刷新binlog日志。
  

[root@db02 ~]# mysqldump -uroot -p123456 -S /data/3306/mysql.sock -A -B -R --flush-logs --lock-all-tables --events >/tmp/mysql_bak_$(date +%F).sql  
[root@db02 ~]# mysql -uroot -p123456 -S /data/3307/mysql.sock  show databases;
  

  Master端配置
  Master端开启binlog日志功能
  

[root@db02 ~]# egrep "log-bin|server-id" /data/3306/my.cnf  
log-bin = /data/3306/mysql-bin
  
server-id = 1
  

  Master配置slave复制授权用户
  

#权限replication slave
  
mysql> GRANT REPLICATION SLAVE ON *.* TO 'mysql52'@'172.16.1.52'>  
mysql> flush privileges;
  

  检查Master端当前binlog日志文件名和位置点
  当前binlog文件名和位置点,在配置Slave端时,需要告诉Slave端
  

mysql> show master status\G  
*************************** 1. row ***************************
  File: mysql-bin.000004
  Position: 337
  Binlog_Do_DB:
  
Binlog_Ignore_DB:
  
1 row in set (0.00 sec)
  

  Slave端配置
  Slave端开启relaylog日志功能
  

[root@db02 ~]# egrep "relay-bin|server-id" /data/3307/my.cnf  
relay-log = /data/3307/relay-bin
  
server-id = 3
  

  告诉Slave端主从复制时连接的Master(ip+端口【默认可以不需要】)、授权连接用户和密码、binlog文件名和位置点。这里的binlog文件名和位置点还有另一种解决办法,在mysqldump全备时加入--master-data参数,把change master【1,不注释;2,注释】语句嵌入到备份文件中(mysqldump逻辑备份,以SQL语句形式导出数据),把备份文件复制到Slave端导入时,如果参数选项为“1”,则会自动执行change master语句,把binlog文件名和位置点写入Slave端的master.info文件中。其它的master端信息、授权用户和密码则需要手动change master写入master.info文件。
  执行change master语句
  

mysql> CHANGE MASTER TO MASTER_HOST='172.16.1.52',  -> MASTER_PORT=3306,
  -> MASTER_USER='mysql52',
  -> MASTER_PASSWORD='123456',
  -> MASTER_LOG_FILE='mysql-bin.000004',
  -> MASTER_LOG_POS=337;
  

  启动Slave
  

mysql> start slave;  

  查看Slave端状态
  

mysql> show slave status\G  
*************************** 1. row ***************************
  Slave_IO_State: Waiting for master to send event
  Master_Host: 172.16.1.52
  Master_User: mysql52
  Master_Port: 3306
  Connect_Retry: 60
  Master_Log_File: mysql-bin.000004
  Read_Master_Log_Pos: 337

  Relay_Log_File:>  Relay_Log_Pos: 253
  Relay_Master_Log_File: mysql-bin.000004
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes
  Replicate_Do_DB:
  Replicate_Ignore_DB: mysql
  Replicate_Do_Table:
  Replicate_Ignore_Table:
  Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
  Last_Errno: 0
  Last_Error:
  Skip_Counter: 0
  Exec_Master_Log_Pos: 337
  Relay_Log_Space: 403
  Until_Condition: None
  Until_Log_File:
  Until_Log_Pos: 0
  Master_SSL_Allowed: No
  Master_SSL_CA_File:
  Master_SSL_CA_Path:
  Master_SSL_Cert:
  Master_SSL_Cipher:
  Master_SSL_Key:
  Seconds_Behind_Master: 0
  
Master_SSL_Verify_Server_Cert: No
  Last_IO_Errno: 0
  Last_IO_Error:
  Last_SQL_Errno: 0
  Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
  Master_Server_Id: 1
  
1 row in set (0.00 sec)
  

  测试主从复制功能
  Master端向test表中插入一条数据
  

mysql> insert into test values(987654,9,'gogo',30);  

  Slave端对应的test会同步了该条数据
  

mysql> select * from ricky.test;


运维网声明 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-612430-1-1.html 上篇帖子: mysql监控---慢语句查询 下篇帖子: MariaDB(MySQL)数据库的介绍及使用示例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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