对于现在的系统来说,在业务复杂的系统中,数据库往往是应用的瓶颈,单机往往是不能扛住大型系统的并发压力的,这时候需要从数据库方面下手解决其瓶颈,例如sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务。使用主从之后,从库的读操作是不受影响的。
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库或者特定的表。
原理:
也就是说:
注意:
图来源《高性能mysql》
mysql的主从复制都是单线程的操作,主库对所有DDL和DML产生的日志写进binlog,由于binlog是顺序写,所以效率很高,slave的sql thread线程将主库的DDL和DML操作事件在slave中重放。DML和DDL的IO操作是随机的,不是顺序,所以成本要高很多,另一方面,由于sql thread也是单线程的,当主库的并发较高时,产生的DML数量超过slave的SQL thread所能处理的速度,或者当slave中有大型query语句产生了锁等待,那么延时就产生了。
解决方案:
mysql5.7之后使用MTS并行复制技术,永久解决复制延时问题 这个后面文章在说下吧
本次测试mysql的版本是5.7
. 比较穷,在一台机子上装了两个mysql实例,修改下不同端口即可。 当然如果有钱准备两台能互相访问的机子安装两个mysql也是可以的。
测试阶段两个mysql实例IP相同都是本机(ip=127.0.0.1),区分下分别命名 主是node1
,从是node2
,端口不同 我实际测试用的是3306和3307)
网上很多按照的例子,这里就不重复说了,请自行百度/google(结果是数据库能正常使用),待两台mysql都按照完成之后,我们开始配置主从复制了。
--注意两台必须全部执行,两台的数据库保持相同 create database test;
#修改配置文件,执行以下命令打开mysql配置文件 vi /etc/my.cnf #在mysqld模块中添加如下配置信息 log-bin=master-bin #二进制文件名称 #二进制日志格式,有row、statement、mixed三种格式, binlog-format=ROW server-id=1 #要求各个服务器的id必须不一样 binlog-do-db=test #同步的数据库名称
二进制日志格式,有row、statement、mixed三种格式; row指的是把改变的内容复制过去,而不是把命令在从服务器上执行一遍;statement指的是在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高; mixed指的是默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
--授权操作 set global validate_password_policy=0; set global validate_password_length=1; grant replication slave on *.* to 'root'@'%' identified by '123456'; --刷新权限 flush privileges;
#修改配置文件,执行以下命令打开mysql配置文件 vi /etc/my.cnf #在mysqld模块中添加如下配置信息 log-bin=master-bin #二进制文件的名称 binlog-format=ROW #二进制文件的格式 server-id=2 #服务器的id
#重启mysql服务 service mysqld restart #登录mysql数据库 mysql -uroot -p #查看master的状态 show master status;
#重启mysql服务 service mysqld restart #登录mysql mysql -uroot -p #连接主服务器(master_host是主的IP地址,我测试本地) change master to master_host='127.0.0.1',master_user='root',master_password='123456',master_port=3306,master_log_file='master-bin.000001',master_log_pos=154; #启动slave start slave #查看slave的状态 show slave status\G #(注意没有分号)
这样主从的配置已经完成,此时可以在主服务器进行相关的数据添加删除工作,在从服务器看相关的状态,查看对应数据有没有变化。