CentOs7.3 搭建 MySQL 5.7.19 主从复制,以及复制实现细节分析

CentOs7.3 搭建 MySQL 5.7.19 主从复制,以及复制实现细节分析

参考 MySQL官网 - 第16章主从复制

概念

主从复制可以使MySQL数据库主服务器的主数据库,复制到一个或多个MySQL从服务器从数据库,默认情况下,复制异步; 从服务器不需要长连接接收主站的更新。根据配置,可以复制数据库中的所有数据库,选定的数据库或甚至选定的表。

MySQL中复制的优点包括:

  • 横向扩展解决方案

在多个从库之间扩展负载以提高性能。在这种环境中,所有写入和更新都必须在主库上进行。但是,读取可能发生在一个或多个从库上。该模型可以提高写入的性能(由于主库专用于更新),同时在多个从库上读取,可以大大提高读取速度。

  • 数据安全性

由于主库数据被复制到从库,从库可以暂停复制过程,可以在从库上运行备份服务,而不会破坏对应的主库数据。

  • 分析 - 可以在主库上创建实时数据,而信息分析可以在从库上进行,而不会影响主服务器的性能。

  • 长距离数据分发

可以使用复制创建远程站点使用的数据的本地副本,而无需永久访问主库。

环境

CentOS版本:CentOS 7.3.1611
Mysql版本:MySQL 5.7.19
Master-Server : 192.168.252.121
Slave-Server : 192.168.252.122

1.准备工作

关闭防火墙

$ systemctl stop firewalld.service

安装 MySQL

参考 - CentOs7.3 安装 MySQL 5.7.19 二进制版本

首先在两台机器上装上,保证正常启动,可以使用

关闭MySQL 服务

$ service mysql.server stop

2.Master 主服务器配置

修改 my.cnf

配置 Master 以使用基于二进制日志文件位置的复制,必须启用二进制日志记录并建立唯一的服务器ID,否则则无法进行主从复制。

$ vi /etc/my.cnf

[mysqld]
log-bin=mysql-bin
server-id=1

进行更改后,重新启动服务。

$ service mysql.server restart

master端参数:

–binlog-do-db 二进制日志记录的数据库(多个数据库用,分割)
–binlog-ignore-db 二进制日志忽略的数据库(多个数据库用,分割)

进行更改后,重新启动服务器。

$ service mysql.server restart

创建用户进行复制

每个从库使用MySQL用户名和密码连接到主库,因此主库上必须有用户帐户,从库可以连接。任何帐户都可以用于此操作,只要它已被授予 REPLICATION SLAVE权限。可以选择为每个从库创建不同的帐户,或者每个从库使用相同帐户连接到主库

虽然不必专门为复制创建帐户,但应注意,复制用到的用户名和密码会以纯文本格式存储在主信息存储库文件或表中 。因此,需要创建一个单独的帐户,该帐户只具有复制过程的权限,以尽可能减少对其他帐户的危害。

mysql> CREATE USER 'repl'@'192.168.252.122' IDENTIFIED BY 'slavepass';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.252.122';

3.Slave 从服务器配置

修改 my.cnf

$ vi /etc/my.cnf

[mysqld]
server-id=2

slave端参数:

--replication-do-db 设定需要复制的数据库(多个数据库用,分割)
--replication-ignore-db 设定忽略复制的数据库(多个数据库用,分割)
--replocation-do-table 设定需要复制的表(多个表用,分割)
--replication-ignore-table 设定忽略复制的表(多个表用,分割)
--replication-wild-do-table和--replocation-do-table功能一样,但是可以加通配符。
--replication-wild-ignore-table和--replication-ignore-table功能一样,但是可以加通配符。

进行更改后,重新启动服务器。

$ service mysql.server restart

如果要设置多个从库,则每个从库必须具有server-id与主库和其他从库不同的唯一值。

配置主库通信

要设置从库与主库进行通信,进行复制,使用必要的连接信息配置从库

在从库上执行以下语句,将选项值替换为与系统相关的实际值

参数格式

mysql> CHANGE MASTER TO
    ->     MASTER_HOST='master_host_name',->     MASTER_USER='replication_user_name',->     MASTER_PASSWORD='replication_password',->     MASTER_LOG_FILE='recorded_log_file_name',->     MASTER_LOG_POS=recorded_log_position;

我编辑好的

mysql>  CHANGE MASTER TO
    -> MASTER_HOST='node1',-> MASTER_USER='repl',-> MASTER_PASSWORD='slavepass',-> MASTER_LOG_FILE='mysql-bin.000001',-> MASTER_LOG_POS=0;
Query OK,0 rows affected,2 warnings (0.02 sec)

启动从服务器复制线程

mysql>  START SLAVE;
Query OK,0 rows affected (0.00 sec)

查看从服务器复制状态

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: node1
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 154
               Relay_Log_File: node2-relay-bin.000004
                Relay_Log_Pos: 367
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 787
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 511dd5da-8a30-11e7-97ed-000c29129bb0
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

ERROR: 
No query specified

mysql>

确认主从同步配置

Slave_IO_State:从站的当前状态

注意 以下两项必须是 yes,不能是Connecting.

Slave_IO_Running:读取主程序二进制日志的I/O线程是否正在运行,确保是 yes
Slave_SQL_Running:执行读取主服务器中二进制日志事件的SQL线程是否正在运行。与I/O线程一样,确保是 yes
Seconds_Behind_Master 是否为0,0就是已经同步了

检查复制状态

4.操作 Master 主服务器

【注意】以下操作都在 Master-Server : 192.168.252.121 执行

登录MySQL

$ /usr/local/mysql/bin/mysql -uroot -p

创建测试库

mysql> CREATE DATABASE sync_www_ymq_io;
Query OK,1 row affected (0.00 sec)

切换测试库

mysql> use sync_www_ymq_io
Database changed

创建测试表

这个表用于测试主从库的,表结构变更,数据变更,是否真的同步了

以下slq 在命令行 逐行执行,或者把->去掉,放在一行执行

mysql> CREATE TABLE `sync_test` (
    -> `id` int(11) NOT NULL AUTO_INCREMENT,-> `name` varchar(255) NOT NULL,-> PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
Query OK,0 rows affected (0.01 sec)

5.操作 Slave 从服务器

检查主从同步复制

1.检查 DATABASE

检查在 Master 主服务器,创建的 DATABASE sync_www_ymq_io 在 Slave 从服务器,是否同步过来

登录MySQL

$ /usr/local/mysql/bin/mysql -uroot -p

查看所有数据库,发现,已经有了,在Master 主服务器创建 sync_www_ymq_io

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sync_www_ymq_io    |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

2.检查 TABLE

选择数据库

mysql> use sync_www_ymq_io;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

查看所有表,发现,已经有了,在Master 主服务器创建 sync_test

mysql> show tables;
+---------------------------+
| Tables_in_sync_www_ymq_io |
+---------------------------+
| sync_test                 |
+---------------------------+
1 row in set (0.00 sec)

6.测试数据同步

Master主服务器

在 Master 主服务器,执行以下语句

mysql> INSERT INTO `sync_www_ymq_io`.`sync_test` (`name`) VALUES ('测试数据');
Query OK,1 row affected (0.01 sec)

mysql> select * from sync_www_ymq_io.sync_test;
+----+--------------+
| id | name         |
+----+--------------+
|  2 | 测试数据     |
+----+--------------+
1 row in set (0.00 sec)

Slave 从服务器

在 Slave 从服务器,执行以下语句,发现数据已经同步过来了

mysql> select * from sync_www_ymq_io.sync_test;
+----+--------------+
| id | name         |
+----+--------------+
|  2 | 测试数据     |
+----+--------------+
1 row in set (0.00 sec)

一些命令

查看主服务器的运行状态

mysql>  show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |     3697 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

查看从服务器主机列表

mysql> show slave hosts;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID                           |
+-----------+------+------+-----------+--------------------------------------+
|         2 |      | 3306 |         1 | 52866d11-8a23-11e7-a410-000c290cb505 |
+-----------+------+------+-----------+--------------------------------------+
1 row in set (0.00 sec)

获取binlog文件列表

mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |      1101 |
| mysql-bin.000002 |       177 |
| mysql-bin.000003 |      4461 |
| mysql-bin.000004 |       774 |
| mysql-bin.000005 |       443 |
+------------------+-----------+
5 rows in set (0.00 sec)

只查看第一个binlog文件的内容

mysql> mysql> show binlog events;
+------------------+------+----------------+-----------+-------------+------------------------------------------------------------------------------------------------------------------------------+
| Log_name         | Pos  | Event_type     | Server_id | End_log_pos | Info                                                                                                                         |
+------------------+------+----------------+-----------+-------------+------------------------------------------------------------------------------------------------------------------------------+
| mysql-bin.000001 |    4 | Format_desc    |         1 |         123 | Server ver: 5.7.19-log,Binlog ver: 4                                                                                        |
| mysql-bin.000001 |  123 | Previous_gtids |         1 |         154 |                                                                                                                              |
| mysql-bin.000001 |  617 | Anonymous_Gtid |         1 |         682 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                         |
| mysql-bin.000001 |  682 | Query          |         1 |         876 | CREATE USER 'repl'@'192.168.252.122' IDENTIFIED WITH 'mysql_native_password' AS '*809534247D21AC735802078139D8A854F45C31F3'  |
| mysql-bin.000001 |  876 | Anonymous_Gtid |         1 |         941 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                                                                                         |
| mysql-bin.000001 |  941 | Query          |         1 |        1078 | GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.252.122'                                                                   |
| mysql-bin.000001 | 1078 | Stop           |         1 |        1101 |                                                                                                                              |
+------------------+------+----------------+-----------+-------------+------------------------------------------------------------------------------------------------------------------------------+
11 rows in set (0.00 sec)

查看指定binlog文件的内容

mysql> show binlog events in 'mysql-bin.000005';
+------------------+-----+----------------+-----------+-------------+-------------------------------------------+
| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                      |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------+
| mysql-bin.000005 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.19-log,Binlog ver: 4     |
| mysql-bin.000005 | 123 | Previous_gtids |         1 |         154 |                                           |
| mysql-bin.000005 | 154 | Anonymous_Gtid |         1 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'      |
| mysql-bin.000005 | 219 | Query          |         1 |         287 | BEGIN                                     |
| mysql-bin.000005 | 287 | Table_map      |         1 |         353 | table_id: 118 (sync_www_ymq_io.sync_test) |
| mysql-bin.000005 | 353 | Write_rows     |         1 |         412 | table_id: 118 flags: STMT_END_F           |
| mysql-bin.000005 | 412 | Xid            |         1 |         443 | COMMIT /* xid=30 */                       |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------+
7 rows in set (0.00 sec)

启动从库复制线程

mysql> START SLAVE;
Query OK,1 warning (0.00 sec)

停止从库复制线程

mysql> STOP SLAVE;
Query OK,0 rows affected (0.00 sec)

7.复制实现细节分析

MySQL主从复制功能使用三个线程实现一个在主服务器上两个在从服务器上

Binlog转储线程。

当从服务器与主服务器连接时,主服务器会创建一个线程将二进制日志内容发送到从服务器。
该线程可以使用 语句 SHOW PROCESSLIST(下面有示例介绍) 在服务器 sql 控制台输出中标识为Binlog Dump线程。

二进制日志转储线程获取服务器上二进制日志上的锁,用于读取要发送到从服务器的每个事件。一旦事件被读取,即使在将事件发送到从服务器之前,锁会被释放。

从服务器I/O线程。

当在从服务器sql 控制台发出 START SLAVE语句时,从服务器将创建一个I/O线程,该线程连接到主服务器,并要求它发送记录在主服务器上的二进制更新日志。

从机I/O线程读取主服务器Binlog Dump线程发送的更新 (参考上面 Binlog转储线程 介绍),并将它们复制到自己的本地文件二进制日志中。

该线程的状态显示详情 Slave_IO_running 在输出端 使用 命令SHOW SLAVE STATUS

使用\G语句终结符,而不是分号,是为了,易读的垂直布局

这个命令在上面 查看从服务器状态 用到过

mysql> SHOW SLAVE STATUS\G

从服务器SQL线程。

从服务器创建一条SQL线程来读取由主服务器I/O线程写入的二级制日志,并执行其中包含的事件。

在前面的描述中,每个主/从连接有三个线程。主服务器为每个当前连接的从服务器创建一个二进制日志转储线程,每个从服务器都有自己的I/O和SQL线程。
从服务器使用两个线程将读取更新与主服务器更新事件,并将其执行为独立任务。因此,如果语句执行缓慢,则读取语句的任务不会减慢。

例如,如果从服务器开始几分钟没有运行,或者即使SQL线程远远落后,它的I/O线程也可以从主服务器建立连接时,快速获取所有二进制日志内容。

如果从服务器在SQL线程执行所有获取的语句之前停止,则I/O线程至少获取已经读取到的内容,以便将语句的安全副本存储在自己的二级制日志文件中,准备下次执行主从服务器建立连接,继续同步。

使用命令 SHOW PROCESSLIST\G 可以查看有关复制的信息

命令 SHOW FULL PROCESSLISTG

在 Master 主服务器 执行的数据示例

mysql>  SHOW FULL PROCESSLIST\G
*************************** 1. row ***************************
     Id: 22
   User: repl
   Host: node2:39114
     db: NULL
Command: Binlog Dump
   Time: 4435
  State: Master has sent all binlog to slave; waiting for more updates
   Info: NULL

Id: 22是Binlog Dump服务连接的从站的复制线程
Host: node2:39114 是从服务,主机名 级及端口
State: 信息表示所有更新都已同步发送到从服务器,并且主服务器正在等待更多更新发生。
如果Binlog Dump在主服务器上看不到 线程,意味着主从复制没有配置成功; 也就是说,没有从服务器连接主服务器。

命令 SHOW PROCESSLISTG

在 Slave 从服务器 ,查看两个线程的更新状态

mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
     Id: 6
   User: system user
   Host: 
     db: NULL
Command: Connect
   Time: 6810
  State: Waiting for master to send event
   Info: NULL
*************************** 2. row ***************************
     Id: 7
   User: system user
   Host: 
     db: NULL
Command: Connect
   Time: 3069
  State: Slave has read all relay log; waiting for more updates
   Info: NULL

Id: 6是与主服务器通信的I/O线程
Id: 7是正在处理存储在中继日志中的更新的SQL线程

在 运行 SHOW PROCESSLIST 命令时,两个线程都空闲,等待进一步更新

如果在主服务器上在设置的超时,时间内 Binlog Dump线程没有活动,则主服务器会和从服务器断开连接。超时取决于的 服务器系统变量 值 net_write_timeout(在中止写入之前等待块写入连接的秒数,默认10秒)和 net_retry_count;(如果通信端口上的读取或写入中断,请在重试次数,默认10次) 设置 服务器系统变量

该SHOW SLAVE STATUS语句提供了有关从服务器上复制处理的附加信息。请参见 第16.1.7.1节“检查复制状态”。

8.更多常见主从复制问题:

常见主从复制问题

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


linux下开机自启: 在/etc/init.d目录下新建文件elasticsearch 并敲入shell脚本: 注意, 前两行必须填写,且要注释掉。 第一行为shell前行代码,目的告诉系统使用shell。 第二行分别代表运行级别、启动优先权、关闭优先权,且后面添加开机服务会用到。 shell脚本
1、因为在centos7中/etc/rc.d/rc.local的权限被降低了,所以需要赋予其可执行权 chmod +x /etc/rc.d/rc.local 2、赋予脚本可执行权限假设/usr/local/script/autostart.sh是你的脚本路径,给予执行权限 chmod +x /usr
最简单的查看方法可以使用ls -ll、ls-lh命令进行查看,当使用ls -ll,会显示成字节大小,而ls- lh会以KB、MB等为单位进行显示,这样比较直观一些。 通过命令du -h –max-depth=1 *,可以查看当前目录下各文件、文件夹的大小,这个比较实用。 查询当前目录总大小可以使用d
ASP.NET Core应用程序发布linux在shell中运行是正常的。可一但shell关闭网站也就关闭了,所以要配置守护进程, 用的是Supervisor,本文主要记录配置的过程和过程遇到的问题 安装Supervisor 1 yum install python-setuptools
设置时区(CentOS 7) 先执行命令timedatectl status|grep 'Time zone'查看当前时区,如果不是时区(Asia/Shanghai),则需要先设置为中国时区,否则时区不同会存在时差。 #已经是Asia/Shanghai,则无需设置 [root@xia
vim /etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTO="static" ONBOOT=yes IPADDR=192.168.8.106 NETMASK=255.255.252.0 GATEWAY=192.168.
一、安装gcc依赖 由于 redis 是用 C 语言开发,安装之前必先确认是否安装 gcc 环境(gcc -v),如果没有安装,执行以下命令进行安装 [root@localhost local]# yum install -y gcc 二、下载并解压安装包 [root@localhost local
第一步 On CentOS/RHEL 6.*: $ sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm On CentOS/RHEL 7: $
/// <summary> /// 取小写文件名后缀 /// </summary> /// <param name="name">文件名</param> /// <returns>返回小写后缀,不带“.”</ret
which nohup .bash_profile中并source加载 如果没有就安装吧 yum provides */nohup nohup npm run start & nohup ./kibana &
1.1 MySQL安装 1.1.1 下载wget命令 yum -y install wget 1.1.2 在线下载mysql安装包 wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 1.1.3 安装My
重启 reboot shutdown -r now init 6 关闭 init 0 shutdown -h now shutdown -h 20:25 #8点25关机查看内存 free CPU利用率 top 日期 date 设置时间 date 033017002015 #月日时间年 日历 cal
1、firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status firewalld 开机禁用 : systemctl disable firewalld 开机启用 :
1 下载并安装MySQL官方的 Yum Repository wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 使用上面的命令就直接下载了安装用的Yum Repository,大概
CentOS6.x CentOS6中转用Upstrat代替以前的init.d/rcX.d的线性启动方式。 一、相关命令 通过initctl help可以查看相关命令 [root@localhost ~]# initctl help Job commands: start Start job. sto
1、使用命令:df -lk 找到已满磁盘 2、使用命令:du --max-depth=1 -h 查找大文件,删除
ifconfig:查看网卡信息 网卡配置文件位置: /etc/sysconfig/network-scripts/文件夹 nmtui:配置网卡 netstat -tlunp:查看端口信息 端口信息存储位置: /etc/services文件 route:查看路由信息 wget:下载网路文件,例如 wg
ps -ef:查看所有进程, ps -ef |grap firewalld 查看与firewalld相关的进程 which :查看进程:which firewalld kill 进程id:杀掉进程 kill 640,强制杀:kill -9 640 man:查看帮助,例如 man ps 查看
useradd:添加用户 useradd abc,默认添加一个abc组 vipw:查看系统中用户 groupadd:添加组groupadd ccna vigr:查看系统中的组 gpasswd:将用户abc添加到ccna组 gpasswd -a abc ccna groups abc:查看用户abc属