主从复制binlog日志方式

原理:
实现整个主从复制,需要由slave服务器上的IO进程和Sql进程共同完成.
要实现主从复制,首先必须打开Master端的binary log(bin-log)功能,因为整个MySQL 复制过程实际上就是Slave从Master端获取相应的二进制日志,然后再在自己slave端完全顺序的执行日志中所记录的各种操作。

主从复制原理

==================下面是过程

master 负责写 -----A
slave relay-log -----B
I/o 负责通信读取binlog日志
SQL 负责写数据

1 master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);

2slave将master的binary log events拷贝到它的中继日志(relay log);

3 slave重做中继日志中的事件,将改变反映它自己的数据。

1.主从复制延迟大比较慢原因:
主服务器配置高,从服务器的配置低。
并发量大导致主服务器读的慢。从服务器写的慢
网络延迟比较高
从服务器的读写速度慢

192.168.246.135    mysql-master
192.168.246.136    mysql-slave
准备两台机器,关闭防火墙和selinux。---两台机器环境必须一致。时间也得一致
两台机器配置hosts解析
192.168.246.135 mysql-master
192.168.246.136 mysql-slave
两台机器安装mysql
# wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
略...
[root@mysql-master ~]# systemctl start mysqld
[root@mysql-master ~]# systemctl enable mysqld

开始配置主服务

1、在主服务器上,必须启用二进制日志记录并配置唯一的服务器ID。需要重启服务器。

编辑主服务器的配置文件 my.cnf,添加如下内容

添加配置
[mysqld]
log-bin=mysql-bin  
server-id=1

创建日志目录并赋予权限

[root@mysql-master ~]# mkdir /var/log/mysql
[root@mysql-master ~]# chown mysql.mysql /var/log/mysql

注意:一般连不上就是问题出在这,删了重建。

重启服务

[root@mysql-master ~]# systemctl restart mysqld

查找密码

[root@mysql-master ~]# grep pass /var/log/mysqld.log

修改密码

[root@mysql-master ~]# mysqladmin -uroot -p'Ns0_3jgPIM*5' password 'QWer@12345!'
创建主从同步的用户:
mysql> GRANT REPLICATION SLAVE ON *.*  TO  'slave'@'%'  identified by 'QWer@12345!';
mysql> flush privileges;

mysql> select user,host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| slave         | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
4 rows in set (0.00 sec)


mysql> show master status;
+------------------------+----------+--------------+------------------+------------------------------------------+
| File                   | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------------+----------+--------------+------------------+------------------------------------------+
| linux-mylog-bin.000004 |     1639 |              |                  | 79172545-2940-11eb-9eed-000c2944920d:1-8 |
+------------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)

MASTER_LOG_FILE='linux-mylog-bin.000004',
MASTER_LOG_POS=629;
MASTER_USER='slave',     #上面设置的名字

在主服务器上面操作

在从服上面操作:

my.cnf配置文件

[mysqld]
server-id=2
重启服务
[root@mysql-slave ~]# systemctl restart mysqld
设置密码
[root@mysql-slave ~]# grep pass /var/log/mysqld.log
[root@mysql-slave ~]# mysqladmin -uroot -p'ofeUcgA)4/Yg' password 'QWer@12345!'
登录mysql
[root@mysql-slave ~]# mysql -uroot -p'QWer@12345!'
mysql> 
CHANGE MASTER TO
MASTER_HOST='192.168.86.145',    #主的网址
MASTER_USER='slave',    #上面设置的名字
MASTER_PASSWORD='QWer@12345!',   #主当中设置的密码
MASTER_LOG_FILE='linux-mylog-bin.000004',  #看主
MASTER_LOG_POS=629;   #看主

mysql> start slave;
mysql> show slave status\G
参数解释:
CHANGE MASTER TO
MASTER_HOST='master2.example.com',      #主服务器ip
MASTER_USER='replication',                        #主服务器用户
MASTER_PASSWORD='password',               #用户密码
MASTER_PORT=3306,                                #端口
MASTER_LOG_FILE='master2-bin.001',      #binlog日志文件名称
MASTER_LOG_POS=4,               #日志位置

在master上面执行:

mysql> create database testdb;   #创建一个库
Query OK, 1 row affected (0.10 sec)

mysql> \q

故障排错

#### UUID一致,导致主从复制I/O线程不是yes

> Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work

致命错误:由于master和slave具有相同的mysql服务器uuid,导致I/O线程不进行;这些uuid必须不同才能使复制工作。

问题提示主从使用了相同的server UUID,一个个的检查:

检查主从server_id

主库:

mysql>  show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
1 row in set (0.01 sec)

从库:

mysql>  show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
1 row in set (0.01 sec)

server_id不一样,排除。

检查主从状态:

主库:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
从库:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      306 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

File一样,排除。

最后检查发现他们的auto.cnf中的server-uuid是一样的。。。

[root@localhost ~]# vim /var/lib/mysql/auto.cnf

[auto]

server-uuid=4f37a731-9b79-11e8-8013-000c29f0700f

修改uuid并重启服务