MySQL主从复制(普通方式和gtid方式)

1.MySQL Replication

主从复制(也称 AB 复制)允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。
根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表。
MySQL中复制的优点包括:

  • 横向扩展解决方案 - 在多个从站之间分配负载以提高性能。在此环境中,所有写入和更新都必须在主服务器上进行。但是,读取可以在一个或多个从设备上进行。该模型可以提高写入性能(因为主设备专用于更新),同时显着提高了越来越多的从设备的读取速度。
  • 数据安全性 - 因为数据被复制到从站,并且从站可以暂停复制过程,所以可以在从站上运行备份服务而不会破坏相应的主数据。
  • 分析 - 可以在主服务器上创建实时数据,而信息分析可以在从服务器上进行,而不会影响主服务器的性能。
  • 远程数据分发 - 您可以使用复制为远程站点创建数据的本地副本,而无需永久访问主服务器。
    原理:
    主服务器上面的任何修改都会通过自己的 I/O tread(I/O 线程)保存在二进制日志 Binary log 里面。
    从服务器上面也启动一个 I/O thread,通过配置好的用户名和密码, 连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Realy log(中继日志)里面。
    从服务器上面同时开启一个 SQL thread 定时检查 Realy log(这个文件也是二进制的),如果发现有更新立即把更新的内容在本机的数据库上面执行一遍。
2.配置主从复制(普通方式)
1.准备

首先准备好两台装有数据库的虚拟机
yum安装mysql步骤

192.168.13.128   master
192.168.13.129   slave

两台虚拟机都要做:地址解析,关闭防火墙,selinux,清空iptables

master:
[root@master ~]# vim /etc/hosts
192.168.13.128   master
192.168.13.129   slave
[root@master ~]# systemctl stop firewalld 
[root@master ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@master ~]# setenforce 0
[root@master ~]# iptables -F
slave:
[root@slave ~]# vim /etc/hosts
192.168.13.128   master
192.168.13.129   slave
[root@slave ~]# systemctl stop firewalld 
[root@slave ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@slave ~]# setenforce 0
[root@slave ~]# iptables -F
2.主服务器配置
master   192.168.13.128
1. 在主服务器上,您必须启用二进制日志记录并配置唯一的服务器ID然后需要重启服务器。
[root@master ~]# vim /etc/my.cnf   #在mysqld模块里面添加如下内容
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1
2. 创建日志目录并赋予权限
[root@master ~]# mkdir /var/log/mysql
[root@master ~]# chown mysql.mysql /var/log/mysql
3. 重启服务
[root@master ~]# systemctl restart mysqld
4. 创建专门用于复制数据的用户,并授权
进入数据库 [root@master ~]# mysql -uroot -p
mysql> CREATE USER 'yjssjm'@'%';
mysql> GRANT REPLICATION SLAVE ON *.*  TO  'yjssjm'@'%'  identified by  '123';
mysql> show binlog events\G     #查看我们需要的Log_name
*************************** 1. row ***************************
   Log_name: mysql-bin.000001
        Pos: 4
 Event_type: Format_desc
  Server_id: 1
End_log_pos: 123
       Info: Server ver: 5.7.29-log, Binlog ver: 4
*************************** 2. row ***************************
   Log_name: mysql-bin.000001
        Pos: 123
 Event_type: Previous_gtids
  Server_id: 1
End_log_pos: 154
       Info: 
*************************** 3. row ***************************
   Log_name: mysql-bin.000001
        Pos: 154
 Event_type: Anonymous_Gtid
  Server_id: 1
End_log_pos: 219
       Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 4. row ***************************
   Log_name: mysql-bin.000001
        Pos: 219
 Event_type: Query
  Server_id: 1
End_log_pos: 354
       Info: CREATE USER 'yjssjm'@'%' IDENTIFIED WITH 'mysql_native_password'
*************************** 5. row ***************************
   Log_name: mysql-bin.000001
        Pos: 354
 Event_type: Anonymous_Gtid
  Server_id: 1
End_log_pos: 419
       Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 6. row ***************************
   Log_name: mysql-bin.000001
        Pos: 419
 Event_type: Query
  Server_id: 1
End_log_pos: 639
       Info: GRANT REPLICATION SLAVE ON *.* TO 'yjssjm'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257'
6 rows in set (0.00 sec)

5. 连接测试
[root@master ~]# mysql -uyjssjm -p'123' -hmaster
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.29-log MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
3.从服务器配置(无数据)

主服务器中无数据,所以我们不用备份,直接配置即可。

slave 192.168.13.129 
1.修改配置文件
[root@slave ~]# vim /etc/my.cnf
[mysqld]
server-id=4        
# server-id只要不是1就可以
2.重启服务
[root@slave ~]# systemctl restart mysqld
3.配置相关连接信息
mysql> edit       #进入编辑模式,复制下面内容
CHANGE MASTER TO
MASTER_HOST='master',
MASTER_USER='yjssjm',
MASTER_PASSWORD='123',
MASTER_LOG_FILE='mysqld-bin.000001',
MASTER_LOG_POS=0;

    -> ;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
===========================================================================
MASTER_HOST='master'   # master地址,如果你没做解析,可以直接用ip,如192.168.13.128
MASTER_USER='yjssjm'   # 创建的用户名
MASTER_PASSWORD='123'
MASTER_LOG_FILE='mysqld-bin.000001'   
MASTER_LOG_POS=0;
# 在master上执行show binlog events命令,可以看到第一个binlog文件的内容mysqld-bin.000001就是我们需要的文件名
===========================================================================
4. 查看
mysql> start slave;
mysql> show slave status\G

MySQL主从复制(普通方式和gtid方式)_第1张图片
测试我就不演示了,在master上面对数据库进行增删改,slave上面会进行同样的操作。

3.从服务器配置(有数据)
主服务器中有数据
  • 如果在启动复制之前有现有数据需要与从属设备同步,请保持客户端正常运行,以便锁定保持不变。这可以防止进行任何进一步的更改,以便复制到从站的数据与主站同步。
  1. 在主服务器中导出先有的数据

如果主数据库包含现有数据,则必须将此数据复制到每个从站。有多种方法可以实现:

  • 使用mysqldump工具创建要复制的所有数据库的转储。这是推荐的方法,尤其是在使用时 InnoDB
[root@master ~]# mysqldump  -u用户名  -p密码  --all-databases  --master-data=1 > dbdump.db

这里的用户是主服务器的用户

如果不使用 --master-data 参数,则需要手动锁定单独会话中的所有表。

  1. 从主服务器中使用 scprsync 等工具,把备份出来的数据传输到从服务器中。

在主服务中执行如下命令

[root@master ~]# scp  dbdump.db root@slave:/root/
这里的 slave 需要能被主服务器解析出 IP 地址,或者说可以在主服务器中 ping 通。
  1. 配置从服务器,并重启
    从服务器 上编辑其配置文件 my.cnf 并添加如下内容
// my.cnf 文件
[mysqld]
server-id=2
  1. 导入数据到从服务器,并配置连接到主服务器的相关信息
    登录到从服务器上,执行如下操作
/*导入数据*/
mysql> source   /root/fulldb.dump

在从服务器配置连接到主服务器的相关信息

mysql> CHANGE MASTER TO
MASTER_HOST='master',  -- 主服务器的主机名(也可以是 IP) 
MASTER_USER='yjssjm',           -- 连接到主服务器的用户
MASTER_PASSWORD='123';        -- 到主服务器的密码
  1. 启动从服务器的复制线程
    mysql> start slave;
    Query OK, 0 rows affected (0.09 sec)
    

检查是否成功
在从服务上执行如下操作,加长从服务器端 IO线程和 SQL 线程是否是 OK

mysql> show slave status\G

输出结果中应该看到 I/O 线程和 SQL 线程都是 YES, 就表示成功。
执行此过程后,在主服务上操作的修改数据的操作都会在从服务器中执行一遍,这样就保证了数据的一致性。

2.配置主从复制(gtid方式)
主库配置
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1
gtid_mode=ON
enforce_gtid_consistency=1   # 强制执行GTID一致性。

重启服务

其他和之前的一样

  • 创建专属用户并授权
  • 假如有数据导出数据
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY '123';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
mysql> 
从库配置

测试用户有效性

mysql -urepl -p'123' -hmysql-master1
[mysqld]
server-id=2
gtid_mode=ON
enforce_gtid_consistency=1

# 可选项, 把连接到 master 的信息存到数据库中的表中
master-info-repository=TABLE
relay-log-info-repository=TABLE

重启服务

假如有数据,先导入数据

mysql> source dump.db

Mysql 终端执行连接信息

mysql> CHANGE MASTER TO
MASTER_HOST='master',
MASTER_USER='yjssjm',
MASTER_PASSWORD='123',
MASTER_AUTO_POSITION=1;

mysql> start slave;

你可能感兴趣的:(笔记,主从,mysqld,linux,运维)