• MySQL多主同步 负载均衡


    高进波 | 2010 年 10 月 8 日
     
    解决多台写服务器主自增长ID重复问题,值得参考,希望对大家所帮助。
     
    二台Mysql服务器,他们的IP地址分别为: 
    A:192.168.0.97 
    B:192.168.0.98 
    数据库都是 test_3306 
    首先我给两台服务器的my.ini 贴出来
     
    A:my.ini 
    server-id=2 
    master-host=192.168.0.98 
    master-user=mydb 
    master-password=123 
    master-port=3306 
    master-connect-retry=1 
    replicate-do-db=tbqu 
    log-bin= 
    log-slave-updates 
    binlog-ignore-db=mysql 
    slave-skip-errors=all
     
     
     
    B:my.ini 
    server-id=1 
    master-host=192.168.0.97 
    master-user=mydb 
    master-password=123 
    master-port=3306 
    master-connect-retry=1 
    replicate-do-db=tbqu 
    log-bin= 
    log-slave-updates 
    binlog-ignore-db=mysql 
    slave-skip-errors=all 
     
    在这里,配置文件和主从配置方法基本上一样 
    log-slave-updates 这个参数一定要加上,否则不会给更新的记录些到二进制文件里 
    slave-skip-errors 是跳过错误,继续执行复制操作 
     
    多主互备和主从复制有一些区别,因为多主中 都可以对服务器有写权限,所以设计到自增长重复问题
     
     
     
    出现的问题(多主自增长ID重复) 
    1:首先我们通过A,B的test表结构 
    2:掉A,在B上对数据表test(存在自增长ID)执行插入操作,返回插入ID为1 
    3:后停掉B,在A上对数据表test(存在自增长ID)执行插入操作,返回的插入ID也是1 
    4:然后 我们同时启动A,B,就会出现主键ID重复
     
     
     
    解决方法: 
    我们只要保证两台服务器上插入的自增长数据不同就可以了 
    如:A查奇数ID,B插偶数ID,当然如果服务器多的话,你可以定义算法,只要不同就可以了
     
     
     
    在这里我们在A,B上加入参数,以实现奇偶插入
     
    A:my.ini上加入参数
     
    auto_increment_offset = 1 
    auto_increment_increment = 2 
    这样A的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID了
     
     
     
    B:my.ini上加入参数
     
    auto_increment_offset = 2 
    auto_increment_increment = 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 重复。
     
     
     
    在这里我们说的是2台MYSQL服务器,你也可以扩展到多台,实现方法类似 
    A -> B -> C-> D ->A 
    这样一个环形的备份结构就形成了,最后可要记住 自增长ID(主键)要设计好哦,否则会出错的。
     
     
     
    ————————————————————————————————————————–
     
    假定有三台Mysql服务器,他们的IP地址分别为: 
    192.168.1.8 
    192.168.1.88 
    192.168.1.188
     
    在192.168.1.8的安装目录下找到my.ini文件,在该文件的最后加上: 
    server-id=1 
    log-bin 
    #asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字 
    binlog-do-db=asyntest1 
    #下面这句话很重要,只有加上它,从前一台机器上同步过来的数据才能同步到下一台机器 
    log-slave-updates 
    master-host=192.168.1.188 
    master-user=root 
    #在此处填入192.168.1.188的root密码 
    master-password=XXXXX 
    #asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字 
    replicate-do-db=asyntest1 
    master-connect-retry=10 
    #出现错误后忽略,如果不加这个,出现任何错误,同步进程会终止 
    slave-skip-errors=all
     
     
     
    在192.168.1.88的安装目录下找到my.ini文件,在该文件的最后加上: 
    server-id=2 
    log-bin 
    #asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字 
    binlog-do-db=asyntest1 
    #下面这句话很重要,只有加上它,从前一台机器上同步过来的数据才能同步到下一台机器 
    log-slave-updates 
    master-host=192.168.1.8 
    master-user=root 
    #在此处填入192.168.1.8的root密码 
    master-password=XXXXX 
    #asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字 
    replicate-do-db=asyntest1 
    master-connect-retry=10 
    #出现错误后忽略,如果不加这个,出现任何错误,同步进程会终止 
    slave-skip-errors=all
     
    在192.168.1.188的安装目录下找到my.ini文件,在该文件的最后加上: 
    server-id=3 
    log-bin 
    #asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字 
    binlog-do-db=asyntest1 
    #下面这句话很重要,只有加上它,从前一台机器上同步过来的数据才能同步到下一台机器 
    log-slave-updates 
    master-host=192.168.1.88 
    master-user=root
     
    #在此处填入192.168.1.88的root密码 
    master-password=XXXXX 
    #asyntest1是我用来试验的数据库名称,到时候要换成你的数据库名字 
    replicate-do-db=asyntest1 
    master-connect-retry=10 
    #出现错误后忽略,如果不加这个,出现任何错误,同步进程会终止 
    slave-skip-errors=all
     
     
     
    在192.168.1.8, 192.168.1.88, 192.168.1.188上建立完全一样的数据库asyntest1,重启这三台数据库,然后在任何一台机器上进行的更新操作,都会同步到另外的两台机 器上,这是一种环形同步,在192.168.1.8有任何修改,会首先同步到192.168.1.88的机器上,88的机器再将同步的数据同步到 192.168.1.188的机器上。同样,如果在192.168.1.88上有任何更新,首先会同步到192.168.1.188的机器上,然后再同步 到192.168.1.8的机器上;而在192.168.1.188的机器上有任何更新,首先会同步到192.168.1.8的机器上,然后在同步到 192.168.1.88的机器上。利用这种原理,可以解决任意多台机器的互相同步问题。
     
     
     
    如果出现问题,首先请在每一台服务器上用命令行通过telnet命令检查其他机器3306端口的连通情况。另外,请检查各机器的防火墙设置和杀毒软件的配置。可将这些软件暂停后进行试验。
     
  • 相关阅读:
    284.软件体系结构集成开发环境的作用
    Socket编程:邮件客户
    Socket编程:UDP Ping
    Socket编程:Web服务器
    计算机网络面试题总结(网络层)
    零基础黑客入门
    MYSQL的安装和配置(Windows)
    计算机网络面试题(分层概念+数据链路层)
    车载网络入侵检测系统设计
    操作系统知识点
  • 原文地址:https://www.cnblogs.com/huapox/p/3516358.html
Copyright © 2020-2023  润新知