mycat配置分片

机器信息

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

1.安装mycat

1.1 安装包下载(建议版本保持一致,成功后自己可以尝试新版本)
mycat下载
jdk下载
mycat配置分片_第1张图片
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环境变量时候,目录要修改下
mycat配置分片_第2张图片
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

mycat配置分片_第3张图片
编辑完成,保存退出,并执行如下命令。

#刷新环境变量配置
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,这里不做展开讲,因为每一个文件都有大量配置,都可以写一整篇文章,而且网上相关介绍资料也很多,大家可以自行查阅。
mycat配置分片_第4张图片
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>

mycat配置分片_第5张图片

  • 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>

mycat配置分片_第6张图片

3.3 配置server.xml

<!-- mycat账号 -->
<user name="root" defaultAccount="true">
	<!-- mycat密码 -->
	<property name="password">123456</property>
	<!-- 逻辑库名 -->
	<property name="schemas">demo</property>
</user>

mycat配置分片_第7张图片

4.启动mycat测试

4.1 启动:

#或者 mycat restart
mycat start

4.2 查看mycat的日志,看是否启动成功

 tail -f /usr/local/mycat/logs/wrapper.log 

mycat配置分片_第8张图片
看到这一行日志,并且前面没报错,说明启动成功。

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)

mycat配置分片_第9张图片
mycat配置分片_第10张图片
最后可以看到数据根据id对2取模分到两个库的t_user表中。

补充:
id对2取模,这些都是定义在rule.xml中的。
mycat配置分片_第11张图片

你可能感兴趣的:(中间件,#,MyCat)