mysql5.7的主从搭建以及分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CharJay_Lin/article/details/82726192

1. 安装mysql5.7

1.1 安装

wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
rpm -ivh mysql57-community-release-el7-8.noarch.rpm
yum -y install mysql-server

1.2 启动

service mysqld start
然后查看mysql状态
service mysqld status

1.3 查看密码

会在 /var/log/mysqld.log文件中会自动生成一个随机的密码,用于安装后登录mysql,查看该随机密码。
grep “temporary password” /var/log/mysqld.log

1.4 登录

mysql -uroot -p 回车
粘贴上面查找到的随机密码

1.5 重置密码

mysql5.7对密码有安全策略,简单的密码通不过,如果要设置简单密码则降低安全策略,登录后执行语句

set global validate_password_length=4;
set global validate_password_policy=0;
SET PASSWORD FOR ‘root’@’localhost’ = PASSWORD(‘root’);

1.6 授权客户端登录

GRANT all privileges on *.* TO ‘root’@’%’ identified by ‘root’ WITH GRANT OPTION;

1.7 安装以后文件对应的目录

mysql的数据文件和二进制文件: /var/lib/mysql/
mysql的配置文件: vim /etc/my.cnf
mysql的日志文件: /var/log/mysql.log

2. 165 为master

1)创建一个用户’repl’,并且允许其他服务器可以通过该用户远程访问master,通过该用户去读取二进制数据,实现数据同步,repl用户必须具有REPLICATION SLAVE权限,除此之外其他权限都不需要

CREATE USER 'repl' IDENTIFIED by 'repl'; 
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl'; 

2)修改my.cnf配置文件,在[mysqld] 下添加如下配置
* log-bin=mysql-bin //启用二进制日志文件
* server-id=165 服务器唯一ID
3)重启数据库 systemctl restart mysqld
4)登录到数据库,通过show master status 查看master的状态信息

3. 166 为slave

1)修改166 my.cnf配置文件, 在[mysqld]下增加如下配置
* server-id=166服务器id,唯一
* relay-log=slave-relay-bin 中继日志 保存master的信息
* relay-log-index=slave-relay-bin.index
* read_only=1 从服务器要设置只读
2)重启数据库: systemctl restart mysqld
3)连接到数据库客户端,通过如下命令建立同步连接

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

image.png | left | 619x112

master_log_file和master_log_pos是从master的show master status可以找到对应的值,不能随便写。

4)执行 start slave;
5)show slave status\G;
查看slave服务器状态,当如下两个线程状态为yes,表示主从复制配置成功
Slave_IO_Running=Yes
Slave_SQL_Running=Yes

6)之后在master上建数据库表等会自动同步到slave

4. 主从同步的原理

4.1 一主多从

image | left

image.png | left | 388x244

4.2 双主

双主的使用场景比较少,会出现数据不一致问题

4.3 原理

image | left

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);
文件内容存储:/var/lib/mysql

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

5. binlog的格式

statement : 基于sql语句的模式。update table set name =”“; effect row 1000;
row: 基于行模式; 存在1000条数据变更; 记录修改以后每一条记录变化的值
mixed: 混合模式,由mysql自动判断处理

show variables like '%log%'; 查看binlog_formater格式
修改binlog_formater,通过在mysql客户端输入如下命令可以修改
set global binlog_format='row/mixed/statement';
或者在vim /etc/my.cnf  的[mysqld]下增加binlog_format='mixed'

5.1 主从同步延迟是怎么产生的

  1. 当master库tps比较高的时候,产生的DDL数量超过slave一个sql线程所能承受的范围,或者slave的大型query语句产生锁等待
  2. 网络传输: bin文件的传输延迟
  3. 磁盘的读写耗时:文件通知更新、磁盘读取延迟、磁盘写入延迟

5.2 解决方案

1)在数据库和应用层增加缓存处理,优先从缓存中读取数据
2)减少slave同步延迟,可以修改slave库sync_binlog属性;
sync_binlog=0 文件系统来调度把binlog_cache刷新到磁盘
sync_binlog=n

3)增加延时监控
Nagios做网络监控
mk-heartbeat

6.参考

搭建 MySQL 5.7.19 主从复制,以及复制实现细节分析

猜你喜欢

转载自blog.csdn.net/CharJay_Lin/article/details/82726192
今日推荐