博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mycat简单实现读写分离与分库分表
阅读量:2347 次
发布时间:2019-05-10

本文共 9865 字,大约阅读时间需要 32 分钟。

一、什么是MyCat 

MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。

MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分

片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再
返回给用户。

Mycat数据库读写分离

环境:

客户端182.13                 ↓            mycat中间件182.11           ↙            ↘master主机182.12        slave主机182.10

二、master主机(1.12)配置

两台主机必须时间同步,可以部署ntp服务

步骤:
①配置my.cnf
[root@192 ~]# vim /etc/my.cnf

[mysqld]...server_id = 1log_bin = mysql-bin

[root@192 ~]# systemctl restart mysqld 

②配置复制用户以及root用户权限
[root@192 ~]# mysql
mysql> grant replication slave on . to 'myslave'@'192.168.1.%' identified by '123.com';
mysql> grant all on . to 'root'@'%' identified by '123.com';
mysql> flush privileges ;
mysql> show master status ;

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

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 133| | | |
+------------------+----------+--------------+------------------+-------------------+

三、slave主机(182.10)配置

步骤:

①配置my.cnf
[root@192 ~]# vim /etc/my.cnf

[mysqld]...server_id = 2relay-log = relay-log-binrelay-log-index = slave-relay-bin.index

[root@192 ~]# systemctl restart mysqld 

②配置同步以及root权限
[root@192 ~]# mysql
mysql> change master to master_host='192.168.182.12',master_user='myslave',master_password='123.com',master_log_file='mysql-bin.000001',master_log_pos=133;
mysql> start slave ;
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
....
mysql> grant all on . to root@'%' identified by '123.com';
mysql> flush privileges;
③回到master主机创建test库
mysql> create database test;

四、mycat主机(182.11)配置

步骤:

①安装jdk
选择与操作系统位数匹配的版本
[root@192 ~]# systemctl stop firewalld
[root@192 ~]# tar xf jdk-7u65-linux-x64.gz -C /usr/src
[root@192 ~]# cd /usr/src
[root@192 src]# mv jdk1.7.0_65/ /usr/local/java
②安装mycat
[root@192 src]# wget 
[root@192 ~]# tar zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/src
[root@192 ~]# cd /usr/src
[root@192 src]# mv mycat/ /usr/local/
③加载环境变量
[root@192 ~]# vi /etc/profile

.....export PATH=$PATH:/usr/local/java/binexport JAVA_HOME=/usr/local/javaexport MYCAT_HOME=/usr/local/mycatexport PATH=$PATH:/usr/local/mycat/bin

[root@192 ~]# source /etc/profile

④配置server.xml
[root@192 ~]# cd /usr/local/mycat/conf/
[root@192 conf]# vim server.xml

......
123.com
test
user
test
true

⑤配置schema.xml

[root@192 conf]# vim schema.xml

show slave status

⑥配置wrapper.conf

[root@192 conf]# vim wrapper.conf

wrapper.java.command=/usr/local/java/bin/java

⑦启动mycat服务器

[root@192 logs]# mycat start
[root@192 logs]# tailf wrapper.log #观察启动日志,便于排错
[root@192 logs]# ss -anpt | grep java 
LISTEN 0 1 127.0.0.1:32000 : users:(("java",pid=40133,fd=4))
LISTEN 0 50 :::50632 ::: users:(("java",pid=40133,fd=51))
LISTEN 0 100 :::9066 :::
 users:(("java",pid=40133,fd=69))
LISTEN 0 50 :::33782 ::: users:(("java",pid=40133,fd=53))
LISTEN 0 50 :::1984 :::
 users:(("java",pid=40133,fd=52))
LISTEN 0 100 :::8066 :::* users:(("java",pid=40133,fd=73))

五、客户端(182.13)验证读写分离

步骤:

①登录到连接端口
[root@192 ~]# mysql -h 192.168.182.11 -P 8066 -uroot -p123.com
mysql> show databases;
+----------+
| DATABASE |
+----------+
| test |
+----------+
1 row in set (0.01 sec)

mysql> use test

Database changed
mysql> create table tb (id int);
Query OK, 0 rows affected (0.03 sec)

mysql> insert into tb values (1);

Query OK, 1 row affected (0.05 sec)

mysql> select * from tb;

+------+

| id |
+------+
| 1 |
+------+
1 row in set (0.02 sec)
②登录管理端口
[root@192 ~]# mysql -P9066 -uroot -p123.com -h 192.168.182.11
mysql> show @@datasource ;

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

| DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+
| dn1 | hostM1 | mysql | 192.168.1.12 | 3306 | W | 0 | 10 | 1000 | 49 | 0 | 2 |
| dn1 | hostS1 | mysql | 192.168.1.10 | 3306 | R | 0 | 6 | 1000 | 44 | 2 | 0 |
+----------+--------+-------+--------------+------+------+--------+------+------+---------+-----------+------------+

从管理端口观察两主机负载变化,发现READ_LOAD在hostS1为2, WRITE_LOAD在hostM1为2,说明读写分离已经实现


Mycat简单实践分库分表

参考:

环境:

客户端               ↓        mycat中间件(1.11)               ↓          主数据库(1.12)

一、主数据库配置(182.12)

步骤:

①在主数据库创建库表
mysql>create database db01;  
mysql>create database db02;  
mysql>create database db03;  
  
mysql>CREATE TABLE users (  
    id INT NOT NULL AUTO_INCREMENT,  
    name varchar(50) NOT NULL default '',   
    PRIMARY KEY (id)  
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;  
  
mysql>CREATE TABLE item (  
    id INT NOT NULL AUTO_INCREMENT,  
    value INT NOT NULL default 0,   
    PRIMARY KEY (id)  
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;  
  
mysql>CREATE TABLE item_detail (  
    id INT NOT NULL AUTO_INCREMENT,  
    value INT NOT NULL default 0,  
    name varchar(50) NOT NULL default '',  
    item_id INT NOT NULL,  
    PRIMARY KEY (id),  
    key (item_id)  
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;

三张表各在三个库,一共九表三库

②分配root网段

mysql>grant all on . to root@’%’ identified by ‘123.com’;
③关闭防火墙或开启端口
[root@192 ~]# systemctl stop firewalld

二、mycat中间件配置(182.11)

部署前安装略

步骤:

①配置server.xml
[root@192 ~]# cd /usr/local/mycat/conf/
[root@192 conf]# vim server.xml

......
123.com
TESTDB
user
TESTDB
true

②配置schema.xml

[root@192 conf]# vim schema.xml

select user()

③配置rule.xml,默认为分三片,需要修改

.......
id
mod-long
........
2

④配置wrapper.xml

[root@192 conf]# vim wrapper.conf

wrapper.java.command=/usr/local/java/bin/javawrapper.working.dir=..

⑤关闭防火墙或开启端口

[root@192 ~]# systemctl stop firewalld
⑥启动mycat
[root@192 conf]# mycat console
[root@192 ~]# ss -anpt | grep java 
LISTEN 0 100 :::9066 ::: users:(("java",pid=39691,fd=69))
LISTEN 0 50 :::1984 :::
 users:(("java",pid=39691,fd=52))
LISTEN 0 100 :::8066 ::: users:(("java",pid=39691,fd=73))
LISTEN 0 50 :::58818 :::
 users:(("java",pid=39691,fd=53))
LISTEN 0 50 :::46407 :::* users:(("java",pid=39691,fd=51))

三、验证

步骤:

①从客户端登入并且插入数据
[root@192 ~]# mysql -h 192.168.182.11 -P8066 -DTESTDB -uroot -p123.com
mysql> show databases;  
  
+----+------+
| DATABASE |
+----+------+
| TESTDB |
+----+------+
mysql>use TESTDB
mysql> show tables;

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

|Tables in TESTDB |
+----+-------+
| item |
| item_detail |
| users |
+----+-------+
mysql>insert into users(name) values('haha');
mysql>insert into item(id,value) values (1,10);
mysql>insert into item(id,value) values (2,20);
mysql>insert into item_detail(id,value,name,item_id) values(1,10,'wu',1); #列出全列名,否则报错
mysql>insert into item_detail(id,value,name,item_id) values(2,20,'kk',2); 
mysql>insert into item_detail(id,value,name,item_id) values(3,30,'kk',55); 
mysql>insert into item_detail(id,value,name,item_id) values(4,40,'kk',66);
mysql> select * from users;

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

| id | name |
+----+------+
| 1 | haha |
+----+------+
mysql> select * from item;

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

| id | value |
+----+-------+
| 2 | 20 |
| 1 | 10 |
+----+-------+
mysql> select * from item_detail;

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

| id | value | name | item_id |
+----+-------+------+---------+
| 1 | 10 | wu | 1 |
| 3 | 30 | kk | 55 |
| 2 | 20 | kk | 2 |
| 4 | 40 | kk | 66 |
+----+-------+------+---------+
②登录主数据库查看数据表存储位置
[root@192 ~]# mysql -uroot -p123.com
mysql> select * from db01.users;

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

| id | name |
+----+------+
| 1 | haha |
+----+------+
1 row in set (0.00 sec)

mysql> select * from db02.users;

Empty set (0.01 sec)

mysql> select * from db03.users;

Empty set (0.01 sec)

mysql> select * from db01.item_detail;

Empty set (0.01 sec)

mysql> select * from db02.item;

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

| id | value |
+----+-------+
| 2 | 20 |
+----+-------+
1 row in set (0.00 sec)

mysql> select * from db03.item;

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

| id | value |
+----+-------+
| 1 | 10 |
+----+-------+
1 row in set (0.00 sec)

mysql> select * from db01.item_detail;

Empty set (0.01 sec)

mysql> select * from db02.item_detail;

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

| id | value | name | item_id |
+----+-------+------+---------+
| 2 | 20 | kk | 2 |
| 4 | 40 | kk | 66 |
+----+-------+------+---------+
2 rows in set (0.00 sec)

mysql> select * from db03.item_detail;

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

| id | value | name | item_id |
+----+-------+------+---------+
| 1 | 10 | wu | 1 |
| 3 | 30 | kk | 55 |
+----+-------+------+---------+
2 rows in set (0.00 sec)

通过使用mycat的hash分片规则,在主数据数据均衡存储,users定义在db01库,item与item_detail分布在db02,db03库,验证成功

转载地址:http://tzxvb.baihongyu.com/

你可能感兴趣的文章
27岁转行自学Java,真的太晚了吗?
查看>>
自学Java最起码要学到什么程度才能就业?
查看>>
零基础学Java需要做哪些准备?需要注意些什么呢?
查看>>
有了这份阿里大牛手写630页Java高级面试手册,offer稳了【建议收藏】
查看>>
学习Java,需要学到什么程度,才能出去找工作?
查看>>
2021年Java发展怎么样?现在学了Java技术出来是否还能找到工作?
查看>>
Java程序员面试大厂的技术标准,你达到要求了吗?
查看>>
为什么Java程序员需求量这么大,还会有人找不到合适的工作?
查看>>
过来人对程序员学习Java的10条建议,第2点很重要!
查看>>
大学生如何学好Java?过来人给你7点建议
查看>>
过来人的经验:Java实习生在公司里一般都做什么?
查看>>
Java入门基础知识点整理大放送,推荐收藏
查看>>
如何成为月入25k的高级程序员?建议养成这7个习惯
查看>>
学 Java还是Python, 哪个更好找工作?
查看>>
Java基础知识:如何计算Java对象占用内存大小?
查看>>
一份Java程序员的珍藏书单,请您注意查收
查看>>
为什么这么多人Java基础薄弱?该如何提升?
查看>>
如何成为一名合格的Java程序员?
查看>>
spring框架中5种自动装配模式介绍
查看>>
如何学习Spring框架?有哪些建议?
查看>>