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实例的一从库) =>多住多从, 差不多一样配置