开发者学堂课程【全面讲解开源数据库中间件 MyCat 使用及原理(四):MyCat - 分片 - MyCat 环境搭建】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/758/detail/13330
MyCat - 分片 - MyCat 环境搭建
内容介绍:
一、分片配置
二、创建数据库
三、测试
一、分片配置
1.配置 MyCat 的 schema.xml
打开服务器,MyCat 将会部署在 157 这台服务器上
在该服务器上查看:
在 MyCat 中找到核心配置文件 schema.xml:
通过 vi schema.xml 不是特别方便:
在此处修改并不方便,因为此处的内容较多。
这时,借助于 notepad++ 中的一个插件,NppFTP。
在这之前,已经连接过 MyCat1 ,可以检查 MyCat1:
即157 上的 MyCat1
所以连接 MyCat1,连接完成后,找到 schema.xml (找到 usr,usr 下有一个 local,在 local 下找到 mycat ,打开 mycat 下 conf 下的配置文件,找到 schema.xml)
将配置好的文件拷贝到 schema.xml
逻辑库的配置:
<schema name="V_SHOP" checkSQLschema="false" sqlMaxLimit="100">
逻辑表的配置:
数据节点的配置:
<dataNode name="dn1" dataHost="host1" database="v_goods"/>
<dataNode name="dn2" dataHost="host2" dat abase="v_order"/>
<dataNode name="dn3" dataHost="host3" dat abase="v_log”/>
<dataNode name="dn4" dataHost="host4" database="v_log”/>
节点主机的配置:
可以看到连接的服务器为 158、159、160、161
2.rule.xml 中配置
在 schema.xml 中,还关联了一块信息:
分片规则:
<table name=”tb_operatelog” dataNode=”dn3,dn4” primaryKey=”id” rule=”log-sharding-by-murmur”/>
所以接下来要声明这样一个分片规则,该规则叫 log-sharding-by-murmur,
打开 rule.xml,可以找到 sharding-by-murmur。
有了一致性 hash 的分片,为什么需要在此处再声明(也可以将 sharding-by-murmur 改为 log-sharding-by-murmur):
因为当前 mycat 中,
该 schema.xml 表用 log-sharding-by-murmur 一致性 hash,有可能其他表也用一致性 hash ,而这两张表的组件不一样,所以为了方便起见,根据分片规则再声明:
<tableRule name=" log-sharding-by-murmur"
<rule>
<columns>id</ columns>
<algorithm>log-murmur</ algorithm>
</rule>
</ tableRule>
注意:log-murmur 是别名,该别名引用的是分片函数
还需要声明 function:
该 function 的声明就是将下面的function(上图所示)拷贝,然后将<property name=.”count”>3</property>
改为<property name=.”count”>2</property>
因为再当前的架构中,operatelog 有两个节点。
该处配置为:
//1og-murmur 就是分片函数
<functionname="1og-murmur” " class="io.mycat.route.function.PartitionByMurmurHash">
<property name="seed">0</property>
<property name="count">2</ property>
<property name="virtualBucketTimes ">160</ property>
</function>
配置权限信息:
哪些用户能访问该逻辑库,这时需要在 server.xml 中配置
打开 server.xml ,找到:
<user name="root" defaultAccount="true">
//加密密码
<property name="password">
GO0bnPVwrAuFgr1JMuEZkvfDNyTpoiGu7n/Wlsa151cirHQnANVk3NzE3FErx8v6pAcO0ctx3xFecmSr+9760A==
</property>
//访问 V_SHOP
<property name="schemas">V_SHOP</property>
<property name="readOnly">false</property>
<property name="benchmark">1000</property>
<property name="usingDecrypt">1</property>
将下面的 <property name="schemas">ITCAST</property>
也该为 <property name="schemas"> V_SHOP </property>
意味着两个用户 root 和 user 都可以访问 V_SHOP,但是 user 是只读的。
二、创建数据库
在各个 MySQL 数据库实例中创建数据库
需要创建 MyCat 中关联的 MySQL 的数据库
MyCat 中关联的 MySQL 的数据库:
<dataNode name="dn1" dataHost="host1" database="v_goods"/>
<dataNode name="dn2" dataHost="host2" dat abase="v_order"/>
<dataNode name="dn3" dataHost="host3" dat abase="v_log”/>
<dataNode name="dn4" dataHost="host4" database="v_log”/>
1.这时需要连接 158、159、160、161 四台服务器连接 MySQL 创建数据库。
在四台服务器中输入mysql-u root -p
,如下图:
连接上 MySQL 后,检查当前 MySQL 中的数据库(在测试时遗留下的数据库),如下图:
之前搭建 MyCat 中关于双主双从的 MySQL 集群时,也用到这几台服务器,要将原有的双主双从的配置删除,还原数据库。这里每一个都是单独的数据库,需要把双主双从的配置以及 MySQL 的配置文件中所有的配置都注释。这样相当于四台独立的 MySQL。
2.接下来创建数据库:
首先在 158 这台服务器上创建数据库 v_goods(存储商品相关的信息)
创建数据库的语句:
create database v_goods default charset utf8mb4;
创建完成
可以输入语句查询:
然后创建服务器 159 上的数据库
其中存储的是订单信息
create database v_order default charset utf8mb4;
创建完成
三、测试
1.可以输入语句查询:
接下来服务器 160 和 161 上存储的是与日志相关的信息,要创建数据库,输入语句:
create database v_log default charset utf8mb4;
四台 MySQL 中关于该四个数据库创建完成。
到此,将 MyCat 的环境都创建完成。
2. 关闭防火墙
接下来启动 MyCat,但是在 启动 MyCat 之前,要保证所有服务器上的防火墙要全部关闭,先检查防火墙的状态,输入语句:
service iptables status
此时防火墙的状态是关闭的,同样的操作检查 158、159、160、161(检查防火墙是否关闭,避免重启后连接不上 MySQL )
3.将五台服务器所有防火墙都关闭后,启动 MyCat:
发现 mycat server 已经在运行,所以先将其关闭(输入语句 bin/myct stop)
再执行 start 开启,开启后查看 log 中关于 mycat 的日志:
successfully 意味着启动成功,再在 157上登录 mycat(输入语句:mysql-h192.168.192.157 -P 8066 -u root -p ,然后输入密码 123456):
然后通过语句 show databases 查看里面的数据库
数据库中有一逻辑库 V_SHOP,使用 use v_shop 语句:
发现其报错,因为 MyCat 中数据表是严格区分大小写的,所以应该改为:use V_SHOP,然后再输入 show tables:
这时可以看到所有的逻辑库。
注意:在 MyCat 中,可以看到这些逻辑库,但是这些逻辑表的表结构不能看到。
所以在 v_goods 、v_order、v_log 中没有表,如下图示例:
说明只是在逻辑上定义了逻辑库和逻辑表,实际在各个数据中,各个数据库表、表结构都不存在。
4.所以接下来要导出在本地 localhost 的表、表结构以及表中的数据,然后从 MyCat 中执行 SQL 脚本,创建数据表,并导入数据。
从本地数据库中将当前信息导出:
导出前不选择 “CREATE database” 语句,假设选择了该语句:
导出完成,SQL 脚本上传到服务器后打开:
使用 head 指令:
head-30 v_shop.sql
在该 SQL 脚本的前 30 行中,有语句:
CREATE DATABASE /*!32312 IF NOT EXISTS* /v_shop/*!40100 DEFAULT CHARACTER SET utf8mb4 */;
之前说到不选择“CREATE database” 语句,就是为了删除该语句,因为该脚本需要在 MyCat 中执行,MyCat 中 V_SHOP 的逻辑库已经存在,不需要再次创建,所以要将该语句删除。
然后需要对 USE ‘v_shop’这条语句做处理:
在切换数据库时,数据库名严格区分大小写,所以这里不能用小写,将其改为 V_SHOP。
然后保存,并查看保存是否成功:
接下来需要在 MyCat 中执行该脚本,用到指令:
source /root/v_shop.sql
查看当前目录有一个脚本叫 zookeeper:
然后执行:
(执行过程需要等待,因为脚本中要插入很多记录,有很多表结构需要创建)
导入完成:
再次执行语句:show tables
发现在 MyCat 中没有任何变化,因为其展示的是逻辑表。
5.在四台 MySQL 的服务器上查看是否有表结构:
服务器 158:
发现有表结构,第一台服务器存储的是商品相关的表,另外四张表是全局表。
服务器 159:
服务器160:
服务器161:
6.此时要查询一张表,执行语句:
select *from tb_operatelog
在该日志表结构中,一共20条记录。
7.该 20 条记录存储在哪个节点?
由于采用的是水平拆分,所以这张表的数据会被分散,根据一致性 hash 算法分散在 160、161 上,所以这两张表中都有数据,查看:
在第一个节点中有 14 条数据,一共 20 条数据,说明第二个节点中有 6 条,如果是 6 条说明当前的水平拆分是没有问题的,
查看: