如何在CentOS Linux上配置MariaDB复制
它是创建数据库重复版本的过程。
复制过程不仅可以复制数据库,还可以将更改从主数据库同步到从属数据库之一。
但这并不意味着从数据库是主数据库的相同副本,因为可以配置复制,以便仅复制表,列或者行的架构,例如:部分复制。
复制可确保这些特定的已配置对象在不同数据库之间保持同步。
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 | +----------+-----------+------------+----------+-------+
我们可以看到数据已复制到从属服务器。