mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」mycat 基础 mycat 作用 当 mysql 为 1主一从的时候,mycat 支持写DB高可用,即当主挂了,那么可以写入从数据库中 将数据库看出一个蛋糕: 垂直切分,类似 上下切,水平就是 左…

mycat和mysql搭建高可用企业数据库集群

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat 基础

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat 作用

 

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

当 mysql 为 1主一从的时候,mycat 支持写DB高可用,即当主挂了,那么可以写入从数据库中

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

将数据库看出一个蛋糕: 垂直切分,类似 上下切,水平就是 左右切

mycat和mysql搭建高可用企业数据库集群「建议收藏」

每个数据库库连接数是有限的,如果连接满了之后,那么后续的连接就连接不上了。用了mycat 之后,mycat 有一个 总的连接池,

可以很好的控制连接数量,让应用更加的稳定。

mycat 的基本元素

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

ER关系表就是 mycat 特有的表 。 即用于  将 主表与 子表的 有关联的数据都 存在同一个库里面,比如 订单表与订单明细表

mycat 安装

mycat和mysql搭建高可用企业数据库集群「建议收藏」

http://www.mycat.org.cn/

http://dl.mycat.org.cn/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz

下载解压之后, 启动之前可以在 conf 下面进行配置vi wrapper.conf   比如配置内存大小等

wrapper.java.additional.5=-XX:MaxDirectMemorySize=800M

mycat和mysql搭建高可用企业数据库集群「建议收藏」

还有就是配置环境变量 如上图

启动:   mycat start 

mycat 核心配置

配置文件关系

mycat和mysql搭建高可用企业数据库集群「建议收藏」

 

server.xml 

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

 

mycat和mysql搭建高可用企业数据库集群「建议收藏」

即 配置访问真实数据库的用户名密码等的配置

同一个用户配置多个数据库, 在 schemas 配置多个即可:

mycat和mysql搭建高可用企业数据库集群「建议收藏」

授予用户某些表的访问权限:

mycat和mysql搭建高可用企业数据库集群「建议收藏」

dml 的值 有1 就是对应的有权限,否则就是没有权限

mycat和mysql搭建高可用企业数据库集群「建议收藏」

执行加密,将加密串放入配置文件的密码里面即可。这样密码就不显示明文密码了 。

0 表示通过mycat 访问的都加密,即 前端加密。 如下配置:

mycat和mysql搭建高可用企业数据库集群「建议收藏」

log4j2.xml 

mycat和mysql搭建高可用企业数据库集群「建议收藏」

rule.xml 

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

property 就是对应分片算法的执行的  参数 

常用分片算法

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

 

mycat和mysql搭建高可用企业数据库集群「建议收藏」

即某些列的值不少整数,因此转为 正数 这样就是 简单的取模算法一样了

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

比如:可以用于 按地区 存入不同数据库中

mycat和mysql搭建高可用企业数据库集群「建议收藏」

partition-hash-int.txt 位于 conf 目录里面 。数据库索引从0开始

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

即取 字母的 阿斯特码的值来进行计算的

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

patternValue 取模基数

mycat和mysql搭建高可用企业数据库集群「建议收藏」

schema.xml

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

一个逻辑库 可能 对应 多个真实的物理数据库,可以看作为其视图

mycat和mysql搭建高可用企业数据库集群「建议收藏」

即如果查询的SQL 没有 加上 limit ,那么mycat 会自动加上 limit 来限制返回的行数

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat 是推荐 checkSQLschema 设置为true的,即mycat 不支持 跨多个 数据库 查询的。比如 select db01.cat, db02.cat

即 可能 库名加上 表名方式查询 可能会报错的 .如果 checkSQLschema=true 那么mycat 会自动将 sql 中带上 库名+表名的 方式 给去调 库名

mycat和mysql搭建高可用企业数据库集群「建议收藏」

table 标签

mycat和mysql搭建高可用企业数据库集群「建议收藏」

逻辑表的主键 就是对应数据库表的主键名

mycat和mysql搭建高可用企业数据库集群「建议收藏」

dataNode 多个 以逗号分隔,索引从 0开始, 一旦配置好之后,就不要进行修改了,否则 容易产生数据混乱

dataNode 标签

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

dataHost 标签

mycat和mysql搭建高可用企业数据库集群「建议收藏」

dataHost 就是一组的 数据库集群

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

stand by writeHost 即双主 数据库(比如 互为主从) 这种情况

switchType 开可用 配置 ,1 当数据库某个挂了,自动切换  。 -1 就不自动切换

writeType 写操作类型 : 0,1  。 当是0 就是 所有写请求由第一个 writeHost 来执行,除非第一个挂了,才会切换到其他可以写的 主机上。 1就是随机发生写请求到writeHost . 一般设置为0 ,除非是支持多写的数据库集群类型

heartbeat 标签

心跳检查的语句 。

mycat和mysql搭建高可用企业数据库集群「建议收藏」

writehost 标签

writehost 一般是 主, readHost 一般是从

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

这里还不支持加密的密码

schema demo

mycat和mysql搭建高可用企业数据库集群「建议收藏」

在 dataHost 中,1.3 与1.4 是主从关系, 当 1.3 挂了,那么1.4 就可以处理读写请求了 。否则 1.3 负责写请求,1.4 负责读请求

垂直分库

一般是先垂直分库,后续数据量还是太大就进行水平 分库

mycat和mysql搭建高可用企业数据库集群「建议收藏」

一般是 写负载大,才有必要进行垂直分库的

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mysql 复制的步骤

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

 

备份

mycat和mysql搭建高可用企业数据库集群「建议收藏」

将备份的数据库SQL 在新的 数据库里面比如 order_db 里面 执行。 

接着 在原数据库 建立主从同步账号,同步数据到 新的order_db 里面 。 这样可以切换的更快,而不让数据库停止服务太久

mycat和mysql搭建高可用企业数据库集群「建议收藏」

接着 在 新的数据库比如 order_db 里面,建立 同步数据传输链路

mycat和mysql搭建高可用企业数据库集群「建议收藏」

— CHANGE MASTER TO MASTER_LOG_FILE=”mysql-bin.000001″, MASTER_LOG_POS=4532519;  

可以在 之前的原数据库的备份sql文件 可以找到

因为 原来的数据库名是 imooc_db 与 新的order_db 名称不一样,要主从同步数据,还得建立 主从复制过滤,

mycat和mysql搭建高可用企业数据库集群「建议收藏」

接着启动复制链路

mycat和mysql搭建高可用企业数据库集群「建议收藏」

 

备份复制总结

mycat和mysql搭建高可用企业数据库集群「建议收藏」

master-data 就是 备份对应 事务级别的数据

垂直切分步骤

mycat和mysql搭建高可用企业数据库集群「建议收藏」

schema :

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

	<schema name="imooc_db" checkSQLschema="false" sqlMaxLimit="100">
	
		<!-- 逻辑表名必须与实际表名一样 . 只能一张一张表的配置 -->
		<table name="order_master" dataNode="orderdb"  primaryKey="order_id" />
		
		<table name="product_info" dataNode="productdb"  primaryKey="product_id" />
		
		
		<table name="customer_login" dataNode="customerdb"  primaryKey="customer_id" />

		
		
	</schema>
	
	
	<dataNode name="orderdb" dataHost="mysqlorder" database="mycat_order_db" />
	<dataNode name="productdb" dataHost="mysqlproduct" database="mycat_product_db" />
	<dataNode name="customerdb" dataHost="mysqlcustomer" database="mycat_customer_db" />
	
	
	<dataHost name="mysqlorder" maxCon="1000" minCon="10" balance="3"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  >
		<heartbeat>select user()</heartbeat>
		
		<writeHost host="192.168.0.102" url="192.168.0.102:3306" user="root"
				   password="123456">			
			
		</writeHost>
		
	</dataHost>
	
	<dataHost name="mysqlproduct" maxCon="1000" minCon="10" balance="3"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  >
		<heartbeat>select user()</heartbeat>
		
		<!-- 读写都是使用这个数据库 -->
		<writeHost host="192.168.0.102" url="192.168.0.102:3306" user="root"
				   password="123456">						
		</writeHost>
		
	</dataHost>
	
	<dataHost name="mysqlcustomer" maxCon="1000" minCon="10" balance="3"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  >
		<heartbeat>select user()</heartbeat>
		
		<writeHost host="192.168.0.102" url="192.168.0.102:3306" user="root"
				   password="123456">
						
		</writeHost>
		
	</dataHost>
	
	
</mycat:schema>		










server:

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
	- you may not use this file except in compliance with the License. - You 
	may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
	- - Unless required by applicable law or agreed to in writing, software - 
	distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
	License for the specific language governing permissions and - limitations 
	under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
	<system>
	<property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
	<property name="useHandshakeV10">1</property>
	<property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
	<property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->

		<property name="sequnceHandlerType">2</property>
	<property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
     
		<property name="processorBufferPoolType">0</property>
		
		<property name="handleDistributedTransactions">0</property>
		
			<!--
			off heap for merge/order/group/limit      1开启   0关闭
		-->
		<property name="useOffHeapForMerge">1</property>

		<!--
			单位为m
		-->
        <property name="memoryPageSize">64k</property>

		<!--
			单位为k
		-->
		<property name="spillsFileBufferSize">1k</property>

		<property name="useStreamOutput">0</property>

		<!--
			单位为m
		-->
		<property name="systemReserveMemorySize">384m</property>

		
			<property name="serverPort">8066</property>
			<property name="managerPort">9066</property> 
			<property name="idleTimeout">300000</property>
			 <property name="bindIp">0.0.0.0</property> 
			 <property name="charset">utf8</property> 

	

	</system>
	
	

	<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">imooc_db</property>
		
		
	</user>

	

</mycat:server>




启动mycat ,然后就可以 通过 mysql 客户端连接mycat 进行测试查询了

https://blog.csdn.net/qq_35890572/article/details/81162110

mycat和mysql搭建高可用企业数据库集群「建议收藏」

但是垂直分库的查询, 是不支持 跨库 多表查询的 。

那么如果要跨库 多表查询,要么就 把表都搞到同一个库里面,

要么 就 配置全局表(比如 字典表,及全局表都存在所有的 数据库里面,mycat 会进行维护的,采用多写方式保证每个库的全局表数据一致) 。

清理多余数据

mycat和mysql搭建高可用企业数据库集群「建议收藏」

当 配置并启动了 使用了mycat 之后,就得停止 主从同步了

mycat和mysql搭建高可用企业数据库集群「建议收藏」

在 order db , product db ,coustomer db 的数据库中,删除 其他不相关的表,比如 order db删除 用户表。

mycat和mysql搭建高可用企业数据库集群「建议收藏」

跨分片(跨库查询): 配置全局表

全局表适合于小表,如果是大表,那么维护麻烦,且查询性能也不会高

在 schema.xml 中  配置 region_info 作为全局表 比如 

<table name="region_info" primaryKey="region_id" 
		dataNode="orderdb,productdb,customerdb" type="global"
			/>

也就是 region_info 表需要在所有的分库里面

UPDATE region_info set region_name=”中华” where region_id=1; 

经过使用mycat 更新全局表发现 每个 分库的表都更新了,即mycat 维护了全局表

 

垂直切分的优缺点

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

水平分库

mycat和mysql搭建高可用企业数据库集群「建议收藏」

水平切分,一般是 对某个表或者某些相关的表 进行水平切分就解决问题了 。 很少表才需要切分而已(一般是大表,且读写非常频繁的) 。

(某些表数据很大,可以将其数据放入历史表中进行归档即可,就不用水平切分了)

水平切分比垂直切分复杂多了

mycat和mysql搭建高可用企业数据库集群「建议收藏」

分片步骤

mycat和mysql搭建高可用企业数据库集群「建议收藏」

 

如何选择分片键

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

很少用订单id 去查询订单信息,因此不作为分配键

部署分片集群步骤

mycat和mysql搭建高可用企业数据库集群「建议收藏」

 

mycat和mysql搭建高可用企业数据库集群「建议收藏」

rule.xml 

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
        - you may not use this file except in compliance with the License. - You
        may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
        - - Unless required by applicable law or agreed to in writing, software -
        distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
        WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
        License for the specific language governing permissions and - limitations
        under the License. -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">

	<tableRule name="order_master">
		<rule>
				<columns>customer_id</columns>
				<algorithm>mod-long</algorithm>
		</rule>
    </tableRule>
	
	
	 <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
                <!-- how many data nodes -->
                <property name="count">2</property>
        </function>


</mycat:rule>
server.xml 


<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
	- you may not use this file except in compliance with the License. - You 
	may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
	- - Unless required by applicable law or agreed to in writing, software - 
	distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
	License for the specific language governing permissions and - limitations 
	under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
	<system>
	<property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
	<property name="useHandshakeV10">1</property>
	<property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
	<property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->

		 <!-- 序列号类型值: 0,1 ,2,3,4 
		 0 就是以本地文件的方式生成全局序列号
		 1 就是数据库方式
		 2 就是时间戳的方式
		 3 就是 zookeeper 的方式
		 -->
		<property name="sequnceHandlerType">2</property> 
		
	<property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
     
		<property name="processorBufferPoolType">0</property>
		
		<property name="handleDistributedTransactions">0</property>
		
			<!--
			off heap for merge/order/group/limit      1开启   0关闭
		-->
		<property name="useOffHeapForMerge">1</property>

		<!--
			单位为m
		-->
        <property name="memoryPageSize">64k</property>

		<!--
			单位为k
		-->
		<property name="spillsFileBufferSize">1k</property>

		<property name="useStreamOutput">0</property>

		<!--
			单位为m
		-->
		<property name="systemReserveMemorySize">384m</property>

		
			<property name="serverPort">8066</property>
			<property name="managerPort">9066</property> 
			<property name="idleTimeout">300000</property>
			 <property name="bindIp">0.0.0.0</property> 
			 <property name="charset">utf8</property> 

	

	</system>
	
	

	<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">imooc_db</property>
		
		
	</user>

	

</mycat:server>
schema.xml : 



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

	<schema name="imooc_db" checkSQLschema="false" sqlMaxLimit="100">
	
		<!-- 逻辑表名必须与实际表名一样 . 只能一张一张表的配置 -->
		
		
		<table name="order_master" dataNode="orderdb01,orderdb02"  primaryKey="order_id" 
		rule="order_master"    />
		
		
		<table name="product_info" dataNode="productdb"  primaryKey="product_id" />
		
		
		<table name="customer_login" dataNode="customerdb"  primaryKey="customer_id" />
		
		<table name="region_info" primaryKey="region_id" 
		dataNode="orderdb,productdb,customerdb" type="global"
			/>

		
		
	</schema>
	
	
	<dataNode name="orderdb" dataHost="mysqlorder" database="mycat_order_db" />
	<dataNode name="productdb" dataHost="mysqlproduct" database="mycat_product_db" />
	<dataNode name="customerdb" dataHost="mysqlcustomer" database="mycat_customer_db" />
	
	<dataNode name="orderdb01" dataHost="mysqlorder" database="mycat_order_db01" />
	<dataNode name="orderdb02" dataHost="mysqlproduct" database="mycat_order_db02" />
	
	
	
	
	
	<dataHost name="mysqlorder" maxCon="1000" minCon="10" balance="3"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  >
		<heartbeat>select user()</heartbeat>
		
		<writeHost host="192.168.0.102" url="192.168.0.102:3306" user="root"
				   password="123456">			
			
		</writeHost>
		
	</dataHost>
	
	<dataHost name="mysqlproduct" maxCon="1000" minCon="10" balance="3"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  >
		<heartbeat>select user()</heartbeat>
		
		
		<writeHost host="192.168.0.102" url="192.168.0.102:3306" user="root"
				   password="123456">						
		</writeHost>
		
	</dataHost>
	
	<dataHost name="mysqlcustomer" maxCon="1000" minCon="10" balance="3"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  >
		<heartbeat>select user()</heartbeat>
		
		<writeHost host="192.168.0.102" url="192.168.0.102:3306" user="root"
				   password="123456">
						
		</writeHost>
		
	</dataHost>
	
	
</mycat:schema>		

mycat 全局自增id 配置

比如订单表分表之后,由于订单id是自增的,因此有id 重复的数据,因此可以采用mycat 的全局自增id 去避免

在server.xml 中 


 <!-- 序列号类型值: 0,1 ,2,3,4 
		 0 就是以本地文件的方式生成全局序列号
		 1 就是数据库方式
		 2 就是时间戳的方式
		 3 就是 zookeeper 的方式
		 -->
		<property name="sequnceHandlerType">1</property> 

这里以数据库的方式来使用 

在 mycat 的conf 下面有 dbseq.sql  就是用到 自增功能的建表语句,执行它 。mycat_sequence 就是用到的辅助表

在 schema.xml 中配置 辅助表用到逻辑库

<dataNode name="mycat" dataHost="mycatIDAuto" database="mycat_sequence" />
	
	<dataHost name="mycatIDAuto" maxCon="1000" minCon="10" balance="3"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  >
		<heartbeat>select user()</heartbeat>
		
		<writeHost host="192.168.0.102" url="192.168.0.102:3306" user="root"
				   password="123456">			
			
		</writeHost>
		
	</dataHost>

接着 在conf 下修改 vi sequence_db_conf.properties

#sequence stored in datanode
# 注意 key 使用大写字母
GLOBAL=mycat
ORDER_MASTER=mycat

接着在 自增用到的数据库里面 增加一条记录 , name 对应配置文件的key 

mycat和mysql搭建高可用企业数据库集群「建议收藏」

这样自增就取name = ORDER_MASTER 的 这条记录开始了

在 schema.xml 中配置 用到全局自增id的表 autoIncrement=”true”

<table name="order_master" dataNode="orderdb01,orderdb02"  primaryKey="order_id" 
		rule="order_master"  autoIncrement="true"  />

插入订单表数据的时候, order_id 就生效了全局id 了

ER分片

mycat和mysql搭建高可用企业数据库集群「建议收藏」

分片之后,联合查询 不行,因此 得配置 订单的 明细表 order_detail  的ER分片关系才行。即对 order_detail 也得配置分片

在schema.xml 中 

<table name="order_master" dataNode="orderdb01,orderdb02"  primaryKey="order_id" 
		rule="order_master"  autoIncrement="true"  >

				<childTable name="order_detail" primaryKey="order_detail_id" joinKey="order_id"
						parentKey="order_id" autoIncrement="true"    >				
				</childTable>
			
		</table>


当然 order_detail 配置的全局自增方式与 order_master 一样

重启之后,测试,就发现 保存 订单明细的时候,会根据 订单id 存入对应的分片库里面,即和 订单表所在的数据存在一起

mycat 其他常用功能

sql 拦截

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

SQL防火墙

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

上图中, 白名单里面的意思就是 规定root 用户只能在 当前机器登录,其他机器不用使用root 登录

mycat 高可用集群

mycat和mysql搭建高可用企业数据库集群「建议收藏」

 

一台机器部署多实例mycat  :  https://blog.csdn.net/tqs314/article/details/102407043

 

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

使用ZK记录mycat 配置

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

初始化ZK并配置mycat 支持zk

mycat和mysql搭建高可用企业数据库集群「建议收藏」

先将之前配置好的mycat 内容 覆盖到 mycat的zkconf 配置内容

在mycat 的bin 下 执行初始化 zk 的数据

./init_zk_data.sh 

可以去zookeeper查看 是否成功 将信息给加载到了zk

mycat和mysql搭建高可用企业数据库集群「建议收藏」

接着在 每台mycat 里面conf配置  myid.properties

loadZk=true   # 这样其他mycat 就可以加载zk 上面的配置信息并启动了

mycat和mysql搭建高可用企业数据库集群「建议收藏」

启动全部zk 和mycat 

haproxy 部署

haproxy 与 nginx 区别

https://www.cnblogs.com/EasonJim/p/7629888.html

https://blog.csdn.net/hellojoy/article/details/80805328

https://ispacesoft.com/wenda/detail/456168

https://zhuanlan.zhihu.com/p/115092359

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

Haproxy 与 Keepalived 一定要部署和mycat 在同一台服务器上。 

即 通过keepatlive 提高 的虚假IP 给 前端用户去访问

haproxy 安装

https://blog.csdn.net/xianglingchuan/article/details/82218469

https://zhuanlan.zhihu.com/p/23893787

mycat和mysql搭建高可用企业数据库集群「建议收藏」

手动安装:

https://jingyan.baidu.com/article/4dc408486bb9e7c8d946f12b.html

https://blog.csdn.net/qq_28710983/article/details/82194404

https://blog.csdn.net/keil_wang/article/details/89712380

https://www.jianshu.com/p/edf2c8c7d83f

开启打印日志  https://www.cnblogs.com/liuxia912/p/11078172.html

 

mycat和mysql搭建高可用企业数据库集群「建议收藏」

上图就是 haproxy 配置的mycat 的负载均衡

haproxy.cfg 完整:

global
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option                  abortonclose
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    balance roundrobin 
    log 127.0.0.1 local0 info

listen  admin_status
      bind *:48800 ##VIP
      stats uri /admin-status  ##统计页面
      stats auth  admin:admin
listen    allmycat_service
      bind *:8096 ##转发到mycat的应用端口,即mycat的服务端口
      mode tcp
      option tcplog
      balance    roundrobin
        server    mycat_132 10.102.13.2:3306 check port 48700 inter 5s rise 2 fall 3
        server    mycat_135 10.102.13.5:8066 check port 48700 inter 5s rise 2 fall 3
listen    allmycat_admin
      bind *:8097 ##转发到mycat的管理端口,及mycat的管理控制台端口
      mode tcp
      option tcplog
      balance    roundrobin
        server    mycat_132 10.102.13.2:9066 check port 48700 inter 5s rise 2 fall 3
        server    mycat_135 10.102.13.5:9066 check port 48700 inter 5s rise 2 fall 3


 

 

 

这里有一个 检查端口 48700 , 因此安装  yum -y install xinetd

[root@node1 haproxy]# yum install xinetd -y

[root@node1 log]# vi /etc/xinetd.d/mycatchk

service mycatchk

{

flags = REUSE

socket_type = stream

port = 48700

wait = no

user = root

server =/usr/local/bin/mycat_status

log_on_failure += USERID

disable = no

}

###########################################

#增加/usr/local/bin/mycat_status脚本

#########################################

#!/bin/bash

#/usr/local/bin/mycat_status

# This script checks if a mycat server is healthy running on localhost. It will

# return:

#

# "HTTP/1.x 200 OK
" (if mycat is running smoothly)

#

# "HTTP/1.x 503 Internal Server Error
" (else)

mycat=`/usr/local/mycat/bin/mycat status |grep "not running"| wc -l`

if [ "$mycat" = "0" ];

then

    /bin/echo -en "HTTP/1.1 200 OK
" 

    /bin/echo -en "Content-Type: text/plain
" 

    /bin/echo -en "Connection: close
" 

    /bin/echo -en "Content-Length: 40
" 

    /bin/echo -en "
" 

    /bin/echo -en "MyCAT  Cluster Node is synced.
" 

    exit 0

else

    /bin/echo -en "HTTP/1.1 503 Service Unavailable
" 

    /bin/echo -en "Content-Type: text/plain
" 

    /bin/echo -en "Connection: close
" 

    /bin/echo -en "Content-Length: 44
" 

    /bin/echo -en "
" 

    /bin/echo -en "MyCAT Cluster Node is not synced.
" 

    exit 1

fi

#########################################################

#在/etc/services中加入mycat_status服务

######################################################

[root@node1 bin]# vi /etc/services 

mycatchk        48700/tcp               # mycat check

#重启xinetd服务

centos6:[root@node1 bin]# service xinetd restart

centos7:[root@node1 bin]# systemctl restart xinetd

#验证mycatchk服务是否启动成功

[root@node1 bin]# netstat -nltp | grep 48700

#在node1节点绑定VIP

[root@node1 bin]# ifconfig eth0:1 10.102.13.248/24

#启动haproxy

[root@node1 xinetd.d]# haproxy -f /etc/haproxy/haproxy.cfg 

#测试通过haproxy连接MyCAT

[root@node3 ~]# mysql -uroot -p -h10.102.13.248 -P8096 

https://blog.csdn.net/lzghxjt/article/details/83018710

其实这里不用 xinetd 也是可以的,开发测试而已  .  生产环境一般都是使用 xinetd的

MyCat服务主机(edu-mycat-01、edu-mycat-02)上需要增加mycat服务的状态检测脚本,并开放相应的检测端口,以提供给HAProxy对MyCat的服务状态进行检测判断。可以使用xinetd来实现,通过xinetd,HAProxy可以用httpchk来检测MyCat的存活状态。(xinetd即extended internet daemon,xinetd是新一代的网络守护进程服务程序,又叫超级Internet服务器。经常用来管理多种轻量级Internet服务。xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。xinetd为linux系统的基础服务)

如果不配置使用xinetd 那么 配置haproxy 的配置代理需要配置 其他的时间参数,否则会代理失败: 比如 timeout 等相关的参数。

listen mycat             # 监控配置
        bind 0.0.0.0:8096   #监听端口 , 虚IP, 访问mycat
        mode tcp
	option tcplog
	timeout connect 60s   #连接超时 
   	timeout client  30000 #客户端超时,
	timeout server  30000
	balance roundrobin
	server mycat_fz_01 192.168.0.205:8066 check inter 5s rise 2 fall 3 weight 1
	server mycat_fz_011 192.168.0.205:8066 check inter 5s rise 2 fall 3 weight 1	

 

接着配置虚IP

mycat和mysql搭建高可用企业数据库集群「建议收藏」

之后就可以重启haproxy 了

其实可以不用配置虚拟IP的, 都配置成 0.0.0.0 

mycat和mysql搭建高可用企业数据库集群「建议收藏」

keepalived  安装

用于 haproxy 的 高可用,即 使用虚IP来访问某一台 haproxy 

 yum -y install keepalived

配置文件目录  cd /etc/keepalived/

keepalived.conf配置内容:

! Configuration Fileforkeepalived
vrrp_script chk_http_port {
script"/etc/keepalived/check_haproxy.sh"   # haproxy 的监控建表
	interval 2     # 时间间隔
	weight 2
}
vrrp_instance VI_1 {
	state MASTER   # 这里是master ,另一台服务器的 keepalived 是 slave ,主从配置
	interface eth0  # 虚IP网卡
	virtual_router_id 51   # 两台的 keepalived  id 值必须一致
	priority 150    # 优先级, master 的优先级 比较高,值越大 越会优先使用作为master keepalived 
	advert_int 1 
	authentication {
	auth_type PASS   # keepalived  认证方式与密码
	auth_pass 1111
	}
	track_script {
		chk_http_port
	}
	virtual_ipaddress { 
		192.168.0.105 dev eth0 scope global   # 虚IP 
	} 
}

check_haproxy.sh :  检查haproxy 是否存活,没有启动就启动。如果启动失败或者haproxy 挂了,那么 虚IP就 就执行另一台的服务器的keepalived 与 haproxy 

#!/bin/bash
STARTHAPROXY="/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg"
STOPKEEPALIVED="/etc/init.d/keepalived stop"
#STOPKEEPALIVED="/usr/bin/systemctl stop keepalived"
LOGFILE="/var/log/keepalived-haproxy-state.log"
echo "[check_haproxy status]" >> $LOGFILE
A=`ps -C haproxy --no-header |wc -l`
echo "[check_haproxy status]" >> $LOGFILE
date >> $LOGFILE
if [ $A -eq 0 ];then
   echo $STARTHAPROXY >> $LOGFILE
   $STARTHAPROXY >> $LOGFILE 2>&1
   sleep 5
fi
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
   exit 0
else
   exit 1
fi

 chmod a+x check_haproxy.sh   加上执行权限

启动keepalived 

通过 ip  addr 可以看到 虚IP已生效。 如果某一台挂了,那么虚IP就切换到另一台服务器了。

mysql 是不能频繁切换虚IP的,会产生数据异常。而haproxy 没有问题,因为它的连接是没有状态的。

mycat 读写分离

mycat和mysql搭建高可用企业数据库集群「建议收藏」

主要配置 dataHost 即可

<dataHost name="mysqlcustomer" maxCon="1000" minCon="10" balance="3"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  >
		<heartbeat>select user()</heartbeat>
		
        写, 主 
		<writeHost host="192.168.0.102" url="192.168.0.102:3306" user="root"
				   password="123456">
						
              读 , 从
			 <readHost host="hostR" url="192.168.0.102:3306" user="root" password="123456" />			
		</writeHost>

        当写挂了, 高可用,配置读作为读写
		<writeHost host="hostRW" url="192.168.0.102:3306" user="root"
				   password="123456">
		</writeHost>
		
	</dataHost>

在 mycat的 conf下的 zkConf 修改配置之后, 执行 bin/init_zk_data.sh 就可以将修改的内容同步到zk 了。

这样其他 mycat 集群机器就可以同步配置了,即滚动应用mycat 配置 . 接着 一台一台启动mycat 即可,这样就不影响使用了

mycat 管理及监控

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

可以通过使用navicat 来连接mycat 来对 mycat 进行管理

重新加载配置:

mycat和mysql搭建高可用企业数据库集群「建议收藏」

常用于管理单台的mycat 

mycat web 管理页面

mycat和mysql搭建高可用企业数据库集群「建议收藏」

http://dl.mycat.org.cn/mycat-web-1.0/  下载 web

tar zxf Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz 

mycat-web/mycat-web/WEB-INF/classes 里面 可以 修改 zookeeper的路径

启动 ./start.sh   

端口 8082 :  http://192.168.0.205:8082/mycat/

这样就可以对mycat 进行 监控和管理了

mycat 集群优化

linux 系统优化

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

以上就是一般的基于内存和网络的优化配置,参考

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

加上 两行即可 ,配置文件的最大打开数量

mycat 优化配置

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mysql 优化配置

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

独占机器的mysql 对于 innodb_buffer_pool_size 为内存的 2/3 大小

mycat 限制

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

即 待 update或者delete 带limit的 不支持,否则会出现数据异常

 

mycat和mysql搭建高可用企业数据库集群「建议收藏」

mycat和mysql搭建高可用企业数据库集群「建议收藏」

即支持 XA的分布式事务:  https://www.cnblogs.com/cxxjohnson/p/9145548.html

mycat和mysql搭建高可用企业数据库集群「建议收藏」

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/6817.html

(0)
上一篇 2023-04-01
下一篇 2023-04-01

相关推荐

  • Python相对路径的使用

    Python相对路径的使用在日常的Python编程中,文件操作是必不可少的环节。而文件的路径则是文件操作的一个重要方面。本文将介绍Python中相对路径的使用方法,让你更加便捷地操作文件。

    2024-05-05
    65
  • 字节跳动 data数据平台_clickhouse github

    字节跳动 data数据平台_clickhouse github更多技术交流、求职机会、试用福利,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 ClickHouse 作为目前业内主流的列式存储数据库(DBMS)之一,拥有着同类型 DBMS 难以企及

    2023-05-24
    148
  • 数据库发展史(中)[亲测有效]

    数据库发展史(中)[亲测有效]在数据库发展史(上)中,为大家介绍了网状数据库和层次数据库、关系数据库、分布式数据库、云数据库的发展史。本篇文章为大家介绍NoSQL数据库和NewSQL数据库的发展历程。 NoSQL数据库 尽管关系…

    2023-04-12
    162
  • 了解Python最新版

    了解Python最新版Python是一种高级编程语言,其设计理念强调代码的可读性和简洁性。Python语言具有庞大的社区和生态系统,几乎可以应用于任何领域,如数据分析、Web开发、科学计算、人工智能等。

    2024-09-02
    22
  • 第02问:怎么模仿磁盘 IO 慢的情况?「建议收藏」

    第02问:怎么模仿磁盘 IO 慢的情况?「建议收藏」问题: 怎么模仿磁盘 IO 慢的情况? 实验: 1. 创建延迟的磁盘 用 dd 创造一片 100M 的文件 将创建的文件用 losetup 虚拟成块设备 /dev/loop3 将块设备 /dev/l…

    2023-02-03
    154
  • oracle encrypt_oracle数据库密码策略

    oracle encrypt_oracle数据库密码策略oracle加密encrypt,解密decrypt

    2023-02-07
    151
  • Python中if语句的用法

    Python中if语句的用法if语句在编程中是非常重要的一种控制流程的工具。它可以根据某种条件来判断是否执行一段代码,从而实现程序的不同分支执行。在Python中,if语句也是一种非常常用的语句。

    2024-04-22
    61
  • 9个SQL运维常遇到的问题「建议收藏」

    9个SQL运维常遇到的问题「建议收藏」摘要:本文重点介绍单个SQL语句持续执行慢的场景。 本文分享自华为云社区《GaussDB(DWS) SQL性能问题案例集》,作者:黎明的风。 本文重点介绍单个SQL语句持续执行慢的场景。我们可以对执行

    2023-06-10
    151

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注