写在前面:如果此文有幸被某位朋友看见并发现有错的地方,希望批评指正。如有不明白的地方,愿可一起探讨。



MySQL复制的基本原理


MySQL复制解决的基本问题

    让一台MySQL服务器的数据与其他MySQL服务器的数据保持同步。

MySQL复制的工作原理

    MySQL复制的工作原理图如下所示(图来自高性能MySQL第3版)

wKioL1QdO8Py89y1AAIWXlt9l-I392.jpg

    MySQL主从复制的基本步骤:

    1、启动主库上的二进制文件,并把数据更改记录到二进制日志中;

    2、备库将主库上的二进制日志复制到自身的中继日志中;

    3、备库读取自身的中继日志中的事件,将其重放到备库数据之上。


案例拓扑图


主从复制

wKioL1QdPkGz3FyWAACCmnTpd1Q681.jpg

双主模型

wKiom1QdUN3C-5oIAACDUQB7CRg365.jpg

前提:在Master和Slave两台主机上安装了mariadb-5.5.36


安装mariadb-5.5.36


创建数据库相关文件所存放的目录

# mkdir -pv /mysql/data
# mkdir /mysql/binlogs
# mkdir /mysql/relaylogs

创建数据运行时的用户和用户组

# groupadd -r mysql
# useradd -g mysql -s /sbin/nologin -M -d /mysql/data/ -r mysql

修改存放数据库相关文件目录的权限

# chown -R mysql:mysql /mysql/*

编译安装maridb-5.5.36

# tar xf mariadb-5.5.36-linux-x86_64.tar.gz -C /usr/local/
# cd /usr/local/
# ln -sv mariadb-5.5.36-linux-x86_64/ mysql
# cd mysql/
# chown -R root:mysql ./*
# mkdir /etc/mysql
# cp support-files/my-large.cnf /etc/mysql/my.cnf
# vim /etc/mysql/my.cnf 
    datadir=/mysql/data
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld
# chkconfig mysqld on
# vim /etc/man.config 
    MANPATH /usr/local/mysql/man
# ln -sv /usr/local/mysql/include/ /usr/include/mysql
# echo "/usr/local/mysql/lib/" > /etc/ld.so.conf.d/mysql.conf
# ldconfig
# vim /etc/profile.d/mysql.sh
    export PATH=/usr/local/mysql/bin:$PATH
# source /etc/profile.d/mysql.sh
# scripts/mysql_install_db --user=mysql --datadir=/mysql/data/
# /etc/rc.d/init.d/mysqld start


配置主从复制

配置Master服务器


配置基本过程:

    1、启用二进制日志

    2、定义server-id

    3、创建有复制权限的账号

编辑配置文件,启动二进制日志和定义server-id

[root@master ~]# vim /etc/mysql/my.cnf
log-bin=/mysql/binlogs/master-bin
server-id       = 1

创建有复制权限的账号

[root@master ~]# mysql
MariaDB [(none)]> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repluser@'10.170.%.%' IDENTIFIED BY 'replp@ss';
MariaDB [(none)]> FLUSH PRIVILEGES;


配置Slave服务器


配置基本过程:

    1、关闭二进制日志,启动中继日志

    2、定义server-id

    3、使用有复制权限的账号连接Master服务器

    4、启动I/O线程和SQL线程

编辑配置文件,启动中继日志功能和定义server-id

[root@slave ~]# vim /etc/mysql/my.cnf 
#log-bin=mysql-bin
relay-log= /mysql/relaylogs/relay-log
server-id       = 11

查看主节点的状态信息

MariaDB [(none)]> SHOW MASTER STATUS;

+-------------------+----------+--------------+------------------+

| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-------------------+----------+--------------+------------------+

| master-bin.000001 |      495 |              |                  |

+-------------------+----------+--------------+------------------+

1 row in set (0.07 sec)

使用有复制权限的账号连接Master服务器

[root@slave ~]# mysql

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='10.170.2.36', MASTER_USER='repluser', MASTER_PASSWORD='replp@ss', MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=495;

启动I/O线程和SQL线程

MariaDB [(none)]> START SLAVE;


测试主从复制


在Master服务器上添加数据库

# mysql < mydb.sql

# mysql < hellodb.sql 

查看Master服务器上的数据库

[root@master ~]# mysql

MariaDB [(none)]> SHOW DATABASES;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| hellodb            |

mydb               |

| mysql              |

| performance_schema |

| test               |

+--------------------+

6 rows in set (0.05 sec)

在Slave服务器上查看数据库

[root@slave ~]# mysql

MariaDB [(none)]> SHOW DATABASES;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| hellodb            |

| mydb               |

| mysql              |

| performance_schema |

| test               |

+--------------------+

6 rows in set (0.00 sec)


配置双主模型

准备工作


将所已经安装MariaDB数据库的两台主机还原到刚安装完的状态

具体过程:

    1、停止MySQL服务;

    2、删除/mysql/data/、/mysql/binlogs/、/mysql/relaylogs/目录下的所有数据;

    3、初始化MySQL并启动MySQL服务。


配置Master1和Master2服务器


基本配置要求:

    1、Master1和Master2都得创建具有复制权限的账号;

    2、Master1和Master2都得启动中继日志和二进制日志;

    3、为了保证具有自动增长功能的字段能正确生成ID,需要配置Master1和Master2分别使用偶数和奇数ID号;

    4、Master1和Master2都要将对方配置为自己的主节点。

配置Master1服务器

编辑配置文件

[root@master ~]# vim /etc/mysql/my.cnf

log-bin=/mysql/data/master1-bin

relay-log=/mysql/relaylogs/relay1-bin

auto-increment-increment = 2

auto-increment-offset = 1

server-id = 1

重启MySQL服务

# /etc/init.d/mysqld restart

创建具有复制权限的账号

[root@master ~]# mysql

MariaDB [(none)]> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repluser@'10.170.%.%' IDENTIFIED BY 'replp@ss';

查看Master2的状态信息

MariaDB [(none)]> SHOW MASTER STATUS;

+--------------------+----------+--------------+------------------+

| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+--------------------+----------+--------------+------------------+

| master2-bin.000001 |      425 |              |                  |

+--------------------+----------+--------------+------------------+

连接到Master2

MariaDB [(none)]>  CHANGE MASTER TO MASTER_HOST='10.170.2.49', MASTER_USER='repluser', MASTER_PASSWORD='replp@ss', MASTER_LOG_FILE='master2-bin.000001', MASTER_LOG_POS=425;

启动I/O线程和SQL线程

MariaDB [(none)]> START SLAVE;

配置Master2服务器

编辑配置文件

[root@slave ~]# vim /etc/mysql/my.cnf 

log-bin=/mysql/data/master2-bin

relay-log=/mysql/relaylogs/relay2-bin

auto-increment-increment = 2

auto-increment-offset = 2

server-id = 11

重启MySQL服务

# /etc/init.d/mysqld restart

创建具有复制权限的账号

[root@slave ~]# mysql

MariaDB [(none)]> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repluser@'10.170.%.%' IDENTIFIED BY 'replp@ss';

查看Master1的状态信息

MariaDB [(none)]> SHOW MASTER STATUS;

+--------------------+----------+--------------+------------------+

| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+--------------------+----------+--------------+------------------+

| master1-bin.000001 |      425 |              |                  |

+--------------------+----------+--------------+------------------+

连接到Master1

MariaDB [(none)]>  CHANGE MASTER TO MASTER_HOST='10.170.2.36', MASTER_USER='repluser', MASTER_PASSWORD='replp@ss', MASTER_LOG_FILE='master1-bin.000001', MASTER_LOG_POS=425;

启动I/O线程和SQL线程

MariaDB [(none)]> START SLAVE;


测试双主模型


Master1服务器上添加hellodb.sql 数据库

mys[root@master ~]# mysql < hellodb.sql 

Master2服务器上,查看数据库

[root@slave ~]# mysql

MariaDB [(none)]> SHOW DATABASES;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| hellodb            |

| mysql              |

| performance_schema |

| test               |

+--------------------+

5 rows in set (0.01 sec)

Master2服务器上添加mydb.sql数据库

[root@slave ~]# mysql < mydb.sql

Master1服务器上,查看数据库

[root@master ~]# mysql

MariaDB [(none)]> SHOW DATABASES;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| hellodb            |

| mydb               |

| mysql              |

| performance_schema |

| test               |

+--------------------+

6 rows in set (0.05 sec)

说明:在整个配置过程中,本文将Master服务器作为Master1服务器使用,将Slave服务器作为Master2服务器使用。