网站建设的步骤和要点,宁波小程序网络开发公司,网站建设文章缩略图,石景山区百科seo1. 数据分片概念#xff1a;
1.1. 分库分表
什么是分库分表#xff1a; 将存放在一台数据库服务器中的数据#xff0c;按照特定方式#xff08;指的是程序开发的算法#xff09;进行拆分#xff0c;分散存放到多台数据库服务器中#xff0c;以达到分散单台服务器负载的…1. 数据分片概念
1.1. 分库分表
什么是分库分表 将存放在一台数据库服务器中的数据按照特定方式指的是程序开发的算法进行拆分分散存放到多台数据库服务器中以达到分散单台服务器负载的效果。 1.2. 水平分割
横向切分 按照表中指定字段的切片规则将表记录按行切分分散存储到多个数据库中。 1.3. 垂直分割
纵向切分 将单个数据库的多个表按业务类型分类分散存储到不同的数据库。 2. mycat软件介绍 mycat是基于Java的分布式数据库系统中间件为高并发环境的分布式存储提供解决方案适合数据大量写入的存储需求不适合数据大量查询的请求。支持MySQL、Oracle、SQL server、Mongodb等。提供数据读写分离和数据分片服务。基于阿里巴巴Cobar进行研发的开源软件 2.1. 分片规则
mycat 支持提供10种分片规则 枚举法sharding-by-intfile固定分片rule1范围约定auto-sharding-long求模法mod-long日期列分区法sharding-by-date通配取模sharding-by-patternASCII码求模通配sharding-by-prefixpattern编程指定sharding-by-substring字符串拆分hash解析sharding-by-stringhash一致性hashsharding-by-murmur 2.2. 工作流程
当mycat收到一个SQL命令时 解析SQL命令涉及到的表然后看对表的配置如果有分片规则则获取SQL命令里分片字段的值并匹配分片函数获得分片列表然后将SQL命令发往对应的分片服务器去执行最后收集和处理所有分片结果数据并返回到客户端 3. 配置数据分片服务
数据分片拓扑结构注意部署这个架构至少需要三台数据库服务器 IP规划
主机名角色数据库IP地址mysql10客户端无192.168.2.10mycat20分片服务器无192.168.2.20mysql30数据库服务器db1192.168.2.30mysql40数据库服务器db2192.168.2.40mysql50数据库服务器db3192.168.2.50
安装mysql这里就不说了可以参考mysql安装。修改所有服务器的主机名以IP规划的表格为准。
##修改所有主机的hosts文件
[rootmysql10 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.2.10 mysql10
192.168.2.20 mycat20
192.168.2.30 mysql30
192.168.2.40 mysql40
192.168.2.50 mysql503.1. 安装mycat
##安装软件jdk,因为mycat软件需要jdk编译。
[rootmycat20 ~]# yum -y install java-1.8.0-openjdk
##查看java版本
[rootmycat20 ~]# java -version
openjdk version 1.8.0_362
OpenJDK Runtime Environment (build 1.8.0_362-b08)
OpenJDK 64-Bit Server VM (build 25.362-b08, mixed mode)
##下载mycat二进制包
[rootmycat20 ~]# wget http://dl.mycat.org.cn/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
##解压指定目录
[rootmycat20 ~]# tar -xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
##解压是否成功
[rootmycat20 ~]# cd /usr/local/
[rootmycat20 local]# ls mycat/
bin catlet conf lib logs version.txt
配置mycat环境变量
[rootlocalhost ~]# echo export PATH/usr/local/mycat/bin:$PATH /etc/profile.d/mycat.sh
[rootlocalhost ~]# . /etc/profile.d/mycat.sh
[rootlocalhost ~]# echo $PATH
/usr/local/mycat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin3.2. 目录结构
ls /usr/local/mycat
- bin ----mycat命令
- catlet ----扩展功能
- conf ----配置文件
- lib ----mycat使用的jar包
- logs ----mycat启动日志和运行日志
- wrapper.log ----mycat服务启动日志
- mycat.log ----记录SQL脚本执行后报错内容3.3. 修改主配置文件
重要配置文件说明
- server.xml ---设置连接账号及逻辑库
- schema.xml ---配置数据分片存储的表
- rule.xml ---分片规则
- 其他文件 ---分片规则配置文件3.3.1. 创建连接用户(server.xml)
##备份server.xml文件
[rootmycat20 ~]# cd /usr/local/mycat/conf/
[rootmycat20 conf]# cp -r server.xml{,.bak}
##创建连接用户
.xml文件中!-- --代表注释。
[rootmycat20 conf]# vim server.xml
....
修改以下内容
user nameroot ---连接mycat服务用户名property namepassword1234/property ---用户密码property nameschemasmycatdb/property ---逻辑库!-- 表级 DML 权限设置 --!--privileges checkfalseschema nameTESTDB dml0110 table nametb01 dml0000/tabletable nametb02 dml1111/table/schema/privileges--/useruser nameuserproperty namepassword1234/propertyproperty nameschemasmycatdb/propertyproperty namereadOnlytrue/property ---只读权限/user
3.3.2. 定义分片的表(schema.xml)
##定义分片的表schema ...... /schema --定义分片信息对什么表做分片
table ...... /table --定义要分片的表
name --逻辑库名或逻辑表名
dataNode --指定数据节点名
rule --指定使用的分片规则
typeglobal --数据不做分片存储##定义数据节点dataNode 选项值,... .../ --定义数据节点
name --数据节点名
datahost --数据库服务器主机名
database --数据库名##定义数据库服务器IP地址及端口datahost 选项值,... ...... .../datahost --服务器主机名
name --主机名与datahost对应的主机名
host --主机名与IP地址对应的主机名
url --数据库服务器IP地址及端口号
user --数据库服务器授权用户
password --授权用户密码
##备份schema.xml文件
[rootmycat20 conf]# cp -r schema.xml{,.bak}
[rootmycat20 conf]# vim schema.xml
?xml version1.0?
!DOCTYPE mycat:schema SYSTEM schema.dtd
mycat:schema xmlns:mycathttp://io.mycat/schema namemycatdb checkSQLschemafalse sqlMaxLimit100table nametravelrecord dataNodedn1,dn2,dn3 ruleauto-sharding-long /table namecompany primaryKeyID typeglobal dataNodedn1,dn2,dn3 /table namegoods primaryKeyID typeglobal dataNodedn1,dn2,dn3 /table namehotnews dataNodedn1,dn2,dn3rulemod-long /table nameemployee primaryKeyID dataNodedn1,dn2,dn3rulesharding-by-intfile /table namecustomer primaryKeyID dataNodedn1,dn2,dn3rulesharding-by-intfilechildTable nameorders primaryKeyID joinKeycustomer_idparentKeyidchildTable nameorder_items joinKeyorder_idparentKeyid //childTablechildTable namecustomer_addr primaryKeyID joinKeycustomer_idparentKeyid //table/schemadataNode namedn1 dataHostmysql30 databasedb1 /dataNode namedn2 dataHostmysql40 databasedb2 /dataNode namedn3 dataHostmysql50 databasedb3 /dataHost namemysql30 maxCon1000 minCon10 balance0writeType0 dbTypemysql dbDrivernative switchType1 slaveThreshold100heartbeatselect user()/heartbeatwriteHost hosthostM1 url192.168.2.30:3306 usermycatpassword1234/writeHost/dataHost
dataHost namemysql40 maxCon1000 minCon10 balance0writeType0 dbTypemysql dbDrivernative switchType1 slaveThreshold100heartbeatselect user()/heartbeatwriteHost hosthostM2 url192.168.2.40:3306 usermycatpassword1234/writeHost/dataHostdataHost namemysql50 maxCon1000 minCon10 balance0writeType0 dbTypemysql dbDrivernative switchType1 slaveThreshold100heartbeatselect user()/heartbeatwriteHost hosthostM3 url192.168.2.50:3306 usermycatpassword1234/writeHost/dataHost
/mycat:schema 4. 配置数据库服务器
根据分片配置做相应的设置
添加授权用户创建数据库
##创建授权用户
mysql grant all on *.* to mycat% identified by 1234; ---在mysql30、mysql40、mysql50执行。
##创建数据库
mysql create database db1 default chatsetutf8; ---在mysql30执行
mysql create database db2 default charsetutf8; --在mysql40执行
mysql create database db3 default charsetutf8; ---在mysql50执行以上的操作是根据mycat配置文件schema.xml的内容
5. 启动mycat服务
[rootmycat20 conf]# mycat start
Starting Mycat-server...
[rootmycat20 conf]# netstat -nltp | grep 8066
tcp6 0 0 :::8066 :::* LISTEN 9719/java6. 客户端连接分片服务器
[rootmysql10 ~]# mysql -uroot -p1234 -h192.168.2.20 -P8066
mysql show databases;
----------
| DATABASE |
----------
| mycatdb | ---逻辑库
----------
mysql use mycatdb
mysql show tables;
-------------------
| Tables in mycatdb |
-------------------
| company | ---这些都是逻辑表
| customer |
| customer_addr |
| employee |
| goods |
| hotnews |
| orders |
| order_items |
| travelrecord |
-------------------
9 rows in set (0.00 sec) 登录分片服务器的用户名密码是图片上定义 分片服务器上的逻辑库和逻辑表是图片上定义的
7. 分片规则
7.1.枚举法(sharding-by-intfile)
字段值必须在规则文件定义的值里选择
[rootmycat20 conf]# vim schema.xml
table nameemployee primaryKeyID dataNodedn1,dn2,dn3rulesharding-by-intfile /
##可以看的出来employee这个表格必须有ID这个字段并且约束条件是主键分片规则是枚举法(sharding-by-intfile)
##查看枚举法的详细内容
[rootmycat20 conf]# vim rule.xml
tableRule namesharding-by-intfilerulecolumnssharding_id/columns --指定employee这个表格必须有sharding_id这个字段名algorithmhash-int/algorithm 算法/rule
....
##定义算法的function namehash-intclassio.mycat.route.function.PartitionByFileMap ---算法property namemapFilepartition-hash-int.txt/property ---定义分片规则的值的配置文件/function
##查看sharding_id字段名的值范围
[rootmycat20 conf]# vim partition-hash-int.txt
100000 ---代表dn1
100101 ---代表dn2
100202 ---代表dn37.1.1. 重启mycat服务
[rootmycat20 conf]# mycat stop;mycat start
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...7.1.2. 创建employee表
##登录分片服务器创建employee表格
[rootmysql10 ~]# mysql -umycat -p1234 -h192.168.2.20 -P8066
mysql create table employee(- ID int primary key auto_increment, ---schema.xml指定的字段名- sharding_id int not null, 分片规则指定字段- name char(20) not null,- sex enum(boy,girl) not null,- age int unsigned not null,- homedir char(50) not null);
Query OK, 0 rows affected (0.08 sec)
mysql desc employee;
---------------------------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
---------------------------------------------------------------------
| ID | int(11) | NO | PRI | NULL | auto_increment |
| sharding_id | int(11) | NO | | NULL | |
| name | char(20) | NO | | NULL | |
| sex | enum(boy,girl) | NO | | NULL | |
| age | int(10) unsigned | NO | | NULL | |
| homedir | char(50) | NO | | NULL | |
---------------------------------------------------------------------
6 rows in set (0.09 sec)
##在mycat分片服务器上创建employee这个表格mysql30、mysql40、mysql50都应该有这个表格这里就不显示出来了。7.1.3. 验证枚举法
##往employee表格插入数据sharding_id赋值为100010代表数据存储在mysql40上。
mysql insert into employee(sharding_id,name,sex,age,homedir) values(10010,bob,boy,29,china);
##进入mysql40验证数据是否在。
mysql select * from employee;
--------------------------------------------------------------------------
| ID | sharding_id | name | sex | age | homedir |
--------------------------------------------------------------------------
| 1 | 10010 | bob | boy | 29 | china |
--------------------------------------------------------------------------1 row in set (0.01 sec)
##还可以验证mysql30、mysql50的employee表格是否有这个数据这里就不展示了正确的应该这两台都没有。7.2. 求模法(mod-long)
根据字段值与设定的数字求模结果存储数据,意思就是取余。
##查看hotnews表定义的内容分片规则为求模法。
[rootmycat20 conf]# vim schema.xml
table namehotnews dataNodedn1,dn2,dn3rulemod-long /##查看求模法定义的字段名以及算法范围
[rootmycat20 conf]# vim rule.xmltableRule namemod-long39 rule40 columnsmod_id/columns41 algorithmmod-long/algorithm42 /rule43 /tableRule
......
function namemod-long classio.mycat.route.function.PartitionByMod
106 !-- how many data nodes --
107 property namecount3/property --定义mod_id值除以3余数为0存储dn1,余数为1存储在dn2,余数为2存储在dn3。
108 /function7.2.1. 重启mycat服务
[rootmycat20 conf]# mycat stop; mycat start
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...7.2.2. 创建hotnews表
mysql create table hotnews( mod_id int not null, title char(20) not null, worker char(15) not null);7.2.3. 验证求模法
##往hotnews表格插入数据
mysql insert into hotnews(mod_id,title,worker) values(1,system,bob);
##mod_id的值为1除以3余1所以数据存储在dn2(mysql40)
##在mysql40上查看数据
mysql select * from hotnews;
------------------------
| mod_id | title | worker |
------------------------
| 1 | system | bob |
------------------------
1 row in set (0.00 sec)
##正确情况下mysql30和mysql50的hotnews表是没有数据的,这里不展示了。8. 不分片存储(typeglobal)
##typeglobal意思是不用分片,存储数据在dn1、dn2、dn3上都存。table namegoods primaryKeyID typeglobal dataNodedn1,dn2,dn3 /8.1. 创建表格goods并插入数据
mysql create table goods(- ID int primary key auto_increment,- name char(15)not null,- sex enum(boy,girl)not null,- age int unsigned not null);
Query OK, 0 rows affected (0.02 sec)
##插入数据
mysql insert into goods(name,sex,age) values(bob,boy,25),(andy,boy,19),(lucy,girl,18);8.2.验证
[rootmysql10 ~]# mysql -umycat -p1234 -h192.168.2.30 -e select * from db1.goods
mysql: [Warning] Using a password on the command line interface can be insecure.
---------------------
| ID | name | sex | age |
---------------------
| 1 | bob | boy | 25 |
| 2 | andy | boy | 19 |
| 3 | lucy | girl | 18 |
---------------------
[rootmysql10 ~]# mysql -umycat -p1234 -h192.168.2.40 -e select * from db2.goods
mysql: [Warning] Using a password on the command line interface can be insecure.
---------------------
| ID | name | sex | age |
---------------------
| 1 | bob | boy | 25 |
| 2 | andy | boy | 19 |
| 3 | lucy | girl | 18 |
---------------------
[rootmysql10 ~]# mysql -umycat -p1234 -h192.168.2.50 -e select * from db3.goods
mysql: [Warning] Using a password on the command line interface can be insecure.
---------------------
| ID | name | sex | age |
---------------------
| 1 | bob | boy | 25 |
| 2 | andy | boy | 19 |
| 3 | lucy | girl | 18 |
---------------------