Mycat不负责数据的同步问题,需要配置mysql端的主从同步(文末)
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
2. balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2- >S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
3. balance="2",所有读操作都随机的在writeHost、readhost上分发。
4. balance="3",所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,
注意balance=3只在1.4及其以后版本有,1.3没有
1. writeType="0", 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的 为准,切换记录在配置文件中:dnindex.properties .
2. writeType="1",所有写操作都随机的发送到配置的writeHost,1.5以后废弃不推荐
1.switchType="-1" 表示不自动切换
2.switchType="1" 默认值,自动切换
3.switchType="2" 基于MySQL主从同步的状态决定是否切换 ,心跳语句为 show slave status
4.switchType="3" 基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like ‘wsrep%’
select user()
或者
select user()
上面两种配置方式第一种当写挂了读不可用,第二种可以继续使用,事务内部的一切操作都会走写节点,所以读操作不要加事务
如果读延时较大,使用根据主从延时的读写分离,或者强制走写节点(1.6版本之后):
强制走从:
/*!mycat:db_type=slave*/ select * from travelrecord
/*#mycat:db_type=slave*/ select * from travelrecord
强制走写:
/*#mycat:db_type=master*/ select * from travelrecord
/*!mycat:db_type=master*/ select * from travelrecord
Mycat 1.4 支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠
show slave status
switchType="2" 与 slaveThreshold="100",此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制,Mycat心跳机
制通过检测 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running", "Slave_SQL_Running" 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master 主从复制时延, 当Seconds_Behind_Master>slaveThreshold 时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之前的旧数据,而当主节点宕机后,切换逻辑会检查Slave上的Seconds_Behind_Master是否为0,为0时则表示主从同步,可以安全切换,否则不会切换
1、修改主服务器配置:
#vi /etc/my.cnf
binlog-do-db=db1
binlog-do-db=db2
binlog-do-db=db3
binlog-ignore-db = mysql
log-bin=mysql-bin #启用二进制日志
server-id=158 #服务器唯一ID,一般取IP最后一段
2、重启mysql
/etc/init.d/mysql restart
3、建立帐户并授权slave:
#/usr/local/mysql/bin/mysql -u登录名 -p密码
mysql>GRANT FILE ON *.* TO 'backup'@'%' IDENTIFIED BY '123456';
mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'backup'@'%' identified by '123456';
#一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。
刷新权限
mysql> FLUSH PRIVILEGES;
4、登录主服务器的mysql,查询master的状态
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000010 | 106 | db1,db2,db3 | mysql |
+------------------+----------+--------------+------------------+
Master 重启后会修改mysql-bin(序号加1)
1、修改从服务器配置:
#vi /etc/my.cnf
replicate-do-db=db1
replicate-do-db=db2
replicate-do-db=db3
replicate-ignore-db=mysql
master-connect-retry=60
server-id=78
master-host=master的IP
master-user=backup
master-password=123456
master-port=3306
master-connect-retry=60
#log-slave-updates
skip-slave-start
#防止复制随着mysql启动而自动启动。即slave端的mysql服务重启后需手动来启动主从复制(slave start),最好加上,slave端数据库服务重启后手动启动slave比较安全
2、重启MySQL
/etc/init.d/mysql restart
3、登录mysql并停止slave服务
# /usr/local/mysql/bin/mysql -u登录名 –p密码
mysql>slave stop;
设置与master服务器相关的配置参数
mysql>change master to master_host='10.1.176.158',master_user='backup', master_password='123456',MASTER_LOG_FILE='mysql-bin.000010',MASTER_LOG_POS=106;
注意:Master重启后slave 要修改MASTER_LOG_FILE,106无单引号。
启动从服务器复制功能
mysql>start slave;
ERROR 1201 (HY000):Could not initialize master info structure的问题
解决方案是:运行命令 stop slave;
成功执行后继续运行 reset slave;
4、检查从服务器复制功能状态
mysql> show slave status\G
以下两个参数必须为YES:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes