MySQL多主一从的实现(转载)


 大型的系统,数据库往往会根据业务逻辑分隔放在多台机上,但统计的时候又经常需要互相关联,MySQL理论上是不支持多个主库同步到一个从库上的,那么如果实现多主一从以方便统计查询呢?我试着利用MyISAM的简单文件存储的特点来实现,过程如下:

1:设置主库,启用Binlog,建议复制帐号。具体过程跟一主多从设置一样。

2:设置从库,在从库使用mysqld_multi启动多库实例,每个实例对应一个主库,并分别设置好主从复制。需要注意的是,

从库只安装MyISAM 引擎,这样不管主库是用什么引擎,从库都使用MyISAM。

       2、从库的几个实例的数据目录使用同一个,这样每个实例都可以访问其他实例的表。

使用 Crontab在从库每分钟执行一次Flush tables;

      以便每个实例都能看到其他实例对期数据的修改变化。

这样,就可以从任意一个实例下访问所以库的表了,还可以做跨库的表连接查询,查询统计很方便吧.



修改从库的配置文件 

[mysqld_multi] 
mysqld = /usr/local/mysql/bin/mysqld_safe # 按照你的实际情况来制定路径
mysqladmin = /usr/local/mysql/bin/mysqladmin 
user = mysql                              # 这个用户不一定非要用mysql ,只要这个用户能启动和关闭mysql就够了
password = mysql
log = /usr/local/mysql/log/multi.log

[mysqld1]                    # 第一个mysql进程
port     = 3306              # 指定端口为3306
socket   = /tmp/mysqlA.sock  # 指定mysql1 的sock
pid-file = /tmp/mysqlA.pid   # 单独指定pid
datadir = /mysqlA            # 为其单独指定数据存放路径
log = /mysqlA/mysqlA.log     # 单独指定log文件 
master-host = 192.168.1.167  # 其实这里就和平时做 一般的mysql主从差不多了
server-id = 2
master-user = ufo
master-password = xman
replicate-ignore-db = mysql  # 这个是选择同步的时候要忽略的库
replicate-do-db = xxx        # 指定要同步哪个库,其实如果有了这个就不用上面那条了
好了 最基本的选项就是这些,其他的可以使用默认配置。 不过你也可以根据自己的需要增加其他的设置。下面是第二个mysql进程:

[mysqld2]                    
port     = 3307              
socket   = /tmp/mysqlB.sock  
pid-file = /tmp/mysqlB.pid   
datadir = /mysqlB            
log = /mysqlA/mysqlB.log     
server-id = 2
master-host = 192.168.1.168  
master-user = ufo
master-password = xman
replicate-ignore-db = mysql  
replicate-do-db = xxx


保存退出

启动mysql ,这时就不能按照以前那样启动了,现在启动时候需要 mysqld_multi这个程序 具体做法如下
/usr/local/mysql/bin/mysqld_multi --config-file=/etc/my.cnf start 1-2 
/usr/local/mysql/bin/mysqld_multi --config-file=/etc/my.cnf start 1,2 这样也可以
不过 这时候可以会启动不了,我当时报了一个错误 是找不到 my_print_defaults ,路径的问题,没关系 ln -s /usr/local/mysql/bin/my_print_defaults /usr/bin/ 建个链接就行了
再次启动 ,还是无法启动,查看 /mysqlA 下的错误日志看了下 ,发现 说找不到 mysql.xxx 库和表 ,原来因为要启动 两个进程 当然初始化数据也要进行两次了
cd /usr/local/mysql
scripts/mysql_install_db --datadir=/mysqlA --user=mysql
scripts/mysql_install_db --datadir=/mysqlB --user=mysql

初始化结束后再次启动,
lsof -i:3306
lsof -i:3307 
两个端口都有mysql在监听的话就表示启动成功了
下一步就是导入数据了,不过要先登录mysql建立数据库
mysql -u root -S /tmp/mysqlA.sock 必须指定sock来进入
create database xxx;
建立好了在导入
mysql -u root -S /tmp/mysqlB.sock xxx < /root/xxx1.sql
另一个进程也是一样
mysql -u root -S /tmp/mysqlB.sock 必须指定sock来进入
create database xxx;
mysql -u root -S /tmp/mysqlB.sock xxx < /root/xxx2.sql

重启两个mysql 
/usr/local/mysql/bin/mysqld_multi --config-file=/etc/my.cnf report 1,2
也可以用 support-files 文件夹下面的 mysqld_multi.server 来重启
不过有时候这两个都不顶用
还可以这样
mysqladmin -u root -S /tmp/mysqlA.sock shutdown
mysqladmin -u root -S /tmp/mysqlB.sock shutdown

重启后分别进入两个进程 
用 show slave status \G;查看 同步是否正常
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果 两个YES 都在的话就可以正常使用了

最后别忘了给两个主库解锁
unlock tables;
随便在两个主库的xxx 里面建几个表并做一些操作来观察同步情况






注意:  多住一丛, 多主库一从库(2实例的一从库)  =>多住多从, 差不多一样配置