个人博客

mysql主从配置——读写分离

一、简介

当网站的有大量的并发访问时,除了在服务应用实现负载均衡,还需要分解单台数据库服务器的压力,大量的数据库连接到同一台机器,数据库必然崩溃,数据就会丢失。这时除了使用缓存减少数据库的压力,还可以设置数据库集群,使用mysql的主从配置,实现读写分离,减少数据库的压力。

二、原理

mysql中有一种叫做bin的日志(二进制日志)。这个日志会记录所有修改数据库的SQL语句(insert, update, delete, create/alter/drop table, grant等等)。主从复制的原理就是吧主服务器上的bin日志复制到从服务器上执行一遍,这样从服务器就有同样的数据。

复制过程:

  • 主节点必须启用二进制日志,记录任何修改数据库数据的事件。
  • 从节点启动一个线程(IO thread),当作主节点的客户端,通过mysql协议,请求主节点中的二进制日志文件中的事件。
  • 主节点启动一个线程(dump thread),检查自己的二进制日志文件中的事件,跟请求方的位置对比,如果请求中不到位置信息,则主节点会从第一日志文件中的第一个事件一个一个的发送过去。
  • 从节点接收到主节点的数据,把它保存到中继日志(relay log)文件中。并记录该次请求到主节点的哪个日志文件的哪个位置。
  • 从节点启动一个线程(SQL thread),把relay log中的事件读取出来,并在本地执行一次。

注意:如果从节点需要作为其他的节点的主节点,那么这个从节点也需要开启二进制日志文件,这种请求就是级联复制。如果只是作为从节点,那就不需要开启二进制日志文件。

线程的作用:

从节点:

  • IO thread:从主节点中请求二进制日志文件中的事件信息,并保存在中继日志中。
  • SQL thread:从中继日志中读取日志事件,并且在本地执行操作。

主节点:

  • dump thread:为每个从节点的IO thread启动一个dump线程,用于向从节点发送二进制事件数据。

复制特点:

  • 异步复制:主节点中一个用户请求来一个写操作时,主节点不需要把数据写入到本地后,发送给从服务器,并且等待从服务写入完成后的反馈。主节点只需要在本地写操作完成之后,就直接响应用户,此时另外的线程会跟进将数据发送给从服务器,这时从服务器可能会落后主节点。
  • 主从数据弱一致性。

三、配置

1,主节点:

  • 启动二进制日志。
  • 为当前节点设置一个全局唯一的server id。
  • 创建复制权限的用户账号REPLICATION SLAVE,REPLICATION CLIENT。

主节点机器:192.168.0.213

1)编辑主节点配置文件:

vi /etc/my.cnf

在配置文件中添加配置信息:

log-bin = mysql-bin
server-id = 1
innodb-file-per-table = ON
skip_name_resolve = ON

2)重启mysql服务:

systemctl restart mysql

3)登录mysql并且查看信息:

查看二进制日志是否开启:

show global variables like '%log%';

picture

查看主节点的二进制日志文件列表:

show master logs;

picture

查看主节点的server id:

show global variables like '%server%';

picture

4)在主节点上创建有复制权限的用户:

grant replication slave, replication client on *.* to 'slaveuser'@'192.168.0.%' identified by '123456';

注意:在mysql8.0版本已经将创建账户和赋予权限的方式分开了,创建账户(create user '用户名'@'访问主机' identified by '密码';),赋予权限(grant 权限列表 on 数据库 to '用户名'@'访问主机' ;)。

即mysql8.0使用命令:

create user 'slaveuser'@'192.168.0.%' identified by '123456';
grant replication slave, replication client on *.* to 'slaveuser'@'192.168.0.%';

5)刷新:

flush privileges;

2,从节点:

  • 启动中继日志。
  • 为当前节点设置一个全局唯一的server id。
  • 使用有复制权限的用户账号连接主节点,并启动复制线程。

从节点机器:192.168.0.214

1)编辑从节点配置文件:

vi /etc/my.cnf

在配置文件中添加配置信息:

relay-log=relay-log
relay-log-index=relay-log.index
server-id=2
innodb_file_per_table=ON
skip_name_resolve=ON

2)重启mysql服务:

systemctl restart mysql

3)登录mysql并且查看从节点信息:

查看中继日志是否开启:

show global variables like '%log%';

picture

查看从节点的server id:

show global variables like '%server%';

picture

4)从节点添加访问主节点配置信息:

添加主节点主机地址,访问主节点数据库的用户和密码,主节点的二进制文件。
注意:主节点的二进制文件一定是二进制列表中的最后一个二进制文件。

change master to MASTER_HOST='192.168.0.213', MASTER_USER='slaveuser', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=909;

5)查看从节点信息:

show slave status\G;

picture

因为没有启动从节点的复制线程,IO线程和SQL线程都为no。

6)启动复制线程:

start slave;

start slave可以指定启动线程类型:IO_THREAD, SQL_THREAD, 如果不指定,则两个都启动。

可以看到信息:

picture

注意:
如果使用的是mysql8.0版本,你会发现Slave_IO_Running: Connecting信息,然后可以查看到下面的错误信息:Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection。这里的原因是mysql8之前的加密规则是mysql_native_password,而mysql8之后加密规则是caching_sha2_password。
我们直接修改主节点的密码规则并更新密码:

alter user 'slaveuser'@'192.168.0.%' identified by '123456' password expire never;
alter user 'slaveuser'@'192.168.0.%' identified with mysql_native_password by '123456';

然后刷新:

flush privileges;

使用show master logs;查看新的主节点的日志信息后更新从节点配置,再重启从节点的复制线程,就可以看到正常的线程都启动成功了。

相关标签
回到顶部