复制允许将一个或多个服务器(称为主服务器)的内容镜像到一个或多个服务器(称为从属服务器)。
您可以控制要复制的数据。可以选择性地复制所有数据库,一个或多个数据库或数据库中的表。
复制中使用的主要机制是二进制日志。如果启用了二进制日志记录,则对数据库的所有更新(数据操作和数据定义)都将作为binlog事件写入二进制日志中。从库从每个主库读取二进制日志,以访问要复制的数据。从库服务器上创建中继日志,使用与二进制日志相同格式,并且这被用于执行复制。不再需要旧的中继日志文件时,将被删除。
从服务器跟踪该从服务器上的最后一个事件在主服务器的二进制日志中的位置。这使从属服务器可以重新连接,并从暂时停止复制后停止的位置开始恢复。它还允许从属服务器断开连接,被克隆,然后让新的从属服务器从同一主服务器恢复复制。
主机和从机之间不需要保持持续的通信。很有可能使服务器脱机或与网络断开连接,并且当它们返回时,复制将从中断处继续进行。
标准复制结构
特点:可以无限扩展read节点,可以通过将salve节点升级为master节点提供高可用。
其他复制结构:环形结构、星形就够、多源复制。
在MariaDB 10.3和更高版本中,服务器中内置了半同步复制,因此可以在那些版本中立即启用它。 在MariaDB 10.2及更低版本中,半同步复制需要用户在主服务器和从服务器上都安装插件,然后才能启用它。
master节点配置
#修改配置文件,在[mysqld]选项组中加入如下内容
[root@localhost ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
#...省略部分内容...
server-id= 1
log-bin=/var/lib/mysql/mysql-bin
binlog_format=mixed
#在master节点,创建同步用户
[root@localhost ~]# mysql -uroot -p
Enter password:
MariaDB [(none)]> CREATE USER 'replication_user'@'%' IDENTIFIED BY 'bigs3cret';
Query OK, 0 rows affected (0.042 sec)
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
Query OK, 0 rows affected (0.001 sec)
创建测试同步数据库
MariaDB [(none)]> create database reptest;
Query OK, 1 row affected (0.001 sec)
MariaDB [(none)]> use reptest
Database changed
MariaDB [reptest]> create table student(id int(4) primary key,name varchar(4) not null,age int(2) not null);
Query OK, 0 rows affected (0.068 sec)
安装热备份工具mariabackup(主从节点都安装)
[root@localhost ~]# yum -y install MariaDB-backup
备份数据库同步数据到slave节点
#备份
[root@localhost ~]# mariabackup --backup --target-dir=/opt/ --user=root --password=123456
#同步
[root@localhost ~]# rsync -avP /opt/ 192.168.117.129:/opt/
从数据库配置
#设置与master不同的id
[root@localhost ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
server-id=2
#...省略部分内容...
[root@localhost ~]# systemctl stop mariadb
[root@localhost ~]# mv /var/lib/mysql/* /var/lib/mysqlbak/
[root@localhost ~]# mariabackup --copy-back --target-dir=/opt/
[root@localhost ~]# chown -R mysql:mysql /var/lib/mysql/
[root@localhost ~]# systemctl start mariadb
[root@localhost ~]# cat /opt/xtrabackup_binlog_info #查看binlog信息,可以使用mysql-bin.000002与1005进行同步,也可以使用gtid 0-1-4进行同步。
mysql-bin.000002 1005 0-1-4
[root@localhost ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
MariaDB [(none)]> SET GLOBAL gtid_slave_pos = "0-1-4";
Query OK, 0 rows affected (0.332 sec)
MariaDB [(none)]> CHANGE MASTER TO
-> MASTER_HOST="192.168.117.128",
-> MASTER_PORT=3306,
-> MASTER_USER="replication_user",
-> MASTER_PASSWORD="bigs3cret",
-> MASTER_USE_GTID=slave_pos;
Query OK, 0 rows affected (2.014 sec)
MariaDB [(none)]> START SLAVE;
Query OK, 0 rows affected (0.006 sec)
MariaDB [(none)]> SHOW SLAVE STATUS\G
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.117.128
Master_User: replication_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 1005
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 670
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...省略部分输出...
至此mariadb主从异步同步服务搭建完成。
MariaDB [(none)]> stop slave;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> reset slave;
Query OK, 0 rows affected (0.25 sec)
MariaDB [(none)]> change master to master_user='', master_host='', master_password='';
ERROR 1210 (HY000): Incorrect arguments to MASTER_HOST
MariaDB [(none)]> change master to master_host=' ';
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> exit
###############同步故障如下
MariaDB [(none)]> show slave status\G
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 2838721
Current database: *** NONE ***
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.217
Master_User: replicationuser1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000030
Read_Master_Log_Pos: 1003390455
Relay_Log_File: jkdb-relay-bin.000007
Relay_Log_Pos: 515425314
Relay_Master_Log_File: mysql-bin.000026
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB: zabbix
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table: zabbix.auditlog_details,zabbix.auditlog
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1517
Last_Error: Error 'Duplicate partition name p202109270000' on query. Default database: 'zabbix'. Query: 'ALTER TABLE zabbix.history ADD PARTITION (PARTITION p202109270000 VALUES LESS THAN (1632758400))'
Skip_Counter: 0
Exec_Master_Log_Pos: 515425026
Relay_Log_Space: 5298367433
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: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1517
Last_SQL_Error: Error 'Duplicate partition name p202109270000' on query. Default database: 'zabbix'. Query: 'ALTER TABLE zabbix.history ADD PARTITION (PARTITION p202109270000 VALUES LESS THAN (1632758400))'
Replicate_Ignore_Server_Ids:
Master_Server_Id: 2
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: conservative
检查错误含义,了解跳过后是否会对数据产生影响。处理方法如下:
MariaDB [(none)]> stop slave;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> set global sql_slave_skip_counter =1 ;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)
在次查看同步状态。如果有很多语句冲突很有很多错误产生。