mycat配置分片

机器信息

机器IP安装服务暴露端口
192.168.177.128mycat服务对外暴露端口8066
192.168.177.131mysql1对外暴露端口3306
192.168.177.132mysql2对外暴露端口3306
1.安装mycat

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.准备mysql实例

2.1 准备两台mysql实例
我这边是直接用docker起了两个msyql5.7的容器,在做这种演示的时候,docker是非常方便快捷的,一行命令搞定。

docker run --name Mymysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

注意:

  1. 以上命令要先安装docker,安装方法参考往期docker文章
  2. 你可以在同一台机器上起两个mysql容器,那么记得修改端口映射,例如一个是 -p 3306:3306另一个就得配置 -p {自定义端口}:3306;如果你是每台机器起一个mysql示例,那么上面命令不用做任何修改,直接分别执行就好(此处只做演示用,没有配置挂载数据卷及其它一些mysql配置)
  3. 记得开防火墙

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='用户表';
3.配置分片

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>

在这里插入图片描述

  • tableRule - name:我们定义的规则名称,自己取,最好见文知意。rule.xml文件不能有相同的tableRule name
  • cloumns:对那个字段进行分片
  • algorithm:和下面的function标签name对应上就好
  • function - class:定义分片算法,io.mycat.route.function.PartitionByMod,mycat提供了很多种分片算法
  • property name=“count”:分片节点数,对应schema.xml中,table标签 dataNode配置数量

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.启动mycat测试

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表中。

补充:
id对2取模,这些都是定义在rule.xml中的。
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值