简单来讲就是保证主SQL(Master)和从SQL(Slave)的数据是一致性的,向Master插入数据后,Slave会自动从Master把修改的数据同步过来(有必定的延迟),经过这种方式来保证数据的一致性,就是主从复制mysql
由于数据都是相同的,因此当Master挂掉后,能够指定一台Slave充当Master继续保证服务运行,由于数据是一致性的(若是当插入Master就挂掉,可能不一致,由于同步也须要时间),固然这种配置不是简单的把一台Slave充当Master,毕竟还要考虑后续的Salve同步Master,固然本文并非将高可用的配置,因此这里就很少讲了sql
由于读写分离也算是负载均衡的一种,因此就不单独写了,由于通常都是有多台Slave的,因此能够将读操做指定到Slave服务器上(须要代码控制),而后再用负载均衡来选择那台Slave来提供服务,同时也能够吧一些大量计算的查询指定到某台Slave,这样就不会影响Master的写入以及其余查询数据库
通常咱们都会作数据备份,多是写定时任务,一些特殊行业可能还须要手动备份,有些行业要求备份和原数据不能在同一个地方,因此主从就能很好的解决这个问题,不只备份及时,并且还能够多地备份,保证数据的安全缓存
能够一个业务模块读取一个Slave,再针对不一样的业务场景进行数据库的索引建立和根据业务选择MySQL存储引擎安全
主从复制支持2种扩展方式服务器
一、scale-upsession
向上扩展或者纵向扩展,主要是提供比如今服务器更好性能的服务器,好比增长CPU和内存以及磁盘阵列等,由于有多台服务器,因此可扩展性比单台更大负载均衡
二、scale-out模块化
向外扩展或者横向扩展,是指增长服务器数量的扩展,这样主要能分散各个服务器的压力性能
无可厚非的是搭建主从确定会增长成本,毕竟一台服务器和两台服务器的成本彻底不一样,另外因为主从必需要开启二进制日志,因此也会形成额外的性能消耗
Slave从Master复制过来确定是会有必定的数据延迟的,因此当刚插入就出现查询的状况,可能查询不出来,固然若是是插入者本身查询,那么能够直接从Master中查询出来,固然这个也是须要用代码来控制的
主从复制主要是针对读远大于写或者对数据备份实时性要求较高的系统中,由于Master在写中须要更多操做,并且只有一台写入的Master(由于我目前只会配置一台写入Master,最多就是有从Master的Slave,用来在Master挂掉后替换成Master,平时不对外进行服务),因此写入的压力并不能被分散,固然若是直接怎么解决这个问题的话,欢迎留言指教
MySQL5.6开始主从复制有两种方式:基于日志(binlog)、基于GTID(全局事务标示符)。
本文只涉及基于日志binlog的主从配置
一、Master将数据改变记录到二进制日志(binary log)中,也就是配置文件log-bin指定的文件,这些记录叫作二进制日志事件(binary log events)
二、Slave经过I/O线程读取Master中的binary log events并写入到它的中继日志(relay log)
三、Slave重作中继日志中的事件,把中继日志中的事件信息一条一条的在本地执行一次,完成数据在本地的存储,从而实现将改变反映到它本身的数据(数据重放)
一、主从服务器操做系统版本和位数一致
二、Master和Slave数据库的版本要一致
三、Master和Slave数据库中的数据要一致
四、Master开启二进制日志,Master和Slave的server_id在局域网内必须惟一
两台或两台以上安装了相同版本的MySQL(我没有试过不一样版本会不会有问题,有兴趣的能够试试),固然这个能够用虚拟机或者Docker代替,我的推荐用Docker,比虚拟机消耗少太多了,固然用起来可能没有虚拟机那么方便,可是却不用挨个环境配置了
1、安装数据库
2、配置my.cnf
不一样的系统my.cnf路径不一样,因此咱们只讲解牵扯修改的地方。添加配置
[mysqld] ## 设置server_id,通常设置为IP,注意要惟一 server_id=100 ## 复制过滤:也就是指定哪一个数据库不用同步(mysql库通常不一样步) binlog-ignore-db=mysql ## 开启二进制日志功能,能够随便取,最好有含义(关键就是这里了) log-bin=edu-mysql-bin ## 为每一个session 分配的内存,在事务过程当中用来存储二进制日志的缓存 binlog_cache_size=1M ## 主从复制的格式(mixed,statement,row,默认格式是statement) binlog_format=mixed ## 二进制日志自动删除/过时的天数。默认值为0,表示不自动删除。 expire_logs_days=7 ## 跳过主从复制中遇到的全部错误或指定类型的错误,避免slave端复制中断。 ## 如:1062错误是指一些主键重复,1032错误是由于主从数据库数据不一致 slave_skip_errors=1062
配置完成后重启mysql
关于复制过滤
复制过滤可让你只复制服务器中的一部分数据,有两种复制过滤:
一、在Master上过滤二进制日志中的事件
二、在Slave上过滤中继日志中的事件。
复制类型
一、基于语句的复制
在Master上执行的SQL语句,在Slave上执行一样的语句。MySQL默认采用基于语句的复制,效率比较高。一旦发现无法精确复制时,会自动选着基于行的复制
二、基于行的复制
把改变的内容复制到Slave,而不是把命令在Slave上执行一遍。从MySQL5.0开始支持
三、混合类型的复制
默认采用基于语句的复制,一旦发现基于语句的没法精确的复制时,就会采用基于行的复制
3、建立数据同步用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
这里主要是要授予用户REPLICATION SLAVE权限和REPLICATION CLIENT权限
1、安装数据库
2、配置my.cnf
[mysqld] ## 设置server_id,通常设置为IP,注意要惟一 server_id=101 ## 复制过滤:也就是指定哪一个数据库不用同步(mysql库通常不一样步) binlog-ignore-db=mysql ## 开启二进制日志功能,以备Slave做为其它Slave的Master时使用 log-bin=edu-mysql-slave1-bin ## 为每一个session 分配的内存,在事务过程当中用来存储二进制日志的缓存 binlog_cache_size=1M ## 主从复制的格式(mixed,statement,row,默认格式是statement) binlog_format=mixed ## 二进制日志自动删除/过时的天数。默认值为0,表示不自动删除。 expire_logs_days=7 ## 跳过主从复制中遇到的全部错误或指定类型的错误,避免slave端复制中断。 ## 如:1062错误是指一些主键重复,1032错误是由于主从数据库数据不一致 slave_skip_errors=1062 ## relay_log配置中继日志 relay_log=edu-mysql-relay-bin ## log_slave_updates表示slave将复制事件写进本身的二进制日志 log_slave_updates=1 ## 防止改变数据(除了特殊的线程) read_only=1
若是Slave为其它Slave的Master时,必须设置bin_log。配置完成后重启mysql
1、初始化数据
保证Master和Slave除不一样步的数据库,其余库的数据一致
2、查询Master状态
在Master中执行
show master status;
记录下返回结果的File列和Position列的值
3、Slave中设置Master信息
在Slave中执行
change master to master_host='192.168.1.100', master_user='slave', master_password='123456', master_port=3306, master_log_file='edu-mysql-bin.000001', master_log_pos=1389, master_connect_retry=30;
上面执行的命令的解释:
master_host='192.168.1.100' ## Master的IP地址
master_user='slave' ## 用于同步数据的用户(在Master中受权的用户)
master_password='123456' ## 同步数据用户的密码
master_port=3306 ## Master数据库服务的端口
masterlogfile='edu-mysql-bin.000001' ##指定Slave从哪一个日志文件开始读复制数据(Master上执行命令的结果的File字段)
masterlogpos=429 ## 从哪一个POSITION号开始读(Master上执行命令的结果的Position字段)
masterconnectretry=30 ##当从新创建主从链接时,若是链接创建失败,间隔多久后重试。单位为秒,默认设置为60秒,同步延迟调优参数。
4、查看主从同步状态
在Slave中执行命令
show slave status;
可看到SlaveIOState为空, SlaveIORunning和SlaveSQLRunning是No,代表Slave尚未开始复制过程。相反SlaveIORunning和SlaveSQLRunning是Yes代表已经开始工做了
5、开启主从同步
在Slave中执行命令
start slave;
查询查看主从同步状态,会发现SlaveIORunning和SlaveSQLRunning是Yes了,代表开启成功