MySql-主从配置

2019/7/23 15:57:35 人评论 次浏览 分类:学习教程

master

创建一个用户’repl’,并且允许其他服务器可以通过该用户远程访问master,通过该用户去读取二进制数据,实现数据同步。

  1. 更改配置

    set global validate_password_length=1;

    set global validate_password_policy=0;

  2. 创建用户

    create user repl identified by 'repl';

    备注:repl用户必须具有REPLICATION SLAVE权限,除此之外其他权限都不需要。

  3. 赋权限

    grant replication slave on *.* to 'repl'@'%' identified by 'repl';

  4. 修改 配置文件

    vim /etc/my.cnf

    log-bin=mysql-bin //启用二进制日志文件

    server-id=130 //服务器唯一ID

  5. 重启数据库 systemctl restart mysqld

  6. 查看状态

    登录到数据库,通过show master status 查看master的状态信息;

slave

  1. 修改配置文件

    vim /etc/my.cnf

    relay-log=slave-relay-bin

    relay-log-index=slave-relay-bin.index

    read_only=1

  2. 重启数据库: systemctl restart mysqld

  3. 连接到数据库客户端,通过如下命令建立同步连接

    change master to master_host='192.168.234.128',master_port=3306,master_user='repl',master_password='='repl',master_log_file='mysql-bin.000001',master_log_pos=154;

  4. 执行 start slave

  5. 查看slave状态:show slave status\G;

    如下两个状态为yes,则表明正常

    Slave_IO_Running: Yes Slave_SQL_Running: Yes

备注:红色标记的为主库里面的信息,如上图。

原理

  1. master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务;

  2. slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志;

  3. SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。

binlog: 用来记录mysql的数据更新或者潜在更新(update xxx where id=x effect row 0);

mysqlbinlog --base64-output=decode-rows -v mysql-bin.000001 查看binlog的内容;

文件内容存储路径:/var/lib/mysql

binlog的格式

  1. statement : 基于sql语句的模式。update table set name =””; effect row 1000; uuid、now() other function;

  2. row: 基于行模式; 存在1000条数据变更; 记录修改以后每一条记录变化的值;

  3. mixed: 混合模式,由mysql自动判断处理;

修改binlog_formater,通过在mysql客户端输入如下命令可以修改:

set global binlog_format=’row/mixed/statement’;

或者在vim /etc/my.cnf 的[mysqld]下增加binlog_format=‘mixed’;

主从同步的延时问题

产生原因

  1. 当master库tps比较高的时候,产生的DDL数量超过slave一个sql线程所能承受的范围,或者slave的大型query语句产生锁等待;

  1. 网络传输: bin文件的传输延迟;

  1. 磁盘的读写耗时:文件通知更新、磁盘读取延迟、磁盘写入延迟;

解决方案

  1. 在数据库和应用层增加缓存处理,优先从缓存中读取数据;

  1. 减少slave同步延迟,可以修改slave库sync_binlog(性能和安全做平衡)属性;

    sync_binlog=0 文件系统来调度把binlog_cache刷新到磁盘

    sync_binlog=n 每执行n个事务就刷新一次;

  1. 增加延时监控

    Nagios做网络监控

    mk-heartbeat

相关资讯

    暂无相关的资讯...

共有访客发表了评论 网友评论

验证码: 看不清楚?
    -->