ToB企服应用市场:ToB评测及商务社交产业平台

标题: MySQ分库分表与MyCat安装配置 [打印本页]

作者: 我可以不吃啊    时间: 2024-8-26 17:18
标题: MySQ分库分表与MyCat安装配置
目次
介绍
拆分计谋
垂直拆分
1. 垂直分库 
2. 垂直分表
水平拆分
1. 水平分库‘
2. 水平分表
实现技术
MyCat概述
安装
概念介绍
MyCat入门
需求
环境预备
分片配置
启动服务
连接测试
执行SQL语句测试
MyCat配置
1. schema.xml 
1. schema标签
2. datanode标签
3. datahost标签
2. rule.xml
3. server.xml 
1. system标签 
2. user标签

续接下篇:Mycat分片-垂直拆分-CSDN博客

介绍


问题分析
随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库举行数据存 储,存在以下性能瓶颈:


为相识决上述问题,我们需要对数据库举行分库分表处理。

分库分表的中央头脑都是将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能 问题,从而到达提升数据库性能的目的。 

拆分计谋

分库分表的形式,重要是两种:垂直拆分和水平拆分。而拆分的粒度,一般又分为分库和分表,以是组 成的拆分计谋终极如下:


垂直拆分


1. 垂直分库 


垂直分库:以表为依据,根据业务将不同表拆分到不同库中。
特点:
        每个库的表结构都不一样。
        每个库的数据也不一样。
        全部库的并集是全量数据。

2. 垂直分表



垂直分表:以字段为依据,根据字段属性将不同字段拆分到不同表中。
特点:
        每个表的结构都不一样。
        每个表的数据也不一样,一般通过一列(主键/外键)关联。
        全部表的并集是全量数据。

水平拆分


1. 水平分库‘


水平分库:以字段为依据,按照一定计谋,将一个库的数据拆分到多个库中。 
特点:
        每个库的表结构都一样。
        每个库的数据都不一样。
        全部库的并集是全量数据。

2. 水平分表


水平分表:以字段为依据,按照一定计谋,将一个表的数据拆分到多个表中。
特点:
        每个表的表结构都一样。
        每个表的数据都不一样。
        全部表的并集是全量数据。
   在业务系统中,为了缓解磁盘IO及CPU的性能瓶颈,到底是垂直拆分,还是水平拆分;具体是分 库,还是分表,都需要根据具体的业务需求具体分析。
  
实现技术





MyCat概述


Mycat是开源的、活跃的、基于Java语言编写的MySQL数据库中心件。可以像使用mysql一样来使用 mycat,对于开发职员来说根本感觉不到mycat的存在。
开发职员只需要连接MyCat即可,而具体底层用到几台数据库,每一台数据库服务器里面存储了什么数 据,都无需关心。 具体的分库分表的计谋,只需要在MyCat中配置即可。

优势: 性能可靠稳定 强大的技术团队 体系完善 社区活跃

安装


预备三台虚拟机,关闭防火墙和selinux,举行时间同步。
IP安装软件说明配置系统
192.168.226.100 JDK8,Mycat1.6.7.4,MySQL8.0.39
MyCat中心件服务器;
分片服务器
2焦点2G-20G磁盘centos7-2009-mini
192.168.226.101MySQL8.0.39分片服务器2焦点2G-20G磁盘centos7-2009-mini
192.168.226.102MySQL8.0.39分片服务器2焦点2G-20G磁盘centos7-2009-mini
初始化脚本
  1. #!/bin/bash
  2. echo "=====系统环境初始化脚本====="
  3. sleep 3
  4. echo "——>>> 关闭防火墙与SELinux <<<——"
  5. sleep 3
  6. systemctl stop firewalld
  7. systemctl disable firewalld &> /dev/null
  8. setenforce 0
  9. sed -i '/SELINUX/{s/enforcing/disabled/}' /etc/selinux/config
  10. echo "——>>> 创建阿里仓库 <<<——"
  11. sleep 3
  12. rm -rf /etc/yum.repos.d/*
  13. curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
  14. yum -y install wget
  15. wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo  
  16. echo "——>>> 设置时区并同步时间 <<<——"
  17. sleep 3
  18. timedatectl set-timezone Asia/Shanghai
  19. yum -y install chrony
  20. systemctl start chronyd
  21. systemctl enable chronyd
  22. reboot
复制代码
 给三台主机下载MySQL,并给root用户设置了简朴密码为1234
  1. sudo yum remove mysql-server -y && sudo yum autoremove -y
  2. sudo yum remove *mysql* -y
  3. sudo rm -rf /var/lib/mysql/
  4. sudo rm -rf /etc/mysql/
  5. yum install -y yum-utils > /dev/null
  6. yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm > /dev/null
  7. yum-config-manager --enable mysql80-community > /dev/null
  8. yum-config-manager --disable mysql57-community > /dev/null
  9. yum install -y mysql-server
  10. systemctl start mysqld && systemctl enable mysqld
  11. mysqladmin -p"`awk '/temporary password/{p=$NF}END{print p}' /var/log/mysqld.log`" password 'TianPFh@123'
  12. mysql -p'TianPFh@123' -e "UNINSTALL COMPONENT 'file://component_validate_password'"
  13. mysqladmin -p'TianPFh@123' password '1234'
复制代码

接下来仅对192.168.226.100主机操作
下载JDK8的rpm包形式:Java Archive Downloads - Java SE 8 | Oracle 台灣

上传到192.168.226.100主机安装
  1. yum install -y jdk-8u202-linux-x64.rpm
复制代码
下载Mycat1.6.7.4版本地点:链接:https://pan.baidu.com/s/1MGzS9TtBz7A9PEKjshvzRg?pwd=e2do 
提取码:e2do
  1. tar -zxf Mycat-server-1.6.7.3-release-20210913163959-linux.tar.gz
复制代码
  1. mv mycat/ /usr/local/
复制代码
更换驱动包
  1. cd /usr/local/mycat/lib/
  2. # 删除旧版本
  3. rm -rf mysql-connector-java-5.1.35.jar
  4. # 然后将mysql-connector-java-8.0.22.jar上传到本目录里
  5. # 授权
  6. chmod +777 mysql-connector-java-8.0.22.jar
  7. [root@master lib]# ll |grep mysql-connec*
  8. -rwxrwxrwx 1 root root 2389216 2月  22 2022 mysql-connector-java-8.0.22.jar
复制代码

概念介绍


在MyCat的团体结构中,分为两个部门:上面的逻辑结构、下面的物理结构。

在MyCat的逻辑结构重要负责逻辑库、逻辑表、分片规则、分片节点等逻辑结构的处理,而具体的数据 存储还是在物理结构,也就是数据库服务器中存储的。

MyCat入门


需求

由于 tb_order 表中数据量很大,磁盘IO及容量都到达了瓶颈,现在需要对 tb_order 表举行数 据分片,分为三个数据节点,每一个节点主机位于不同的服务器上, 具体的结构,参考下图:

环境预备

在上面已经预备好啦这三台服务器并安装好了相关软件了
192.168.226.100:MyCat中心件服务器,同时也是第一个分片服务器。
192.168.226.101:第二个分片服务器。
192.168.226.102:第三个分片服务器。

并且在上述3台数据库中创建数据库 db01 。并创建一个可以远程并授权的root用户,此远程root密码为admin 下面是sql语句一键完成。
  1. CREATE DATABASE db01;
  2. create user 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'admin';
  3. grant all on *.* to 'root'@'%';
  4. FLUSH PRIVILEGES;
复制代码

分片配置

这里我配置使用Notepad++连接服务器举行编辑文件,较为方便,连接方式:Notepad++使用SFTP连接虚拟机编辑文档_notepad ftp-CSDN博客
 编辑 /usr/local/mycat/conf/schema.xml 文件
该文件里全部内容参数替换为下述内容。
  1. <?xml version="1.0"?>
  2. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
  3. <mycat:schema xmlns:mycat="http://io.mycat/">
  4.     <schema name="DB01" checkSQLschema="true" sqlMaxLimit="100">
  5.         <table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
  6.     </schema>
  7.     <dataNode name="dn1" dataHost="dhost1" database="db01" />
  8.     <dataNode name="dn2" dataHost="dhost2" database="db01" />
  9.     <dataNode name="dn3" dataHost="dhost3" database="db01" />
  10.     <dataHost name="dhost1" maxCon="1000" minCon="10" balance="0"
  11.               writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
  12.         <heartbeat>select user()</heartbeat>
  13.         <writeHost host="master" url="jdbc:mysql://192.168.226.100:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="admin" />
  14.     </dataHost>
  15.     <dataHost name="dhost2" maxCon="1000" minCon="10" balance="0"
  16.               writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
  17.         <heartbeat>select user()</heartbeat>
  18.         <writeHost host="master" url="jdbc:mysql://192.168.226.101:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="admin" />
  19.     </dataHost>
  20.     <dataHost name="dhost3" maxCon="1000" minCon="10" balance="0"
  21.               writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
  22.         <heartbeat>select user()</heartbeat>
  23.         <writeHost host="master" url="jdbc:mysql://192.168.226.102:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="admin" />
  24.     </dataHost>
  25. </mycat:schema>
复制代码
这里界说了DB01这个逻辑库,逻辑库关联travelrecord这个逻辑表,将其分为dn1,dn2,dn3这三个分片,并将三个分片分别关联到了dhost1,dhost3,dhost3这三个节点,然后界说了这三个节点要关联的数据都为db01库,然后下面将每个节点主构造联到实际mysql节点主机,并配置了节点主机的URL,用户名和密码。

编辑 /usr/local/mycat/conf/server.xml 文件
需要在server.xml中配置用户名、密码,以及用户的访问权限信息,具体的配置如下:
下滑到文件尾部,按照如下修改配置,password为root登录mycat的登录密码,schemas对应的是逻辑库的名字
这里用户名和密码是登陆mycat的,和mysql无关。
此文件仅需要修改下述代码对应的模块即可,其它内容不消改动。
  1.         <user name="root" defaultAccount="true">
  2.                 <property name="password">123456</property>
  3.                 <property name="schemas">DB01</property>
  4.                
  5.                 <!-- 表级 DML 权限设置 -->
  6.                 <!--                
  7.                 <privileges check="false">
  8.                         <schema name="TESTDB" dml="0110" >
  9.                                 <table name="tb01" dml="0000"></table>
  10.                                 <table name="tb02" dml="1111"></table>
  11.                         </schema>
  12.                 </privileges>               
  13.                  -->
  14.         </user>
  15.         <user name="user">
  16.                 <property name="password">123456</property>
  17.                 <property name="schemas">DB01</property>
  18.                 <property name="readOnly">true</property>
  19.         </user>
复制代码

启动服务

  1. # 启动
  2. /usr/local/mycat/bin/mycat start
  3. # 停止命令:/usr/local/mycat/bin/mycat stop
复制代码
  1. [root@master ~]# ss -tnlp
  2. State       Recv-Q Send-Q                           Local Address:Port                                          Peer Address:Port              
  3. LISTEN      0      128                                          *:22                                                       *:*                   users:(("sshd",pid=913,fd=3))
  4. LISTEN      0      1                                    127.0.0.1:32000                                                    *:*                   users:(("java",pid=16698,fd=4))
  5. LISTEN      0      128                                       [::]:22                                                    [::]:*                   users:(("sshd",pid=913,fd=4))
  6. LISTEN      0      50                                        [::]:1984                                                  [::]:*                   users:(("java",pid=16698,fd=85))
  7. LISTEN      0      100                                       [::]:8066                                                  [::]:*                   users:(("java",pid=16698,fd=111))
  8. LISTEN      0      50                                        [::]:44003                                                 [::]:*                   users:(("java",pid=16698,fd=88))
  9. LISTEN      0      70                                        [::]:33060                                                 [::]:*                   users:(("mysqld",pid=963,fd=21))
  10. LISTEN      0      50                                        [::]:40069                                                 [::]:*                   users:(("java",pid=16698,fd=84))
  11. LISTEN      0      100                                       [::]:9066                                                  [::]:*                   users:(("java",pid=16698,fd=107))
  12. LISTEN      0      128                                       [::]:3306                                                  [::]:*                   users:(("mysqld",pid=963,fd=24))
复制代码
连接测试

可以看到mycat中的逻辑库与逻辑表
  1. [root@master ~]# mysql -h 192.168.226.100 -P8066 -p123456
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. Welcome to the MySQL monitor.  Commands end with ; or \g.
  4. Your MySQL connection id is 1
  5. Server version: 5.6.29-mycat-1.6.7.3-release-20210913163959 MyCat Server (OpenCloudDB)
  6. Copyright (c) 2000, 2024, Oracle and/or its affiliates.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  11. mysql> show databases;
  12. +----------+
  13. | DATABASE |
  14. +----------+
  15. | DB01     |
  16. +----------+
  17. 1 row in set (0.00 sec)
  18. mysql> use DB01;
  19. Reading table information for completion of table and column names
  20. You can turn off this feature to get a quicker startup with -A
  21. Database changed
  22. mysql> show tables;
  23. +----------------+
  24. | Tables in DB01 |
  25. +----------------+
  26. | tb_order       |
  27. +----------------+
  28. 1 row in set (0.00 sec)
复制代码
实际的mysql库中是没有变革的
  1. [root@slave ~]# mysql -p1234
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. Welcome to the MySQL monitor.  Commands end with ; or \g.
  4. Your MySQL connection id is 37
  5. Server version: 8.0.39 MySQL Community Server - GPL
  6. Copyright (c) 2000, 2024, Oracle and/or its affiliates.
  7. Oracle is a registered trademark of Oracle Corporation and/or its
  8. affiliates. Other names may be trademarks of their respective
  9. owners.
  10. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  11. mysql> show databases;
  12. +--------------------+
  13. | Database           |
  14. +--------------------+
  15. | information_schema |
  16. | db01               |
  17. | mysql              |
  18. | performance_schema |
  19. | sys                |
  20. +--------------------+
  21. 5 rows in set (0.00 sec)
  22. mysql> use db01
  23. Database changed
  24. mysql> show tables;
  25. Empty set (0.00 sec)
复制代码

执行SQL语句测试

在mycat中执行sql语句
  1. [root@master ~]# mysql -h 192.168.226.100 -P8066 -p123456   # 登录mycat执行
  2. --登录mycat执行这些sql语句,然后登录这三台主机的mysql,看哪个mysql存储了数据.
  3. --因为当前使用的默认分片规则,下面插入的数据会根据一定规则分别进入不同的数据库中.
  4. --规则文件的位置在:/usr/local/mycat/conf/rule.xml  引用规则的文件就在/usr/local/mycat/conf/schema.xml里
  5. -- 创建表TB_ORDER  
  6. CREATE TABLE TB_ORDER (  
  7.     id BIGINT(20) NOT NULL,  
  8.     title VARCHAR(100) NOT NULL,  
  9.     PRIMARY KEY (id)  
  10. ) ENGINE=INNODB DEFAULT CHARSET=utf8;  
  11.   
  12. -- 插入数据  
  13. INSERT INTO TB_ORDER(id, title) VALUES(1, 'goods1');
  14. INSERT INTO TB_ORDER(id, title) VALUES(2, 'goods2');
  15. INSERT INTO TB_ORDER(id, title) VALUES(3, 'goods3');
  16. INSERT INTO TB_ORDER(id,title) VALUES(5000000,'goods5000000');
  17. INSERT INTO TB_ORDER(id,title) VALUES(10000000,'goods10000000');
  18. INSERT INTO TB_ORDER(id,title) VALUES(10000001,'goods10000001');
  19. INSERT INTO TB_ORDER(id,title) VALUES(15000000,'goods15000000');
  20. INSERT INTO TB_ORDER(id,title) VALUES(15000001,'goods15000001');
复制代码
颠末测试,我们发现,在往 TB_ORDER 表中插入数据时:
        假如id的值在1-500w之间,数据将会存储在第一个分片数据库中。
        假如id的值在500w-1000w之间,数据将会存储在第二个分片数据库中。
        假如id的值在1000w-1500w之间,数据将会存储在第三个分片数据库中。
        假如id的值超出1500w,在插入数据时,将会报错。
这是由逻辑表配置时 的一个参数 rule 决定的,而这个参数配置的就是分片规则。

MyCat配置


1. schema.xml 

schema.xml 作为MyCat中最重要的配置文件之一 , 涵盖了MyCat的逻辑库 、 逻辑表 、 分片规 则、分片节点及数据源的配置。

重要包罗以下三组标签:
schema标签:schema 标签界说了一个数据库模式,包罗多个数据节点、路由规则和分片计谋。
datanode标签:schema 标签界说了一个数据库模式,包罗多个数据节点、路由规则和分片计谋。
datahost标签:datahost 标签界说了数据源的连接信息,包括数据库的地点、用户名、密码等。

1. schema标签

schema 界说逻辑库

schema 标签用于界说 MyCat实例中的逻辑库 , 一个MyCat实例中, 可以有多个逻辑库 , 可以通 过 schema 标签来划分不同的逻辑库。MyCat中的逻辑库的概念,等同于MySQL中的database概念 , 需要操作某个逻辑库下的表时, 也需要切换逻辑库(use 库名)。
焦点属性:


schema 中的table界说逻辑表 



2. datanode标签


焦点属性:


3. datahost标签


该标签在MyCat逻辑库中作为底层标签存在, 直接界说了具体的数据库实例、读写分离、心跳语句。
焦点属性:


2. rule.xml

rule.xml中界说全部拆分表的规则, 在使用过程中可以机动的使用分片算法, 或者对同一个分片算法 使用不同的参数, 它让分片过程可配置化。重要包罗两类标签:tableRule、Function。


3. server.xml 


server.xml配置文件包罗了MyCat的系统配置信息,重要有两个重要的标签:system、user。 
1. system标签 

此图为部门展示


重要配置MyCat中的系统配置信息,对应的系统配置项及其含义,如下:
属性取值含义charsetutf8设置 MyCat 的字符集,字符集需要与 MySQL 的字符集保持一致。nonePasswordLogin0, 10: 需要密码登录;1: 不需要密码登录。默认值为 0。假如设置为 1,则需要指定默认账户。useHandshakeV100, 1是否使用 HandshakeV10Packet 来与客户端举行通信。1: 使用;0: 不使用。重要用于兼容高版本的 JDBC 驱动。useSqlStat0, 10: 关闭 SQL 实时统计;1: 开启 SQL 实时统计。开启后 MyCat 会主动统计 SQL 执行情况。useGlobleTableCheck0, 10: 关闭全局表一致性检测;1: 开启全局表一致性检测。sqlExecuteTimeout1000 (秒)SQL 语句执行的超时时间,单位为秒。假如 SQL 执行超时,则会关闭连接。sequnceHandlerType0, 1, 20: 本地文件方式;1: 数据库方式;2: 时间戳列方式。默认使用本地文件方式。sequnceHandlerPattern正则表达式必须带有 MYCATSEQ 或 mycatseq 进入序列匹配流程。注意 MYCATSEQ_ 有空格的情况。subqueryRelationshipChecktrue, false在子查询中存在关联查询的情况下,查抄关联字段中是否有分片字段。默认值为 false。useCompression0, 10: 关闭 MySQL 压缩协议;1: 开启 MySQL 压缩协议。fakeMySQLVersion5.5, 5.6设置模拟的 MySQL 版本号。defaultSqlParserdruidparser, fdbparser指定默认的 SQL 剖析器。MyCat 1.4 之后,默认是 druidparser,fdbparser 已经废除。processors1, 2, ...指定系统可用的线程数目,默认值为 CPU 焦点 × 每个焦点运行线程数目。影响性能调优时的线程池配置。processorBufferChunk字节数指定每次分配 Socket Direct Buffer 的巨细,默认值为 4096 字节。processorExecutor数字指定 NIOProcessor 上共享的 businessExecutor 固定线程池的巨细。packetHeaderSize数字指定 MySQL 协议中的报文头长度,默认值为 4 个字节。maxPacketSize字节数指定 MySQL 协议可以携带的数据最大巨细,默认值为 16MB。idleTimeout30指定连接的空闲时间的超时长度,单位为分钟。假如超时,将关闭资源并接纳。默认值为 30 分钟。txIsolation1, 2, 3, 4初始化前端连接的事务隔离级别。默认值为 REPEATED_READ(数字 3)。serverPort8066界说 MyCat 的使用端口,默认值为 8066。managerPort9066界说 MyCat 的管理端口,默认值为 9066。
2. user标签

配置MyCat中的用户、访问密码,以及用户针对于逻辑库、逻辑表的权限信息,具体的权限形貌方式及 配置说明如下:

在测试权限操作时,我们只需要将 privileges 标签的注释放开。 在 privileges 下的schema 标签中配置的dml属性配置的是逻辑库的权限。 在privileges的schema下的table标签的dml属性 中配置逻辑表的权限。 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4