MySql主从复制
主从复制是指将主库的 DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持一致。
配置
1.主机配置
sudo vi /etc/mysql/my.cnf
[mysqld]
在这里配置已覆盖默认的127.0.0.1(只能连本机)
bind-address = 0.0.0.0id为唯一值,每个server不可重复
server-id = 1指定产生bin log文件名称,使MySQL记录所有DB事务记录
log-bin=mysql-bin
保存后,重启 MySQL 才会生效:sudo /etc/init.d/mysql restart
2.从机配置
id为唯一值,每个server不可重复
server-id =2指定产生bin log文件名称,使MySQL记录所有DB事务记录
log-bin=mysql-bin
3.主机、从机重启Mysql服务
4.关闭防火墙
5.主机上建立账户并授权slave
#创建它广播用户,并设置密码,该用户可在任意主机连接该MySQL服务
创建用户'itcast'@'%'已通过'root@123456'识别mysql native_password;
#为'itcast'@'%'用户分配主从复制权限
授予复制从站*。*到“它投”@“%”
6.从机上配置需要复制的主机
配置主库与从库使其相互关联:
CHANGE MASTER TO MASTER_HOST SOURCE='xxx.xxx.xxx.xxx’,MASTER_USER='xxx',MASTER_PASSWORD='xxx',MASTER_LOG_FILE='xxx',MASTER_LOG_POS=xxx;
7.测试
查看主库中的数据和从库中的数据,并在主库当中执行增删改的操作。
主库和从库复制,它是从二进制日志的当前位置往后进行同步的,如果之前的数据也需要同步到从库中,这时就需要将主库的数据导入到一个sql文件中,然后在从库中执行此sql脚本,来保证主库和从库的初始数据是一致的。然后再从当前位置往后进行主从复制的同步。
读写分离
通过MyCat和MySql的主从复制配合搭建数据库的读写分离,实现MySql的高可用性。将搭建一主一从和双主双从两种读写分离模式。
读写分离模式:基本的原理是让主数据库处理事务性增、改、删操作, 而从数据库处理查询操作
Mycat实现的读写分离和自动切换机制,需要MySQL的主从复制机制配合。
为什么用?
从集中到分布,最基本的一个需求不是数据存储的瓶颈,而是在于计算的瓶颈,即 SQL 查询的瓶颈,我们知道,正常情况下,Insert SQL 就是几十个毫秒的时间内写入完成,而系 统中的大多数 Select SQL 则要几秒到几分钟才能有结果,很多复杂的 SQL,其消耗服器 CPU 的能力超强,不亚于死循环的威力
读写分离存在的问题
主从数据延迟,导致业务数据无法保证强一致性
一主一从
最基础的复制结构,用来分担之前单台数据库服务器的压力, 可以进行读写分离。
搭建
添加主数据源
进入mycat目录下的conf/datasources
目录,复制 prototypeDs.datasource.json
并将名称设为master.datasource.json
cp prototypeDs.datasource.json master.datasource.json
修改master.datasource.json
指定数据源 "targetName": "prototype" ,配置主机数据源
使用注解方式添加数据源:
注意下面命令在运行时不要有换行符,不然可能会执行错误
#配置写数据源 主机
/*+mycat:createDataSource{"name":"rwSepw","url":"jdbc:mysql://主机ip:3306/wusql?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root","password":"密码" } */;#配置读数据源 从机
/*+mycat:createDataSource{"name":"rwSepr","url":"jdbc:mysql://从机ip:3306/wusql?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","user":"root","password":"密码" } */;
#查询配置数据源结果
/*+ mycat:showDataSources{} */;
更新集群信息 , 添加 dr0 从节点 . 实现读写分离
/*!mycat:createCluster{"name":"prototype","masters":["rwSepw"],"replicas":["rwSepr"]} */;
查看配置集群信息
/*+ mycat:showClusters{} */;
读写分离功能验证
利用mysql的命令登录mycat,查看虚拟的数据库,在库中进行增删改查,再查看主从库中是否修改。