机器信息
机器IP | 安装服务 | 暴露端口 |
---|---|---|
192.168.177.128 | mycat服务 | 对外暴露端口8066 |
192.168.177.131 | mysql1 | 对外暴露端口3306 |
192.168.177.132 | mysql2 | 对外暴露端口3306 |
1.1 安装包下载(建议版本保持一致,成功后自己可以尝试新版本)
mycat下载
jdk下载
1.2 解压安装
#解压
tar -zxf jdk-8u251-linux-x64.tar.gz
tar -zxf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
我这边是把解压后的文件都移动到了/usr/local
目录,这个看个人习惯,如果不移动,后面配置jdk和mycat环境变量时候,目录要修改下
1.3配置环境变量
编/etc/
目录下的profile
文件,在文件最后加上环境变量配置
(如果jdk和mycat路径不一致,记得修改)
export JAVA_HOME=/usr/local/java/jdk1.8.0_251
export MYCAT_HOME=/usr/local/mycat
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$PATH:$JAVA_HOME/bin:$MYCAT_HOME/bin
#刷新环境变量配置
source profile
#验证环境变量配置是否生效
java -version
2.1 准备两台mysql实例
我这边是直接用docker起了两个msyql5.7的容器,在做这种演示的时候,docker是非常方便快捷的,一行命令搞定。
docker run --name Mymysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
2.2 初始化数据库以及表
每个示例建立一个user数据库,以及一张user表,作为我们后面分片实验使用。
-- 导出 user 的数据库结构
CREATE DATABASE IF NOT EXISTS `user` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin */;
USE `user`;
-- 导出 表 user.user 结构
CREATE TABLE IF NOT EXISTS `t_user` (
`id` bigint(20) NOT NULL COMMENT 'id',
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '名字',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='用户表';
mycat有三个很重要的配置文件:server.xml、schema.xml、rule.xml
,这里不做展开讲,因为每一个文件都有大量配置,都可以写一整篇文章,而且网上相关介绍资料也很多,大家可以自行查阅。
3.1 配置分片rule
修改rule.xml配置分片规则
<tableRule name="partitionByMod-id-2">
<rule>
<columns>id</columns>
<algorithm>PartitionByMod</algorithm>
</rule>
</tableRule>
<function name="PartitionByMod" class="io.mycat.route.function.PartitionByMod">
<property name="count">2</property>
</function>
3.2 配置schema
<!-- schema name配置逻辑库名,可以定义;table name配置的逻辑表名和准备的两个数据库,表名保持一致 -->
<schema name="demo" checkSQLschema="false" sqlMaxLimit="100">
<table name="t_user" primaryKey="id" dataNode="dn1,dn2" rule="partitionByMod-id-2"/>
</schema>
<!-- 配置两个dataNode,database和两个mysql库名一致 -->
<dataNode name="dn1" dataHost="host1" database="user" />
<dataNode name="dn2" dataHost="host2" database="user" />
<!-- 配置host1代表的是那个数据库实例 -->
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostS1" url="192.168.177.131:3306" user="root" password="123456">
</writeHost>
</dataHost>
<!-- 配置host2代表的是那个数据库实例 -->
<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostS2" url="192.168.177.132:3306" user="root" password="123456">
</writeHost>
</dataHost>
3.3 配置server.xml
<!-- mycat账号 -->
<user name="root" defaultAccount="true">
<!-- mycat密码 -->
<property name="password">123456</property>
<!-- 逻辑库名 -->
<property name="schemas">demo</property>
</user>
4.1 启动:
#或者 mycat restart
mycat start
4.2 查看mycat的日志,看是否启动成功
tail -f /usr/local/mycat/logs/wrapper.log
4.3 测试
我这边使用python进行的测试,因为代码简单。(我是个python菜鸟QAQ)
import MySQLdb
import random
import string
conn = MySQLdb.connect(host="192.168.177.128",port=8066,user="root",passwd ="123456",db="demo",charset='utf8')
conn.autocommit(1)
# 使用cursor()方法获取操作游标
cursor = conn.cursor()
for i in range(1,10):
ran_str = ''.join(random.sample(string.ascii_letters + string.digits, 8))
sqlStr = "insert into t_user(id,name,age,address)values('{}','{}',18,'广东省深圳市')".format(i,ran_str)
cursor.execute(sqlStr)
最后可以看到数据根据id对2取模分到两个库的t_user表中。