zoukankan      html  css  js  c++  java
  • Windows下MySQL双向同步及环形同步的实现

    记录一下这次做的双向同步及环形同步吧,都是最简单的实现;


    具体实现之前,先说些与之有关的内容吧,大部分内容都是网上的,操作步骤则是亲自测试之后记录下的;


    一. 数据同步的几种方式:

    1. 触发器,在数据库中建立增删改的触发器,每当数据库有变化,就会激活触发器,进而执行相应的操作,缺点是性能问题;

    2. 时间戳,即在要同步的表里增加一个字段,当数据变化后,这个字段会发生相应的变化,然后根据这个字段的值来进行同步,可以是日期类型,记录当前的时间,缺点是有些延时,并且是每个表都要有这个字段。这中间还会涉及到逻辑删除;

    3. 日志记录,通过分析数据库的日志,来获取数据库中变化的数据,缺点有些延时,并且对于没有提供日志分析接口的数据库,开发难度较大;


    二. 数据库双向同步的实现

    系统:windows 7旗舰版

    数据库:MySQL Server 5.0

    主机A的IP:192.168.75.129     主机B的IP:192.168.75.130


    1. 首先要保证两台主机间能的网络通信是正常的,可以ping一下或Telnet一下;


    2. 添加同步帐号:

    grant replication slave,replication client on *.* to backup@'192.168.75.129' identified by '123456';

    也可设置为局域网内访问,即IP为192.168.75.%。

    在主机A和B上分别执行了添加帐号之后,先测试一下能否正常连接,如在B上测试:

    mysql -u backup -p -h192.168.75.129 -P3306
    如果不能访问,多半是账户backup的权限不够,修改权限即可;

    A中重新backup账户grant一下,如果grant了几次都不行,那就给所有的权限,当然,只是为了测试;

    grant all privileges on *.* to ‘backup’@’%’ identified by ‘123456’;


    3. 停掉A和B的MySQL服务,然后对A和B的my.ini进行配置,A和B的server-id不一样;

    server-id = 1      #MySQL服务器标志,必须唯一
    log-bin=mysql-bin  #二进制日志文件的位置和命名
    log-slave-updates=1 #事件自动更新到日志中
    sync_binlog=1  #日志文件同步到磁盘上
    replicate_do_db=test  #要同步的数据库名称

    4. 启动各自的MySQL服务,进行动态的Change master配置,先对B进行配置:

    change master to master_host='192.168.75.129',
    master_user='backup', 
    master_password='123456',
    master_log_file='mysql-bin.000001',
    master_log_pos=0;
    至于master_log_file和master_log_pos可以使用show master status来查看的;

    然后对A执行相同的操作,注意master_host,如果报错,先slave stop,在操作,再slave start即可;


    5. 使用show slave statusG来查看同步是否正确执行;

    show slave statusG
    如果Slave_IO_Running、Slave_SQL_Running都为YES,则表明配置已经成功,下一步可以准备测试了;


    6. 可以进行简单的create, alter ,update, insert ,delete测试了;


    三. 环形同步

    系统:windows 7旗舰版

    数据库:MySQL Server 5.0

    主机A的IP:192.168.75.129     主机B的IP:192.168.75.130   主机C的IP:192.168.75.131


    1. 采用环形操作,即A是B的主服务器,B是C的主服务器,C又是A的主服务器,依次类推组成一个环状结构。这样ABC三台服务器,在任意一台执行数据操作,数据均会同步其他服务器上。


    2. 分别配置A、B、 C的my.ini,在[mysqld]下添加如下配置内容:

    server-id = 1
    log-bin=mysql-bin
    log-slave-updates=1
    slave-skip-errors=all
    replicate_do_db=test
    其中需注意A、B、C的server-id是不同的;


    3. 配置完成后,重启各主机的服务;


    4. 对主机A添加专门用于同步的账户,操作过程和双向同步类似;

    GRANT REPLICATION SLAVE ON *.* TO 'backup'@'192.168.75.130:3306' IDENTIFIED BY '123456';


    5. 然后对B也进行同样操作,但@的是C的地址,并且根据A的show master status的日志文件和偏移量,进行如下操作:

    slave stop;
    
    CHANGE MASTER TO MASTER_HOST='192.168.75.129', 
    MASTER_USER='backup',
    MASTER_PASSWORD='123456',
    MASTER_PORT=3309,
    MASTER_LOG_FILE='mysql-bin.000001',  //A的日志文件
    MASTER_LOG_POS=98;  //A的偏移量  
    
    slave start;
    需注意的是端口号,因为我的端口号修改为了3309;


    6. 对C进行同样操作,@的是A的地址,并且根据B的show master status的日志文件和偏移量,进行配置:

    其中master_host是B的IP地址;

    然后对A进行操作,根据C的show master status,进行同样的配置,注意master_host;


    7.全部重启服务,分别看下show slave statusG,如果是YES,就没问题了:

    Slave_IO_Running: Yes

    Slave_SQL_Running: Yes

    8.可以测试了;


    总结:

    1. 实现过程中,遇到最多的问题应该就是账户的权限不足,导致ping不通的问题了;

    2. 这次双向同步和环形同步实现的是最简单的,好多问题都没有考虑,如权限问题,ID冲突的问题,环形同步的稳定性问题,即如果一个节点出了问题,别的节点都会收到影响;

    3. 参考网址:MySQL环形同步和测试


  • 相关阅读:
    jquery基础整理(面试必备)
    ES中文学习指南---入门篇
    ES的Java Rest client---jest
    java学习路线
    ES中文学习指南一-----产品体验
    Tomcat无法启动
    Maven问题集
    informatica9.5.1资源库为machine in exclusive mode(REP_51821)
    程序员书单_架构设计篇
    Informatica9.6.1在Linux Red Hat 5.8上安装遇到的有关问题整理_1
  • 原文地址:https://www.cnblogs.com/xiaozhang2014/p/5297290.html
Copyright © 2011-2022 走看看