MyCat 中间件
# MyCat 中间件
MyCat 是一款 数据集群软件,支持 MySQL 和常用的关系型数据库
# Windows 命令安装 mysql
# 卸载mysql服务
sc delete mysql
# mysql初始化
mysqld --initialize
# 安装
mysqld install
# 启动服务
net start mysql
# 输出控制台 用于查看错误信息
mysqld --console
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# mysql 忘记密码
vi /etc/my.cnf
#在[mysqld]下添加编码配置
skip-grant-tables #无需密码进入mysql
mysql -uroot -p #直接回车进入
#修改密码
use mysql;
update user set authentication_string=password('123456') where user='root';
#刷新权限
flush privileges;
exit;
#删除之前的无密码
vi /etc/my.cnf
systemctl restart mysqld #重启
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 安装
mysql
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql-community-server
systemctl start mysqld.service
grep "password" /var/log/mysqld.log
mysql -uroot -p
#修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';
#关闭密码强度检测
grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;
flush privileges;
#退出
exit
#防火墙
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
#配置默认编码为UTF-8 修改/etc/my.cnf配置文件,在[mysqld]下添加编码配置,如下所示
vi /etc/my.cnf
#在[mysqld]下添加
character_set_server=utf8
collation-server=utf8_general_ci
init_connect='SET NAMES utf8'
systemctl restart mysqld
# 开机启动
systemctl enable mysqld
systemctl daemon-reload
#用户名为root 密码为A37
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
mycat
#上传mycat到linux上
tar -xvf Mycat-server-1.6.7.6-release-20210730131311-linux.tar.gz
# 编辑环境变量
vi /etc/profile
#添加以下内容
export MYCAT_HOME=/root/mycat
source /etc/profile
cd /root/mycat/bin
./mycat start
firewall-cmd --zone=public --add-port=8066/tcp --permanent
firewall-cmd --reload
#用户root 密码123456 端口8066
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 克隆
克隆重新生成 mac 地址
并修改 mysql 的 uuid 随机改一下
vi /var/lib/mysql/auto.cnf
1
# 主重复制
MyCat 的读写分离 需要用到主从复制 从表会根据主表进行同步
我们在写数据时 写入主表 而读取从从表中读取
#在主服务器上
vi /etc/my.cnf
#在[mysqld]加上 log-bin 开启主从复制 server-id 主从服务器的唯一标识
log-bin=mysql-bin
server-id=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
service mysqld restart
mysql -uroot -p
# 需要 file和position的值 配置从服务器用
show master status;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#在从服务器上
vi /etc/my.cnf
#在[mysqld]加上
server-id=2
mysql -uroot -p
use mysql;
drop table slave_master_info;
drop table slave_relat_log_info;
drop table slave_worker_info;
drop table innodb_index_stats;
drop table innodb_table_stats;
sorce /usr/share/mysql/mysql_system_tables.sql;
serveice mysqld restart
mysql -uroot -p
change master to master_host='主服务器ip',master_port=3306,master_user='root',master_password='password',master_log_file='刚刚在主服务器查到的值',master_log_pos=同样也是之前查到的;
# 开启从节点
start slave;
# 查询结果 Slave_IO_Runing和Slave_SQL_Running都为yes才成功
show slave status\G;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 读写分离
需要先配置主从复制 写操作只写主服务器 而读取是从从服务器中数据
# 修改server.xml
vi /root/mycat/conf/server.xml
1
2
2
<user name="root" defaultAccount="true">
<!-- 密码 -->
<property name="password">123456</property>
<!-- 库名 -->
<property name="schemas">TESTDB</property>
<property name="defaultSchema">TESTDB</property>
</user>
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 修改schema.xml
vi /root/mycat/conf/schema.xml
1
2
2
<!-- 建议百度找配置文件这个不太准确 -->
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- name为主服务器 server文件的虚拟库名与name必须一致 -->
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
<table name="customer" primaryKey="id" dataNode="dn1,dn2" rule="sharding-by-intfile" autoIncrement="true" fetchStoreNodeByJdbc="true">
<childTable name="customer_addr" primaryKey="id" joinKey="customer_id" parentKey="id"> </childTable>
</table>
</schema>
<!-- name必须与datenode一致 database为真实的库名 -->
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 主服务器 host自定义 url为写的数据的地址+端口 user passwd -->
<writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="root"
password="root">
<!-- 从服务器 负责读 -->
<readHost host="hostS1" url="从服务器+端口" user="" password="">
</writeHost>
</dataHost>
</mycat:schema>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 重启 mycat
./mycat restart
1
2
2
使用时连接 mycat 的地址使用即可
# 分库分表
将庞大数据量拆分为不同的数据库和数据表进行存储
# 水平拆分
根据表的数据逻辑关系,将同一表中的数据按某种条件,拆分到多台服务器上,也叫横向拆分
修改主服务器中 server.xml vi /root/mycat/conf/server.xml
<!-- 添加property 配置主键方式 0为本地文件方式 --> <property name="sequnceHandlerType">0</property>1
2
修改主服务器的 sequence_conf.properties vi /root/mycat/conf/sequence_conf.properties
GLOBAL.HISIDS= #可以自定义关键字 GLOBAL.MINID=10001 #最小值 GLOBAL.MAXID=20000 #最大值1
2
3
修改 schema.xml vi /root/mycat/conf/schema.xml
<mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <table name="customer" primaryKey="id" dataNode="dn1,dn2,dn3" rule="mod-long"> </table> </schema> <!-- name必须与datenode一致 database为真实的库名 --> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataNode name="dn2" dataHost="localhost1" database="db2" /> <dataNode name="dn3" dataHost="localhost1" database="db3" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- 主服务器 host自定义 url为写的数据的地址+端口 user passwd --> <writeHost host="hostM1" url="localhost:3306" user="root" password="root"> <!-- 从服务器 负责读 --> <readHost host="hostS1" url="从服务器+端口" user="" password=""> </writeHost> </dataHost> </mycat:schema>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
修改 rule.xml vi /root/mycat/conf/rule.xml
<function name='mod-log' class='io.mycat.route.function.PartitionBymod'> <property name='count'>3</property> </function>1
2
3
插入数据列名必须完整 如果是自增键 则需要用 NEXT VALUE FOR MYCATSEQ_GLOBAL 不能用 null
以上配置用的是根据主键取模方式拆分
# 垂直拆分
根据业务的维度,将不同的表切分到不同数据库上,也叫纵向拆分
修改 schema.xml vi /root/mycat/conf/schema.xml
<mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> </table> <table name="dog" primaryKey="id" autoIncrement='true' dataNode='dn4'> </table> <table name="cat" primaryKey="id" autoIncrement='true' dataNode='dn5'> </table> </schema> <!-- name必须与datenode一致 database为真实的库名 --> <dataNode name="dn4" dataHost="localhost1" database="db1" /> <dataNode name="dn5" dataHost="localhost1" database="db2" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- 主服务器 host自定义 url为写的数据的地址+端口 user passwd --> <writeHost host="hostM1" url="localhost:3306" user="root" password="root"> <!-- 从服务器 负责读 --> <readHost host="hostS1" url="从服务器+端口" user="" password=""> </writeHost> </dataHost> </mycat:schema>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24根据 表名 区分库 如 dog 存放在 db1 中 cat 存放在 db2 中
编辑 (opens new window)
上次更新: 2023/12/06, 01:31:48