Mycat 是一个开源的分布式数据库系统,是一个实现了 Mysql 协议的服务器,前端用户可以把它看作是一个数据库代理,用 Mysql Mysql 客户端工具和命令行访问,而其后端可以用原生协议与个 Mysql 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端 Mysql 服务器里或者其他数据库里。
- Mycat端口:
- 数据端口 8066
- 管理端口 9066
部署Mycat
环境准备
## 用 hostnamectl set-hostname 根据角色更改主机名
## 关闭防火墙和selinux
[root@mycat ~]# systemctl stop firewalld
[root@mycat ~]# systemctl disable firewalld
[root@mycat ~]# setenforce 0
## 更改 /etc/hosts 文件
[root@mycat ~]# cat >/etc/hosts << EOF
192.168.1.1 mycat
192.168.1.2 master
192.168.1.3 slave1
192.168.1.4 slave2
EOF
## 分发到其他服务器上
[root@mycat ~]# scp /etc/hosts root@master:/etc/hosts
[root@mycat ~]# scp /etc/hosts root@slave1:/etc/hosts
[root@mycat ~]# scp /etc/hosts root@slave2:/etc/hosts
## 在 master、slave1和slave2做Mysql一主双从复制(M-S-S)
安装Mycat
Mycat官方
## Mycat依赖于Java环境
[root@mycat ~]# yum install java -y
[root@mycat ~]# java -version
openjdk version "1.8.0_201"
OpenJDK Runtime Environment (build 1.8.0_201-b09)
OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)
## 下载Mycat
[root@mycat ~]# wget http://dl.mycat.io/1.6.6.1/Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
[root@mycat ~]# mkdir /soft/
[root@mycat ~]# tar xf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz -C /soft/
配置应用程序连接 Mycat 账户密码
## 在配置文件最低下有 Mycat 账号密码和对应的权限配置
[root@mycat ~]# vim /soft/mycat/conf/server.xml
<!-- 应用连接 mycat 账户(defaultAccount默认连接用户,false=否,true=是) -->
<user name="test" defaultAccount="true">
<!-- 应用连接 mycat 密码 -->
<property name="password">123456</property>
<!-- 针对哪个库进行授权,多库用逗号隔开 -->
<property name="schemas">test,www</property>
<!-- 表级 DML 权限设置(check是否开启,false=否,true=是) -->
<privileges check="false">
<!-- 针对数据下的所有表授权(1=有,0=没有,分别对应:insert,update,select,delete) -->
<schema name="TEST" dml="0110" >
<!-- 针对数据下的单个表授权 -->
<table name="t1" dml="0000"></table>
<table name="t2" dml="1111"></table>
</schema>
</privileges>
</user>
<user name="www">
<property name="password">123456</property>
<property name="schemas">www</property>
<!-- 是否只读 -->
<property name="readOnly">false</property>
</user>
配置 Mycat 连接后端数据库
balance
负载均衡轮询balance="0"
不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。balance="1"
所有的主机都参与 select 语句的负载均衡, 但写语句还是由 writeHostbalance="2"
所有读操作都随机的在 writeHost、readhost 上分发。
writeType
负载均衡状态writeType="0"
所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeType="1"
所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。
作者:Johnny_Kam
链接:https://www.jianshu.com/p/4e15cad5ce6a
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
[root@mycat ~]# vim /soft/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 定义逻辑库(逻辑库名、是否分片、返回最大行数、数据节点) -->
<schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema>
<schema name="www" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"> </schema>
<!-- 定义数据节点(数据节点名、数据库实例、真实数据库名) -->
<dataNode name="dn1" dataHost="dn1pool" database="test" />
<dataNode name="dn2" dataHost="dn2pool" database="www" />
<!-- 定义 test 数据库实例(实例名、最大连接数、最初连接数、负载均衡轮询、负载均衡状态、数据库类型、连接类型、是否自动切换、) -->
<dataHost name="dn1pool" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<!-- 健康检查 -->
<heartbeat>select user()</heartbeat>
<!-- 定义读写主机 , 可以定义多个 -->
<writeHost host="master" url="master:3306" user="test" password="Sgy123.com">
<readHost host="slave1" url="slave1:3306" user="test" password="Sgy123.com" />
<readHost host="slave2" url="slave2:3306" user="test" password="Sgy123.com" />
</writeHost>
</dataHost>
<dataHost name="dn2pool" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<!-- 健康检查 -->
<heartbeat>select user()</heartbeat>
<writeHost host="master" url="master:3306" user="www" password="Sgy123.com">
<readHost host="slave1" url="slave1:3306" user="www" password="Sgy123.com" />
<readHost host="slave2" url="slave2:3306" user="www" password="Sgy123.com" />
</writeHost>
</dataHost>
</mycat:schema>
配置 master 上添加相应的用户和数据库和模拟数据
## 模拟数据省略。。。
mysql> create databse test;
mysql> create databse www;
## 模拟数据省略。。。
mysql> grant all on *.* to test@'192.168.1.%' identified by 'Sgy123.com';
mysql> grant all on www.* to www@'192.168.1.%' identified by 'Sgy123.com';
启动 Mycat 中间件
[root@mycat conf]# /soft/mycat/bin/mycat start
Starting Mycat-server...
[root@mycat logs]# lsof -i :8066
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 7905 root 81u IPv6 107719 0t0 TCP *:8066 (LISTEN)
[root@mycat logs]# lsof -i :9066
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 7905 root 77u IPv6 107717 0t0 TCP *:9066 (LISTEN)
连接 Mycat 中间件
[root@mycat ~]# mysql -P8066 -utest -p'123456' -h127.0.0.1
[root@mycat ~]# mysql -P9066 -utest -p'123456' -h127.0.0.1
[root@mycat ~]# mysql -P8066 -uwww -p'123456' -h127.0.0.1
[root@mycat ~]# mysql -P9066 -uwww -p'123456' -h127.0.0.1