使用mycat搭建实现mysql数据库集群管理

今天来使用mycat管理mysql集群, 随着数据量的提升, 我们如果把所有数据存储在一个数据库中, 对数据的各种操作就会变得非常的困难. 自然我们又想到了数据库也进行集群部署, 将一个数据库的数据分散到不同的数据库中存储, 进而提升数据操作的性能.

本文的定义是简洁快速的使用mycat, 让读者可以快速的入门mycat, 因此本文聚焦于mycat的安装, 使用, 简易配置, 常用配置文件和标签的介绍. 如果需要全面深入的了解建议去读一读官方推荐的文档.

什么是mycat?

Mycat 是基于阿里巴巴曾经开源的知名产品 - cobar 演变而来, 简单来说MyCAT就是一个数据库中间件产品支持mysql集群, 你可以像使用mysql一样使用mycat, 对于开发人员来说根本感觉不到mycat的存在.

其实可以这么简单理解: 你有多个数据库, 那么你存数据的时候存到哪个数据库呢? 所以我们需要一个存储策略, 而mycat就是做这个事情的, 简单来说: mycat就是管理数据库集群的.

mycat的分片策略

本文主要目的是为了快速搭建使用起来, 不是为了深入分析概念, 因此就简单列举介绍下, 建议读者可以到官方文档或百度了解概念. 也可以到这篇博文了解一下详细的每个参数和属性有什么作用: https://www.cnblogs.com/joylee/p/7513038.html.

    首先什么是分片?
        分片就是指将同一个数据库中的数据分散存储到多个数据库中, 以达到分散单台设备负载的效果, 这就是分片.
    数据切分的方式
        垂直切分
            垂直切分就是按照表来切分
        横向切分
            横向切分就是把单表按照记录来切分, 例如ID (将1,2切分到一个库表, 3,4切分到一个库表)
    mycat的分片策略
        逻辑库 (schema)
            逻辑库不是真实存在的, 想要把数据存储到物理库中, 就需要通过逻辑库来操作, 简单来说: 逻辑库是来管理和调度物理库的.
        逻辑表 (table)
            逻辑表的概念是类似于逻辑库的, 逻辑表是来管理和调度物理表的.
        分片节点 (dataNode)
            ip+数据库名
        节点主机 (dataHost)
            分片节点所在的主机
        分片规则 (rule)
            就是拆分的算法, 如何来拆分呢? 就要用到分片规则, mycat有10中分片规则, 基本上我们的应用场景都包含在内了, 这方面mycat做的很赞!

好了, 不多说, 下面我们正式进入正题.

首先我们需要现有一个已经装好jdk和mysql的linux系统, 为什么需要jdk呢? 因为mycat是java代码写的, 所以需要jdk环境.

安装mysql步骤

第一步: 查看是否已经安装mysql

rpm -qa | grep mysql

    1

第二步: 卸载你查询到的mysql

#rpm -e --nodeps 要卸载的mysql
#例如:
rpm -e --nodeps mysql-libs-5.1.73-8.el6_8.x86_64

    1
    2
    3

第三步: 上传mysql压缩包, 解压

第四步: 安装服务端

rpm -ivh 服务端程序 --nodeps --force

    1

第五步: 安装客户端

rpm -ivh 客户端程序 --nodeps --force

    1

第六步: 启动和关闭mysql

启动mysql:    service mysql start
关闭mysql:    service mysql stop
重启mysql:    service mysql restart

    1
    2
    3

第七步: 连接mysql

mysql -u root -p

    1

这里有个需要注意: 如果你安装的是5.6版本的, 会自动生成一个随机密码

1)进入该文件查看密码

​ vi /root/.mysql_secret

2)使用这个密码登录mysql

​ mysql –u root –p

3)修改密码

​ SET PASSWORD = PASSWORD(‘123456’);

第八步: 设置远程登录权限

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456'  WITH GRANT OPTION;

然后使用SQLyog, 或者Navicat等软件连接远程mysql.

MyCat安装及启动

mycat下载地址:https://github.com/MyCATApache/Mycat-download

这里要注意是linux的压缩文件.

第一步: 上传到linux系统, 解压缩.

第二步: 启动mycat

进入bin目录

第三步: 启动之后, 我们通过mysql客户端连接mycat

用户名和密码都是test, 这是mycat默认的.

默认端口是8066

但是这里, 我在连接的时候报了2003的错误:

ERROR 2003 (HY000): Can’t connect to MySQL server on ‘192.168.179.133’ (0)

然后去查询了下mycat的启动状态, 发现是not running, 并没有连接上.

然后我使用./mycat console 命令监测

Running Mycat-server... wrapper | 
--> Wrapper Started as Console wrapper |
 Launching a JVM... jvm 1 | 
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0 wrapper | JVM exited while loading the application. jvm 1 | 错误: 代理抛出异常错误: java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: simple01: simple01: 未知的名称或服务

这个错误的原因是因为位置的host名称, 所以我们需要在hosts文件中配置当前主机IP

vim /etc/hosts

在127.0.0.1 和 ::1 中间加上你的主机IP, 保存退出后, 重新启动mycat.

再次使用客户端连接, 发现连接成功.

第四步: 分片配置

这里分为三步:

    连接mysql, 创建三个数据库db1, db2, db3 (注意是连接mysql, 不是mycat)
    修改schema.xml文件
    修改server.xml文件

    连接mysql, 创建三个数据库db1, db2, db3

2、配置schema.xml文件

看上图, 我们配置了哪些东西呢?

    <schema name=“TESTDB” 这个是逻辑库名

3、配置server.xml文件

server.xml几乎保存了所有mycat需要的系统配置信息。最常用的是在此配置用户名、密码及权限。

在system中添加UTF-8字符集设置,否则存储中文会出现问号

<property name="charset">utf8</property>

修改user的设置 , 我们这里为 TESTDB设置了两个用户

<user name="test">
    <property name="password">test</property>
    <property name="schemas">TESTDB</property>
</user>
<user name="root">
    <property name="password">123456</property>
    <property name="schemas">TESTDB</property>
</user>

name=“root” 是用户名, 下面的password自然是密码

第五步: 测试分片

我们用mysql客户端连接mycat, 在mycat中执行下面的SQL语句, 创建一张tb_test表

我们来看一下, 是否会在其他的三个数据库中同步创建呢?

CREATE TABLE tb_test (
  id BIGINT(20) NOT NULL,
  title VARCHAR(100) NOT NULL ,
  PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8

  

我们再查看MySQL的3个库, 发现表都自动创建好了.

接下来是插入表数据, 我们来插入一些数据 (注意, 这里mycat自动将tb_test变成了大写TB_TEST)

INSERT INTO TB_TEST(ID,TITLE) VALUES(1,'goods1');
INSERT INTO TB_TEST(ID,TITLE) VALUES(2,'goods2');
INSERT INTO TB_TEST(ID,TITLE) VALUES(3,'goods3');
INSERT INTO TB_TEST(ID,TITLE) VALUES(5000001,'goods5000001');
INSERT INTO TB_TEST(ID,TITLE) VALUES(10000001,'goods10000001');

   

查看结果, 我们发现前3条数据插入到了db1中, 第4条数据插入到了db2中, 第5条数据插入到了db3中…

很显然是因为我们采用的分片规则是每节点存储500万条数据, 所以超过了500万就存到了db2, 超过1000万就存到了db3.

第六步: 分片规则配置

我们还记得, 在配置scheme.xml文件时, 我们的分片规则是auto-sharding-long

那现在, 我们就进入rule.xml中, 来搜索下这个名字

接着, 又看到这个分片规则的算法是rang-long, 我们继续搜索

接着, 又看到这个算法是在autopartition-long.txt这个文件中, 看来我们必须到这个文件中, 才能看到庐山真面目了.

接着, 在conf目录下找到了这个文件, 进去看看

果然, 原来是在这里配置了. 这其实是最简单的一种分片规则了, 接下来我想把我的数据均匀的分配到3个分片中, 所以我要用到 “一致性哈希” 分片规则.

一致性哈希 murmur (这个我一般读作 嬷嬷, 好记, 哈哈)

我们依然是到rule.xml文件中, 搜索这个嬷嬷

然后找到表规则定义, 这个规则指定的列是id ,如果我们的表主键不是id, 而是order_id, 那么我们应该重新定义一个tableRule:

这里我们把count改成3, 这个count就是要分片的数据库节点数量

<tableRule name="sharding-by-murmur-order">
	<rule>
		<columns>order_id</columns>
		<algorithm>murmur</algorithm>
	</rule> 
</tableRule>

在schema.xml中配置新的逻辑表时, 指定规则为sharding-by-murmur-order

注意:修改完配置,重新启动mycat

第七步: 测试一致性哈希分片规则

创建tb_order表

插入多条数据, 测试是否平均分布在3个库表中

测试的SQL语句这里就不粘贴了, 直接看下测试结果: 发现db1的TB_ORDER表中插入了19条数据, db2的TB_ORDER中插入了22条数据, db3的TB_ORDER表中插入了28条数据.

有的读者可能纳闷了, 这是成功了还是失败了呢? 为啥不是平均的呢?

其实一致性哈希算法并不能做到完全平均, 而是数据量越大越趋近与平均. 有兴趣的读者可以专门去研究研究一致性哈希算法到底是个什么东东…
---------------------
本文转载自:https://blog.csdn.net/weixin_42582592/article/details/82919039

参考:https://blog.csdn.net/m0_38039437/article/details/79711969   有写如何监控mycat

猜你喜欢

转载自blog.csdn.net/qq_39427835/article/details/88425250