MySQL 中间件Mycat部署
* 一个彻底开源的,面向企业应用开发的大数据库集群 * 支持事务、ACID、可以替代MySQL的加强版数据库 * 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 * 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server * 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品 * 一个新颖的数据库中间件产品
为什么使用MyCat
如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB。对数据的各种 操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现 暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上 的提升。但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安 全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库。如何使用关系型数据库解决 海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据分散到不同的数据库中 存储,为应对此问题就出现了——MyCat
**Mycat作用为:** 能满足数据库数据大量存储;提高了查询性能 * 读写分离 * 数据分片 垂直拆分(分库) 、 水平拆分(分表) 、 垂直+水平拆分(分库分表) * 多数据源整合
支持MySQL ORACLE SQLServer等一些主流的数据库
核心技术(分库分表) 数据库分片指:通过某种特定的条件,将我们存放在一个数据库中的数据分散存放 在不同的多个数据库(主机)中,这样来达到分散单台设备的负载,根据切片规则,可分为以下两种切片模式
MyCAT通过定义表的分片规则来实现分片,每个表格可以捆绑一个分片规则,每个分片规则指定一个分片字段 并绑定一个函数,来实现动态分片算法
1.Schema:逻辑库,与MySQL中的Database(数据库)对应,一个逻辑库中定义了所包括的Table。
2.Table:逻辑表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑 数据节点DataNode。在此可以指定表的分片规则。
3.DataNode:MyCAT的逻辑数据节点,是存放table的具体物理节点,也称之为分片节点,通过DataSource来 关联到后端某个具体数据库上
4.DataSource:定义某个物理库的访问地址,用于捆绑到Datanode上
5.分片规则:前面讲了数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则 把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难
MyCat部署
#安装jdk环境,为了方便我这里直接yum安装了,jdk必须是1.7以上的版本 [ ~]# yum -y install java [ ~]# java -version openjdk version "1.8.0_252" OpenJDK Runtime Environment (build 1.8.0_252-b09) OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode) [ ~]# wget https://github.com/MyCATApache/Mycat-Server/releases/download/Mycat-server-1675-release/Mycat-server-1.6.7.5-release-20200422133810-linux.tar.gz [ ~]# tar zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/ [ conf]# pwd /usr/local/mycat/conf [ conf]# vim server.xml # 修改配置文件 #找到最后,找出此模块,这里我是为了不和系统用户root冲突,所以修改为了mycat <user name="mycat"> <property name="password">123456</property> <property name="schemas">TESTDB</property> #由于我在修改的途中为了观看清晰删除了很多配置,所以这块为了以防万一就先备份一个副本出来 [ conf]# cp schema.xml schema.xml.bak [ conf]# 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="dn1"> # dataNode指定节点 </schema> <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" /> --> <dataNode name="dn1" dataHost="host1" database="test1" /> # database 指定数据库 <dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="192.168.171.135:3306" user="root" password="123"> # 指定写的数据库主机,及登录账号密码 <!-- can have multi read hosts --> <readHost host="hostS2" url="192.168.171.145:3306" user="root" password="123" /> # 指定读的数据主机及账户和密码 </writeHost> </dataHost> </mycat:schema> [ ~]# ln -s /usr/local/mycat/bin/* /usr/bin/ # 做软连接方便使用
MySQL主从配置
1、master配置
[ ~]# vim /etc/my.cnf ..................... log-bin=mysql-bin server-id=1 mysql> grant replication slave on *.* to ‘192.168.171.%‘ identified by ‘123‘; # 赋予权限使从服务器可以连接 mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 448 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) mysql> create database test1; mysql> use test1; mysql> create table tab1(id int primary key auto_increment,name varchar(22)); mysql> insert into tab1 values(1,‘zhang‘),(2,‘li‘),(3,‘zhao‘); mysql> select * from tab1; +----+-------+ | id | name | +----+-------+ | 1 | zhang | | 2 | li | | 3 | zhao | +----+-------+ 3 rows in set (0.00 sec) #赋予权限使mycat能够远程登录 mysql> grant all on *.* to ‘192.168.171.%‘ identified by ‘123‘; #将mysql命令复制过去,是mycat能简单使用 [ ~]# scp /usr/local/mysql/bin/mysql :/usr/bin/
2、slave配置
[ data]# vim /etc/my.cnf ................. relay-log=relay-bin server-id=2 mysql> change master to master_host=‘192.168.171.135‘,master_user=‘rep‘,master_password=‘123‘,master_log_file=‘mysql-bin.000001‘,master_log_pos=448; mysql> start slave; mysql> show slave status\G
mysql> use test1; mysql> select * from tab1; +----+-------+ | id | name | +----+-------+ | 1 | zhang | | 2 | li | | 3 | zhao | +----+-------+ 3 rows in set (0.00 sec) #赋予权限使mycat能够远程连接 mysql> grant all on *.* to ‘192.168.171.%‘ identified by ‘123‘;
3、测试
[ ~]# mysql -umycat -p123456 -h 192.168.171.134 -P8066 mysql> show databases; +----------+ | DATABASE | +----------+ | TESTDB | # 这个是逻辑库 +----------+ 1 row in set (0.00 sec) mysql> use TESTDB mysql> show tables; +-----------------+ | Tables_in_test1 | +-----------------+ | tab1 | +-----------------+ 1 row in set (0.00 sec) mysql> select * from tab1; +----+-------+ | id | name | +----+-------+ | 1 | zhang | | 2 | li | | 3 | zhao | +----+-------+ 3 rows in set (0.00 sec)