当前位置: 首页 > news >正文

数据库切片

一、  概述

随着业务的扩大,数据量呈指数级增长。对于一些不便使用nosql的场景,关系型数据库难以满足快速查询和插入数据的需求。这就需要做数据库集群,将一个数据库中的数据分散到不同的数据库存储,这种分散数据库负载的技术是数据库分片。

数据的切分,根据切分规则的类型,可以分为两种切分模式。一种是按照不同的表来切分到不同的数据库,这种称为垂直切分或纵向切分。另一种是根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库机上面,这种称为水平切分或横向切分。

二、  mycat

实现数据库分片涉及到查询数据库时查哪个库,插入数据时插入哪个库等麻烦的问题。使用mycat可以解决相关的问题。

mycat基于阿里的cobar。cobar擅长mysql数据库分片。mycat对cobar进行了重构,使用NIO重构了网络模块,优化了buffer内核,增强了聚合,join等基本特性,兼容大多数数据库。mycat,作为数据库中间件,支持mysql集群或者mariadb集群,提供高可用性数据分片集群,在使用上几乎与mysql无异。

mycat通过定义表的分片规则来实现分片,每个表格可以捆绑一个分片规则,每个分片规则指定一个分片字段并绑定一个函数,来实现动态分片算法。

三、  mycat的安装

要求jdk1.7以上,mysql5.5以上。官网下载mycal,有windows版和linux版的,装法基本相同。

linux安装,将压缩包解压到/usr/local下。在bin目录下,./mycat  start,后台启动。mycat默认端口是8066。

四、  mycat的分片

创建三个数据库节点,分别创建数据库db1,db2,db3,将mycat安装到节点1上。

配置mycat的conf中的schema.xml文件。

在配置文件中,schema用于定义mycat实例中的逻辑库;table定义了mycat中的逻辑表;datanode定义了mycat中的数据节点,也就是数据分片;datahost在mycat逻辑库中也是作为最底层的标签,指定定义了具体的数据库实例、读写分离配置和心跳语句。

在linux版本的mysql中,需要配置mysql为大小写不敏感,否则发生表找不到的问题。在mysql配置文件/etc/my.cnf[mysqld]中增加一行lower_case_table_names=1。

配置schema.xml,注意配置所有节点数据库的远程访问授权。

<?xmlversion="1.0"?>

<!DOCTYPEmycat:schema SYSTEM "schema.dtd">

<mycat:schemaxmlns:mycat="http://org.opencloudb/">



        <schema name="e3shop"checkSQLschema="false" sqlMaxLimit="100">

                <!-- auto sharding by id(long) -->

                <table name="tb_item"dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />

        </schema>

        <dataNode name="dn1"dataHost="localhost1" database="db1" />

        <dataNode name="dn2"dataHost="localhost1" database="db2" />

        <dataNode name="dn3"dataHost="localhost2" database="db3" />

        <dataHostname="localhost1" maxCon="1000" minCon="10"balance="0"

                writeType="0"dbType="mysql" dbDriver="native"switchType="1" slaveThreshold="100">

                <heartbeat>select user()</heartbeat>

                <!-- can have multi writehosts -->

                <writeHosthost="hostM1" url="192.168.0.121:3306"user="root"

                       password="123456">

                        <!-- can have multiread hosts -->



                </writeHost>

        </dataHost>

         <dataHostname="localhost2" maxCon="1000" minCon="10"balance="0"

                writeType="0"dbType="mysql" dbDriver="native"switchType="1" slaveThreshold="100">

                <heartbeat>select user()</heartbeat>

                <!-- can have multi writehosts -->

                <writeHosthost="hostM1" url="192.168.0.102:3306"user="root"

                       password="123456">

                        <!-- can have multiread hosts -->



                </writeHost>

        </dataHost>

</mycat:schema>

配置server.xml

<?xmlversion="1.0" encoding="UTF-8"?>

<!-- - - Licensedunder the Apache License, Version 2.0 (the "License");

        - you may not use this file except incompliance with the License. - You

        may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0

        - - Unless required by applicable lawor agreed to in writing, software -

        distributed under the License isdistributed on an "AS IS" BASIS, - WITHOUT

        WARRANTIES OR CONDITIONS OF ANY KIND,either express or implied. - See the

        License for the specific languagegoverning permissions and - limitations

        under the License. -->

<!DOCTYPEmycat:server SYSTEM "server.dtd">

<mycat:serverxmlns:mycat="http://org.opencloudb/">

        <system>

        <propertyname="defaultSqlParser">druidparser</property>

      <!-- <property name="useCompression">1</property>--><!--1为开启mysql压缩协议-->

        <!-- <propertyname="processorBufferChunk">40960</property> -->

        <!--

        <propertyname="processors">1</property>

        <propertyname="processorExecutor">32</property>

         -->

                <!--默认是65535 64K 用于sql解析时最大文本长度 -->

                <!--<propertyname="maxStringLiteralLength">65535</property>-->

                <!--<propertyname="sequnceHandlerType">0</property>-->

                <!--<propertyname="backSocketNoDelay">1</property>-->

                <!--<propertyname="frontSocketNoDelay">1</property>-->

                <!--<propertyname="processorExecutor">16</property>-->

                <!--

                        <property name="mutiNodeLimitType">1</property>0:开启小数量级(默认) ;1:开启亿级数据排序

                <propertyname="mutiNodePatchSize">100</property> 亿级数量排序批量

                        <propertyname="processors">32</property> <propertyname="processorExecutor">32</property>

                        <propertyname="serverPort">8066</property> <propertyname="managerPort">9066</property>

                        <propertyname="idleTimeout">300000</property> <propertyname="bindIp">0.0.0.0</property>

                        <property name="frontWriteQueueSize">4096</property><property name="processors">32</property> -->

        </system>

        <user name="user">

                <propertyname="password">user</property>

                <propertyname="schemas">e3shop</property>

        </user>

</mycat:server>

重启mycat。

连接mycat,mysql  -h  192.168.0.121  -P  8066 -u  user  –p

测试,进入mycat客户端,创建schema中定义的表,插入一定量的数据。mycat中根据id的长度的规则,每个数据库放500万条数据,当id的值在500万以及以内时放在db1,500万以上以及1000万及以内时放在db2,1000万以上放在db3。

五、  mycat读写分离

大型系统或者高访问量的互联网应用,需要配置数据库读写分离。mysql中,标准的读写分离是主从模式,一个写节点master后面跟着多个读节点,读节点的数量取决于系统的压力,一般是1-3个读节点。mycat的读写分离和自动切换机制,需要mysql的主从复制的配合。

1.         mysql主从配置

mysql主从配置需要注意的问题。主dbserver和从dbserver的数据库版本一致;主dbserver和从dbserver的数据库名称一致;主dbserver开启binlog二进制日志,主dbserver和从dbserver的server_id必须唯一,一般在同一网段中使用ip地址末节点数作为id,不会重复的。

mysql主服务器配置。

第一步,修改my.cnf文件。在[mysqld]中添加。

binlog-do-db=db1

binlog-ignore-db=mysql

#启用二进制日志

log-bin=mysql-bin

#服务器唯一ip,一般取ip最后一段

server_id=78

第二步,重启mysql服务。

第三步,建立账户并授权slave。供从服务器访问。

GRANT FILE  ON  *.* TO  'tom'  @'%' IDENTIFIED  BY  '1234';

GRANT REPLICATION  SLAVE,REPLICATION  CLIENT ON  *.*  to 'tom'  @'%'  identified by  '1234';刷新权限,FLUSH  PRIVILEGES;

select  User,Host from  mysql.user;查看mysql现在拥有的用户。

第四步,查询master的状态,mysql>show  master  status \G;

mysql从服务器配置。

第一步,修改my.cnf文件,在[mysqld]中添加server_id=121。

第二步,配置从服务器。

mysql>change  master to  master_host='39.105.79.78',master_port=3306,master_user='tom',master_password='1234',master_log_file='mysql-bin.000008',master_log_pos=107;

其中master_log_file='mysql-bin.000008',master_log_pos=107,是在主服务器中使用show  master status查到的信息。

修改主服务器配置的方式

CHANGE MASTER TOMASTER_LOG_FILE='mysql-bin.000014',MASTER_LOG_POS=120;

第三步,启动从服务器复制功能。mysql>start  slave;

第四步,检查从服务器复制功能状态。mysql>show  slave status  \G;注意,Slave_IO以及Slave_SQL进程必须正常进行,即为YES。

出现Fatal error: The slaveI/O thread stops because master and slave have equal MySQL server ids; theseids must be different for replication to work (or the--replicate-same-server-id option must be used on slave but this does notalways make sense; please check the manual before using it).的错误的原因可能是mysql的虚拟机系统是克隆的,所以mysql的uuid是一样,解决方法是删除/var/lib/mysql/auto.cnf文件,重新启动服务。

测试主从复制,向主服务器添加一天记录,查看从服务器对应的库中是否添加成功。

2.         mycat读写分离

在schema.xml中配置

<?xmlversion="1.0"?>

<!DOCTYPEmycat:schema SYSTEM "schema.dtd">

<mycat:schemaxmlns:mycat="http://org.opencloudb/">



        <schema name="e3shop"checkSQLschema="false" sqlMaxLimit="100">

                <!-- auto sharding by id(long) -->

                <tablename="tb_item" dataNode="dn1,dn2,dn3"rule="auto-sharding-long" />

        </schema>

        <dataNode name="dn1"dataHost="localhost1" database="db1" />

        <dataNode name="dn2"dataHost="localhost1" database="db2" />

        <dataNode name="dn3"dataHost="localhost2" database="db3" />

        <dataHostname="localhost1" maxCon="1000" minCon="10" balance="1"

                writeType="0"dbType="mysql" dbDriver="native"switchType="2" slaveThreshold="100">

                <!-- <heartbeat>selectuser()</heartbeat> -->

                <heartbeat>show slavestatus</heartbeat>

                <!-- can have multi writehosts -->

                <writeHosthost="hostM1" url="39.105.79.78:3306" user="root"

                       password="1234">

                        <!-- can have multiread hosts -->

                        <readHosthost="hosts" url="192.168.0.121:3306" user="root"password="1234" />

                </writeHost>

        </dataHost>

        <dataHostname="localhost2" maxCon="1000" minCon="10"balance="0"

                writeType="0"dbType="mysql" dbDriver="native"switchType="1"  slaveThreshold="100">

                <heartbeat>selectuser()</heartbeat>

                <!-- can have multi writehosts -->

                <writeHosthost="hostM1" url="192.168.0.102:3306"user="root"

                       password="1234">

                        <!-- can have multiread hosts -->



                </writeHost>

        </dataHost>

</mycat:schema>

balance和writeType的值

balance的参数,0,所有读操作都发送到当前可用的writeHost上;1,所有读操作都随机的发送到readHost上;2,所有读操作都随机发送到writeHost、readHost上。

writeType的参数,0,所有写操作都发送到可用的writeHost上;1,所有写操作到随机的发送到readHost上;2,所有写操作都随机的向writeHost和readHost上发送。

switchType的参数,-1,表示不自动切换;1,默认值,自动切换;2,基于mysql主从同步的状态决定是否切换。

启动mycat,会自动启动读写分离。测试。

相关文章:

  • tomcat热部署
  • c++
  • linux系统编程
  • proc*c/c++简介
  • [one_demo_14]一个简单的easyui的demo
  • ztree
  • PowerDesigner
  • POI简单介绍
  • shiro
  • ehcache
  • highcharts
  • spring框架和jdk的版本兼容
  • 系统中日志的作用
  • 针对tomcat入侵的简单防御
  • 诡异的MalformedParameterizedTypeException异常
  • [译]前端离线指南(上)
  • 【刷算法】从上往下打印二叉树
  • CSS 提示工具(Tooltip)
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • extract-text-webpack-plugin用法
  • HashMap ConcurrentHashMap
  • iOS 颜色设置看我就够了
  • java概述
  • js学习笔记
  • MySQL的数据类型
  • win10下安装mysql5.7
  • 订阅Forge Viewer所有的事件
  • 分布式熔断降级平台aegis
  • 工作中总结前端开发流程--vue项目
  • 前端js -- this指向总结。
  • 前端自动化解决方案
  • 三分钟教你同步 Visual Studio Code 设置
  • 使用common-codec进行md5加密
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 一个项目push到多个远程Git仓库
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • C# - 为值类型重定义相等性
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • (TOJ2804)Even? Odd?
  • (独孤九剑)--文件系统
  • (四)linux文件内容查看
  • (五)关系数据库标准语言SQL
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • 、写入Shellcode到注册表上线
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET CORE Aws S3 使用
  • .NET Core Web APi类库如何内嵌运行?
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET 材料检测系统崩溃分析
  • .Net 垃圾回收机制原理(二)
  • .net 使用ajax控件后如何调用前端脚本
  • .net通用权限框架B/S (三)--MODEL层(2)
  • /*在DataTable中更新、删除数据*/