`

MySql主从复制

 
阅读更多

     前面说的分区、分表都是基于同一数据库本事的一些结构优化,而当访问量巨大的情况单一的数据库服务器是无法满足压力要求的,MySQL为我们提供了复制功能,使得多台MySQL服务器共享数据,从而实现负载均衡。
        首先我们来看一张图,了解一下主从复制的物理结构:



 

        从图上我们可以直观的看出MySQL主从复制的机制就是:
        1.主服务器(Master)执行SQL语句成功后将执行结果记录在"Binary log"(二进制文件)中。
        2.从服务器(Slave)的I/O进程负责连接主服务器,连接成功后主服务器从指定位置(起初为开始位置)读取"Binary log"文件并返回,返回的内容包括"Binary log"改动内容,日志文件名及读取到的位置。
        3.从服务器接受内容之后将内容添加到"Relay log"(中继日志)尾部。将二进制文件名称及读取到的位置记录在"Master info"文件中以便下次利用。
        4.从服务器的SQL进程在实时监控着"Relay log"文件,当有新增内容出现时,SQL进程将文件内容转换成可执行的SQL内容并更新到数据中。

 

        Mysql为了解决这个风险并提高复制的性能,将Slave端的复制改为两个进程来完成。提出这个改进方案的人是Yahoo!的一位工程师“Jeremy Zawodny”。这样既解决了性能问题,又缩短了异步的延时时间,同时也减少了可能存在的数据丢失量。当然,即使是换成了现在这样两个线程处理以后,同样也还是存在slave数据延时以及数据丢失的可能性的,毕竟这个复制是异步的。只要数据的更改不是在一个事务中,这些问题都是会存在的。如果要完全避免这些问题,就只能用mysql的cluster来解决了。不过mysql的cluster是内存数据库的解决方案,需要将所有数据都load到内存中,这样就对内存的要求就非常大了,对于一般的应用来说可实施性不是太大。

        主从复制的架构绝大多数是“一主多从”,因为我们默认的认为读取数据的次数是远远大于更新的,事实证明绝大多数情况是这样的。这样做的好处就是将压力很好的分散,甚至我们可以通过购买廉价的服务器来扩充从服务器数量。
        当然这种结构并不是没有问题,读写不同步,数据丢失等等,这些问题我们会在最后去讨论,下面开始我们的主从服务器配置工作(条件有限,以一主一从为例)。

 

        配置主服务器:


        1.安装MySQL,安装过程就不说了,可以查看前面的文章。假定安装成功之后主服务器ip为192.168.0.1;从服务器ip为192.168.0.2.

 

        2.登录主服务器MySQL,建立一个供Slave端使用的账号,提供复制和连接权限,输入命令:

Sql代码   收藏代码
  1. grant replication slave on *.* to slave1@192.168.0.2 identified by '123456';  

 

        slave1@192.168.0.2:为用户名和ip
        '123456':为slave1的密码

 

        3.配置my.cnf,我这里的my.cnf是放在/etc/mysql/下的,找到以下两行内容:

文件内容
log-bin=mysql-bin 
server-id=1

 有注释的将注释去掉,并修改为以上值。

 

        4.查看主服务器binary log日志名和复制到的位置,输入命令:

Sql代码   收藏代码
  1.  mysql>  show master status;    
  2. +------------------+----------+--------------+------------------+  
  3. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |  
  4. +------------------+----------+--------------+------------------+  
  5. | mysql-bin.000070 |      241 |              |                  |   
  6. +------------------+----------+--------------+------------------+  
  7. 1 row in set (0.00 sec)  

 

        5.锁定master服务器所有表的写入,防止我们在操作过程中数据被修改,SQL状态下输入命令:

Sql代码   收藏代码
  1. flush tables with read lock;  

        6.备份数据库,利用mysqldump工具,在shell状态下输入以下命令:

Sql代码   收藏代码
  1. mysqldump -h127.0.0.1 -p3306 -uroot -p “数据库名” > /home/back.sql  

        mysqldump -u用户名 -p密码 -h主机 数据库 a -w "sql条件" --lock-all-tables > 路径

        详细用法可以参照我的另一篇文章。

        7.备份完成后解锁数据库,SQL状态下输入:

Sql代码   收藏代码
  1. unlock tables;  

 

 

        配置从服务器:


        1.修改从服务器的my.cnf文件:

文件内容
#服务器标示 
server-id=2 
#日志存放位置 
log_bin = /var/log/mysql/mysql-bin.log 
#主服务器ip 
master-host =192.168.0.1 
#用于复制的用户,也就是我们最开始创建的那个 
master-user=slave1 
#用户密码 
master-pass=123456 
#端口 
master-port =3306 
#连接超时时间,单位为“秒”,默认值为3600,即1小时 
master-retry-count=10 
#要复制的数据库,这句话谨慎使用,如果没有特殊情况最好不用,因为这句话有隐患会引起问题 
replicate-do-db =test

 

         2.导入主服务器数据库的备份脚本back.sql,输入命令:

Sql代码   收藏代码
  1. source /home/back.sql;  

 

        3.开启从服务器同步服务,命令比较简单,SQL状态下输入:

Sql代码   收藏代码
  1. start slave;  

 

        4.查看Slave状态:

Sql代码   收藏代码
  1. mysql> SHOW SLAVE STATUS\G  
  2. *************************** 1. row ***************************  
  3. Slave_IO_State: Waiting for master to send event  
  4. Master_Host: 192.168.0.2  
  5. Master_User: root  
  6. Master_Port: 3306  
  7. Connect_Retry: 4  
  8. Master_Log_File: mysql-bin.003  
  9. Read_Master_Log_Pos: 79  
  10. Relay_Log_File: mysql -relay-bin. 003  
  11. Relay_Log_Pos: 548  
  12. Relay_Master_Log_File: mysql -bin. 003  
  13. #Slave IO进程状态  
  14. Slave_IO_Running: Yes  
  15. #Slave SQL进程状态  
  16. Slave_SQL_Running: Yes  
  17. Replicate_Do_DB:  
  18. Replicate_Ignore_DB:  
  19. Last_Errno: 0  

        参数也比较简单,上面都介绍过来,一看就懂了。 

 

        5.我们此时可以更新一下主服务器的数据库,再到从服务器中验证结果,下篇文章我们会讨论一下这种机制的问题及解决办法。

 

        主从复制一般会设置一台性能较好的主服务器,复制更新数据的操作,理论上我们认为查询操作的数量级远远大于更新的操作,所以需要准备多台从服务器组成负载均衡结构供外部查询。负载均衡可以使用mysql proxy或其他产品,这些内容我们之后会接触到。

分享到:
评论

相关推荐

    基于net的超市管理系统源代码(完整前后端+sqlserver+说明文档+LW).zip

    功能说明: 环境说明: 开发软件:VS 2017 (版本2017以上即可,不能低于2017) 数据库:SqlServer2008r2(数据库版本无限制,都可以导入) 开发模式:mvc。。。

    LABVIEW程序实例-公式节点.zip

    labview程序代码参考学习使用,希望对你有所帮助。

    大米商城开源版damishop(适合外贸)

    大米外贸商城系统 简称damishop 完全开源版,只需做一种语言一键开启全球133中语言自动翻译功能,价格实现自动汇率转换,集成微信支付宝 paypal以及国外主流支付方式,自带文章博客系统。 软件架构 基于MVC+语言包模式,增加控制台,API导入产品方便对接其他系统(带json示例数据)。 使用要求 PHP7.4+ MYSQL5.6+ REDIS(可选) 安装方法 composer install 打开安装向导安装 http://您的域名/install 特色 1、缓存层增加时间与批量like删除 2、API产品导入方便对接其他系统 3、增加控制台命令行,命令行生成语言翻译包 4、后台一键开启自动翻译模式,支持全球133中语言,由于google代理翻译需要收费,这个功能需要付费。 5、可选购物车与ajax修改购物车产品 6、一键结算checkout 7、增加网站前台自定义路由 方便seo 更新日志 v3.9.7 集成鱼码支付接口,方便个人站长即使收款到账使用 v3.9.3 更新内容 1:增加ueditor与旧编辑器切换 2:增加可视化布局插

    LABVIEW程序实例-通过全局变量接收数据.zip

    labview程序代码参考学习使用,希望对你有所帮助。

    LABVIEW程序实例-日历控件.zip

    labview程序代码参考学习使用,希望对你有所帮助。

    毕设和企业适用springboot人工智能客服系统类及旅游规划平台源码+论文+视频.zip

    毕设和企业适用springboot人工智能客服系统类及旅游规划平台源码+论文+视频

Global site tag (gtag.js) - Google Analytics