zoukankan      html  css  js  c++  java
  • 1019mysql 复制技术

    -- 第一步实现主从复制
    参照 http://369369.blog.51cto.com/319630/790921/
    核心点 :开启二进制日子和服务器ID,创建复制账号,配置连接主从服务器,查看各自状态

    mysql主从复制
    (超简单)

    怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下:

    1、主从服务器分别作以下操作
      1.1、版本一致
      1.2、初始化表,并在后台启动mysql
      1.3、修改root的密码

    2、修改主服务器master:
       #vi /etc/my.cnf
           [mysqld]
           log-bin=mysql-bin   //[必须]启用二进制日志
           server-id=222      //[必须]服务器唯一ID,默认是1,一般取IP最后一段

    3、修改从服务器slave:
       #vi /etc/my.cnf
           [mysqld]
           log-bin=mysql-bin   //[不是必须]启用二进制日志
           server-id=226      //[必须]服务器唯一ID,默认是1,一般取IP最后一段

    4、重启两台服务器的mysql
       /etc/init.d/mysql restart

    5、在主服务器上建立帐户并授权slave:
       #/usr/local/mysql/bin/mysql -uroot -pmttang   
       mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'mysync'@'%' identified by 'q123456'; //一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。

    6、登录主服务器的mysql,查询master的状态
       mysql>show master status;
       +------------------+----------+--------------+------------------+
       | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
       +------------------+----------+--------------+------------------+
       | mysql-bin.000004 |      308 |              |                  |
       +------------------+----------+--------------+------------------+
       1 row in set (0.00 sec)
       注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化

    7、配置从服务器Slave:
       mysql>change master to master_host='192.168.145.222',master_user='mysync',master_password='q123456',
             master_log_file='mysql-bin.000004',master_log_pos=308;   //注意不要断开,308数字前后无单引号。

       Mysql>start slave;    //启动从服务器复制功能

    8、检查从服务器复制功能状态:

       mysql> show slave statusG

       *************************** 1. row ***************************

                  Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.2.222  //主服务器地址
                  Master_User: mysync   //授权帐户名,尽量避免使用root
                  Master_Port: 3306    //数据库端口,部分版本没有此行
                  Connect_Retry: 60
                  Master_Log_File: mysql-bin.000004
                  Read_Master_Log_Pos: 600     //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
                  Relay_Log_File: ddte-relay-bin.000003
                  Relay_Log_Pos: 251
                  Relay_Master_Log_File: mysql-bin.000004
                  Slave_IO_Running: Yes    //此状态必须YES
                  Slave_SQL_Running: Yes     //此状态必须YES
                        ......

    注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。

    以上操作过程,主从服务器配置完成。
      
    9、主从服务器测试:

    主服务器Mysql,建立数据库,并在这个库中建表插入一条数据:

      mysql> create database hi_db;
      Query OK, 1 row affected (0.00 sec)

      mysql> use hi_db;
      Database changed

      mysql>  create table hi_tb(id int(3),name char(10));
      Query OK, 0 rows affected (0.00 sec)
     
      mysql> insert into hi_tb values(001,'bobu');
      Query OK, 1 row affected (0.00 sec)

      mysql> show databases;
       +--------------------+
       | Database           |
       +--------------------+
       | information_schema |
       | hi_db                |
       | mysql                |
       | test                 |
       +--------------------+
       4 rows in set (0.00 sec)

    从服务器Mysql查询:

       mysql> show databases;

       +--------------------+
       | Database               |
       +--------------------+
       | information_schema |
       | hi_db                 |       //I'M here,大家看到了吧
       | mysql                 |
       | test          |

       +--------------------+
       4 rows in set (0.00 sec)

       mysql> use hi_db
       Database changed
       mysql> select * from hi_tb;           //查看主服务器上新增的具体数据
       +------+------+
       | id   | name |
       +------+------+
       |    1 | bobu |
       +------+------+
       1 row in set (0.00 sec)
     

    10、完成:
        编写一shell脚本,用nagios监控slave的两个yes(Slave_IO及Slave_SQL进程),如发现只有一个或零个yes,就表明主从有问题了,发短信警报吧。

    -- 第二步实现主主复制
    参照 http://blog.csdn.net/jeffreynicole/article/details/8309451
    核心点 :配置log-slave-updates,binlog-do-db,replicate-do-db,auto_increment_increment=2,auto_increment_offset=1 ,然后按照上面的方法进行反向配置
    有时候复制用户不正确,可以先使用root进行测试

    MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环。当一个从服务器连接到主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知下一次更新。



    配置主主同步的操作步骤:
    MySQL-A     10.17.1.11
    MySQL-B     10.17.1.12
    1.     分别在两台机器授权账户:grant replication slave, file, select on *.* to 'repl'@'10.17.%' identified by ‘xxxx’ 
    备注:如果想要在Slave上有权限执行 "LOAD TABLE FROM MASTER" 或 "LOAD DATA FROM MASTER" 语句的话,必须授予全局的 FILE 和 SELECT 权限。


    2.     配置文件/etc/my.cnf,在使用主库配置文件的基础上,加入以下配置项
    MySQL-A     MySQL-B

    log-bin=mysql-bin log-bin=mysql-bin
    server-id=1 server-id=2
    binlog-do-db=TestXXX binlog-do-db=TestXXX
    binlog-ignore-db=mysql binlog-ignore-db=mysql
    replicate-do-db=TestXXX replicate-do-db=TestXXX
    replicate-ignore-db=mysql replicate-ignore-db=mysql
    log-slave-updates log-slave-updates
    slave-skip-errors=all slave-skip-errors=all
    auto_increment_increment=2 auto_increment_increment=2
    auto_increment_offset=1 auto_increment_offset=2


     
    备注:
    log-slave-updates是为从库的写操作记录binlog
    多主互备和主从复制有一些区别,因为多主中的各个库,都可以对服务器有写权限,所以设计到自增长重复问题


    模拟出现的问题(多主自增长ID重复)
    • 假如我们在AB都建立一张test表,表中有一个auto increment的字段
    • 停掉A的同步,在B上对数据表test(存在自增长ID)执行插入操作,返回插入ID为1
    • 然后停掉B的同步,在A上对数据表test(存在自增长ID)执行插入操作,返回的插入ID也是1
    • 然后同时启动A,B,就会出现主键ID重复


    解决方法:
    我们只要保证两台服务器上插入的自增长数据不同就可以了
    如:A插入奇数ID,B插入偶数ID,当然如果服务器多的话,你可以定义算法,只要不同就可以了


    在这里我们在A,B上加入参数,以实现奇偶插入


    A:my.cnf上加入参数
    [plain] view plain copy
     
    1. auto_increment_increment=2  
    2. auto_increment_offset=1  




    这样A的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID了


    B:my.cnf上加入参数
    [plain] view plain copy
     
    1. auto_increment_increment=2  
    2. auto_increment_offset=2  




    这样B的auto_increment字段产生的数值是:2, 4, 6, 8, …等偶数ID了
    可以看出,你的auto_increment字段在不同的服务器之间绝对不会重复,所以Master-Master结构就没有任何问题了。当然,你还可以使用3台,4台,或者N台服务器,只要保证auto_increment_increment = N 再设置一下auto_increment_offset为适当的初始值就可以了,那样,我们的MySQL可以同时有几十台主服务器,而不会出现自增长ID重复。
             
    3.     重启MySQL读取新的配置文件,进入MySQL后,用change master命令进行同步即可。
     
     
    更加深入的请参见http://www.cnblogs.com/hustcat/archive/2009/12/19/1627525.html
  • 相关阅读:
    HTTP Basic 验证客户端 C#实现笔记
    泗洪高薪行业
    C#中Math的使用总结
    Android音频底层调试-基于tinyalsa
    我看项目管理第一回:认识利益相关方,提高思想意识
    【剑指Offer学习】【面试题19 :二叉树的镜像】
    算法
    zTree实现地市县三级级联DAO接口实现
    Unix/Linux环境C编程新手教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建
    正尝试在 OS 载入程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内执行托管代码,这样做会导致应用程序挂起。
  • 原文地址:https://www.cnblogs.com/qcfeng/p/5977451.html
Copyright © 2011-2022 走看看