什么是主从复制
传统数据库中存在的问题
- 传统数据库设计时,如果服务器宕机,将不能为用户提供服务导致整个系统崩溃
- 如果数据库突然宕机,会导致数据丢失
- 为了防止数据丢失,要进行实时备份
冷备份:通过数据库工具进行人为的导出 SQL,但是手动导出数据可能在中间节点宕机时也会造成数据库的丢失
主从复制
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库
主从复制的作用
- 做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失
- 架构的扩展。业务量越来越大,I/O 访问频率过高,单机无法满足,此时做多库的存储,降低磁盘 I/O 访问的频率,提高单个机器的 I/O 性能
- 读写分离,使数据库能支撑更大的并发
主从复制的原理
- 数据库有个 bin-log 二进制文件,记录了所有 SQL 语句
- 我们的目标就是把主数据库的 bin-log 文件的 SQL 语句复制过来
- 让其在从数据的 relay-log 重做日志文件中再执行一次这些 SQL 语句即可
- 下面的主从配置就是围绕这个原理配置
- 具体需要三个线程来操作
i/o 线程去请求主库的 binlog,并将得到的 binlog日志写到 relay log(中继日志)
文件中,主库会生成一个 log dump 线程,用来给从库 i/o线程传 binlog,SQL 线程,会
读取 relay log 文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致
主从复制实现过程
主机
- 首先修改 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 | GRANT replication slave ON *.* TO 'jonathanlee'@'169.254.122.48' IDENTIFIED BY '123456'; |
1 | FLUSH PRIVILEGES |
- 查看主服务器 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 | CHANGE MASTER TO MASTER_HOST = '169.254.122.48', |
参数解释
- 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 |