DBA-70-day14

不是所有公司都适用这类架构,如果公司规模小高可用主从就可以了,像阿里这样的公司或者更大得可以考虑

分布式架构演变

3. MyCAT安装

3.0 介绍

开源组织和社区开发人员,在淘宝cober(TDDL)基础上二次开发。

3.1 预先安装Java运行环境

yum install -y java

3.2下载

Mycat-server-xxxxx.linux.tar.gz

http://dl.mycat.io/

3.3 解压文件

tar xf Mycat-server-*

3.4 软件目录结构

ls

bin  catlet  conf  lib  logs  version.txt

3.5 启动和连接

3.5.1 配置环境变量

vim /etc/profile

export PATH=/data/app/mycat/bin:$PATH

source /etc/profile

3.5.2 启动

mycat start

3.5.3 连接mycat:

mysql -uroot -p123456 -h 127.0.0.1 -P8066

4. 配置文件介绍

4.1 bin 目录

程序目录

4.2 conf

配置文件目录

4.2.1 schema.xml

主配置文件:节点信息、读写分离、高可用设置、调用分片策略..

4.2.2 rule.xml

分片策略的定义、功能、使用用方法

4.2.3 server.xml

mycat服务有关配置: 用户、网络、权限、策略、资源...

4.2.4 xx.txt文件

分片参数定义文件

4.2.5 log4j2.xml

Mycat 相关日志记录配置

4.3 logs

wrapper.log : 启动日志 

mycat.log  :工作日志

========================

++++++Mycat核心应用+++++++

1.  schema.xml配置文件结构

[root@db01 conf]# cd /data/mycat/conf/

mv schema.xml schema.xml.bak

vim schema.xml

# 逻辑库:

 

# DN数据节点(逻辑分片):数据节点(逻辑分片):

     

作用:

垂直和水平查分。

# DH 数据主机

作用: 高可用和读写分离

   

        select user() 

   

           

   

     

====================================

 

 

# 1.逻辑库配置

 

# 2. DN,分片定义

     

#3. DH节点定义

   

        select user() 

   

           

   

     

==================配置文件模板============================

 

 

 

     

   

        select user() 

   

           

   

     

===========================================================

2. 测试环境准备

db01:

mysql -S /data/3307/mysql.sock -e "grant all on *.* to root@'10.0.0.%' identified by '123';"

mysql -S /data/3307/mysql.sock -e  "source /root/world.sql"

mysql -S /data/3308/mysql.sock -e "grant all on *.* to root@'10.0.0.%' identified by '123';"

mysql -S /data/3308/mysql.sock -e  "source /root/world.sql"

重启mycat

mycat restart

3.  读写分离测试

# 连接mycat 服务

[root@db01 ~]# mysql -uroot -p123456 -h 10.0.0.51 -P8066

# 测试读

mysql> select @@server_id;

# 测试写

mysql> begin ; select @@server_id;commit;

4. 配置读写分离及高可用

[root@db01 conf]# mv schema.xml schema.xml.rw

[root@db01 conf]# vim schema.xml

 

 

 

     

   

        select user() 

   

           

   

   

           

           

     

primary  writehost    :负责写操作的writehost 

standby  writeHost    :和readhost一样,只提供读服务

当写节点宕机后,后面跟的readhost也不提供服务,这时候standby的writehost就提供写服务,

后面跟的readhost提供读服务

测试读写分离:

mycat restart

mysql -uroot -p123456 -h 10.0.0.51  -P 8066

mysql> select @@server_id;

mysql> begin;select @@server_id;commit;

测试高可用:

[root@db01 conf]# systemctl stop mysqld3307

mysql -uroot -p123456 -h 10.0.0.51  -P 8066

mysql> select @@server_id;

mysql> begin;select @@server_id;commit;

[root@db01 conf]# systemctl start mysqld3307

mysql -uroot -p123456 -h 10.0.0.51  -P 8066

mysql> select @@server_id;

mysql> begin;select @@server_id;commit;

5.  参数介绍

5.1 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上分发。

5.2 writeType属性

写操作,负载均衡类型,目前的取值有2种:

1. writeType="0", 所有写操作发送到配置的第一个writeHost,

第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为主,切换记录在配置文件中:dnindex.properties .

2. writeType=“1”,所有写操作都随机的发送到配置的writeHost,但不推荐使用

5.3 switchType属性

-1 表示不自动切换

1 默认值,自动切换

2 基于MySQL主从同步的状态决定是否切换 ,心跳语句为 show slave status

datahost其他配置

5.4  连接有关

maxCon="1000":最大的并发连接数

minCon="10" :mycat在启动之后,会在后端节点上自动开启的连接线程

5.5 tempReadHostAvailable="1"

这个一主一从时(1个writehost,1个readhost时),可以开启这个参数,如果2个writehost,2个readhost时

select user()  监测心跳

6.  Mycat 分布式架构--垂直分表

taobao  user (sh1),order_t(sh2)  ,others(sh3)

cd /data/app/mycat/conf

mv  schema.xml  schema.xml.ha

vim schema.xml

       

       

   

   

   

        select user()

   

           

   

   

           

   

   

   

        select user()

   

           

   

   

           

   

   

创建测试库和表:

mysql -S /data/3307/mysql.sock -e "create database taobao charset utf8;"

mysql -S /data/3308/mysql.sock -e "create database taobao charset utf8;"

mysql -S /data/3307/mysql.sock -e "use taobao;create table user(id int,name varchar(20))";

mysql -S /data/3308/mysql.sock -e "use taobao;create table order_t(id int,name varchar(20))"

# 重启mycat

mycat restart

# mycat中对user  和 order 数据插入

mysql -uroot -p123456 -h 10.0.0.51  -P 8066

insert into user values(1,'a');

insert into user values(2,'b');

insert into user values(3,'c');

commit;

insert into order_t values(1,'x'),(2,'y');

commit;

[root@db01 conf]# mysql -S /data/3307/mysql.sock -e "show tables from taobao"

+------------------+

| Tables_in_taobao |

+------------------+

| user            |

+------------------+

[root@db01 conf]# mysql -S /data/3308/mysql.sock -e "show tables from taobao"

+------------------+

| Tables_in_taobao |

+------------------+

| order_t          |

+------------------+

[root@db01 conf]# mysql -S /data/3307/mysql.sock -e "select * from taobao.user"

+------+------+

| id  | name |

+------+------+

|    1 | a    |

|    2 | b    |

|    3 | c    |

+------+------+

[root@db01 conf]# mysql -S /data/3308/mysql.sock -e "select * from taobao.order_t"

+------+------+

| id  | name |

+------+------+

|    1 | x    |

|    2 | y    |

+------+------+

[root@db01 conf]#

7.  Mycat 分布式架构--水平拆分

7.0 重要概念

# 1. 分片策略 :几乎融合经典业务中大部分的分片策略。Mycat已经开发了相应算法,非常方便调用。

范围分片

取模

枚举

日期

HASH

等。

  分片键: 作为分片条件的列。

7.1 范围分片

比如说t3表

(1)行数非常多,2000w(1-1000w:sh1  1000w01-2000w:sh2)

(2)访问非常频繁,用户访问较离散

# 1. 修改schema.xml文件,定制分片策略

cp schema.xml schema.xml.1 

vim schema.xml

添加:

# 2. 定义和使用分片策略

vim rule.xml

               

                        id

                        rang-long

                   

    class="io.mycat.route.function.AutoPartitionByLong">

    autopartition-long.txt


# 3.  定义范围


vim autopartition-long.txt

0-10=0

10-20=1

4. 创建测试表:

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);"

5. 测试:

重启mycat

mycat restart

mysql -uroot -p123456 -h 10.0.0.51 -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(4,'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');

[root@db01 conf]# mysql -S /data/3308/mysql.sock  -e "select * from taobao.t3"

[root@db01 conf]# mysql -S /data/3307/mysql.sock  -e "select * from taobao.t3"

7.2 取模分片

1%3 1

2%3 2

3%3 0

4%3 1

任何正整数数字和N(正整数)取模,得的值永远都是 0~N-1

id % 分片数量取模

N  % 5  =  0-4  idx

取余分片方式:分片键(一个列)与节点数量进行取余,得到余数,将数据写入对应节点

# 1.  修改配置文件

vim schema.xml

# 2. 查看和定义分片使用

vim rule.xml

2

# 3. 准备测试环境


创建测试表:

mysql -S /data/3307/mysql.sock -e "use taobao;create table t4 (id int not null primary key auto_increment,name varchar(20) not null);"

mysql -S /data/3308/mysql.sock -e "use taobao;create table t4 (id int not null primary key auto_increment,name varchar(20) not null);"

重启mycat

mycat restart

# 4. 测试:

mysql -uroot -p123456 -h10.0.0.51 -P8066

use TESTDB

insert into t4(id,name) values(1,'a');

insert into t4(id,name) values(2,'b');

insert into t4(id,name) values(3,'c');

insert into t4(id,name) values(4,'d');

insert into t4(id,name) values(6,'x'),(8,'y'),(10,'z');

分别登录后端节点查询数据

mysql -S /data/3308/mysql.sock  -e "select * from taobao.t4"

mysql -S /data/3307/mysql.sock  -e "select * from taobao.t4"

7.3 枚举分片

t5 表

id name telnum

1  bj  1212

2  sh  22222

3  bj  3333

4  sh  44444

5  bj  5555

sharding-by-intfile

# 1.  设计分片策略

vim schema.xml

# 2. 应用分片策略

vim rule.xml

       

               

                        name

                        hash-int

               

       

partition-hash-int.txt

  1

vim  partition-hash-int.txt 配置:

bj=0

sh=1

DEFAULT_NODE=1

# 3. 准备测试环境

mysql -S /data/3307/mysql.sock -e "use taobao;create table t5 (id int not null primary key auto_increment,name varchar(20) not null);"

mysql -S /data/3308/mysql.sock -e "use taobao;create table t5 (id int not null primary key auto_increment,name varchar(20) not null);"

重启mycat

mycat restart

# 4. 插入测试数据: 

mysql -uroot -p123456 -h10.0.0.51 -P8066

use TESTDB

insert into t5(id,name) values(1,'bj');

insert into t5(id,name) values(2,'sh');

insert into t5(id,name) values(3,'bj');

insert into t5(id,name) values(4,'sh');

insert into t5(id,name) values(5,'tj');

mysql -S /data/3308/mysql.sock  -e "select * from taobao.t5"

mysql -S /data/3307/mysql.sock  -e "select * from taobao.t5"

7.4  Mycat全局表

a  b  c  d  .....

join

t

id  name  age

1    zs    18  sh1

id    addr  aid

1001  bj    1

1002  sh    2

2    ls    19  sh2

id    addr  aid

1001  bj    1

1002  sh    2

t

id    addr  aid

1001  bj    1

1002  sh    2

使用场景:

如果你的业务中有些数据类似于数据字典,比如配置文件的配置,

常用业务的配置或者数据量不大很少变动的表,这些表往往不是特别大,

而且大部分的业务场景都会用到,那么这种表适合于Mycat全局表,无须对数据进行切分,

要在所有的分片上保存一份数据即可,Mycat 在Join操作中,业务表与全局表进行Join聚合会优先选择相同分片内的全局表join,

避免跨库Join,在进行数据插入操作时,mycat将把数据分发到全局表对应的所有分片执行,在进行数据读取时候将会随机获取一个节点读取数据。

# 1. 设置全局表策略

vim schema.xml

# 2. 后端数据准备

mysql -S /data/3307/mysql.sock -e "use taobao;create table t_area (id int not null primary key auto_increment,name varchar(20) not null);"

mysql -S /data/3308/mysql.sock -e "use taobao;create table t_area (id int not null primary key auto_increment,name varchar(20) not null);"

重启mycat

mycat restart

# 3. 测试:

mysql -uroot -p123456 -h10.0.0.51 -P8066

use TESTDB

insert into t_area(id,name) values(1,'a');

insert into t_area(id,name) values(2,'b');

insert into t_area(id,name) values(3,'c');

insert into t_area(id,name) values(4,'d');

mysql -S /data/3308/mysql.sock  -e "select * from taobao.t_area"

mysql -S /data/3307/mysql.sock  -e "select * from taobao.t_area"

7.5 E-R分片

a

join

b

on  a.xx =b.yy

a       

id  name           

1  a      sh1

3  c 

2  b      sh2

4  d 

b

id  addr  aid

1001  bj  1        sh1 

1002  sh  2

1003  tj  3        sh2

1004  wh  4

为了防止跨分片join,可以使用E-R模式

     

select * from a join b on a.id = b.aid where a.name=d

例子:

1. 修改配置文件

vim schema.xml

     

2. 修改rule.xml mod-log分片策略:

vim rule.xml

       

               

                        id

                        mod-long_oldguo

               

       

       

               

                2

       

3. 创建测试表

mysql -S /data/3307/mysql.sock -e "use taobao;create table a (id int not null primary key auto_increment,name varchar(20) not null);"

mysql -S /data/3307/mysql.sock -e "use taobao;create table b (id int not null primary key auto_increment,addr varchar(20) not null ,aid int );"

mysql -S /data/3308/mysql.sock -e "use taobao;create table a (id int not null primary key auto_increment,name varchar(20) not null);"

mysql -S /data/3308/mysql.sock -e "use taobao;create table b (id int not null primary key auto_increment,addr varchar(20) not null ,aid int );"

4. 重启mycat 测试

mycat restart

mysql -uroot -p123456 -h10.0.0.51 -P8066

use TESTDB

insert into a(id,name) values(1,'a');    1    3308

insert into a(id,name) values(2,'b');    0    3307

insert into a(id,name) values(3,'c');    1    3308

insert into a(id,name) values(4,'d');    0   3307

insert into a(id,name) values(5,'e');    1    3308

insert into b(id,addr,aid) values(1001,'bj',1);    1 3308

insert into b(id,addr,aid) values(1002,'sj',3);    1 3308

insert into b(id,addr,aid) values(1003,'sd',4);    0 3307

insert into b(id,addr,aid) values(1004,'we',2);    0 3307

insert into b(id,addr,aid) values(1005,'er',5);    0 3307

========

后端数据节点数据分布:

mysql -S /data/3307/mysql.sock  -e "select * from taobao.a"

mysql -S /data/3307/mysql.sock  -e "select * from taobao.b"

mysql -S /data/3308/mysql.sock  -e "select * from taobao.a"

mysql -S /data/3308/mysql.sock  -e "select * from taobao.b"

8. 管理类操作

[root@db01 conf]# mysql -uroot -p123456 -h10.0.0.51 -P9066

查看帮助

show @@help;

查看Mycat 服务情况

show @@server ;

查看分片信息

mysql> show @@datanode;

查看数据源

show @@datasource

重新加载配置信息

reload @@config          : schema.xml                       

reload @@config_all      :  所有配置重新加载

9. 修改逻辑库:

逻辑库名

# 总配置文件

schema.xml

sh3

sh4

# mycat 服务配置

server.xml

                123456

                oldboy

                oldboy

               

               

               

       

       

                user

                oldboy

                true

                oldboy

       

reload @@config_all      :  所有配置重新加载

2. 添加一个逻辑库

schema.xml

server.xml

oldboy,oldguo

reload @@config_all      :  所有配置重新加载

课后练习:

1. 测试月份分片

2.  Mycat+3*MHA分片架构+月份分片

你可能感兴趣的:(DBA-70-day14)