MySQL主从同步配置
为什么要做主从同步?
- 在非常复杂的业务中,经常会碰到有sql需要锁表的场景,导致暂时不能读取数据,那么就影响运行中的业务,而使用主从复制,让主库复制写,从库复制读,这样就算主库出现了锁表的情景,通过读取从库也依然可以保证业务的正常运作。
- 做数据的热备时很可靠
- 随着业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
主从配置原理?
简单说就是主库开启logbin,从数据库启动的那一刻起将保存所有修改数据库结构或内容的一个文件。mysql主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。在主库里,只要有更新事件出现,就会被依次地写入到binlog里面,之后会推到从库中作为从库进行复制的数据源。
配置主从同步
准备工作:
- 12.122.132.22 :3306 主库
- 12.122.132.23 :3306 从库
- 数据库版本 5.7+
首先安装好两台mysql,并且启动:
systemctl start mysqld; #启动mysql
systemctl stop mysqld;#停止mysql
systemctl reload mysqld; #重启mysql
登录主库,创建一个用户用于主从复制:
-- 用户名 SimpleWu 密码123456
CREATE USER 'SimpleWu'@'*' IDENTIFIED BY '123456';
-- 执行刷新权限:
flush privileges;
登录两个数据库同时创建数据库(CORE):
CREATE DATABASE CORE;
关闭两个数据库。
修改主库配置文件:
[mysqld]
#开启二进制日志
log-bin=mysql-bin
#设置server-id
server-id=1
binlog-do-db = game
binlog-ignore-db = mysql
binlog-ignore-db = test
binlog-ignore-db = information_schema
log-bin:
设置logbin文件名称,最好不要改动位置。
server-id:
该id主从之间必须是唯一,唯一的标识。
binlog-do-db:
指定可以主从同步的数据库,多数据库则配置多行。
binlog-ignore-db:
指定不可以主从同步的数据库,多数据库则配置多行
修改从库配置文件:
#设置server-id,必须唯一
server-id=2
只需要将服务id
设置为与主库不同的ID既可;现在启动两个数据。
启动后需要查看主库log-bin信息
:
SHOW MASTER STATUS; -- 主库执行
获取到:
+------------------+----------+--------------+----------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+----------------------------------+
| mysql-bin.000012 | 619 | core | mysql,information_schema,sys |
+------------------+----------+--------------+----------------------------------+
以目前位置开始主从同步,在从库执行SQL将从库关联主库:
CHANGE MASTER TO
MASTER_HOST='12.122.132.22', -- 主库ip
MASTER_USER='SimpleWu', -- 用户名
MASTER_PORT=3306, -- 端口号
MASTER_PASSWORD='123456', -- 密码
MASTER_LOG_FILE='mysql-bin.000012', -- 开始文件
MASTER_LOG_POS=619; -- 开始位置
执行改SQL后我们需要查看我们目前的配置信息:
SHOW SLAVE STATUS; -- 从库执行,查看主从状态
可以看到Slave IO STATE
为空代表未连接上,这时候从库启动复制:
START SLAVE; -- 从库执行,启动从库
启动后可以再次查看从库状态,看到Slave IO STATE
变成Waiting for master to send event
代表主从同步成功。
这个时候在主库创建一张表:
-- 主库执行
CREATE TABLE `TB_USER`(
ID VARCHAR(55) PRIMARY KEY NOT NULL,
`NAME` VARCHAR(55)
);
创建成功后登录从库,会发下多了一张表,这个时候我们的主从复制就已经搭建完成了。图就不贴了,贴图不如自己动手体会效果。
启动,关闭从库:
START SLAVE; # 启动从库
STOP SLAVE; # 关闭从库
在修改从库的master
配置之前一定要关闭从库,在修改配置信息。
主从同步延迟
在主从同步过程中因为所有的SQL必须都要在从服务器里面执行一遍,但是主服务器如果不断的有更新操作源源不断的写入, 那么一旦有延迟产生, 那么延迟加重的可能性就会原来越大。虽然这个问题又不能完全解决,但是我们可以采取一些措施来缓解。
我们知道因为主服务器要负责更新操作, 他对安全性的要求比从服务器高, 所有有些设置可以修改,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1
之类的设置,而slave则不需要这么高的数据安全,完全可以讲sync_binlog
设置为0或者关闭binlog,innodb_flushlog, innodb_flush_log_at_trx_commit
也 可以设置为0来提高sql的执行效率 这个能很大程度上提高效率。另外就是使用比主库更好的硬件设备作为slave。