八、数据库主从同步

八、数据库主从同步

    1、概述

         MySQL主从同步是异步的,简单说就是主库开启logbin,从数据库启动的那一刻起将保存所有修改数据库结构或内容的一个文件。mysql主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。在主库里,只要有更新事件出现,就会被依次地写入到binlog里面,之后会推到从库中作为从库进行复制的数据源。

    2、复制原理

        master与slave之间实现整个复制过程主要由三个线程完成:两个(SQL线程和IO线程)在slave端,一个(IO线程)在master端。slave端的IO线程负责读取master的binlog内容到中继日志relay log里;slave端的SQL线程负责从relay log日志里读出binlog内容,并更新到slave的数据库里。

        (1)、master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;

        (2)、slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则slave上的I/O线程连接master,请求从指定日志文件的指定位置(或者从最开始)之后的日志内容。

        (3)、master收到请求,负责复制的I/O线程根据请求信息读取指定的日志,并返回(日志文件的地址也返回,方便下次直接根据地址请求)。

        (4)、slave的I/O线程收到信息后,将日志内容依次写入到slave端的relay log(中继文件)的最末端,存master日志文件的地址。

        (5)、slave的SQL线程检测到relay-log中新加内容后,马上将该log文件的内容解析成sql语句并逐一执行,从而能保证两端的数据是一样的。最后I/O线程和SQL线程将进入睡眠状态,等待下一次被唤醒。

    3、主从同步配置

        (1)、安装好两台MySQL,并且启动。

            ①、12.122.132.22 :3306 主库

            ②、12.122.132.23 :3306 从库

        (2)、登录主库,创建一个用户用于主从复制:

            -- 用户名 db_sync 密码123456

            CREATE USER ‘db_sync'@'*' IDENTIFIED BY '123456';

            -- 执行刷新权限:

            flush privileges; 

        (3)、修改主库配置文件

            log-bin:设置logbin文件名称,最好不要改动位置。

            server-id:该id主从之间必须是唯一,唯一的标识。

            binlog-do-db:指定可以主从同步的数据库,多数据库则配置多行。

            binlog-ignore-db:指定不可以主从同步的数据库,多数据库则配置多行

        (4)、修改从库配置文件

        (5)、从库执行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; -- 开始位置 

    4、主从同步延迟

        (1)、产生原因

            MySQL的主从复制都是单线程的操作,主库对所有DDL和DML产生的日志写进binlog,由于binlog是顺序写,所以效率很高。slave的SQL线程将主库的DDL和DML操作事件在slave中重放。DML和DDL的IO操作是随机的,不是顺序,所以成本要高很多。另一方面,由于slave的sql thread也是单线程的,当主库的并发较高时,产生的DML数量超过slave的sql thread所能处理的速度,或者当slave中有大型query语句产生了锁等待,那么延时就产生了。

        (2)、解决方案

            ①、业务的持久化层的实现水平分库架构,MySQL服务可平行扩展,分散压力。

            ②、单个库读写分离,一主多从,主写从读,分散压力。这样从库压力比主库高,保护主库。

            ③、服务的基础架构在业务和MySQL之间加入memcache或者redis的cache层,降低MySQL的读压力。

            ④、不同业务的MySQL物理上放在不同机器,分散压力。

            ⑤、使用比主库更好的硬件设备作为slave,MySQL压力小,延迟自然会变小。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值