1.为什么配置数据库主从复制
主从复制最主要的原因是提高数据库的访问性能,将读和写分开,降低单台宿主机的高消耗和资源竞争激烈程度;同时,多台从数据库能够提高读QPS性能。
2. 数据复制原理
Master将改变记录到二进制日志(binary log)中,Slave将Master的二进制日志文件拷贝到它的中继日志(relay log),Slave重做中继日志(relay log)中的事件。那么,Master的变化,Slave也会变化,这样就是所谓的MYSQL的复制,即MYSQL replication。
值得注意的是,通过上面的机制,可以保证Master和Slave的数据库数据一致,但是时间上肯定有延迟,即Slave的数据是滞后的。
3. 主从复制方式
1、同步复制
同步复制,即master的变化,必须等待slave-1,slave-2,…,slave-n完成后才能返回。这样,显然不可取,也不是MYSQL复制的默认设置。比如,在WEB前端页面上,用户增加了条记录,需要等待很长时间。
2、异步复制
异步复制,master只需要完成自己的数据库操作即可。至于slaves是否收到二进制日志,是否完成操作,不用关心。MYSQL的默认设置。
3、半同步复制
半同步复制,master只保证slaves中的一个操作成功,就返回,其他slave不管。这个功能,是由google为MYSQL引入的。
4. 主从复制分析
-
问题1:master的写操作,slave被动的进行一样的操作,保持数据一致性,那么slave是否可以主动的进行写操作?
答:假设slave可以主动的进行写操作,slave又无法通知master,这样就导致了master和slave数据不一致了。因此slave不应该进行写操作,至少是slave上涉及到复制的数据库不可以写。实际上,这里已经揭示了读写分离的概念。 -
问题2:主从复制中,可以有N个slave,slave的作用?
答:一方面,进行数据备份,防止单点故障,保证高可用性。另一方面,分担负载,提高查询性能。 -
问题3:主从复制中有master,slave1,slave2,…等等这么多MYSQL数据库,那比如一个JAVA WEB应用到底应该连接哪个数据库?
答:一般,insert/delete/update这些更新数据库的操作,用master进行操作,select用slave进行操作。或者,找一个组件用它来完成MYSQL的代理,实现SQL语句的路由。这就是所谓的MYSQL READ WRITE SPLITE,MYSQL的读写分离。 -
问题4:当master的二进制日志每产生一个事件,都需要发往slave,如果我们有N个slave,那是发N次,还是只发一次?
答:如果只发一次,发给了slave-1,那slave-2,slave-3,…它们怎么办?显然,应该发N次。实际上,在MYSQL master内部,维护N个线程,每一个线程负责将二进制日志文件发往对应的slave。master既要负责写操作,还的维护N个线程,负担会很重。可以这样,slave-1是master的从,slave-1又是slave-2,slave-3,…的主,同时slave-1不再负责select。 slave-1将master的复制线程的负担,转移到自己的身上。这就是所谓的多级复制的概念。
5. mysql主从复制配置
1、安装mysql
需要注意修改my.cnf的文件权限就Ok,命令:chmod 644 my.cnf。
2、配置master主服务器
在Master MySQL上创建一个用户‘repl’,并允许其他Slave服务器可以通过远程访问Master,通过该用户 读取二进制日志,实现数据同步。
- //创建新用户
- mysql>create user repl;
- //repl用户必须具有REPLICATION SLAVE权限.说明一下192.168.0.%,是指明repl用户所在服务器,当然你也可以指定固定Ip。
- mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.%' IDENTIFIED BY 'mysql';
找到MySQL安装文件夹修改my.Ini文件,在[mysqld]下面增加下面几行代码
- server-id=1 //给数据库服务的唯一标识,一般为大家设置服务器Ip的末尾号
- log-bin=master-bin
- log-bin-index=master-bin.index
重启mysql服务;
3、配置slave服务器
找到MySQL安装文件夹修改my.ini文件,在[mysqld]下面增加下面几行代码,重启MySQL服务。
- [mysqld]
- server-id=2
- relay-log-index=slave-relay-bin.index
- relay-log=slave-relay-bin
链接master服务器
- change master to master_host='192.168.0.104', //Master 服务器Ip
- master_port=3306,
- master_user='repl',
- master_password='mysql',
- master_log_file='master-bin.000001',//Master服务器产生的日志
- master_log_pos=0;