为何要配置读写分离,我想我就不须要再赘述了,那么在mycat下如何进行读写分离的配置,配置以后的实际效率又如何呢?我上午根据文档捣鼓和测试了一下,这里作一下记录:mysql
最开始,咱们仍是要配置mysql自己的主从复制。sql
首先,配置主服务器:数据库
1.编辑数据库配置文件,/etc/my.cnf服务器
在[mysqld]下加入代码:测试
log-bin=mysql-bin
server-id=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
binlog-do-db=db1
binlog_ignore_db=mysql
server-id 用于区分各自服务器,须要全局惟一。优化
binlog-ignore_db为忽略的库,即不复制该项设置的库。url
binlog-do-db为须要复制的数据库,若是不要,则为复制除了binlog-ignore_db设置的库以外的全部库spa
2.重启mysql:rest
service mysqld restart
3.登陆mysql: mysql -uroot -pcode
能够为slave端单独创建一个帐户,方便权限管理,而后把这个帐户的权限赋予slave端:
mysql>CREATE USER 'user'@ 'X.X.X.X' IDENTIFIED BY 'XXXXXX'; mysql>GRANT REPLICATION SLAVE ON *.* TO 'user'@'X.X.X.X' IDENTIFIED BY 'XXXXXX';
X.X.X.X为slave端的IP地址
4.防止在复制期间,数据库有新数据写入致使数据不一样步:
mysql>FLUSH TABLES WITH READ LOCK;
5.把数据库导出并传送到从服务器端:
#mysqldump -u root -pXXXXXX --all-databases --lock-tables=false -- > /root/all.sql #scp /root/all.sql root@X.X.X.X:/root
X.X.X.X为从服务器IP地址。
6.进入主服务器数据库查看并记录状态,待会儿会用到:
mysql>SHOW MASTER STATUS\G;
记录File和position
7.解锁数据表
mysql>UNLOCK TABLES;
而后配置从服务器:
1.登陆从服务器,导入主服务器的数据库:
#mysql -u root -p123456 < /root/all.sql
2.编辑/etc/my.cnf,在[mysqld]下加入:
server-id=11 //服务Id,注意要和master的server-id不同
log-bin=mysql-bin
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
sync_master_info=1
sync_relay_log=1
sync_relay_log_info=1
3.重启数据库并登陆,执行下面的命令
mysql>CHANGE MASTER TO
MASTER_HOST='X.X.X.X', //主服务器的ip地址
MASTER_USER='user', //刚才在主服务器建立的帐号和密码
MASTER_PASSWORD='XXXXXX',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001', //刚才主服务器的file
MASTER_LOG_POS=120, //主服务器的position
MASTER_CONNECT_RETRY=10;
4.启动slave进程:
mysql>START SLAVE;
若是没有报错,应该就设置好了。
小小的优化方案:
虽然MyISAM引擎不支持事务处理和行级锁,可是它的查询效率相比innoDB要好的多,而做为从数据库,并不须要事务处理和行级锁,因此建议把客户端的表从新删除并创建为InnoDB。
启动mycat的读写分离:
配置schema.xml文件:
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="localhost:3306" user="root" password="XXXXXX"> <!-- can have multi read hosts --> <readHost host="hostS1" url="X.X.X.X:3306" user="user" password="XXXXXX" /> </writeHost> </dataHost>