MySQL分布式架构

1.架构图
在这里插入图片描述
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.sql

mysql -S /data/3308/mysql.sock
grant all on *. * to root@‘10.0.0.%’ identified by ‘123’;
source /root/world.sql

4.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 restart

mysql -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;”

猜你喜欢

转载自blog.csdn.net/qq_44788449/article/details/107025735