zoukankan      html  css  js  c++  java
  • mysql复制

    author:skate
    time:2012/03/08


    MySQL高可用解决方案
    1.主备模式:master/slave
    2.级联主备模式:A->B->C
    3.mysql双主MMM模式
    4.hearbeat/san,hearbeat/BRBD模式
    5.NDB cluster模式


    这里只讲配置,具体的适合应用场景稍后在详述


    1.主备模式:master/slave


    A.master可以停机配置slave
    B.master不允许停机配置slave
    C.添加/删除slave
    D.常用的维护与诊断手册



    A.master可以停机(停止更新)配置slave
    通过"load data from master"语句把master主服务器的数据copy到slave从服务器上,但是这个语句使用是有前提条件的;
    一个是只对myisam表起作用,第二是该语句将会获得全局的读锁,禁止master主库的任何更新,当然热备份就不会有全局
    读锁了。



    mysql的复制基本原理是master对数据库的更新存入master的二进制日志文件里,slave通过读master的二进制日志来完成master和slave的主从同步的。整个同步过程需要三个线程来完成


    master有一个io线程:负责将master的二进制日志发送到slave
    slave有一个io线程和一个sql线程:slave的I/O线程读取master的Binlog Dump线程发送的内容并将该数据拷贝到slave的
    数据目录中的本地文件中,即中继日志。slave的sql线程用于读取中继日志并执行日志中包含的更新。



    在复制的环境中用到的文件
    master的文件:
    1.二进制文件
    二进制文件最好放在单独的目录下,这不但对方便优化、更方便维护。重新命名二进制日志很简单,只需要修改[mysqld]里的
    log_bin选项,这里有一点需要注意,如下例子:


    log_bin=/home/mysql/binlog/binlog.log


    [root@localhost ~]# ll /home/mysql/binlog
    total 8
    -rw-rw---- 1 mysql mysql 98 Mar  7 17:24 binlog.000001
    -rw-rw---- 1 mysql mysql 33 Mar  7 17:24 binlog.index
    [root@localhost ~]#


    从上面的例子可以看到,我要重新调整logbin的路径为“/home/mysql/binlog”,但我log_bin的设置却有些不同



    这里需要注意两点
    1).目录的文件夹命名不能有空格
    2).指定目录时候一定要以*.log结尾,即不能仅仅指定到文件夹的级别,否则在重启mysql时会报错。


    2.错误日志
    错误日志对于诊断问题非常重要,第一个要看的就应该是这个文件,类似oracle的alertlog文件。
    它的默认路径是“log-error=/var/log/mysqld.log”。



    slave文件
    1.中继日志文件(包括中继日志索引文件)
    中继日志文件和master的二进制文件格式一样,也应该单独维护它,把它单独放在一个目录下,可以通过如下两个参数修改
    --relay-log=file_name
    --relay-log-index=file_name


    和中继日志有关的几个参数
    --max-relay-logs-size=size
    定义中继日志的大小


    --relay-log-info-file=file_name
    从服务器用于记录中继日志相关信息的文件名。默认名为数据目录中的relay-log.info。


    --relay-log-purge={0|1}
    是否自动清空不再需要中继日志时。默认值为1(启用)。这是一个全局变量,可以用SET GLOBAL Relay_log_purge动态更改。


    3.master.info和relay-log.info两个状态文件
    这两个文件都是保存在硬盘上的,服务器异常不会丢失的
    master.info:
    在slave重启时,读取这个文件以确定它已经从主服务器读取了多少二进制日志,默认名字是数据目录下master.info,若要修改其文件名,通过参数 “--master-info-file=file_name”


    relay-log.info:
    在slave重启时,读取这个文件以确定它已经处理了多少二进制日志,默认名字是数据目录下relay-log.info,若要修改其文件名,通过参数“--relay-log-info-file=file_name”


    4.错误日志
    这个和master一样,参考上面,这里就不说了


    5.二进制日志
    当做级联复制时,二进制文件也会启用,和master类似。



    停机master复制配置的步骤
    1)确定主从服务器的版本,最好版本一样
    2)在master服务器上建立一个复制用户并授权,用户slave服务器连接取log用。
    3)配置主master,并为slave服务器准备master的备份数据
    4)配置slave服务器
    5)严重配置是否正确



    1)确定主从服务器的版本,最好版本一样
    在主从库上运行如下语句,检查版本是否一致
    mysql> select version();


    2)在master服务器上建立一个复制用户并授权,用户slave服务器连接取log用。


    创建复制用户:
    mysql> grant replication slave on *.* to 'repluser'@'192.168.1.*'  identified by '123456' with grant option;

    Query OK, 0 rows affected (0.04 sec)


    3)配置主master,为slave服务器准备master的备份数据
    master的my.cfg文件
    [mysqld]
    server-id=1
    log_bin=/home/mysql/binlog/binlog.log
    binlog-do-db=backup             //需要同步的数据库,默认是所有的数据库都同步
    #binlog-ignore-db = mysql         //忽略此数据库同步,不记录到binlog里
    #binlog-ignore-db = skate           //忽略此数据库同步,不记录到binlog里



    以上的配置没有考虑双master模式



    获得全局读锁
    mysql> flush  tables with read lock;
    Query OK, 0 rows affected (0.00 sec)


    记录master的日志名和偏移量后
    mysql> show master status;


    这个时候可以用tar创建了数据库的快照或者关闭mysql直接copy数据文件


    [root@localhost mysql]# tar -cvf /tmp/backup-snap.tar ./backup
    ./backup/
    ./backup/tt.frm
    ./backup/right_table.frm
    ./backup/tt.MYI
    ./backup/t1.MYD
    ./backup/t2.frm
    ./backup/t5.frm
    ./backup/t1.MYI
    ./backup/t5.MYD
    ./backup/db.opt
    ./backup/t1.frm
    ./backup/tt.MYD
    ./backup/left_table.frm
    ./backup/t5.MYI


    注意:如果有innodb表的话,还要打包表空间”ibdata1“。



    master服务器上重新启用更新
    mysql> unlock tables;
    Query OK, 0 rows affected (0.00 sec)



    把归档文件传送到salve服务器,然后解压缩文件到slave的数据目录下


    [root@localhost mysql]# tar -xvf /tmp/backup-snap.tar



    4)配置slave服务器
    这个时候mysql应该是停止的


    [mysqld]
    server-id=11    //不能和master一样
    master-connect-retry=60     //在master宕机或连接丢失的情况下,slave线程重新尝试连接master之前睡眠的秒数,默认60s
    logs-warnings                //记录更详细的错误信息
    read-only  //该选项让slave只允许来自slave线程或具有SUPER权限的用户的更新。可以确保slave的数据一致性。
    relay-log-purge=0   //默认值为1,自动清空不需要的rely-log;最好自己定制清空策略     
    replicate-do-db=backup  //只复制backup数据库
    skip-slave-start  //在第一次配置要使用这个,slave启动时不启动从服务器线程


    auto_increment_offset=2   //AUTO_INCREMENT列值的起点,影响到在复制设置中可以有多少主服务器
    auto_increment_increment=1 //控制列值增加的间隔


    relay_log = mysql-relay-log #中继日志
    relay_log_index= mysql-relay-log-index  #指定中继日志的名字的索引文件的位置和名字

    log_slave_updates = 1 #将从服务器将所有的复制记录到自己的日志中,该项可以把从服务器作为一个另一个从服务器的主服务器



    启动mysql服务


    [root@localhost mysql]# service mysqld start


    开始复制
    mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.104',

    >MASTER_USER='rpl',

    >MASTER_PASSWORD='rpl',

    >MASTER_LOG_FILE='mysql-bin.000001',

    >MASTER_LOG_POS=0;

    启动slave
    mysql> start slave;



    5)查看配置是否正确
    然后在主库创建表,在从库查看,并观察错误log


    建议:

    1.无论主从服务器server-id从10开始

    2.主服务器使用innodb引擎,从服务器使用myisam引擎.前者写并发大,后者读效率高.

  • 相关阅读:
    docker 容器管理常用命令
    第一章 入门示例
    rsyslog 日志服务器端配置
    如何利用一个按钮绑定两个事件
    select下拉框有了空行怎么办
    如何设置select下拉禁止选择
    mysql utf8 中文
    数据化决策的魅力
    数据化决策的魅力
    minor.major version 详解
  • 原文地址:https://www.cnblogs.com/itfenqing/p/4429437.html
Copyright © 2011-2022 走看看