> 数据库 > MySQL >

MariaDB(MySQL):主从复制

  • 一、数据复制目的

    数据分布:实现不同的地方维护数据拷贝,比如各个数据中心之间。

    负载均衡:将读取分布在不同服务器上,针对读取密集型的程序效果很好。

    备份:复制对于备份很有帮助,比如主从复制

    高可用性和故障转移:显著减少故障停机时间

     

    二、主从复制原理

    wKioL1NjGRiDhEGpAAEDyOkZrVg664.jpg

    1.工作原理

    主:主服务器上完成数据的修改,修改完成之后通知从服务器读取二进制日志事件;

    从:从服务器收到通知之后,唤醒I/O thread,到主服务器上请求事件,主服务器

    使用binlogdump发送事件,I/O thread读到后保持在中继日志中,SQL thread

    从中继日志中读取,同步到磁盘。

    2.二进制日志与中继日志

    a).二进制日志中

    保存的只是跟服务器修改相关的操作,也叫复制日志。

    二进制日志为了避免日志文件过大,要进行不停地滚动,

    主要有两个功能:即时点恢复、复制

    因为二进制日志有即时点恢复功能,所以万一某天一个不小心失误把数据库删了,只要二进制日志文件保存完好,就可以把我们的数据恢复回来。

    二进制日志是重要性可见一斑,因此二进制日志不要和数据库放到一起,而要另找位置存放。

    b).中继日志

    中继日志和复制相关,中继日志是从服务器请求的主服务器上所有事件的日志。 即主服务器的二级制日志的副本。

    3.主从复制的其他要点

    版本要求:

    1.双发的MySQL要一致;

    2.如果不一致:主的要低于从的,因为从要兼容主的,才能复制数据;

    复制起始:

    1.都从0开始;

    2.若主服务器已经运行一段时间,并且存储不小的数据集;把主服务器备份,然后将备份数据在从服务器上恢复,从备份时所处的位置开始复制;

     

    三、简单的主从复制的实现

    1.主从复制配置大纲:

    前提:

    主从服务器时间要同步(NTP);

    1.# crontab -e
    2.*/5 * * * * /usr/sbin/ntpdate  172.16.0.1 &> /dev/null

    master

    (1).启用二进制日志

    1.log-bin=/mydate/binlogs/master-bin
    2.log-bin-format=

    (2).为master在当前复制架构中唯一的server-id

    1.server-id={0~2^32}

    (3).创建一个具有复制权限的用户账号

    1.mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repluser'@'hostname' IDENTIFIED BY 'repluser_pass';

    slave

    (1).启用中继日志(并关闭二进制文件)

    1.relay-log=/mydata/relaylogs/relay-bin

    (2).为slave选择一个在当前复制架构中唯一的server-id

    1.server-id={0~2^32}

    (3).连接至主服务器

    1.mysql> CHANGE MASTER TO MASTER_HOST='',MASTER_USER='',MASTER_PASSWORD='',MASTER_LOG_FILE='',MASTER_LOG_POS=#;

    (4).启动复制线程

    1.mysql> START SLAVE;

    2.主从复制实现

    a).配置主服务器

    01.#service mysqld stop     //关闭mysqld服务
    02.#vim /etc/my.cnf         //编辑配置文件输入如下内容:
    03.datadir=/mydata/data
    04.//指定数据目录
    05.log-bin=/mydata/binlogs/master-bin
    06.//设置二进制日志存放目录与日志名称
    07.binlog_format=mixed             
    08.//设置二进制日志存储格式
    09.server-id       =1             
    10.// 设置server-id 为 1
    11.# mkdir /mydata/binlogs        //创建二进制日志目录
    12.# chown -R mysql.mysql /mydata/binlogs
    13. 
    14.#service mysqld start     //启动mysql服务
    15.#mysql -uroot -hlocalhost -pHoolee     //登录msyqld服务器
    16.MariaDB[(none)]> grant replication slave,replication client on *.* to 'repluser'@'172.16.%.%' identified by 'replpass';
    17.//授权从服务器连接的用户
    18.MariaDB[(none)]> flush privileges;         //重读授权表

    b).配置从服务器

    01.# service mysqld stop    //停止mysql服务
    02.# vim /etc/my.cnf        //编辑mysql配置文件
    03.//注释如下两行(从服务器无需二进制日志)
    04.#log-bin=mysql-bin
    05.#binlog_format=mixed
    06.datadir=/mydata/data  //从服务器数据目录
    07.read-only = on  //从服务器设置为只读模式
    08.server-id =2
    09.relay-log  =/mydata/relaylogs/relay-bin  //指定中继日志目录
    10.# mkdir /mydata/relaylogs  //创建relay-log存放目录及属主属组
    11.# chown -R mysql.mysql /mydata/relaylogs

    c).查看从服务器的中继日志是否启动成功

    1.MariaDB[(none)]> show global variables like '%relay%'
    2.显示: relay-log   /mydata/relaylogs/relay-bin
    3.//显示日志路径,说明开启日志成功

    d).查看主服务器状态

    1.MariaDB[(none)]> show master status;
    2.显示: master-bin.000004   444
    3.//这是从连接的时候,必须要使用的选项

    e).从服务器连接主服务器

    1.# service mysqld start     //启动mysqld服务
    2.# mysql -uroot -hlocahost -pHoolee  //连接mysqld服务器
    3.MariaDB[(none)]&gt; change master to master_host='172.16.1.3',master_user='repluser',master_pass<a href="http://www.it.net.cn/edu/ebg/" target="_blank"class="keylink">word</a>='replpass',master_log_file='master-bin.000004',master_log_pos=444;
    4.MariaDB[(none)]&gt; start slave;  //启动复制线程

    f).查看从服务器状态信息,检测是否连接主成功

    MariaDB[(none)]> show slave status\G;
     显示: Slave_IO_running: Yes
            Slave_SQL_running: Yes
        //成功启动 I/O thread 与 SQL thread

    g).测试

    在主主服务上新建一个数据库,在从服务器上查看,是否有复制。略

     

    四、补充

    如何主从复制时的事务安全?

    在主服务器上所有的修改操作都要先记录到二进制日志之后才能同步到从服务器,但是为了提高二进制日志的i/o性能,这些时间会首先被保存在二级制日志的缓冲区(内存)中,过段时间才会同步进二进制,这样是为了降低i/o占用率。

    如果事务commit了,但是保留在缓冲区中,这意味着不会立即同步到从,万一此时主挂了,从服务器上事务没有提交。这种场景下,事务不安全,如果将从服务器指向别的主服务器可能导致这个事务被回滚,因为后续commit的语句没看到。

    这种情况下,只要事务提交了,就立即将与事务相关的语句从二级制日志的缓存区中同步到二进制日志中(会频繁i/o,系统性能下降)。通过sync_binlog参数设定。

    在主服务器上配置:

    sync_binlog=1

(责任编辑:IT)