1数据mysql主机地址10.0.209.48(主)10.0.209.4910.0.209.5010.0.209.51(主)mysql服务器5.5.27安装路径1.1双主备库复制方案这种配置方式当主节点出现问题,所有的从节点将不能进行同步...优点:保证主节点的网络不参与多次的复制,master-B可以作为备份1.如果master-a宕机,f5切换到master-b,当master-a启动后,原有连接还在master-b上,新建连接在master-a上。2.如果master-b宕机,读的数据库将不能实时同步,当master-b启动后,数据连续同步,不会出现不同步的情况。3.需要保证所有复制关系才能正常运行。Master-AMaster-B负载均衡设备VIP-ReadVIP-WriteSlave-ASlave-B读访问读访问复制复制写访问写访问1.1.1MySQL5.5安装过程1.使用ntp保证时间一致2.新建/etc/my.cnf文件,配置相应路径3.使用mysql_install_db重新安装数据4.修改mysql密码mysqladmin-urootpassword防止主键冲突主节点1auto_increment_increment=2#步长auto_increment_offset=1#初始值sync_binlog=1#防止不同步,一定要有,先一个停止服务,然后插入另一个,可能不同步innodb_flush_log_at_trx_commit=2主节点2auto_increment_increment=2#步长auto_increment_offset=2#初始值sync_binlog=1#防止不同步innodb_flush_log_at_trx_commit=2从节点server-id=323307log_slave_updates=1auto_increment_increment=2auto_increment_offset=2read-only(保证只读)1、主从服务器时间要同步(ntp):echo*/5****/usr/sbin/ntpdateYOURNTP_SERVER_IP/var/cron/root2、如何限制从服务器只读?在从服务器上,/etc/my.cnf[mysqld]段中添加下行read-only=ON注意:仅能限制那不具有SUPER权限用户无法执行写操作;想限制所有用户:mysqlFLUSHTABLESWITHREADLOCK;3、如何主从复制时的事务安全?在主服务器上配置:sync_binlog=11.1.2导入数据MariaDB[(none)]CREATEDATABASEtestdb;[root@Master~]#mysqldump--all-databases--flush-logs--master-data=1--lock-all-tablesall.sql//将此文件传给新Slave.[root@Master~]#scpall.sqlroot@172.16.41.2:/root/(2)在从服务器上导入:[root@Slave~]#mysqlall.sql(1)导出整个数据库(包括数据库中的数据)mysqldump-uusername-pdbnamedbname.sql(2)导出数据库结构(不含数据)mysqldump-uusername-p-ddbnamedbname.sql(3)导出数据库中的某张数据表(包含数据)mysqldump-uusername-pdbnametablenametablename.sql(4)导出数据库中的某张数据表的表结构(不含数据)mysqldump-uusername-p-ddbnametablenametablename.sqlmysqldump-uroot-punicom_documentuni.sql创建数据库之后执行mysql-uroot-punicom_documentuni.sql或者windows下useunicom_documentmysqlsourced:/myprogram/database/unicom_document.sql;1.1.3配置复制在两个主节点上分别执行:grantreplicationslaveon*.*torepuser@'%'identifiedby'repuser';flushprivileges;#情况日志,查看master的状态stopslave;resetmaster;resetslave;showmasterstatus;1.发出该语句:复制代码代码如下:mysqlFLUSHTABLESWITHREADLOCK;2.仍然加锁时,执行该命令(或它的变体):复制代码代码如下:shelltarzcf/tmp/backup.tar.gz/var/lib/mysql并拷到从服务器上。3.发出该语句并且确保记录了以后用到的输出:复制代码代码如下:mysqlSHOWMASTERSTATUS;4.释放锁:复制代码代码如下:mysqlUNLOCKTABLES;两个主节点配置CHANGEMASTERTOMASTER_HOST='10.0.209.48',MASTER_PORT=3316,MASTER_USER='repuser',MASTER_PASSWORD='repuser',MASTER_LOG_FILE='mysql-bin.000057',MASTER_LOG_POS=13895;CHANGEMASTERTOMASTER_HOST='10.0.209.51',MASTER_PORT=3316,MASTER_USER='repuser',MASTER_PASSWORD='repuser',MASTER_LOG_FILE='mysql-bin.000011',MASTER_LOG_POS=1554;两个从节点配置CHANGEMASTERTOMASTER_HOST='10.0.209.51',MASTER_PORT=3316,MASTER_USER='repuser',MASTER_PASSWORD='repuser',MASTER_LOG_FILE='mysql-bin.000011',MASTER_LOG_POS=1231202;CHANGEMASTERTOMASTER_HOST='10.0.209.51',MASTER_PORT=3316,MASTER_USER='repuser',MASTER_PASSWORD='repuser',MASTER_LOG_FILE='mysql-bin.000011',MASTER_LOG_POS=1231202;#在所有从节点的MySQL上执行:startslave;showslavestatus\Gmysqlshowprocesslist\G1.2MySQLCluster集群方案使用mysqlcluster和mysqlfabric来管理集群。1.3问题解决方案1.使用F5向M1上定向,如果有问题转到M2,可以2.使用mysqlproxy3.使用mysqlcluster,不建议,不清楚4.是否能通过F5各分担50%的访问,不建议,复制问题5.使用MMM,MHA6.使用mysql5.6gtid,可以1.3.1Mysql安装错误使用mysql_install_db重新安装数据1.3.2插入之后就读取的情况处理数据源分为读数据源、写数据源两种。如果插入完之后就读取使用写数据源,只有待办列表、打开表单使用读数据源。使用f5作为双主的VIP-WRITE,采用如果有一台机器M-A出现问题,然后再转发到另外的M-B,所有的从库也通过VIP-READ进行配置从主库进行读写,。Mysql数据库使用5.6的GTID防止事物不一致。1.3.3双主的故障切换错误日志:Gotfatalerror1236frommasterwhenreadingdatafrombinarylog:'Couldnotfindfirstlogfilenameinbinarylogindexfile'使用mysql5.6CHANGEMASTERTOMASTER_HOST='xxx',MASTER_AUTO_POSITION1.3.4主从不一致同步方法因为是通过GTID来进行复制的,也需要跳过这个事务从而继续复制,这个事务可以到主上的binlog里面查看:因为不知道找哪个GTID上出错,所以也不知道如何跳过哪个GTID。但在showslavestatus里的信息里可以找到在执行Master里的POS:151Exec_Master_Log_Pos:151的时候报错,所以通过mysqlbinlog找到了GTID:#at151#15081022:57:45serverid1end_log_pos199CRC320x5e14d88fGTID[commit=yes]SET@@SESSION.GTID_NEXT='4e659069-3cd8-11e5-9a49-001c4270714e:1'/*!*/;找到这个GTID之后执行:必须按照下面顺序执行mysqlstopslave;QueryOK,0rowsaffected(0.01sec)mysqlsetsessiongtid_next='4e659069-3cd8-11e5-9a49-001c4270714e:1';#在session里设置gtid_nextQueryOK,0rowsaffected(0.01sec)mysqlbegin;#开启一个事务QueryOK,0rowsaffected(0.00sec)mysqlcommit;QueryOK,0rowsaffected(0.01sec)mysqlSETSESSIONGTID_NEXT=AUTOMATIC;#把gtid_next设置回来QueryOK,0rowsaffected(0.00sec)mysqlstartslave;#开启复制QueryOK,0rowsaffected(0.01sec)stopslave;setsessiongtid_next='3877a6bb-2f68-11e5-82a9-008cfa052c24:112';begin;commit;SETSESSIONGTID_NEXT=AUTOMATIC;startslave;showslavestatus\G;如果很多地方不一致,需要重新导入数据库1.3.5注意showslavestatus\G;Worker3failedexecutingtransaction''atmasterlogmysql-bin.000011,end_log_pos194300254;Error'Unknowndatabase'eostest''onquery.Defaultdatabase:'eostest'.Query:'createtablexxx_EOS_1440382952663(abcdefchar(10))'如果数据库的忽略大小写会导致同步错误,要保证所有的配置是一致的。