不积跬步,无以至千里;不积小流,无以成江海。

mycat读写分离,故障切换配置

先做mysql主从复制

不提了

部署mycat

一、安装mycat

1.1 、从Mycat官网下载安装包:http://dl.mycat.org.cn/1.6.7.1/

1.2、把下载好的安装包上传解压

tar -zxvf Mycat-server-1.6.7.4-test-20191022170541-linux.tar.gz

[root@localhost mycat]# ll
总用量 12
drwxr-xr-x. 2 root root  190 8月  25 09:33 bin
drwxrwxrwx. 2 root root    6 6月  24 2019 catlet
drwxrwxrwx. 4 root root 4096 8月  25 15:18 conf
drwxr-xr-x. 2 root root 4096 8月  25 09:33 lib
drwxrwxrwx. 3 root root   92 8月  25 13:57 logs
drwxr-xr-x. 2 root root    6 8月  25 11:27 tmlogs
-rwxrwxrwx. 1 root root  227 6月  27 2019 version.txt

二、配置mycat

2.1、配置server.xml

cd mycat/conf
vim server.xml

更改以下配置

 	<!-- 全局SQL防火墙设置 -->
	<!--白名单可以使用通配符%或着*-->
	<!--例如<host host="127.0.0.*" user="root"/>-->
	<!--例如<host host="127.0.*" user="root"/>-->
	<!--例如<host host="127.*" user="root"/>-->
	<!--例如<host host="1*7.*" user="root"/>-->
	<!--这些配置情况下对于127.0.0.1都能以root账户登录-->
	<firewall>
	   <whitehost>
	      <host host="127.0.0.1" user="用户3,用户1,用户2"/>
		<host host="ip" user="用户1,用户2"/>
		<host host="ip" user="用户1,用户2"/>
              <host host="ip" user="用户3,用户1"/>
		<host host="ip" user="用户3,用户1"/>
           </whitehost>
       <blacklist check="false">
	</blacklist>
	</firewall>

<!-- 	<user name="dev_sa" defaultAccount="true">
		<property name="password">密码</property>
		<property name="schemas">自定义库名</property>
-->		
		<!-- 表级 DML 权限设置 -->
<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
-->
<!--
	</user>
-->
	<user name="用户3">
		<property name="password">密码</property>
		<property name="schemas">自定义库名1</property>
		<property name="readOnly">true</property>
	</user>
	
	<user name="用户1">
                <property name="password">密码</property>
                <property name="schemas">自定义库名</property>
		
		<!-- 表级 DML 权限设置 -->
                <!-- dml权限顺序为:insert(新增),update(修改),select(查询),delete(删除), 1111,0为禁止权限,1为开启权限。下面配置的表都禁止删除-->
                <privileges check="true">
                        <schema name="自定义库名" dml="0000" >
				<table name="表名1" dml="1110"></table>
				<table name="表名2" dml="1110"></table>
				<table name="表名3" dml="1110"></table>
				<table name="表名4" dml="1110"></table>
				<table name="表名5" dml="1110"></table>
                        </schema>
                </privileges>           
                 

        </user>

	<user name="用户2">
                <property name="password">密码</property>
                <property name="schemas">自定义库名1,自定义库名2,自定义库名3</property>
        </user>


需跟schema.xml里面的schema标签的name对应,如果需要配置多个schema,可以用,隔开。我们将schemas设置成自定义库名.

2.2、配置schema.xml

vim schema.xml

更改以下配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="自定义库名1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
	</schema>
	<schema name="自定义库名2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
        </schema>
	<schema name="自定义库名3" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn3">
        </schema>
	
	
	<dataNode name="dn1" dataHost="localhost1" database="自定义库名1" />
	<dataNode name="dn2" dataHost="localhost1" database="自定义库名2" />
	<dataNode name="dn3" dataHost="localhost1" database="自定义库名3" />
	

<!-- balance="1"表示读写分离。writeType="0"代表所有写操作发送到配置的第一个 writeHost。switchType="1"代表自动切换 -->
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
			  <!-- 心跳检测 -->
		<heartbeat>select user()</heartbeat>
		<!-- can have multi write hosts -->
		<!-- 读写分离 -->
		<writeHost host="hostM1" url="主库ip:端口号" user="mycat连接mysql的用户名"
				   password="密码">
			<!-- can have multi read hosts -->
			<readHost host="hostS2" url="从库ip:端口号" user="mycat连接mysql的用户名" password="密码" />
		</writeHost>
		<!-- 主从切换 -->
		<writeHost host="hostM2" url="从库ip:端口号" user="mycat_app"
				   password="密码">
		</writeHost>
			<!-- 当主库宕机时,从库充当主库,进行读写操作 -->

	</dataHost>

</mycat:schema>


2.3、schema.xml 注意事项

schema.xml文件中有三点需要注意:balance="1",writeType="0" ,switchType="1"
schema.xml中的balance的取值决定了负载均衡对非事务内的读操作的处理。balance 属性负载均衡类型,目前的取值有 4 种:

balance="0":   不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上,即读请求仅发送到writeHost上。 
balance="1":   读请求随机分发到当前writeHost对应的readHost和standby的writeHost上。即全部的readHost与stand by writeHost 参与 select语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1,S2 都参与 select语句的负载均衡
balance="2":   读请求随机分发到当前dataHost内所有的writeHost和readHost上。即所有读操作都随机的在writeHost、 readhost 上分发。
balance="3":   读请求随机分发到当前writeHost对应的readHost上。即所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。

writeType 属性,负载均衡类型,目前的取值有 3 种

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

对于事务内的SQL默认走写节点

以 /*balance*/ 开头,可以指定SQL使用特定负载均衡方案。例如在大环境开启读写分离的情况下,特定强一致性的SQL查询需求;slaveThreshold:近似的主从延迟时间(秒)Seconds_Behind_Master < slaveThreshold ,读请求才会分发到该Slave,确保读到的数据相对较新。schema.xml中的writeType的取值决定了负载均衡对写操作的处理:
writeType="0":所有的写操作都发送到配置文件中的第一个write host。(第一个write host故障切换到第二个后,即使之后修复了仍然维持第二个为写库)。推荐取0值,不建议修改.

主从切换(双主failover):switchType 属性

如果细心观察schem.xml文件的话,会发现有一个参数:switchType,如下配置:<dataHost name="237_15" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> 参数解读
switchType="-1": 不自动切换
switchType="1":  默认值,自动切换
switchType="2":  基于MySQL主从同步的状态来决定是否切换。需修改heartbeat语句(即心跳语句):show slave status
switchType="3":  基于Mysql Galera Cluster(集群多节点复制)的切换机制。需修改heartbeat语句(即心跳语句):show status like 'wsrep%'

dbType属性

指定后端连接的数据库类型,目前支持二进制的mysql协议,还有其他使用JDBC连接的数据库。例如:mongodb、oracle、spark等。

dbDriver属性指定连接后端数据库使用的

Driver,目前可选的值有native和JDBC。使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql和maridb。其他类型的数据库则需要使用JDBC驱动来支持。从1.6版本开始支持postgresql的native原始协议。如果使用JDBC的话需要将符合JDBC 4标准的驱动JAR包放到MYCAT\lib目录下,并检查驱动JAR包中包括如下目录结构的文件:META-INF\services\java.sql.Driver。在这个文件内写上具体的Driver类名,例如:com.mysql.jdbc.Driver。

2.4 其他配置文件作用

1、log4j2.xml

<asyncRoot level="debug" includeLocation="true">
将mycat的日志输出级别改完debug(默认是info级别),在conf/log4j2.xml里配置,然后去查询去添加数据在/logs/mycat.log日志文件里查看sql被路由到了哪个服务器上

2、dnindex.properties

[root@ecs-e209-0617611 conf]# cat dnindex.properties 
#update
#Fri Aug 27 12:00:39 CST 2021
localhost1=0

该配置文件下的内容为当前'写操作'使用的是schema.xml配置文件中的第几个writeHost。0为第一个。本配置中,如果localhost1=1,那么。写操作使用的是从库。主库可能挂了。

3、wrapper.log

启动mycat失败,报错日志。/mycat/logs/wrapper.log

三、Mycat服务启动

[root@Mycat-node ~]# cd /data/mycat/bin/
[root@Mycat-node bin]#
[root@Mycat-node bin]# ./mycat start   #开启
[root@Mycat-node bin]# ./mycat stop    #关闭
[root@Mycat-node bin]# ./mycat restart  #重启
[root@Mycat-node bin]# ./mycat status   #查看启动状态
[root@Mycat-node bin]# ./mycat console  #前台运行
[root@Mycat-node bin]# ./mycat pause   #暂停
mycat启动后,执行命令不成功,可能实际上配置有错误,导致后面的命令没有很好的执行。``如果在启动时发现异常,在logs目录中查看日志。
[root@Mycat-node ~]# cd /data/mycat/logs/
[root@Mycat-node logs]# ls
2018-07 mycat.log mycat.pid wrapper.log 

- wrapper.log 为程序启动的日志,启动时的问题看这个
- mycat.log  为脚本执行时的日志,SQL脚本执行报错后的具体错误内容,查看这个文件。mycat.log是最新的错误日志,历史日志会根据时间生成目录保存。

mycat端口号:8066

四、动态加载配置文件

1. 登上mycat所在机器

2. mysql -u用户名 -p密码 -P9066 -h192.168.0.1

3. 执行命令

   会加载schema.xml配置的调整。
   mysql>reload @@config;

   刷新全部配置
   mysql>reload @@config_all;
posted @ 2021-08-27 14:14  |是吴啊|  阅读(555)  评论(0编辑  收藏  举报