介绍:
主从的优势:
- 将读操作和写操作分离到不同的数据库上,避免主服务器出现性能瓶颈;
- 主服务器进行写操作时,不影响查询应用服务器的查询性能,降低阻塞,提高并发;
- 数据拥有多个容灾副本,提高数据安全性,同时当主服务器故障时,可立即切换到其他服务器,提高系统可用性;
主从的缺点:
从网上找了一些资料:
Mysql主从缺点:
但主从机制是一样的:
mysql主从的实现是,mysql master被使用后,其中master后台IO线程会写Binlog;slave有一个Relay Log线程同步binlog日志,同时有另一个Extractor线程会读取相应的Binlog,在Slave进行相应的同样的操作。
对于主从正常执行,相应的延迟几乎是不存在的。但是在高QPS下,主从同步却出现了比较明显的延迟情况。在PPT介绍中,当master QPS达到1万左右时,Slave重做的QPS却只有2000左右,因此所谓的瓶颈其实是在Binlog日志在slave重做这块。而此处实现是单线程的,因此改进的方法此处用多线程实现。
PPT中介绍淘宝实现,修改了源码,对应的机制是Transfer机制:此处通过对Binlog日志重做采用多线程实现,从而提高slave的QPPS,PPT给出的实验数据按此机制实现后,QPS能达到1万多。从而解决mysql主从之间高QPS下的数据同步问题。
当然使用此机制对应的mysql相关配制也有一定的要求:
1.Binlog日志格式必须是基于ROW级别的,
2.对应的SQL语句必须对应PK或者uni key。
对于以上两点,作者解析是基于多线程必须是知道PK或者uni key才能完成相应的多线程重做slave,这样才能保证SQL语句的执行顺序。相对来说,对于第二点很多应用需求还是能满足。但是对ROW日志格式,对于一些批量修改等应用,采用此日志格式所带来的DB的IO压力等应该也是需要考虑的。
毕竟一种新的方案的提出有它的优点也有它的缺点,合适才是最合理的。总的来说此PPT是围绕此方案的实现在讲解,很易懂。
原文
开始
两台服务器里面的mysql 数据结构要一样。
数据库如何外网访问:点击查看
主服务器:
文件: /etc/my.cnf 如下配置
[mysqld]
server-id=1
log-bin=master-bin
log-bin-index=master-bin.index
重启mysql
命令:
show master status;
出现图中的信息,之后主数据库配置就可以不要改了。
添加用户并授权给slave
说明: repl用户必须具有REPLICATION SLAVE权限,除此之外没有必要添加不必要的权限,密码为mysql。说明一下192.168.0.%,这个配置是指明repl用户所在服务器,这里%是通配符,表示192.168.0.0-192.168.0.255的Server都可以以repl用户登陆主服务器。当然你也可以指定固定Ip。
mysql>create user repl; //创建新用户
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.%' IDENTIFIED BY 'mysql';
从服务器:
配置 my.cnf
[mysqld]
log-bin=mysql-bin //[不是必须]启用二进制日志
server-id=2 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
重启数据库
登录mysql帐号,执行:
change master to master_host='192.168.0.104', //Master 服务器Ip
master_port=3306,
master_user='repl',
master_password='mysql',
master_log_file='mysql-bin.000017',//Master服务器产生的日志 刚刚主服务器中的 File
master_log_pos=49529; //这边要注意了,刚刚主服务器中的 Position
开启:start slave;
到此就结束了,接下来找如果不顺利的话就要根据错误提示,找bug了;
验证
判定主从是否配置成功;红框里面的两个都要yes;
show slave status\G
问题
如果报错,类似:
Last_Error: Error ‘Table ‘splier.wait_work’ doesn’t exist’ on query。。。
则是主从的数据库不一致所导致的,要使两个数据库一致。重新设置postion的值
从机:
错误:The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it)
show variables like 'server_id'; //查看当前的id 如果你发现,这个server 和你配置中的不一样。如果一样,则不要看下去了
set global server_id=2; //改成你刚刚配置的一致
slave start; //重启
参考:
MySQL同步故障:" Slave_SQL_Running:No" 两种解决办法
http://120.79.143.216:8888/99297233