日期:2014-05-16  浏览次数:20390 次

多主一从的一种简单方案
在实际情况中,可能会通过分库来解决单台服务器压力问题,但是这样会给统计带来很大的麻烦,对于统计业务,最好的就是把所有数据集中到一块,然后做统计,对于这样的应用,我想可能就需要多台主对应一台slave了。
对于mysql的来说,他并不支持多主一从,通过网上查询,发现http://denniswwh.itpub.net/post/15174/483254这方法

【大型的系统,数据库往往会根据业务逻辑分隔放在多台机上,但统计的时候又经常需要互相关联,MySQL理论上是不支持多个主库同步到一个从库上的,那么如果实现多主一从以方便统计查询呢?我试着利用MyISAM的简单文件存储的特点来实现,过程如下:
1设置主库,启用Binlog,建议复制帐号。具体过程跟一主多从设置一样。
2设置从库,在从库使用mysqld_multi启动多库实例,每个实例对应一个主库,并分别设置好主从复制。需要注意的是,1、从库只安装MyISAM引擎,这样不管主库是用什么引擎,从库都使用MyISAM。2、从库的几个实例的数据目录使用同一个,这样每个实例都可以访问其他实例的表。3、使用Crontab在从库每分钟执行一次Flush tables;以便每个实例都能看到其他实例对期数据的修改变化。】


个人感觉这个解决方案还是不错,就测试了下,
废话不说了,mysqld_multi的配置请参照:http://hi.baidu.com/ytjwt/blog/item/7302a81037fe7ecda7ef3f99.html
我的配置如下:
[mysqld2]
datadir=/usr/local/mysql/data2/
basedir=/usr/local/mysql
port            = 3307
socket          = /tmp/mysql1.sock
pid-file=/usr/local/mysql/data2/mysql2.pid
default-storage-engine=myisam
skip-innodb
relay-log=relay-bin-myisam1
relay-log-index=relay-bin-myisam1.index
relay-log-info-file=relay-log-myisam1.info
log_error=log-myisam1.err
log_bin=bin-myisam1
server-id=20
master-host=10.50.21.16
master-user=yangting
master-password=yangting
master-port=3306
master-connect-retry=60

[mysqld3]
datadir=/usr/local/mysql/data2/
basedir=/usr/local/mysql
port            = 3308
socket          = /tmp/mysql3.sock
pid-file=/usr/local/mysql/data2/mysql3.pid
default-storage-engine=myisam
skip-innodb
relay-log=relay-bin-myisam2
relay-log-index=relay-bin-myisam2.index
relay-log-info-file=relay-log-myisam2.info
log_error=log-myisam2.err
log_bin=bin-myisam2
server-id=23
master-host=10.50.21.17
master-user=yangting
master-password=yangting
master-port=3306
master-connect-retry=60


启动服务器:
mysqld_multi start 2,3
测试:
测试内容就不贴了。步骤很简单
1:在16 17上分别新建不同的库与表,然后插入的数据
2:分别用不同的客户端登录查看
mysql -u root -S /tmp/mysql1.sock   
mysql -u root -S /tmp/mysql3.sock  
这样就会得到你想要的结果
开始还在想在slave上能不能用分表空间的innodb呢,后来一想,答案是肯定不行。在手册上有这样一句话
You cannot freely move .ibd files between database directories as you can with MyISAM table files. This is because the table definition that is stored in the myisam shared tablespace includes the database name, and because myisam must preserve the consistency of transaction IDs and log sequence numbers.
后经测试也发现,虽然show tables 能看到表名,但是是不能使用该表的。
报这个错误
mysql--root@localhost:yangting_mult 11:07:03>>select * from dsn_db;
ERROR 1146 (42S02): Table 'yangting_mult.dsn_db' doesn't exist

以上就是多主一从的一种实施方案测试了。

还有一种解决方案来解决多主一从的问题:tungsten replicator,这个我还没有测试,具体方法可以参照:
http://www.chinaunix.net/jh/17/1487796.html