Mycat读写分离

Mycat读写分离

Mycat不负责数据的同步问题,需要配置mysql端的主从同步(文末)

1.相关配置属性:

1.1balance属性:

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.2writeType属性 :

1. writeType="0", 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的      为准,切换记录在配置文件中:dnindex.properties . 
2. writeType="1",所有写操作都随机的发送到配置的writeHost,1.5以后废弃不推荐

1.3switchType属性 :

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%’ 

2.配置


	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

3.根据主从延时切换

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时则表示主从同步,可以安全切换,否则不会切换

4.配置mysql的主从同步

4.1 Mysql主服务起master配置

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)

4.2 Mysql从服务器slave配置

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

你可能感兴趣的:(Mycat)