什么是主从复制
Master(主服务器) Slave(从服务器)
主服务器每次对数据库的操作修改都会记录到二进制日志,然后从服务器会收到消息,通过一个log dump thread 进程到主服务器上获得二进制日志,然后重写到本服务器的relay log日志,最后从服务器通过SQL thread进程重演relay log,以达到执行相同操作,得到相同数据结果的目的。
1 主从复制的条件
– 主需要开启Binlog功能
– 主库要建立账号(授权从服务器过来复制binlog)
– 从库要配置master.info(CHANGE MASTER to 相当于配置密码文件和Master的相关信息)
– start slave 开启复制功能
2 主从复制的分类
同步复制:指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以同步复制的性能会受到严重的影响
异步复制(有延迟):MySQL默认的复制,主库在执行完客户端提交的事务后会立即返回结果给客户端,并不关心从库是否已经接收并处理,这样的话,主服务器如果crash掉了,此时主服务器上已经提交的事务可能并没有传到从服务器上,如果此时,将从服务器提升为主服务器,可能导致主服务器上的数据不完整。
半同步复制:介于同步复制和异步复制之间,主库接收到客户端的请求之后,会先形成二进制日志,然后等从服务器来拿,从服务器拿到二进制日志执行完之后,反馈给主服务器,然后主服务器在进行该事务的执行,最后反馈给客户端。
相对于异步复制,半同步复制提高了数据的安全性,同时也造成了一定的延迟,这个延迟最少是一个TCP/IP往返的时间。
主从复制的意义
从服务器到主服务器拿数据,他们的数据都是一样的(数据一致性)
web服务器读数据是可以到主服务器或者从服务器去读
但是如果写数据是只往主服务器上去写,所以只有主服务器有对数据改变的权限
实验模拟
(下面的一些数据记得用自己的)
1、 2个Linux服务器(2核心、4G)、centos7、MySQL5.7.29
master 192.168.243.138
Slave 192.168.243.139
2、主服务器开启二进制日志,从服务器上修改 /etc/my.cnf,改完记得刷新服务
主服务器配置文件加上
[mysqld]log-binserver_id=1(最下方有解释server_id)
从服务器加上
[mysqld]log-binserver_id=2
3、主服务器MySQL授权用户(请记住用户名和密码)
grant replication slave on *.* to \'curry\'@\'192.168.243.139\' identified by \'Sanchuang123#\';
4、备份主服务器上的数据,然后导出到从服务器上(先建立相应位置的文件)
mysqldump -uroot -p\'Sanchuang123#\' --all-databases > /backup/all_db.sqlscp /backup/all_db.sql root@192.168.243.139:/backup
5、在主服务上刷新二进制日志文件,起一个新的二进制文件,然后查看当前位置点(请记住文件名和位置点)
flush logs;show master status;ph-mysql-master-bin.000002 | 154
6、在从服务器上配置master信息(此处填写的数据是主服务器上的ip地址、MySQL新建的用户名、密码、MySQL进程端口号、二进制日志当前的文件以及位置点,这些都是上面的步骤配置的)
mysql> CHANGE MASTER TO MASTER_HOST=\'192.168.243.138\',-> MASTER_USER=\'curry\',-> MASTER_PASSWORD=\'Sanchuang123#\',-> MASTER_PORT=3306,-> MASTER_LOG_FILE=\'ph-mysql-master-bin.000002\',-> MASTER_LOG_POS=154;
7、开启slave功能
mysql> start slave;查看是否成功:mysql> show slave status;
8、验证主从复制的效果
主服务器中新建库、表、插入数据,从服务器上也会有一摸一样的数据就是成功了
9、到slave上去看一下master.info和relay-log.info
所在路径:/data/mysql
10、改成半同步的配置
在主服务器上执行安装:
install plugin rpl_semi_sync_master soname ‘semisync_master.so’;
show plugins;
set global rpl_semi_sync_master_enabled=1;
show global variables like ‘%rpl_semi%’;
在从服务器上执行安装插件:
install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’;
set global rpl_semi_sync_slave_enabled=1;
show global variables like ‘%rpl_semi%’;
#、如何知道当前主从复制的状态是半同步还是异步?
mysql>show status like \'Rpl_semi_sync_master_status\';+-----------------------------+-------+| Variable_name | Value |+-----------------------------+-------+| Rpl_semi_sync_master_status | ON | 表示是半同步
一些问题:
1、如何让web服务器从数据库集群里读取数据更快些?解决大并发的问题?
流量分流:读写分离
2. 到底是主服务器主动通知从服务器来取二进制日志,还是从服务器每隔一段时间来拿二进制日志?
主服务器主动通知从服务器过来拿二进制日志
3. 主服务器如何知道从服务器上已经有哪些数据了,需要从哪里开始给数据给从服务器?
master-info文件会记录取得日志结束的pos位置号,日志文件的名字
4. 是否任何一台机器都可以充当从服务器,不需要验证就可以去拿主服务器的二进制日志?
不可以,主服务器上授权某个特定的用户才能采集数据信息,而从服务器需要知道该用户名和密码,并配置好才可以通过验证拿到二进制日志。
5. 从服务器如何知道谁是它的主服务器呢?
配置master信息的时候会配置好
6. master-info文件的作用?
记录取日志结束的pos位置号,日志文件的名字
7、relay-log.info文件的作用?
记录上一次重演执行到了的位置点
8、/etc/my.cnf中的server_id的作用
给服务器分配一个独一无二的ID编号; 取值范围是1~2的32次方,启用二进制日志功能和配置主从复制需要用上它。
有问题来欢迎一起交流