1.架构图

mysql多实例分布式事务 mysql分布式架构_mysql多实例分布式事务


2. MyCAT安装

2.1 预先安装Java运行环境
 yum install -y java
 2.2下载
 Mycat-server-xxxxx.linux.tar.gz
 http://dl.mycat.io/ 2.3 解压文件
 [root@db01 application]# tar xf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz
 2.4 软件目录结构
 bin catlet conf lib logs version.txt
 2.5 启动和连接
 配置环境变量
 vim /etc/profile
 export PATH=/application/mycat/bin:$PATH
 source /etc/profile
 启动
 mycat start
 连接mycat:
 mysql -uroot -p123456 -h 127.0.0.1 -P8066

3.数据库分布式架构方式
3.1 垂直拆分----分库分表
3.2 水平拆分----分表
分表的方式:range、取模、枚举…

4.Mycat基础应用

4.1 主要配置文件介绍
 rule.xml ---------------------------分片策略定义
 schema.xml ---------------------主配置文件
 server.xml ------------------------mycat服务有关
 log4j2.xml ------------------------记录日志有关
 *.txt --------------------------------分片策略使用的规则4.2 用户创建及数据库导入
 db01:
 mysql -S /data/3307/mysql.sock
 grant all on *. * to root@‘10.0.0.%’ identified by ‘123’;
 source /root/world.sqlmysql -S /data/3308/mysql.sock
 grant all on *. * to root@‘10.0.0.%’ identified by ‘123’;
 source /root/world.sql4.3 配置文件结构介绍
 逻辑库:schema
 数据节点:datanode
 数据主机:datahost(w和r)4.4 Mycat高可用+读写分离
 mv schema.xml schema.xml.1
 vim schema.xml


##一下开头或结尾均没有"."符号,编辑器不太会用

<.!DOCTYPE mycat:schema SYSTEM “schema.dtd”>
 <.mycat:schema xmlns:mycat=“http://io.mycat/”>
 <.schema name=“TESTDB” checkSQLschema=“false” sqlMaxLimit=“100” dataNode=“sh1”>
 <./schema>
 <.dataNode name=“sh1” dataHost=“oldguo1” database= “world” />
 <.dataHost name=“oldguo1” maxCon=“1000” minCon=“10” balance=“1” writeType=“0” dbType=“mysql” dbDriver=“native” switchType=“1”>
 <.heartbeat>select user()</heartbeat.>
 <.writeHost host=“db1” url=“10.0.0.51:3307” user=“root” password=“123”>
 <.readHost host=“db2” url=“10.0.0.51:3309” user=“root” password=“123” />
 <./writeHost>
 <.writeHost host=“db3” url=“10.0.0.52:3307” user=“root” password=“123”>
 <.readHost host=“db4” url=“10.0.0.52:3309” user=“root” password=“123” />
 <./writeHost>
 <./dataHost>
 <./mycat:schema>


说明:
第一个 writehost: 10.0.0.51:3307 真正的写节点,负责写操作
第二个 writehost: 10.0.0.52:3307 准备写节点,负责读,当 10.0.0.51:3307宕掉,会切换为真正的写节点

测试:
 [root@db01 conf]# mysql -uroot -p123456 -h 10.0.0.51 -P 8066
 读:
 mysql> select @@server_id;
 写:
 mysql> begin ;select @@server_id; commit;

4.5 配置中的属性介绍:

balance属性
负载均衡类型,目前的取值有3种:
1.balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
2.balance=“1”,全部的readHost与standby writeHost参与select语句的负载均衡,简单的说,
当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
3. balance=“2”,所有读操作都随机的在writeHost、readhost上分发。

writeType属性
负载均衡类型,目前的取值有2种:
1.writeType=“0”, 所有写操作发送到配置的第一个writeHost,
第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为主,切换记录在配置文件中:dnindex.properties .
2. writeType=“1”,所有写操作都随机的发送到配置的writeHost,但不推荐使用

switchType属性
-1 表示不自动切换
1 默认值,自动切换
2 基于MySQL主从同步的状态决定是否切换 ,心跳语句为 show slave status

datahost其他配置
 <.dataHost name=“localhost1” maxCon=“1000” minCon=“10” balance=“1” writeType=“0” dbType=“mysql” dbDriver=“native” switchType=“1”>maxCon=“1000”:最大的并发连接数
 minCon=“10” :mycat在启动之后,会在后端节点上自动开启的连接线程

tempReadHostAvailable=“1”
这个一主一从时(1个writehost,1个readhost时),可以开启这个参数,如果2个writehost,2个readhost时
<.heartbeat>select user()</heartbeat.> 监测心跳

5.1 垂直分表

mv schema.xml schema.xml.ha
 vim schema.xml <?xml version="1.0"?> 
<.!DOCTYPE mycat:schema SYSTEM “schema.dtd”>
 <.mycat:schema xmlns:mycat=“http://io.mycat/”>
 <.schema name=“TESTDB” checkSQLschema=“false” sqlMaxLimit=“100” dataNode=“sh1”>
 <.table name=“user” dataNode=“sh1”/>
 <.table name=“order_t” dataNode=“sh2”/>
 <./schema>
 <.dataNode name=“sh1” dataHost=“oldguo1” database= “taobao” />
 <.dataNode name=“sh2” dataHost=“oldguo2” database= “taobao” />
 <.dataHost name=“oldguo1” maxCon=“1000” minCon=“10” balance=“1” writeType=“0” dbType=“mysql” dbDriver=“native” switchType=“1”>
 <.heartbeat>select user()</heartbeat.>
 <.writeHost host=“db1” url=“10.0.0.51:3307” user=“root” password=“123”>
 <.readHost host=“db2” url=“10.0.0.51:3309” user=“root” password=“123” />
 <./writeHost>
 <.writeHost host=“db3” url=“10.0.0.52:3307” user=“root” password=“123”>
 <.readHost host=“db4” url=“10.0.0.52:3309” user=“root” password=“123” />
 <./writeHost>
 <./dataHost><.dataHost name=“oldguo2” maxCon=“1000” minCon=“10” balance=“1” writeType=“0” dbType=“mysql” dbDriver=“native” switchType=“1”>
 <.heartbeat>select user()</heartbeat.>
 <.writeHost host=“db1” url=“10.0.0.51:3308” user=“root” password=“123”>
 <.readHost host=“db2” url=“10.0.0.51:3310” user=“root” password=“123” />
 <./writeHost>
 <.writeHost host=“db3” url=“10.0.0.52:3308” user=“root” password=“123”>
 <.readHost host=“db4” url=“10.0.0.52:3310” user=“root” password=“123” />
 <./writeHost>
 <./dataHost> 
 <./mycat:schema>创建测试库和表:
 [root@db01 conf]# mysql -S /data/3307/mysql.sock -e “create database taobao charset utf8;”
 [root@db01 conf]# mysql -S /data/3308/mysql.sock -e “create database taobao charset utf8;”
 [root@db01 conf]# mysql -S /data/3307/mysql.sock -e “use taobao;create table user(id int,name varchar(20))”;
 [root@db01 conf]# mysql -S /data/3308/mysql.sock -e “use taobao;create table order_t(id int,name varchar(20))”重启mycat :
 mycat restart测试功能:
 [root@db01 conf]# mysql -uroot -p123456 -h 10.0.0.51 -P 8066
 mysql> use TESTDB
 mysql> insert into user(id ,name ) values(1,‘a’),(2,‘b’);
 mysql> commit;mysql> insert into order_t(id ,name ) values(1,‘a’),(2,‘b’);
 mysql> commit;[root@db01 ~]# mysql -S /data/3307/mysql.sock -e “show tables from taobao;”
 ±-----------------+
 | Tables_in_taobao |
 ±-----------------+
 | user |
 ±-----------------+
 [root@db01 ~]# mysql -S /data/3308/mysql.sock -e “show tables from taobao;”
 ±-----------------+
 | Tables_in_taobao |
 ±-----------------+
 | order_t |
 ±-----------------+

5.2 Mycat分布式-范围分片
对t3表
(1)行数非常多,2000w(1-1000w:sh1 1000w01-2000w:sh2)
(2)访问非常频繁,用户访问较离散

cp schema.xml schema.xml.11
 vim schema.xml
 <.schema name=“TESTDB” checkSQLschema=“false” sqlMaxLimit=“100” dataNode=“sh1”>
 <.table name=“t3” dataNode=“sh1,sh2” rule=“auto-sharding-long” />
 <./schema>
 <.dataNode name=“sh1” dataHost=“oldguo1” database= “taobao” />
 <.dataNode name=“sh2” dataHost=“oldguo2” database= “taobao” />vim rule.xml
 <.tableRule name=“auto-sharding-long”>
 <.rule>
 <.columns>id</columns.>
 <.algorithm>rang-long</algorithm.>
 <./rule>
 <.function name=“rang-long”
 class=“io.mycat.route.function.AutoPartitionByLong”>
 <.property name=“mapFile”>autopartition-long.txt</property.>
 <./function>vim autopartition-long.txt
 1-10=0 ----------------------> >=1 , <=10
 10-20=1 --------------------> >10 ,<=20创建测试表:
 mysql -S /data/3307/mysql.sock -e “use taobao;create table t3 (id int not null primary key auto_increment,name varchar(20) not null);”mysql -S /data/3308/mysql.sock -e “use taobao;create table t3 (id int not null primary key auto_increment,name varchar(20) not null);”

测试:

重启mycat
 mycat restartmysql -uroot -p123456 -h 127.0.0.1 -P 8066
 insert into t3(id,name) values(1,‘a’);
 insert into t3(id,name) values(2,‘b’);
 insert into t3(id,name) values(3,‘c’);
 insert into t3(id,name) values(10,‘d’);
 insert into t3(id,name) values(11,‘aa’);
 insert into t3(id,name) values(12,‘bb’);
 insert into t3(id,name) values(13,‘cc’);
 insert into t3(id,name) values(14,‘dd’);
 insert into t3(id,name) values(20,‘dd’);mysql -S /data/3310/mysql.sock -e “select * from taobao.t3;”