0%

MySQL-主从复制

什么是主从复制

传统数据库中存在的问题

  1. 传统数据库设计时,如果服务器宕机,将不能为用户提供服务导致整个系统崩溃
  2. 如果数据库突然宕机,会导致数据丢失
  3. 为了防止数据丢失,要进行实时备份

冷备份:通过数据库工具进行人为的导出 SQL,但是手动导出数据可能在中间节点宕机时也会造成数据库的丢失

主从复制

主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库

主从复制的作用

  1. 做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失
  2. 架构的扩展。业务量越来越大,I/O 访问频率过高,单机无法满足,此时做多库的存储,降低磁盘 I/O 访问的频率,提高单个机器的 I/O 性能
  3. 读写分离,使数据库能支撑更大的并发

主从复制的原理

  1. 数据库有个 bin-log 二进制文件,记录了所有 SQL 语句
  2. 我们的目标就是把主数据库的 bin-log 文件的 SQL 语句复制过来
  3. 让其在从数据的 relay-log 重做日志文件中再执行一次这些 SQL 语句即可
  4. 下面的主从配置就是围绕这个原理配置
  5. 具体需要三个线程来操作

i/o 线程去请求主库的 binlog,并将得到的 binlog日志写到 relay log(中继日志)
文件中,主库会生成一个 log dump 线程,用来给从库 i/o线程传 binlog,SQL 线程,会
读取 relay log 文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致

主从复制实现过程

主机

  1. 首先修改 mysql 的配置文件,使其支持二进制日志功能,打开主服务器的 mysql 配置文件:my.conf(window保存时, 使用使用 ANTIS 格式,否则 Mysql 启动不起来),加入如下代码
1
log-bin=C:/ProgramData/MySQL/MySQL Server 5.7/Data/mysql-bin

将 mysql 二进制日志取名为 mysql-bin

server-id=1:为服务器设置一个独一无二的 id 便于区分,重启 mysql 命令

  1. 在主服务器上为从服务器分配一个账号,就像一把钥匙,从服务器拿着这个钥匙,才能到主服务器上来共享主服务器的日志文件
1
GRANT replication slave ON *.* TO 'jonathanlee'@'169.254.122.48' IDENTIFIED BY '123456';
1
FLUSH PRIVILEGES
  1. 查看主服务器 BIN 日志的信息,执行完之后记录下这两值,然后在配置完从服务器之前不要对主服务器进行任何操作,因为每次操作数据库时这两值会发生改变
1
show master status;
  • mysql-bin.000003
  • 612

从机

进入从机修改配置文件

1
vim /etc/my.cnf
1
log-bin=mysql-bin
1
server-id=2

保存修改,重启服务

启动mysql服务

1
systemctl start mysqld.service

停止mysql服务

1
systemctl stop mysqld.service

在从机mysql中执行以下语句

执行以下语句

1
2
3
4
5
CHANGE MASTER TO MASTER_HOST = '169.254.122.48',
MASTER_USER = 'jonathanlee',
MASTER_PASSWORD = '123456',
MASTER_LOG_FILE = 'mysql-bin.000003',
MASTER_LOG_POS = 612;

参数解释

  • MASTER_HOST:设置要连接的主服务器的ip地址
  • MASTER_USER:设置要连接的主服务器的用户名
  • MASTER_PASSWORD:设置要连接的主服务器的密码
  • MASTER_LOG_FILE:设置要连接的主服务器的bin日志的日志名称,即第3步得到的信息
  • MASTER_LOG_POS:设置要连接的主服务器的bin日志的记录位置,即第3步得到的信息,(这里注意,最后一项不需要加引号。否则配置失败)

先在从服务器配置完成,启动从服务器

1
START SLAVE;

查看是否配置成功

1
SHOW SLAVE STATUS;

停止服务复制

1
STOP SLAVE
↓赏一个鸡腿... 要不,半个也行↓