如何在CentOS Linux上配置MariaDB复制

时间:2020-03-05 15:24:45  来源:igfitidea点击:

它是创建数据库重复版本的过程。
复制过程不仅可以复制数据库,还可以将更改从主数据库同步到从属数据库之一。
但这并不意味着从数据库是主数据库的相同副本,因为可以配置复制,以便仅复制表,列或者行的架构,例如:部分复制。
复制可确保这些特定的已配置对象在不同数据库之间保持同步。

Mariadb复制概念

备份:复制可用于数据库备份。
例如,我们具有主->从复制。
如果master丢失(例如,hdd失败),则可以从master还原数据库。

缩放:我们可以使用主->从复制来缩放解决方案。
例如,如果我们有几个大型查询并且具有SQL查询,则可以使用replcation为每个replcation节点将此查询分开。
只能在主服务器上执行写SQL,对于只读查询可以使用从服务器。

传播解决方案:我们可以使用复制进行分发。
例如,我们可以将不同的销售数据分配到不同的数据库。

故障转移解决方案:例如,我们具有master-> slave(1)-> slave(2)-> slave(3)复制。
我们可以编写脚本来监视主服务器,如果主服务器发生故障,脚本可以快速更改主服务器master的slave(1)-> slave(1)-> slave(2),应用程序将继续工作,以减少停机时间

复制的简单图解演示

在开始之前,请先了解什么是二进制日志和Ibdata1.
二进制日志包含有关db,数据和结构中所有更改以及每个语句执行所需时间的记录。
Bin日志由设置日志文件和索引组成。
这意味着将把诸如CREATE,ALTER,INSERT,UPDATE和DELETE之类的主要SQL语句放入此日志,而不会将诸如SELECT之类的语句记录在日志中。
这些信息可以记录到常规query.log文件中。
简单地说,Ibdata1是一个文件,其中包含所有表和有关db的所有信息。

主服务器配置

很高兴更新服务器

sudo yum install update -y && sudo yum install upgrade -y

我们正在centos 7服务器上工作

sudo cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)

安装MariaDB

sudo yum install mariadb-server -y

启动MariaDB并启用它以在服务器启动时启动

sudo systemctl start mariadb.service
sudo systemctl enable mariadb.service

输出:

ln -s '/usr/lib/systemd/system/mariadb.service' '/etc/systemd/system/multi-user.target.wants/mariadb.service'

检查MariaDB状态

sudo service mariadb status

或者使用

sudo systemctl is-active mariadb.service

输出:

Redirecting to /bin/systemctl status  mariadb.service
mariadb.service - MariaDB database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled)

设置MariaDB密码

mysql -u root
mysql> use mysql;
mysql> update user set password=PASSWORD("SOME_ROOT_PASSWORD") where User='root';
mysql> flush privileges;
mysql> exit

SOME_ROOT_PASSWORD根密码。
我的情况下,我将使用“ q”密码,然后尝试登录:

sudo mysql -u root -pSOME_ROOT_PASSWORD

输出:

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 5.5.41-MariaDB MariaDB Server
Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.

输入“帮助;”或者'\ h'寻求帮助。
键入“ \ c”以清除当前输入语句。

让我们用带有一些数据的表创建数据库

创建数据库/方案

sudo mysql -u root -pSOME_ROOT_PASSWORD
mysql> create database test_repl;

其中:

test_repl - Name of shcema which will be replicated

输出:

Query OK, 1 row affected (0.00 sec)

创建人员表

mysql> use test_repl;
CREATE TABLE Persons (
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

输出:

mysql> MariaDB [test_repl]> CREATE TABLE Persons (
-> PersonID int,
-> LastName varchar(255),
-> FirstName varchar(255),
-> Address varchar(255),
-> City varchar(255)
-> );
Query OK, 0 rows affected (0.01 sec)

插入一些数据

mysql> INSERT INTO Persons VALUES (1, "LastName1", "FirstName1", "Address1", "City1");
mysql> INSERT INTO Persons VALUES (2, "LastName2", "FirstName2", "Address2", "City2");
mysql> INSERT INTO Persons VALUES (3, "LastName3", "FirstName3", "Address3", "City3");
mysql> INSERT INTO Persons VALUES (4, "LastName4", "FirstName4", "Address4", "City4");
mysql> INSERT INTO Persons VALUES (5, "LastName5", "FirstName5", "Address5", "City5");

输出:

Query OK, 5 row affected (0.00 sec)

检查数据

mysql> select * from Persons;

输出:

+----------+-----------+------------+----------+-------+
| PersonID | LastName  | FirstName  | Address  | City  |
+----------+-----------+------------+----------+-------+
|        1 | LastName1 | FirstName1 | Address1 | City1 |
|        1 | LastName1 | FirstName1 | Address1 | City1 |
|        2 | LastName2 | FirstName2 | Address2 | City2 |
|        3 | LastName3 | FirstName3 | Address3 | City3 |
|        4 | LastName4 | FirstName4 | Address4 | City4 |
|        5 | LastName5 | FirstName5 | Address5 | City5 |
+----------+-----------+------------+----------+-------+

配置MariaDB进行复制

我们需要在主服务器上编辑my.cnf文件,以启用二进制日志记录并设置服务器的ID。
我将使用vi文本编辑器,但使用可以使用任何适合文件,例如nano,joe等。

sudo vi /etc/my.cnf

并在[mysqld]节中将这样的行放置到config中。

log-basename=master
log-bin
binlog-format=row
server_id=1

输出:

然后重新启动MariaDB:

sudo service mariadb restart

登录到MariaDB并检查二进制日志:

sudo mysql -u root -pq test_repl

mysql> SHOW MASTER STATUS;

输出:

+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000002 |     3913 |              |                  |
+--------------------+----------+--------------+------------------+

记住:“文件”和“位置”值。
我们将在从属服务器上需要此值

创建要复制的用户

mysql> GRANT REPLICATION SLAVE ON *.* TO replication_user IDENTIFIED BY 'bigs3cret' WITH GRANT OPTION;
mysql> flush privileges;

输出:

Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

在数据库中检查用户

mysql> select * from mysql.user WHERE user="replication_user"\G;

输出:

mysql> select * from mysql.user WHERE user="replication_user"\G;
*** 1. row ***
Host: %
User: replication_user
Password: *2AF30E7AEE9BF3AF584FB19653881D2D072FA49C
Select_priv: N
.....

从主数据库创建数据库转储(所有要复制的数据的快照)

mysqldump -uroot -pSOME_ROOT_PASSWORD  test_repl > full-dump.sql

其中:

SOME_ROOT_PASSWORD - password for root user that you have setup
test_repl - name of the data base which will be replicated;

我们需要在从属服务器上恢复mysql dump(full-dump.sql)。
它是复制所需的。

从服务器配置

我们需要在从属服务器上执行的所有这些命令

假设我们已经使用最新的mariaDB服务器更新/更新了CentOS 7.x服务器,并且我们可以以root用户身份登录到maria DB服务器(在本文的第一部分中进行了介绍)

登录到Maria DB控制台并创建数据库

mysql -u root -pSOME_ROOT_PASSWORD;
mysql> create database test_repl;
mysql> exit;

在从属服务器上从主服务器恢复数据

mysql -u root -pSOME_ROOT_PASSWORD test_repl < full-dump.sql

其中:

full-dump.sql其在测试服务器上创建的数据库转储。

登录到Maria DB并设置复制

mysql>     CHANGE MASTER TO
MASTER_HOST='82.196.5.39',
MASTER_USER='replication_user',
MASTER_PASSWORD='bigs3cret',
MASTER_PORT=3306,
MASTER_LOG_FILE='mariadb-bin.000002',
MASTER_LOG_POS=3913,
MASTER_CONNECT_RETRY=10;

其中:

MASTER_HOST - IP of the master server.
MASTER_USER - replication user at master server
MASTER_PASSWORD - replication user password
MASTER_PORT - mysql port at master
MASTER_LOG_FILE - bin-log file name form master
MASTER_LOG_POS - bin-log position file at master

启动从属模式

mysql> slave start;

输出:

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: 82.196.5.39
Master_User: replication_user
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: mariadb-bin.000002
Read_Master_Log_Pos: 4175
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 793
Relay_Master_Log_File: mariadb-bin.000002
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: 4175
Relay_Log_Space: 1089
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
1 row in set (0.00 sec)

在此步骤中,一切都应该没事,不要在这里犯错误。

测试复制

在MAIN/MASTER服务器上,将一些实体添加到数据库

mysql -u root -pSOME_ROOT_PASSWORD test_repl
mysql> INSERT INTO Persons VALUES (6, "LastName6", "FirstName6", "Address6", "City6");
mysql> INSERT INTO Persons VALUES (7, "LastName7", "FirstName7", "Address7", "City7");
mysql> INSERT INTO Persons VALUES (8, "LastName8", "FirstName8", "Address8", "City8");

然后转到SLAVE服务器并检查复制的数据

mysql -u root -pSOME_ROOT_PASSWORD test_repl
mysql> select * from Persons;
+----------+-----------+------------+----------+-------+
| PersonID | LastName  | FirstName  | Address  | City  |
+----------+-----------+------------+----------+-------+
...................
|        6 | LastName6 | FirstName6 | Address6 | City6 |
|        7 | LastName7 | FirstName7 | Address7 | City7 |
|        8 | LastName8 | FirstName8 | Address8 | City8 |
+----------+-----------+------------+----------+-------+

我们可以看到数据已复制到从属服务器。