文章

MariaDB 主从数据库同步

那什么,网站在日本,数据库在新加坡,然后吧,网站与数据库之间通信延时 100ms 左右,导致网站打开比较慢,嗯,这不为了提高体验,就折腾了一下同步的事情。

1,环境:
OS: CentOS 7.4 x64
DB: MariaDB 5.5.56

2, 服务端新建一个用于同步的用户:

1
MariaDB [(none)]> GRANT FILE, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'sync_account'@'%' IDENTIFIED BY '123456';

3, 修改服务端 my.cnf 配置文件:

1
2
3
4
5
6
7
8
server-id = 1              #Server标识, 不能重复
log-bin = mysql-bin        #日志文件名
auto_increment_increment=2 #自动增长的步长 解决多个主机自动增长出现重复问题 这个主机使用奇数值 另外一个主机使用偶数值  
auto_increment_offset=1    #自动增长的起始数值
binlog-do-db=testdb        #指定需要日志的数据库,多个加一行,不需要就注释
binlog-ignore-db = db_name #指定不需要日志的数据库,多个加一行,不需要就注释
replicate-do-db = testdb   #指定从端需要同步的数据库,多个加一行,不需要就注释

4,重启 MariaDB:

1
service mariadb restart

配置过程中为了防止突然的主机数据写入 导致配置主从失败 可以将机器锁定只允许读 注意千万不要将从机配成锁定 否则无法同步数据了

1
MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;

配置完从端解锁:

1
MariaDB [(none)]> UNLOCK TABLES;

5, 备份数据库:

1
mysql -u root -p --quick --all-databases --flush-logs --delete-master-logs --single-transaction > sync.sql

6, 查看服务端状态

1
MariaDB [(none)]> SHOW MASTER STATUS;

显示类似如下:

1
2
3
4
5
6
7
+------------------+----------+-------------------------------------+------------------+
| File             | Position | Binlog_Do_DB                        | Binlog_Ignore_DB |
+------------------+----------+-------------------------------------+------------------+
| mysql-bin.000013 |  1714336 | testdb                              |                  |
+------------------+----------+-------------------------------------+------------------+
1 row in set (0.00 sec)

7, 从端导入数据库

1
mysql -u root -p < sync.sql

8, 修改从端 my.cnf 配置文件:

1
2
3
4
5
server-id = 2
auto_increment_increment=3  
auto_increment_offset=1
#其余项目与服务端一致就可以了, 完了重启 MariaDB

9,配置从端主服务器信息:

1
2
3
4
5
6
7
8
9
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='master.host.name',\  #主服务器主机名称
    -> MASTER_USER='sync_account',\                                  #用于复制的用户
    -> MASTER_PASSWORD='12345',\                                     #复制用户的密码
    -> MASTER_PORT=3306,\                                            #连接使用的端口
    -> MASTER_LOG_FILE='mysql-bin.000013',\                          #起点日志文件
    -> MASTER_LOG_POS=1714336,\                                      #起点位置
    -> MASTER_CONNECT_RETRY=10,\                                     #连接重试间隔
    -> MASTER_HEARTBEAT_PERIOD=2;                                    #心跳间隔时间

10, 启动从端数据库同步

1
MariaDB [(none)]> START SLAVE;                            #启动同步进程

11, 查看同步信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
MariaDB [(none)]> SHOW SLAVE STATUS\G                     #查看从服务器线程的关键参数的信息
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: master
                  Master_User: backup1                    #被用于连接主服务器的当前用户
                  Master_Port: 3306
                Connect_Retry: 10                         #连接重试间隔
              Master_Log_File: mysql-bin.000003           #I/O线程当前正在读取的主服务器二进制日志文件的名称
          Read_Master_Log_Pos: 1832                       #在当前的主服务器二进制日志中,I/O线程已经读取的位置
               Relay_Log_File: relay-bin.000003           #SQL线程当前正在读取和执行的中继日志文件的名称
                Relay_Log_Pos: 529                        #在当前的中继日志中,SQL线程已读取和执行的位置
        Relay_Master_Log_File: mysql-bin.000003           #由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称
             Slave_IO_Running: Yes                              #I/O线程是否被启动并成功地连接到主服务器上
            Slave_SQL_Running: Yes                              #SQL线程是否被启动
            ...
             Master_Server_Id: 2

12, 查看从端 MASTER 状态,然后在主端启动服务器同步就可以实现相互同步了。

参考:

  1. MySQL数据库设置主从同步
  2. 实现两个Mysql数据库之间的主从同步
  3. mariadb配置双主多从
  4. MariaDB主从同步
  5. MySQL Documentation
本文由作者按照 CC BY 4.0 进行授权