JAVAEE——宜立方商城13:Mycat数据库分片、主从复制、读写分离、100%Linux中打响安装Mysql的法子

海量数据的囤积难题

近年来乘机网络的发展,数据的量级也是撑指数的增加,从GB到TB到PB。对数码的各样操作也是更为的费劲,古板的关系性数据库已经无力回天满足飞速查询与插入数据的需要。那一个时候NoSQL的产出暂时缓解了这一风险。它通过降落数据的安全性,收缩对事情的支撑,减弱对复杂查询的帮衬,来博取品质上的升官。

唯独,在稍微场面NoSQL一些低头是无能为力知足使用意况的,就比如某些使用意况是纯属要有事情与雅安目的的。这几个时候NoSQL肯定是不可以餍足的,所以依旧要求采取关系性数据库。尽管接纳关系型数据库消除海量存储的题材吧?此时就需求做数据库集群,为了拉长查询品质将3个数据库的数据分散到差其他数据库中贮存。

1.1 如何是数据库分片

简短来说,就是指通过某种特定的规格,将大家存放在同二个数据库中的数据分散存放到三个数据库(主机)下面,以达到疏散单台设备负载的功力。

数码的切分(Sharding)依照其切分规则的花色,可以分成两种切分情势。

(1)一种是比照不一样的表(或然Schema)来切分到不一样的数据库(主机)之上,那种切可以叫做数据的垂直(纵向)切分

图片 1

 

 

 

(2)其它一种则是依照表中的多少的逻辑关系,将同一个表中的多少依据某种条件拆分到多台数据库(主机)下面,那种切分称之为数据的程度(横向)切分。

 图片 2

 

1.2 什么已毕数据库分片

当数据库分片后,数据由1个数据库分散到三个数据库中。此时系统要询问时索要切换不一致的数据库举行查询,那么系统如何知道要询问的数额在哪些数据库中?当添加一条记下时要向哪个数据库中插入呢?这几个标题处理起来都以老大的麻烦。

那种景况下得以利用多个数据库中间件mycat来化解相关的标题。接下来了然一下怎么样是mycat。

Mycat介绍

2.1 什么是Mycat?

 

Mycat 背后是阿里业已开源的头面产品——Cobar。Cobar 的主导功效和优势是 MySQL 数据库分片,此产品已经流传,传说最早的发起者对
Mysql 很精晓,后来从阿里跳槽了,阿里紧接着开源的
Cobar,并维持到 二零一一 年年初,然后,就一直不然后了。

Cobar 的思绪和兑现路径的确不易。基于
Java 开发的,完成了 MySQL 公开的二进制传输协议,巧妙地将团结伪装成八个MySQL Server,如今市面上绝一大半 MySQL 客户端工具和动用都能匹配。比本身落成1个新的数据库协议要明智的多,因为生态环境在哪儿摆着。

 

Mycat 是根据 cobar 演化而来,对 cobar 的代码举办了干净的重构,使用 NIO 重构了网络模块,并且优化了 Buffer 内核,增强了聚众,Join 等基本特征,同时匹配绝大部分数据库成为通用的数据库中间件。

粗略的说,MyCAT就是:

·二个新型的数据库中间件产品资助mysql集群,只怕mariadb cluster,提供高可用性数据分片集群。你可以像使用mysql一样使用mycat。对于开发人士来说根本感觉不到mycat的留存。

 图片 3

2.2 Mycat资助的数据库

 图片 4

 

2.3 Mycat的分片策略

 图片 5

 

 

 

2.4 概念表达

2.4.1 逻辑库(schema) :

眼下一节讲了数据库中间件,平常对实际应用来说,并不要求知道中间件的存在,业务开发人士只须要领悟数据库的概念,所以数据库中间件可以被用作是三个或多个数据库集群构成的逻辑库。

2.4.2 逻辑表(table):

既然有逻辑库,那么就会有逻辑表,分布式数据库中,对拔取来说,读写多少的表就是逻辑表。逻辑表,可以是数据切分后,分布在多个或几个分片库中,也可以不做多少切分,不分片,唯有一个表构成。

分片表:是指那一个原来的很大数量的表,必要切分到七个数据库的表,那样,每一种分片都有一部分数码,所有分片构成了全部的数目。
简单来讲就是内需进行分片的表。

非分片表:二个数据库中并不是富有的表都很大,有个别表是可以不用进行切分的,非分片是相持分片表来说的,就是那几个不须要开展多少切分的表。

2.4.3 分片节点(dataNode)

多少切分后,1个大表被分到不一致的分片数据库方面,每一个表分片所在的数据库就是分片节点(dataNode)。

2.4.4 节点主机(dataHost)

数据切分后,逐个分片节点(dataNode)不必然都会把持一台机器,同一机器上面可以有三个分片数据库,那样三个或三个分片节点(dataNode)所在的机器就是节点主机(dataHost),为了避开单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不相同的节点主机(dataHost)。

2.4.5 分片规则(rule)

前面讲了数额切分,二个大表被分成若干个分片表,就要求肯定的平整,那样依照某种业务规则把数据分到有个别分片的规则就是分片规则,数据切分接纳适合的分片规则不行紧要,将高大的防止后续数据处理的难度。

Mycat的下载及安装

3.1 设置环境

一,jdk:须要jdk必须是1.7及以上版本

二,Mysql:推荐mysql是5.5上述版本

3、Mycat:

Mycat的官方网站:

http://www.mycat.org.cn/

下载地址:

https://github.com/MyCATApache/Mycat-download

 

3.2 安装步骤

Mycat有windows、linux多种版本。本课程为linux安装步骤,windows基本相同。

第一步:下载Mycat-server-xxxx-linux.tar.gz

其次步:将削减包解压缩。指出将mycat放到/usr/local/mycat目录下。

第三步:进入mycat目录,启动mycat

./mycat start

停止:

./mycat stop

mycat 支持的吩咐{ console | start | stop | restart | status
| dump }

Mycat的暗中同意端口号为:8066

Mycat的分片

4.1 需求

把商品表分片存储到多个数据节点上。

 

4.2 设置环境分析

两台mysql数据库服务器:

Host1:192.168.25.134

Host2:192.168.25.166

 

host1环境

操作系统版本 : centos6.4

数据库版本 : mysql-5.6

mycat版本 :1.4 release

数据库名 : db1、db3

 

 

mysql节点2环境

操作系统版本 : centos6.4

数据库版本 : mysql-5.6

mycat版本 :1.4 release

数据库名 : db2

 

MyCat安装到节点1上(要求安装jdk)

 

4.3 配置schema.xml

4.3.1 Schema.xml介绍

Schema.xml作为MyCat中第一的陈设文件之一,管理着MyCat的逻辑库、表、分片规则、DataNode以及DataSource。弄懂这一个配置,是不易选取MyCat的前提。那里就一百年不遇对该公文举办辨析。

 

schema 标签用于定义MyCat实例中的逻辑库

Table 标签定义了MyCat中的逻辑表

dataNode 标签定义了MyCat中的数据节点,也等于我们习以为常说所的数据分片。

dataHost标签在mycat逻辑库中也是用作最尾部的竹签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。

 

注意:若是LINUX版本的MYSQL,则需要设置为Mysql大小写不敏感,否则可能会发生表找不到的问题。

在MySQL的配置文件中/etc/my.cnf [mysqld] 中增加一行

  lower_case_table_names=1

 

4.3.2 Schema.xml配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

        <schema name="e3mall" 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="localhost2" 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>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="192.168.25.134:3306" user="root"
                        password="root">
                        <!-- can have multi read hosts -->

                </writeHost>
        </dataHost>
        <dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="192.168.25.166:3306" user="root"
                        password="root">
                        <!-- can have multi read hosts -->

                </writeHost>
        </dataHost>
</mycat:schema>

 

4.4 配置server.xml 

 

4.4.1 Server.xml介绍

server.xml大概保存了具备mycat要求的系统布局新闻。最常用的是在此布置用户名、密码及权限。

 

4.4.2 Server.xml配置

<user name="test">
    <property name="password">test</property>
    <property name="schemas">e3mall</property>
    <property name="readOnly">false</property>
</user>

 

4.5 配置rule.xml 

rule.xml里面就定义了大家对表举办拆分所提到到的条条框框定义。大家得以灵活的对表使用差距的分片算法,大概对表使用同样的算法但现实的参数差别。那一个文件之中根本有tableRule和function那多少个标签。在具体运用进度中可以依照须求添加tableRule

和function。

此安顿文件可以毫无修改,使用暗许即可。

4.6 测试分片

4.6.1 创建表

陈设达成后,重新开动mycat。使用mysql客户端连接mycat,创造表。

-- ----------------------------
-- Table structure for tb_item
-- ----------------------------
DROP TABLE IF EXISTS `tb_item`;
CREATE TABLE `tb_item` (
  `id` bigint(20) NOT NULL COMMENT '商品id,同时也是商品编号',
  `title` varchar(100) NOT NULL COMMENT '商品标题',
  `sell_point` varchar(500) DEFAULT NULL COMMENT '商品卖点',
  `price` bigint(20) NOT NULL COMMENT '商品价格,单位为:分',
  `num` int(10) NOT NULL COMMENT '库存数量',
  `barcode` varchar(30) DEFAULT NULL COMMENT '商品条形码',
  `image` varchar(500) DEFAULT NULL COMMENT '商品图片',
  `cid` bigint(10) NOT NULL COMMENT '所属类目,叶子类目',
  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '商品状态,1-正常,2-下架,3-删除',
  `created` datetime NOT NULL COMMENT '创建时间',
  `updated` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `cid` (`cid`),
  KEY `status` (`status`),
  KEY `updated` (`updated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表';

 

4.6.2 插入数据 

 

将此文件中的数据插入到数据库:

 图片 6

 

 

4.6.3 分片测试

鉴于配备的分片规则为“auto-sharding-long”,所以mycat会依照此规则自动分片。

逐个datanode中保留一定数额的数额。依照id举办分片

经测试id范围为:

Datanode1:1~5000000

Datanode2:5000000~10000000

Datanode3:10000001~15000000

 

当1六千000上述的id插入时报错:

[Err] 1064 – can’t find any valid datanode :TB_ITEM -> ID ->
15000001

那儿亟待添加节点了。

 

Mycat读写分离

数据库读写分离对于大型系统恐怕访问量很高的互连网采纳来说,是必备的贰个首要功用。对于MySQL来说,标准的读写分离是中央情势,3个写节点Master前边随着八个读节点,读节点的多少取决于系统的下压力,平常是1-3个读节点的配置

 图片 7

 

Mycat读写分离和机动切换机制,须求mysql的主从复制机制合作。

 图片 8

 

5.1 Mysql的主从复制

 

基本配置需求留意的地点

壹,主DB server和从DB server数据库的本子一样

二,主DB server和从DB server数据库数据名称相同

3、主DB server开启二进制日志,主DB
server和从DB server的server_id都必须唯一

 

5.2 Mysql主服务器配置

第一步:修改my.cnf文件:

在[mysqld]段下添加:

binlog-do-db=db1

binlog-ignore-db=mysql

#启用二进制日志

log-bin=mysql-bin

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

server-id=134

第二步:重启mysql服务

service mysqld restart

其三步:建立帐户并授权slave

mysql>GRANT FILE ON *.* TO ‘backup’@’%’ IDENTIFIED BY ‘123456’;

mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to
‘backup’@’%’ identified by ‘123456’;

#貌似不要root帐号,“%”表示拥有客户端都或者连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,做实安全。

 

刷新权限

mysql> FLUSH PRIVILEGES;

  

查阅mysql今后有怎样用户

mysql>select user,host from mysql.user;

 

第四步:查询master的状态

mysql> show master status;

+——————+———-+————–+——————+——————-+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
Executed_Gtid_Set |

+——————+———-+————–+——————+——————-+

| mysql-bin.000001 |      120 | db1          | mysql            |
                  |

+——————+———-+————–+——————+——————-+

1 row in set

 

 

 

5.3 Mysql从服务器配置

第一步:修改my.cnf文件

[mysqld]

server-id=166

 

其次步:配置从服务器

mysql>change master to
master_host=’192.168.25.128′,master_port=3306,master_user=’backup’,master_password=’123456′,master_log_file=’mysql-bin.000001′,master_log_pos=120

 

留意语句中间不要断开,master_port为mysql服务器端口号(无引号),master_user为实施同步操作的数据库账户,“120”无单引号(此处的120就是show master status 中看看的position的值,那里的mysql-bin.000001就是file对应的值)。

 

第二步:运行从服务器复制功用

Mysql>start slave;

 

其三步:检查从服务器复制作用状态:

mysql> show slave status

 

……………………(省略部分)

Slave_IO_Running: Yes //此状态必须YES

Slave_SQL_Running: Yes //此状态必须YES

……………………(省略部分)

 

注:Slave_IO及Slave_SQL进度必须不奇怪运营,即YES状态,否则都是不当的气象(如:其中3个NO均属不当)。

 

错误处理:

如果出现此错误:

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

因为是mysql是克隆的系统所以mysql的uuid是一样的,所以需要修改。

解决方法:

删除/var/lib/mysql/auto.cnf文件,重新启动服务。

 

 图片 9

 

上述操作进程,从服务器配置落成。

 

5.4 Mycat配置

Mycat 1.4 匡助MySQL主从复制状态绑定的读写分离机制,让读特别安全可相信,配置如下:

 

<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="1"

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

<heartbeat>show slave status</heartbeat>

<writeHost host="hostM" url="192.168.25.134:3306" user="root"

    password="root">

    <readHost host="hostS" url="192.168.25.166:3306" user="root"

    password="root" />

  </writeHost>

</dataHost>

 

 

 

(1) 设置
balance=”1″与writeType=”0″

Balance参数设置:

  1. balance=“0”, 所有读操作都发送到当前可用的writeHost上。

2.
balance=“1”,所有读操作都随意的发送到readHost。

  1. balance=“2”,所有读操作都随意的在writeHost、readhost上散发

WriteType参数设置:

  1. writeType=“0”,
    所有写操作都发送到可用的writeHost上。

  2. writeType=“1”,所有写操作都随意的发送到readHost。

  3. writeType=“2”,所有写操作都随意的在writeHost、readhost分上发。

 “readHost是从属于writeHost的,即意味着它从相当writeHost获取同步数据,因而,当它所属的writeHost宕机了,则它也不会再加入到读写分离中来,即“不干活了”,那是因为那时候,它的数据已经“不可相信”了。基于这一个考虑,近日mycat
1.3和1.4本子中,若想扶助MySQL一主一从的标准配置,并且在主节点宕机的意况下,从节点还是能读取数据,则须求在Mycat里计划为七个writeHost并安装banlance=1。”

(2) 设置 switchType=”2″
与slaveThreshold=”100″

switchType 近年来有三种拔取:

-1:表示不自动切换

1 :暗许值,自动切换

2 :基于MySQL主从同步的图景控制是还是不是切换

“Mycat心跳检查语句配置为 show slave status ,dataHost 上定义八个新天性:
switchType=”2″
与slaveThreshold=”100″,此时表示开启MySQL主从复制状态绑定的读写分离与切换机制。Mycat心跳机制通过检测
show slave status 中的 “Seconds_Behind_Master”, “Slave_IO_Running”,
“Slave_SQL_Running”
三个字段来规定当前主旨同步的动静以及Seconds_Behind_Master主从复制时延。“

 

 

附:Centos6.5下安装mysql

首先步:查看mysql是不是安装。

rpm -qa|grep mysql

第二步:如若mysql的本子不是想要的本子。需求把mysql卸载。

yum remove mysql mysql-server mysql-libs mysql-common

rm -rf /var/lib/mysql

rm /etc/my.cnf

其三步:安装mysql。须要使用yum命令安装。在装置mysql以前要求安装mysql的下载源。要求从oracle的官方网站下载。

1)下载mysql的源包。

我们是centos6.4对应的rpm包为:mysql-community-release-el6-5.noarch.rpm

2)安装mysql下载源:

yum localinstall mysql-community-release-el6-5.noarch.rpm

(图片 10)此附件可保存

 图片 11

 

3)在线安装mysql:

yum install mysql-community-server

第四步:启动mysql

service mysqld start

第五步:需求给root用户安装密码。

/usr/bin/mysqladmin -u root password ‘new-password’  //
为root账号设置密码

第六步:远程连接授权。

GRANT ALL PRIVILEGES ON *.* TO ‘myuser’@’%’ IDENTIFIED BY
‘mypassword’ WITH GRANT
OPTION;

注意:’myuser’、’mypassword’ 须求替换成实际的用户名和密码。

 

相关文章