MySQL的主从复制

为君一笑 提交于 2020-03-10 10:54:11

1.什么是主从复制

MySQL 主从复制是其最重要的功能之⼀. 主从复制是指⼀台服务器充当主数据库服务器, 另⼀台或多台服务器充当从数据库服务器, 主服务器中的数据⾃动复制到从服务器之中. 对于多级复制, 数据库服务器即可充当主机, 也可充当从机.

MySQL主从复制的基础是主服务器对数据库修改记录⼆进制⽇志, 从服务器通过主服务器的⼆进制⽇志⾃动执⾏更新.

2.主从复制的类型

  1. 基于语句的复制:
    主服务器上⾯执⾏的语句在从服务器上⾯再执⾏⼀遍.
    存在的问题: 时间上可能不完全同步造成偏差, 执⾏语句的⽤户也可能是不同⼀个⽤户.

  2. 基于⾏的复制:
    把主服务器上⾯改编后的内容直接复制过去, ⽽不关⼼到底改变该内容是由哪条语句引发的.
    存在的问题: ⽐如⼀个⼯资表中有⼀万个⽤户, 我们把每个⽤户的⼯资+1000, 那么基于⾏的复制则要复制⼀万⾏的内容, 由此造成的开销⽐较⼤, ⽽基于语句的复制仅仅⼀条语句就可以了.

  3. 混合类型的复制:
    MySQL 默认使⽤基于语句的复制, 当基于语句的复制会引发问题的时候就会使⽤基于⾏的复制, MySQL会⾃动进⾏选择.
    在MySQL主从复制架构中, 读操作可以在所有的服务器上⾯进⾏, ⽽写操作只能在主服务器上⾯进⾏. 主从复制架构虽然给读操作提供了扩展,可如果写操作也⽐较多的话(多台从服务器还要从主服务器上⾯同步数据), 单主模型的复制中主服务器势必会成为性能瓶颈.

3.主从复制的原理

  1. 主服务器上⾯的任何修改都会保存在⼆进制⽇志 Binary log ⾥⾯.

  2. 从服务器上⾯启动⼀个 I/O thread(实际上就是⼀个主服务器的客户端进程), 连接到主服务器上⾯请求读取⼆进制⽇志, 然后把读取到的⼆进制⽇志写到本地的⼀个 Relay log ⾥⾯.

  3. 从服务器上⾯开启⼀个 SQL thread 定时检查 Relay log, 如果发现有更改⽴即把更改的内容在本机上⾯执⾏⼀遍.

  4. 如果⼀主多从的话, 这时主库既要负责写, ⼜要负责同时为多个从库提供⼆进制⽇志. 所以可以稍做调整, 将⼆进制⽇志只给某⼀从, 这⼀从再开启⼆进制⽇志并将⾃⼰的⼆进制⽇志再发给其它从. 或者是⼲脆这个从不记录只负责将⼆进制⽇志转发给其它从, 这样架构起来性能可能要好得多, ⽽且数据之间的延时应该也稍微要好⼀些. ⼯作原理图如下:
    在这里插入图片描述

4.主从复制的配置

最简单的复制模式就是⼀主⼀从的复制模式了, 这样⼀个简单的架构只需要,如下⼏个步骤:
主机上的操作:

  1. 在主机上建⽴⼀个⽤户, 专⻔⽤来进⾏主从复制
GRANT REPLICATION SLAVE ON *.* TO 'backup'@'%'
IDENTIFIED BY '123';
  1. 建⽴⼀个主节点, 开启 binlog, 设置服务器id
    在主机上找到 /etc/mysql/my.cnf ⽂件, 并打开. 将 [mysqld] 的段落,改为如下内容:
[mysqld]
# 主机绑定 0.0.0.0 确保从机可以访问. ⽣产环境下出于安全考虑会绑定内⽹地址
bind-address = 0.0.0.0
# 设置主机 ID
server-id = 1
# 主机读写模式: 0 表示读写都可以
read-only = 0
# 主机的 bin log 的路径
log-bin = /var/log/mysql-bin.log
  1. 然后重启 MySQL 服务: sudo systemctl restart mysql
  2. 检查⼆进制⽇志是否启动
    进⼊ MySQL, 执⾏如下语句
show variables like 'log_%';
看到 log_bin 的值为 ON 表示成功
  1. 查看 master 状态
show master status;
记下 File 和 Position 的值
  1. 建⽴⼀个从节点, 设置服务器id;
    同样, 再从机上找到 /etc/mysql/my.cnf ⽂件, 并打开, 添加如下内容:
[mysqld]
server-id = 2 # 设置从机的 id
read-only = 1 # 从机设置为只读模式
然后重启: sudo systemctl restart mysql
  1. 再从机上进⼊ mysql, 并执⾏如下语句:
 -- 指定主机
change master to
master_host='192.168.1.10', 
master_user='backup', 
master_password='123', 
master_log_file='mysql-bin.000001',
master_log_pos=434; 
-- 启动从库
start slave;

 -- 查看从库
show slave status\G;
看到从机状态中包含如下信息说明⼤功告成:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!