主从复制原理

image.png

  1. 主数据库有个 bin log 二进制文件,记录了所有增删改 SQL 语句。(binlog线程)
  2. 从库发起连接,连接到主库。
  3. 此时主库创建一个 binlog dump thread,把 bin log 的内容发送到从库。
  4. 从库启动之后,创建一个 I/O 线程,读取主库传过来的 bin log 内容并写到 relay log
  5. 从库还会创建一个SQL线程,从 relay log 里面读取内容。 重做日志文件,再执行一次这些sql语句。(sql执行线程)

    搭建一主一从

    image.png
    一台是主数据库,同时对外提供读写操作。一台是从数据库,对外提供读的操作。数据从主库同步到从库。

    修改主机配置

    vim /etc/my.cnf
    注意:mydb1 数据库现在不要创建,等搭建完成主从之后,直接在主数据库创建,从数据也会创建该数据库。如果先创建了,搭建完成之后,其实从数据库并没有mydb1这个数据库。此时直接操作数据库会导致从数据库报错。
    1. # 主库其唯一id
    2. server-id=1
    3. # 启用二进制日志文件
    4. log-bin=makun-master-bin
    5. # 设置不要复制的数据库(可设置多个)
    6. binlog-ignore-db=mysql
    7. # 设置需要复制的数据库
    8. binlog-do-db=mydb1
    9. # 设置binlog的日志格式
    10. binlog_format=STATEMENT
    image.png
    重启主机服务

    修改从数据库配置

    1. # 从库唯一ID
    2. server-id=2
    3. # 启动中继日志
    4. relay-log=mysql-relay
    image.png
    重启从机服务

    关闭防火墙

    ```bash

    临时关闭防火墙

    systemctl stop firewalld

永久关闭防火墙

systemctl disable firewalld

  1. <a name="yq1Tz"></a>
  2. ### 主从连接配置
  3. 1. 在主机创建slave账号
  4. ```sql
  5. -- 创建slave1账号
  6. create user 'slave1'@'%' identified by '123456';
  7. -- 修改加密插件
  8. alter user 'slave1'@'%' identified with mysql_native_password by '123456';
  9. -- 授权
  10. grant replication slave on *.* to 'slave1'@'%';
  11. -- 刷新权限
  12. flush privileges;
  13. -- 查看master状态
  14. show master status;

image.png

  1. 在从机配置连接信息 ```sql change master to master_host=’192.168.58.128’, master_user=’slave1’, master_password=’123456’, master_log_file=’makun-master-bin.000003’,master_log_pos=1110;

— 上面log-file和pos接入点就是主机的信息 — 表示从机从哪里开始复制主机的


3. 开启从机服务
```sql
start slave;
  1. 查看从机状态

    show slave status\G;
    

    image.png
    当这两个全是Yes的时候表示主从已经搭建完成

  2. 在主机创建数据库便添加数据

image.png

  1. 如果发生错误想重新搭建的话

    # 在从机停止slave
    stop slave;
    # 重置master信息
    reset master;
    ## 之后就可以从查看主机状态信息开始,从新配置连接信息即可
    
  2. 遇到的问题

    我的从服务器是直接把主服务器的虚拟机直接拷贝一份出来的,然后在配置从数据库连接信息的时候就不是两个Yes 原因是:克隆出来的服务器,和主服务器mysql的uuid是相同的 解决:手动修改其中一个uuid

# 查看uuid
select uuid();
# 解决
cd /var/lib/mysql/
vi auto.cnf
# 修改server-uuid
# 重启MySQL服务
systemctl restart mysqld
# 查看data目录位置
show variables like 'datadir';

image.png

搭建双主双从

image.png

修改m1配置文件

#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=mydb1
#设置logbin格式
binlog_format=STATEMENT

# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
# 表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
# 因为时两台主机,所以步长为2     1、3、5、7...
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=1

修改m2配置

#主服务器唯一ID
server-id=3
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=mydb1
#设置logbin格式
binlog_format=STATEMENT

# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
# 表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
# 因为时两台主机,所以步长为2     2、4、6、8...
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=2

修改s1和s2配置

#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay
#从服务器唯一ID
server-id=4
#启用中继日志
relay-log=mysql-relay

双主机、双从机重启 mysql 服务

在两台主机上建立帐户并授权 slave

# 创建slave1账号
create user 'slave1'@'%' identified by '123456';
# 修改加密插件
alter user 'slave1'@'%' identified with mysql_native_password by '123456';
# 授权
grant replication slave on *.* to 'slave1'@'%';
# 刷新权限
flush privileges;

# 查看master状态
show master status;

记住上面的主机状态

在从机上配置主机连接配置

change master to master_host='192.168.58.128',
master_user='slave1',
master_password='123456',
master_log_file='makun-master-bin.000003',master_log_pos=1110;

# 上面log-file和pos接入点就是主机的信息
# 表示从机从哪里开始复制主机的

# 开启从机服务
start slave;
# 查看从机状态
show slave status
# 必须是两个 Yes

现在只是搭建好了m1->s1m2->s2,还差m1<->m2

两个主机互相复制

两个主机都要执行下面的操作,配置自行修改

change master to master_host='192.168.58.128',
master_user='slave1',
master_password='123456',
master_log_file='makun-master-bin.000003',master_log_pos=1110;

# 上面log-file和pos接入点就是主机的信息
# 表示从机从哪里开始复制主机的

# 开启从机服务
start slave;
# 查看从机状态
show slave status
# 必须是两个 Yes

验证

此时在m1新增数据库并插入数据
image.png