主从复制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并重启服务