Mysql主从复制

扩展方式: Scale UP, Scale Out

MySQL的扩展:

  复制: 每个节点都有相同的数据集

    向外扩展

    二进制日志

    单向

复制的功用:

  数据分布

  负载均衡读

  备份

  高可用和故障切换

  MySQL升级测试

主从复制线程:

  主节点: 

    dump Thread: 为每个Slave的I/O Thread启动一个dump线程,向从库发送binary log events

  从节点:

    I/O Thread: 向Master 请求二进制日志事件,并保存于中继日志中,

    SQL Thread: 从中继日志中读取日志事件,在本地完成重放

跟复制功能相关的文件:

  master.info: 用于保存slave链接至master时的相关信息,例如: 账号,密码, 服务器地址等

  relay-log.info: 保存在当前slave节点上,已经复制的当前二进制日志和本地replay log日志的对应关系

主从复制特点:

  异步复制

  主从数据不一致比较常见

复制架构:

  Master/Slave , Master/Master, 环状复制 ,一主多从

  从服务器还可以在有从服务器

  一丛多主,适用于多个不同数据库

复制需要考虑二进制时间记录格式

  STATEMENT(5.0之前) ROW(5.1之后,推荐), MIXED

各种复制模型实战:

  主从,主主,半同步复制, 复制过滤器

 主从配置过程参考文档:

  https://mariadb.com/kb/en/library/setting-up-replication/

  https://dev.mysql.com/doc/refman/5.5/en/replication-configuration.html

  主节点:

    1) [mysqld]

       log_bin=mysql-bin

    2) 当前节点设置一个全局唯一的ID号

      [mysqld]

      server_id=#

    3) 创建由复制全向的用户账号

      GRANT REPLCATION SLAVE ON *.* TO 'repluser'@HOST IDENTIFIED BY 'password';

从节点配置:
  1)启动中继日志
    [mysqld]
      server_id=# 为当前节点设置一个全局惟的ID号
      relay_log=relay-log relay log的文件路径,默认值hostname-relay-bin
      relay_log_index=relay-log.index默认值hostname-relay-bin.index
       2)使用有复制权限的用户账号连接至主服务器,并启动复制线程

mysgl> CHANGE MASTER TO MASTER_HOST='host',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='mysql-binxxxxx',MASTER_LOG_POS=#;
mysgl> START SLAVE [IO_THREAD|SQL_THREAD];

实战操作

1. Master 配置

  1) 修改配置文件

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
innodb_file_per_table
log_bin
server_id=1

  2) 创建测试数据库(可选),创建复制用户

# 查看 要复制的log日志size 点

MariaDB [(none)]> show binary logs;
+--------------------+-----------+
| Log_name | File_size |
+--------------------+-----------+
| mariadb-bin.000001 | 245 |
+--------------------+-----------+

# 创建数据库测试文件
MariaDB [(none)]> create database test;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> use test
MariaDB [test]> create table students(id int auto_increment primary key,name varchar(30) not NULL UNIQUE key ,gender char(1) DEFAULT'm');
Query OK, 0 rows affected (0.36 sec)
MariaDB [test]> insert into students (name) values ('Zhang San'),('Li Si');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
MariaDB [test]> insert into students (name) values ('Wang Wu'),('Zhao Liu');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

# 查看 bin log日志

MariaDB [test]> show binary logs;
+--------------------+-----------+
| Log_name           | File_size |
+--------------------+-----------+
| mariadb-bin.000001 |      1841 |
+--------------------+-----------+
1 row in set (0.00 sec)

# 创建复制用户
MariaDB [test]> grant replication slave on *.* to repluser@'192.168.10.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

从服务器配置

  1) 配置数据库文件

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
innodb_file_per_table
server_id=2

  2) 

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.16.0.40',MASTER_USER='alave',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mariadb-bin.000001',MASTER_LOG_POS=245;
Query OK, 0 rows affected (0.00 sec)

  3) 启动同步线程

MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)

  

  4) 查看从服务器状态

MariaDB [(none)]> show slave statusG

  

检查,查看日志信息

# 主服务器执行
MariaDB [test]> show binary logs;
+--------------------+-----------+
| Log_name           | File_size |
+--------------------+-----------+
| mariadb-bin.000001 |      2155 |
+--------------------+-----------+
# 从服务器执行
MariaDB [(none)]> show slave statusG
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.0.40
          Read_Master_Log_Pos: 2155
 Seconds_Behind_Master: 0  #主从同步的时间差

  

原文地址:https://www.cnblogs.com/yanshicheng/p/10453708.html