• linux-mysql-主从同步


    什么是二进制日志binlog:
    记录着mysql数据库中的一些写入性操作,比如一些增删改,但不包括查询!
    二进制日志有哪些功能:
    数据复制和数据恢复的功能

    查看网络状态:
    netstat -natp
    查看master或slave状态:
    show processlist; // 配置主从连接后,根据状态判断是否配置成功
    1、binlog(二进制日志):主机配置
    relaylog(中继日志):从机
    2、每个服务器都有id,也就是Mysql集群每个机器有一个唯一的标识
    3、授权信息(用户、密码、ip地址)【微信sdk,将系统在平台申请,获取微信平台秘钥】
    3.1、主服务器开通账户,设置权限
    create user 'repl'@'172.17.0.%' identified by '123456';
    grant replication slave on *.* to 'repl'@'172.17.0.%' identified by '123456';
    所有库.所有表
    flush privileges;
    3.2、从服务器设置访问信息
    stop slave; // 关闭同步线程(I/O thread):停止从主服务器继续同步主服务器的binarylog文件
    show slave statusG; // 查看从服务器与主服务器通信情况
    change master to master_host='主机IP',master_user='repl',master_password='123456',
    master_log_file='mysql-bin.000001',master_log_pos=154;

    start slave; // 开启同步线程
    show slave statusG;
    // show master status; 找到binlog文件
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000001 | 154 | | | |
    +------------------+----------+--------------+------------------+-------------------+


    // 查看binlog文件内容
    mysql> show binlog events in 'binlog文件名' from 0;



    show slave statusG;
    发现如下问题
    Slave_IO_Running: No 
    Slave_SQL_Running: Yes

    原因:1、The slave I/O thread stops because master and slave have equal MySQL server ids(主从服务器id相同了)
    在主机这边,操作:
    vim /etc/my.cfg文件中server_id
    service mysql restart;
    在从机那边,操作:
    start slave;


    2、Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
    在主机那边,执行:
    mysql> flush logs;
    Query OK, 0 rows affected (0.01 sec)
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000003 | 154 | | | |
    +------------------+----------+--------------+------------------+-------------------+


    记下File, Position。
    在从机这边,执行:
    mysql> change master to master_log_file='mysql-bin.000003',master_log_pos=154;
    Query OK, 0 rows affected (0.01 sec)
    mysql> start slave; // 开启同步IO线程
    Query OK, 0 rows affected (0.00 sec)


    mysql> show slave statusG;
    *************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event
    Master_Host: 47.105.49.219
    Master_User: repl
    Master_Port: 3306
    Connect_Retry: 60
    Master_Log_File: mysql-bin.000003
    Read_Master_Log_Pos: 154
    Relay_Log_File: iZwz97y9qoykzzotubitq3Z-relay-bin.000002
    Relay_Log_Pos: 320
    Relay_Master_Log_File: mysql-bin.000003
    Slave_IO_Running: Yes // io线程开启了
    Slave_SQL_Running: Yes
    Seconds_Behind_Master: NULL //从属服务器SQL线程和从属服务器I/O线程之间的时间差距,单位以秒计


    4、查看是否配置成功
    从服务器:
    mysql> show processlist;
    +----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
    | Id | User | Host | db | Command | Time | State | Info |
    +----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
    | 8 | root | localhost | NULL | Query | 0 | starting | show processlist |
    | 10 | system user | | NULL | Connect | 36 | Slave has read all relay log; waiting for more updates | NULL |
    | 11 | system user | | NULL | Connect | 37 | Waiting for master to send event | NULL |
    +----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
    主服务器:
    mysql> show processlist;
    +----+------+----------------------+------+-------------+------+---------------------------------------------------------------+------------------+
    | Id | User | Host | db | Command | Time | State | Info |
    +----+------+----------------------+------+-------------+------+---------------------------------------------------------------+------------------+
    | 2 | root | localhost | NULL | Query | 0 | starting | show processlist |
    | 4 | repl | 39.108.130.154:45454 | NULL | Binlog Dump | 62 | Master has sent all binlog to slave; waiting for more updates | NULL |
    +----+------+----------------------+------+-------------+------+---------------------------------------------------------------+------------------+

    5、测试主从同步

    在主服务器上创建一张表c,查看binlog文件内容如下:
    mysql> show binlog events in'mysql-bin.000004' from 0;
    +------------------+-----+----------------+-----------+-------------+------------------------------------------------------------+
    | Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
    +------------------+-----+----------------+-----------+-------------+------------------------------------------------------------+
    | mysql-bin.000004 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.24-log, Binlog ver: 4 |
    | mysql-bin.000004 | 123 | Previous_gtids | 1 | 154 | |
    | mysql-bin.000004 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
    | mysql-bin.000004 | 219 | Query | 1 | 336 | use `a`; create table c (id int not null,name varchar(20)) |
    | mysql-bin.000004 | 336 | Anonymous_Gtid | 1 | 401 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
    | mysql-bin.000004 | 401 | Query | 1 | 470 | BEGIN |
    | mysql-bin.000004 | 470 | Table_map | 1 | 514 | table_id: 110 (a.c) |
    | mysql-bin.000004 | 514 | Write_rows | 1 | 563 | table_id: 110 flags: STMT_END_F |
    | mysql-bin.000004 | 563 | Xid | 1 | 594 | COMMIT /* xid=93 */ |
    +------------------+-----+----------------+-----------+-------------+------------------------------------------------------------+

    在从服务器上查询是否存在这张表c
    mysql> show tables;
    +-------------+
    | Tables_in_a |
    +-------------+
    | c |
    +-------------+
    1 row in set (0.00 sec)

    结论:主从同步(复制)配置成功了!!!
    注意点:从服务器只读,不要进行写操作。如果插入了数据,主服务器与从服务器插入的数据重复了,同步binlog日志后,
    在解析完中继文件执行sql时,可能会发生Duplicate entry '1' for key 'PRIMARY'等问题

    6、主从同步延时问题
    延迟情况分析:
    ● show slave status显示参数Seconds_Behind_Master不为0,这个数值可能会很大
    ● show slave status显示参数Relay_Master_Log_File和Master_Log_File显示bin-log的编号相差很大,说明bin-log在从库上没有及时同步,所以近期执行的bin-log和当前IO线程所读的bin-log相差很大
    ● mysql的从库数据目录下存在大量mysql-relay-log日志,该日志同步完成之后就会被系统自动删除,存在大量日志,说明主从同步延迟很厉害

    使用并行复制解决:
    mysql5.6支持从服务器sql线程并行复制,但并行是库级别的,对于单个库的操作,Thread SQL还是串行执行。
    mysql5.7支持从服务器sql线程并行复制,并行是事务组级别的,对于单个库的一事务组操作,Thread SQL可以并行执行。
    (硬件方面:考虑从服务器性能(cpu,硬盘)、考虑网络带宽)

    7、主从同步数据丢失问题
    分析:默认情况下,Mysql复制是异步的。主机将事件写入其二进制日志中,但不知道从机是否或何时检索并处理了它们,使用异步复制,如果主服从器奔溃,则它提交的事务可能不会传输到任何从服务器。
    因此,在这种情况下,从服务器就无法同步到主服务器上的部分数据了。

    ● 如果在主服务器端启用了半同步复制,并且至少有一个半同步从服务器,则在主服务器上执行事务提交的线程将阻塞并等待,直到至少一个半同步从服务器确认已接收到该事务的所有事件为止,或者直到发生超时。
    ● 从属仅在将事件写入其中继日志并刷新到磁盘后,才确认接收到事务的事件。
    ● 如果发生超时而没有任何从属服务器确认该事务,则主服务器将还原为异步复制。当至少有一个半同步从属服务器赶上时,主服务器将返回到半同步复制。
    ● 必须在主服务器和从服务器上都启用半同步复制。如果在主服务器上禁用了半同步复制,或者在主服务器上但没有从属服务器上启用了半同步复制,则主服务器将使用异步复制。

    使用半同步复制解决:
    主服务器事务线程在提交时会被阻塞并等待,从服务器读取binlog日志,然后写入replay中继日志到硬盘,最后给主服务器一个ack通知,此时主服务器才继续进行下一次会话。
    (或者等待到配置的超时时间后,半同步复制将会自动关闭,转为异步复制)

  • 相关阅读:
    open-falcon实现邮件报警
    open-falcon监控Flume
    Ubuntu下安装open-falcon-v0.2.1
    Python学习笔记——发邮件
    Flume的监控参数
    Ubuntu下安装Kafka Manager
    Ubuntu系统监控indicator-sysmonitor
    kafka性能测试
    Ubuntu下安装sbt
    Ubuntu安装shadow$ocks-libev
  • 原文地址:https://www.cnblogs.com/yuefeng123/p/12359067.html
Copyright © 2020-2023  润新知