Mycat及MySQL实例部署情况:
Mycat(版本:5.6.29):
IP:192.168.227.6,Port:3310/3311
MySQL(版本:5.6.29) :注意MySQL版本最好5,6以上,刚开始yum安装默认版本5.1.73版本总报错
userHost1,IP:192.168.227.3,Port:3306
userHost2,IP:192.168.227.4,Port:3306
架构图:
数据字典为全局表,2个库表数据一样
用户表按UID%2来分库表
用户地址表按userID跟随用户表
1,首先安装mysql:
安装节点:(192.168.227.3,192.168.227.4)
yum安装MySQL,一定要注意安装的版本,要是版本太低推荐源码安装
mysql安装:
yum -y install mysql-server yum安装MySQL
service mysqld start 启动MySQL
chkconfig mysqld on 添加到开机启动项
mysql 进入mysql客户端
use mysql 切换库
delete from user; 删除默认权限表
重新创建权限用户
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
flush privileges; 刷新权限
quit 退出
mysql -u root -p 登陆(带用户)
如果是centos7,直接安装MySQL会报错:
原因是:
CentOS7带有MariaDB而不是MySQL,MariaDB和MySQL一样也是开元的数据库
解决方案:
如果必须要安装MySQL,首先必须添加mysql社区repo通过输入命令:sudo rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm,最后使用像安装MySQL的常规方法一样安装mysql: yum install mysql mysql-server mysql-libs mysql-server
2,安装Mycat
去Mycat官网下载安装包:http://www.mycat.io/ 选择自己需要的版本
上传到192.168.227.6服务器上
tar -zxvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz #解压
3,配置Mycat
server.xml:
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useSqlStat">1</property>
<property name="useGlobleTableCheck">0</property>
<property name="defaultSqlParser">druidparser</property>
<property name="sequnceHandlerType">2</property>
<property name="processorBufferPoolType">0</property>
<property name="serverPort">3310</property> <!-- mycat的使用端口 -->
<property name="managerPort">3311</property> <!-- mycat的管理端口 -->
<property name="handleDistributedTransactions">0</property>
<property name="useOffHeapForMerge">1</property>
<property name="memoryPageSize">1m</property>
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<property name="systemReserveMemorySize">389m</property>
</system>
<user name="root"><!--登陆mycat用户名-->
<property name="password">123456</property><!--登陆mycat密码-->
<!--数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库db1,db2,则配置db1,dbs-->
<property name="schemas">db_user</property>
<property name="readOnly">false</property>
</user>
</mycat:server>
schema.xml:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 数据库配置,与server.xml中的数据库对应 -->
<schema name="db_user" checkSQLschema="false" sqlMaxLimit="100">
<table name="data_dictionary" type="global" dataNode="db_user_dataNode1,db_user_dataNode2" primaryKey="dataDictionaryID"/>
<table name="users" dataNode="db_user_dataNode$1-2" rule="mod-userID-long" primaryKey="userID"> <!-- 对2取模,详见rule.xml -->
<childTable name="user_address" joinKey="userID" parentKey="userID" primaryKey="addressID"/>
</table>
</schema>
<!-- 分片配置 -->
<!-- db_user -->
<dataNode name="db_user_dataNode1" dataHost="db_userHOST1" database="db_user" />
<dataNode name="db_user_dataNode2" dataHost="db_userHOST2" database="db_user" /> <!-- 配置db_user的节点主机 -->
<dataHost name="db_userHOST1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="userHost1" url="192.168.227.3:3306" user="root" password="password">
</writeHost>
</dataHost>
<dataHost name="db_userHOST2" 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="userHost2" url="192.168.227.4:3306" user="root" password="password">
</writeHost>
</dataHost>
</mycat:schema>
修改rule.xml中下列配置项:
<tableRule name="mod-userID-long">
<rule>
<columns>userID</columns> <!-- t1的分片列 -->
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property> <!-- count值与分片个数相同 -->
</function>
保存 启动mycat ./mycat start
db_user建表语句:
DROP TABLE IF EXISTS `data_dictionary`;
CREATE TABLE `data_dictionary` (
`dataDictionaryID` int(11) NOT NULL COMMENT '数据字典ID',
`displayName` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '显示名称',
`value` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '数据字典取值',
`createTime` datetime DEFAULT NULL COMMENT '创建时间',
`lastUpdate` datetime DEFAULT NULL COMMENT '最后更新时间',
PRIMARY KEY (`dataDictionaryID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Table structure for user_address
-- ----------------------------
DROP TABLE IF EXISTS `user_address`;
CREATE TABLE `user_address` (
`addressID` int(11) NOT NULL COMMENT '地址ID',
`receiver` varchar(16) COLLATE utf8_bin DEFAULT NULL COMMENT '收货人',
`addressDetail` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '地址详细',
`userID` int(11) NOT NULL COMMENT '用户ID',
`createTime` datetime DEFAULT NULL COMMENT '创建时间',
`lastUpdate` datetime DEFAULT NULL COMMENT '最后更新时间',
PRIMARY KEY (`addressID`,`userID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`userID` int(11) NOT NULL COMMENT '用户ID',
`username` varchar(16) COLLATE utf8_bin DEFAULT NULL COMMENT '用户名',
`phoneNum` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '手机号码',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`ddID` int(11) DEFAULT NULL COMMENT '所属会员类型',
`createTime` datetime DEFAULT NULL COMMENT '注册时间',
`lastUpdate` datetime DEFAULT NULL COMMENT '最后更新时间',
PRIMARY KEY (`userID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;