Mariadb的复制功能是mysql内置的,装上它之后就具备了这个功能,而Mariadb复制是Mariadb实现大规模高性能应用的一个基本工具,是Mariadb完成水平扩展的基本架构,为了能够应付更多的访问请求,通常情况下我们需要对服务器进行扩展,而扩展通常有两种方式:向上扩展和向外扩展;

  • 向上扩展:scale on,也称为垂直扩展,一般是扩充服务器的内存或CPU颗数的这种就是向上扩展。

  • 向外扩展:scale out,也称为水平扩展,比较一台服务器不够,再加一台服务器,再不够再加,这种情况就是向外扩展。

  Mariadb的的复制功能就是使用Mariadb向外扩展的能力,也就是水平扩展的功能。

   所谓同步的复制:首先主服务器每更新一条数据先写到磁盘文件中,同时还要写一个到二进制日志文件中,从服务器就会到主服务器请求二进制信息保存在中继日志中,保存好后由本地的SQL thread从中继日志应用到从服务器的本地有磁盘文件中,当这个过程完成之后再由从服务器返回确认结果给主服务器,主服务器才返回结果给客户端的。

所谓异步复制:当主服务器要写数据时,先写到本地的磁盘,同时写到二进制文件日志中,写好二进制日志文件后就把结果返回给客户端,至于从服务有没有来主服务器同步二进制日志他不关心。

 

Mariadb支持的复制类型

 

  • 基于语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的语句。默认采用基于语句的复制,效率比较高。
      一旦发现没法精确复制时,会自动选着基于行的复制。   

 

  • 基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍. mysql5.0开始支持

 

  • 混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。

 

Mariadb主从服务的工作原理图

wKioL1aOLInzGkIoAAHOnwY4vrA273.jpg

 

配置过程:

1、主服务器配置

  • 启用二进制日志
    检查/etc/my.cnf中确定有log-bin=mysql-bin 这行就行,mysql-bin名字可以随便换

  • 设置一个在当前集群中惟一的server-id

/etc/my.cnf server-id=1

  • 创建一个有复制权限(REPLICATIONSLAVE, REPLICATION CLIENT)账号;
    MariaDB [(none)]> grant replication client,replication slave on *.* to'repluser'@'192.168..%.%' identified by '123456';
             MariaDB [(none)]> flushprivileges;

show master status;   可以显示状态和二进制最新日志号 

 

2、从服务器配置

 

1)编辑/etc/my.cnf 文件 [mysqld]段新增内容如下:

datadir=/data/mysql/
innodb_file_per_table =on
skip-name-resolve
#log-bin=mysql-bin
relay-log=relay-bin
read_only=on
binlog_format=mixed
server-id=139


说明:

  • 注释二进制日志

    #log-bin=mysql-bin

  • 启用中继日志

    添加relay-log=relay-bin

  • 设置一个在当前集群中惟一的server-id

    server-id=139

  • 限制数据库为只读

    read_only=on

 

2)数据库内部设置只读

启动数据库并进入

MariaDB [(none)]> show global variables like '%only%';

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

| Variable_name                | Value |

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

| innodb_optimize_fulltext_only | OFF   |

| innodb_read_only             | OFF   |

| read_only                     | ON    |

| tx_read_only                 | OFF   |

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

 

MariaDB [(none)]> set global read_only=ON;

 

read_only 设置为ON (注意!这个选项只能限制除管理员以外的用户,如果想把管理员也限制的话,可以启动数据库后,用一个用户连入请求锁定所有表,一直不释放即可。但它并不影响mysqld进程写数据)

 

 

3)使用有复制权限用户账号连接至主服务器,设置主服务器信息和同步起点信息

[root@ha111 mysql]# mysql -u repluser -p
MariaDB [(none)]> help change master to; 可以查看帮助
MariaDB [(none)]>  change master to master_host='192.168.61.140',master_user='repluser',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=496,master_connect_retry=5,master_hearbeat_period=2;

 

各选项说明:

# MASTER_HOST='192.168.61.140' --主服务器的IP地址

# MASTER_USER='repluser' --主服务器上授权复制的用户名

# MASTER_PASSWORD='123456' --主服务器上授权用名的密码

# MASTER_LOG_FILE='mysql-bin.000003' --主服务器上的日志文件

# MASTER_LOG_POS=496 --主服务器上日志文件的位置

                           

4)启动IO thread SQL thread 复制线程

 MariaDB [(none)]> show slave status\G;
 查看从服务器状态。如果开始复制,数据库存放目录下也会出现relay-log日志文件。这里会看到slave_io_runningslave_sql_running都为No,默认关闭。

     手动启用:

     MariaDB [(none)]> start slave;

     这样两个线程一块启用,help start slave里面有详细说明,也可以分别启动。

                           

测试

  现在只要在主服务器上添加删除等操作,从服务器很快就能同步过来

 

复制如何开始

 主节点运行很长时间,且已经有一定规模的数据,如何启动复制?

  • 在主节点做一个完全备份,并记录二进制日志文件及位置

  • 在从节点恢复此完全备份,并在启动复制时从记录的二进制日志文件和位置开始

 

注意事项

 1.主、从服务器的server-id不能相同

 2. 双方的的Mariadb版本要一致,如果不一致,主服务器的版本要低于从的

 3. 如果mysql数据库的隔离级别为可读,其二进制日志格式尽量使用基于行的

 

 

 

常见错误:

 

ERROR 1201 (HY000): Could not initializemaster info structure; more error messages can be found in the MySQL error log

mysql>

 

解决办法:

1.进入MySQL数据库默认的数据库存储目录:

/usr/local/mysql/var

 

2.删除以下两个文件:

master.info

relay-log.info