1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 定时任务-Quartz Mycat简单入门 Linux下安装MySQL Linux下安装MyCAT Mycat的数据库分片 Mycat读写分离

定时任务-Quartz Mycat简单入门 Linux下安装MySQL Linux下安装MyCAT Mycat的数据库分片 Mycat读写分离

时间:2021-11-25 19:38:46

相关推荐

定时任务-Quartz Mycat简单入门 Linux下安装MySQL Linux下安装MyCAT Mycat的数据库分片 Mycat读写分离

表现层:页面 后台管理系统、商城门户、搜索系统、订单系统、商品详情系统、购物车系统

中间件:dubbo 系统之间的通信,服务的统计,rpc协议远程过程调用 同步通信

服务层:实现具体的业务逻辑 商品服务、内容服务、单点登录服务、订单服务、搜索服务(solr服务solrj httpclient 从索引库中去查询的,目录需要自己制定)

消息队列:异步通信(系统解耦)

加缓存redis

中间件mycat数据库

持久层:数据库

面试的时候

分布式系统,如果性能达到瓶颈如何做一个优化?

首先用户访问,要从头开始,由ngnix做一个代理,已经到了瓶颈的话,要做一个集群,ngnix转发请求到反向代理器,转发到表现层如果也到了瓶颈的话,服务层,由dubbo来达到负载均衡的作用。

redis做缓存,去访问数据库。

定时任务—Quartz

一、什么是Quartz

Quartz是OpenSymphony开源组织在Job scheduling领域的开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个、百个、甚至好几万个Jobs这样复杂的日程程序表。Jobs可以做成标准的Java组件或EJBs。

Quartz是一个任务日程管理系统,一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件的系统。

Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。

二、Quartz的使用

2.1 下载

官方网站:http://quartz-/,可以从官方网站下载quartz的最新版本。(如果是用Maven的话,2.1步是不需要的)

2.2 Quartz与Spring结合

关于依赖某个jar包,我们最好在taotao-parent工程统一定下版本号,如下图所示。

为了使用quartz的功能,我们在taotao-order-service工程添加对quartz以及spring-context-support的依赖,如下图所示。

下面我们先来看一张图,每个jobDetail中包含一个Job,每个Trigger包含一个jobDetail以及cron表达式(触发的时机),一个Scheduler包含多个Trigger。

第二步:写一个job类。是一个普通的java类

第三步:在spring的配置文件中配置一个jobDetail,需要引用job bean

第四步:在spring的配置文件中配置一个Trigger,指定任务触发时机需要使用cron表达式。需要jobDetail引用。

第五步:在spring的配置文件中配置一个scheduler,在此list中可以配置多个trigger。

applicationContext-quartz.xml文件的内容如下,其中job、jobDetail、trigger是一套,如果大家还想再配一套的话,就复制这这项配置稍微修改下,然后在配置调度框架中新添加一套。

下面我们来测试一下,如果我们修改了tao-parent工程的pom.xml文件的话,我们需要重新将taotao-parent工程打包到本地maven仓库。

我们来启动taotao-order工程,启动它会自动执行定时器任务。如下图所示,可以看到每隔5秒就会打印一下消息,说明我们的定时任务成功了。

关于cron表达式,大家可以参考/u012453843/article/details/53153288这篇博客进行学习。

Mycat简单入门

一:什么是Mycat?

简单的说,Mycat就是:

一个彻底开源的,面向企业应用开发的"大数据库集群"

支持事务、ACID、可以替代Mysql的加强版数据库

一个可以视为"Mmysql"集群的企业级数据库,用来代替昂贵的Oracle集群。

一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQL Server

结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

一个新颖的数据库中间件产品

MyCat的目标是:低成本的将现有的单机数据库和应用平滑移到“云端”解决数据存储和业务规模迅速增长情况下的数据瓶颈问题。

二:Mycat的关键特性

支持SQL92标准

支持Mysql集群,可以作为Proxy使用

支持JDBC链接ORACLE、DB2、SQL Server,将其模拟为MySQL Server使用。

支持galera for mysql集群,percona-cluster或者mariadb cluster,提供高可用性数据分片集群。

自动故障切换,高可用性。

支持读写分离,支持Mysql双主多从,以及一主多从的模式

支持全局表,数据自动分片到多个节点,用于高效表关联查询

支持独有的基于E-R关系的分片策略,实现了高效的表关联查询

多平台支持,部署和实施简单

三:Mycat架构

如图所示:MyCAT使用Mysql的通讯协议模拟成了一个Mysql服务器,并建立了完整的Schema(数据库)、Table (数据表)、User(用户)的逻辑模型,并将这套逻辑模型映射到后端的存储节点DataNode(MySQL Instance)上的真实物理库中,这样一来,所有能使用Mysql的客户端以及编程语言都能将MyCAT当成是Mysql Server来使用,不必开发新的客户端协议。

四:Mycat解决的问题

性能问题

数据库连接过多

E-R分片难处理

可用性问题

成本和伸缩性问题

Mycat支持的数据库如下图所示

五:分片策略

MyCAT支持水平分片与垂直分片:

水平分片:一个表格的数据分割到多个节点上,按照行分隔。

垂直分片:一个数据库中多个表格A,B,C,A存储到节点1上,B存储到节点2上,C存储到节点3上。

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

1、Schema:逻辑库,与MySQL中的Database(数据库)对应,一个逻辑库中定义了所包括的Table。

2、Table:表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑数据节点DataNode。在此可以指定表的分片规则。

3、DataNode:MyCAT的逻辑数据节点,是存放table的具体物理节点,也称之为分片节点,通过DataSource来关联到后端某个具体数据库上

4、Database:定义某个物理库的访问地址,用于捆绑到Datanode上

六:下载和安装Mycat

安装:需要环境:Linux系统、jdk1.7及以上、mysql5.6

Linux下安装MySQL

Linux下安装MyCAT

1.将mycat的压缩包上传到服务器Mycat-server-1.4-release-1019230038-linux.tar.gz

2.解压缩安装包mycat

解压后,我们来看看mycat目录下的文件,首先看bin目录,如下所示,其中mycat是用来启动的。

[root@taotao-mysql mycat]# ll bin/

总用量 376

-rwxr-xr-x. 1 root root 15714 10月 19 mycat

-rwxr-xr-x. 1 root root 2947 6月 17 rehash.sh

-rwxr-xr-x. 1 root root 2502 6月 17 startup_nowrap.sh

-rwxr-xr-x. 1 root root 140198 10月 19 wrapper-linux-ppc-64

-rwxr-xr-x. 1 root root 99401 10月 19 wrapper-linux-x86-32

-rwxr-xr-x. 1 root root 111027 10月 19 wrapper-linux-x86-64

接着我们看conf目录,如下所示,该目录下schema.xml文件定义了逻辑表以及如何连接Datanode,连接实际的数据库。server.xml一般是全局的配置,如用户名密码。rule.xml文件则定义了分库分表的规则。这三个文件最重要。

[root@taotao-mysql mycat]# ll conf/

总用量 72

-rwxrwxrwx. 1 root root 88 10月 19 autopartition-long.txt

-rwxrwxrwx. 1 root root 340 10月 19 cacheservice.properties

-rwxrwxrwx. 1 root root 439 10月 19 ehcache.xml

-rwxrwxrwx. 1 root root 931 10月 19 index_to_charset.properties

-rwxrwxrwx. 1 root root 1647 6月 17 log4j.xml

-rwxrwxrwx. 1 root root 15 10月 19 partition-hash-int.txt

-rwxrwxrwx. 1 root root 102 10月 19 partition-range-mod.txt

-rwxrwxrwx. 1 root root 943 10月 19 router.xml

-rwxrwxrwx. 1 root root 4510 10月 19 rule.xml

-rwxrwxrwx. 1 root root 4130 10月 19 schema.xml

-rwxrwxrwx. 1 root root 413 10月 19 sequence_conf.properties

-rwxrwxrwx. 1 root root 75 10月 19 sequence_db_conf.properties

-rwxrwxrwx. 1 root root 51 10月 19 sequence_time_conf.properties

-rwxrwxrwx. 1 root root 2549 10月 19 server.xml

-rwxrwxrwx. 1 root root 4152 10月 19 wrapper.conf

[root@taotao-mysql mycat]#

3.需要对conf目录下的schema.xml、server.xml、rule.xml进行配置(我们暂且不配置)

4.启动mycat

[root@taotao-mysql software]# cd mycat/

[root@taotao-mysql mycat]# ls

bin catlet conf lib logs version.txt

[root@taotao-mysql mycat]# cd bin

[root@taotao-mysql bin]# ll

总用量 376

-rwxr-xr-x. 1 root root 15714 10月 19 mycat

-rwxr-xr-x. 1 root root 2947 6月 17 rehash.sh

-rwxr-xr-x. 1 root root 2502 6月 17 startup_nowrap.sh

-rwxr-xr-x. 1 root root 140198 10月 19 wrapper-linux-ppc-64

-rwxr-xr-x. 1 root root 99401 10月 19 wrapper-linux-x86-32

-rwxr-xr-x. 1 root root 111027 10月 19 wrapper-linux-x86-64

[root@taotao-mysql bin]# ./mycat start

Starting Mycat-server…

[root@taotao-mysql bin]#

Mycat的数据库分片

一:需求

把商品表分片存储在三个数据节点上

二:环境

mysql节点1环境

操作系统版本:centos6.8

数据库版本:mysql-5.6

mycat版本:1.4 release

数据库名:db1、db3

ip:192.168.156.41

mysql节点2环境

操作系统版本:centos6.8

数据库版本:mysql-5.6

mycat版本:1.4 release

数据库名:db2

ip:192.168.156.42

Mycat安装到节点1上(需要安装jdk)

三:配置schema.xml文件

3.1 schema.xml介绍

schema.xml作为MyCat中重要的配置文件之一,管理着MyCat的逻辑库、表、分片规则、DataNode以及DataSource。弄懂这些配置,是正确使用MyCat的前提。这里就一层层对该文件进行解析。

schema 标签用于定义MyCat实例中的逻辑库(也就是说一个schema就是一个数据库连接)

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

dataNode 标签定义了MyCat中的数据节点,也就是我们通常说所的数据分片。

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

注意:若是LINUX版本的MYSQL,则需要设置为Mysql大小写不敏感,否则可能会发生表找不到的问题。另外,据我测试,使用mycat来建表的话,会乱码,要解决乱码问题就需要

设置一下数据库的编码格式。

在MySQL的配置文件中/etc/f中 [mysqld]下方增加两行,注意要给所有参与分片的linux系统的mysql都添加如下配置,配置好之后,重启mysql。

lower_case_table_names = 1

character_set_server=utf8

重启mysql如下。

[root@mysql-server ~]# service mysqld restart

停止 mysqld: [确定]

正在启动 mysqld: [确定]

[root@mysql-server ~]#

为了方便操作schema.xml文件,我们可以用NodePad++来编辑schema.xml文件

schema.xml文件的内容如下图所示。

schema.xml文件内容如下:

<?xml version="1.0"?>

<mycat:schema xmlns:mycat=“http://org.opencloudb/”>

select user()

select user()

</mycat:schema>

我们要进行分片的表是tb_item,如下图所示。

配置好了schema.xml,我们还需要配置user信息,在server.xml文件中进行配置,如下图所示。

修改的代码如下:两个用户都可以登录,只是权限不一样而已。

<user name="taotao"><property name="password">root</property><property name="schemas">taotao</property></user><!--user这个用户,只可读数据库--><user name="user"><property name="password">user</property><property name="schemas">taotao</property><property name="readOnly">true</property></user>

下面我们启动mycat,启动后查看是否正常启动,如下所示。

[root@taotao-mysql mycat]# bin/mycat start

Starting Mycat-server…

[root@taotao-mysql mycat]# bin/mycat status

Mycat-server is running (1875).

[root@taotao-mysql mycat]#

下面我们便来连接mycat,如下图所示,需要注意的是,mycat的默认端口是8066,用户名和密码我们就用server.xml文件中配置的那个可读可写的用户名和密码。先进行连接测试,弹出对话框"连接成功"表明连接没问题,我们再点击"确定"。

下面我们便在mycat这个数据库中新建tb_item这张表,建表语句如下:

DROP TABLE IF EXISTS tb_item;

CREATE TABLEtb_item(

idbigint(20) NOT NULL COMMENT ‘商品id,同时也是商品编号’,

titlevarchar(100) NOT NULL COMMENT ‘商品标题’,

sell_pointvarchar(500) DEFAULT NULL COMMENT ‘商品卖点’,

pricebigint(20) NOT NULL COMMENT ‘商品价格,单位为:分’,

numint(10) NOT NULL COMMENT ‘库存数量’,

barcodevarchar(30) DEFAULT NULL COMMENT ‘商品条形码’,

imagevarchar(500) DEFAULT NULL COMMENT ‘商品图片’,

cidbigint(10) NOT NULL COMMENT ‘所属类目,叶子类目’,

statustinyint(4) NOT NULL DEFAULT ‘1’ COMMENT ‘商品状态,1-正常,2-下架,3-删除’,

createddatetime NOT NULL COMMENT ‘创建时间’,

updateddatetime NOT NULL COMMENT ‘更新时间’,

PRIMARY KEY (id),

KEYcid(cid),

KEYstatus(status),

KEYupdated(updated)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘商品表’;

在mycat数据库中建完表后,我们便可以到192.168.156.41和192.168.156.42这两台服务器的mysql数据库中去查看是否也生成同样的表,如下图所示,可以看到mycat所在的服务器(192.168.156.41)上的mysql中db1和db3这两个数据库中都有tb_item这张表,另一台服务器192.168.156.42上的db2数据库也有这张表。

下面我们向mycat数据库中的tb_item表中添加20条商品记录,如下图所示。

sql语句如下:

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘536563’, ‘new2 - 阿尔卡特 (OT-927) 炭黑 联通3G手机 双卡双待’, ‘清仓!仅北京,武汉仓有货!’, ‘29900000’, ‘99999’, ‘’, ‘/jd/4ef8861cf6854de9889f3db9b24dc371.jpg’, ‘560’, ‘1’, ‘-03-08 21:33:18’, ‘-04-11 20:38:38’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘562379’, ‘new8- 三星 W999 黑色 电信3G手机 双卡双待双通’, ‘下单送12000毫安移动电源!双3.5英寸魔焕炫屏,以非凡视野纵观天下时局,尊崇翻盖设计,张弛中,尽显从容气度!’, ‘1100’, ‘99999’, ‘’, ‘/jd/d2ac340e728d4c6181e763e772a9944a.jpg’, ‘560’, ‘1’, ‘-03-08 21:27:54’, ‘-04-12 17:10:43’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘605616’, ‘阿尔卡特 (OT-979) 冰川白 联通3G手机’, ‘清仓!仅上海仓有货!’, ‘30900’, ‘99999’, null, ‘/jd/a69d0d09a1a04164969c2d0369659b1a.jpg’, ‘560’, ‘1’, ‘-03-08 21:33:18’, ‘-03-08 21:33:18’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘635906’, ‘阿尔卡特 (OT-927) 单电版 炭黑 联通3G手机 双卡双待’, ‘清仓!仅北京,武汉仓有货!’, ‘24900’, ‘99999’, null, ‘/jd/9c1fcdf2bf20450788195c707da00a87.jpg’, ‘560’, ‘1’, ‘-03-08 21:33:18’, ‘-03-08 21:33:18’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘679532’, ‘阿尔卡特 (OT-986+) 玫红 AK47 加强版 联通3G手机’, ‘仅上海,广州,沈阳仓有货!预购从速!’, ‘49900’, ‘99999’, null, ‘/jd/65ed41dc4e3cb308833a1a910f8d.jpg’, ‘560’, ‘1’, ‘-03-08 21:32:31’, ‘-03-08 21:32:31’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘679533’, ‘阿尔卡特 (OT-986+) 曜石黑 AK47 加强版 联通3G手机’, ‘少量库存,抢完即止!<a target=“blank” href=“/act/bxYeI1346g.html?erpad_source=erpad”>“领券更优惠!”’, ‘49900’, ‘99999’, null, ‘/jd/b3251c85da8e4302b7389f3371dd0a68.jpg’, ‘560’, ‘1’, ‘-03-08 21:31:36’, ‘-03-08 21:31:36’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘691300’, ‘三星 B9120 钛灰色 联通3G手机 双卡双待双通’, ‘下单即送10400毫安移动电源!再赠手机魔法盒!’, ‘439900’, ‘99999’, null, ‘/jd/c1775819c7e44b1c903f27514e70b998.jpg’, ‘560’, ‘1’, ‘-03-08 21:29:27’, ‘-03-08 21:29:27’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘738388’, ‘三星 Note II (N7100) 云石白 联通3G手机’, ‘经典回顾!超值价格值得拥有。’, ‘169900’, ‘99999’, null, ‘/jd/089b79cbe19f454dab24cce65f2e9602.jpg’, ‘560’, ‘1’, ‘-03-08 21:28:16’, ‘-03-08 21:28:16’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘741524’, ‘三星 Note II (N7100) 钛金灰 联通3G手机’, ‘下单赠12000毫安移动电源’, ‘169900’, ‘99999’, null, ‘/jd/29e1b92dc7e146489ce46a2262479a0f.jpg’, ‘560’, ‘1’, ‘-03-08 21:28:30’, ‘-03-08 21:28:30’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘816448’, ‘三星 Note II (N7100) 钻石粉 联通3G手机’, ‘经典回顾!超值特惠!’, ‘169900’, ‘99999’, null, ‘/jd/5a45e88aeca046ec88d7b7ffbc47092a.jpg’, ‘560’, ‘1’, ‘-03-08 21:28:44’, ‘-03-08 21:28:44’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘816753’, ‘夏普(SHARP)LCD-46DS40A 46英寸 日本原装液晶面板 智能全高清液晶电视’, ‘要好屏,选夏普!日本原装面板,智能电视,高画质高音质!<a target=“blank” href=“/1278686.html”>还有升级版安卓智能新机46DS52供您选择!’, ‘379900’, ‘99999’, null, ‘/jd/2e45ff47f2e7424cb6d95fb9f05151bd.jpg’, ‘76’, ‘1’, ‘-03-08 21:27:39’, ‘-03-08 21:27:39’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘830972’, ‘飞利浦 老人手机 (X2560) 深情蓝 移动联通2G手机 双卡双待’, ‘赠:九安血压计+8G内存!超长待机,关爱无限,更好用!飞利浦简单健康老人手机!外观圆滑,手感极佳!’, ‘48900’, ‘99999’, null, ‘/jd/4f1d41baa6c84219a622f20a4f1c32bb.jpg’, ‘560’, ‘1’, ‘-03-08 21:28:30’, ‘-03-08 21:28:30’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘832739’, ‘中兴 U288 珠光白 移动3G手机’, ‘好评过万!超大彩屏,超大字体,超大按键,超大音量,一键SOS紧急呼叫 !’, ‘19900’, ‘99999’, null, ‘/jd/4021f8a1ffcc4ae2a313cd9f35c8.jpg’, ‘560’, ‘1’, ‘-03-08 21:28:44’, ‘-03-08 21:28:44’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘844022’, ‘三星 SCH-W899 亮金色 电信3G手机 双卡双待双通’, ‘双3.3英寸魔焕炫屏,CG双网双待,臻尊体验,心系天下!’, ‘299900’, ‘99999’, null, ‘/jd/e638243d8341474293be09ad157546b8.jpg’, ‘560’, ‘1’, ‘-03-08 21:28:01’, ‘-03-08 21:28:01’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘847276’, ‘飞利浦 老人手机 (X2560) 喜庆红 移动联通2G手机 双卡双待’, ‘超长待机,关爱无限,更好用!飞利浦简单健康老人手机!外观圆滑,手感极佳!’, ‘48900’, ‘99999’, null, ‘/jd/657c61e5018043f89d9fe0f9a1519884.jpg’, ‘560’, ‘1’, ‘-03-08 21:28:30’, ‘-03-08 21:28:30’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘847278’, ‘飞利浦 老人手机 (X2560) 硬朗黑 移动联通2G手机 双卡双待’, ‘超长待机,关爱无限,更好用!飞利浦简单健康老人手机!外观圆滑,手感极佳!’, ‘46900’, ‘99999’, null, ‘/jd/306b2287ce1c4b3bb541f37984d67929.jpg’, ‘560’, ‘1’, ‘-03-08 21:28:09’, ‘-03-08 21:28:09’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘855739’, ‘三星 Galaxy S4 (I9500)16G版 皓月白 联通3G手机’, ‘三星经典旗舰机!5英寸1080P高清屏+1300万像素主摄像头!’, ‘188800’, ‘99999’, null, ‘/jd/c687f304b5164b1b84736b9a4d34a37c.jpg’, ‘560’, ‘1’, ‘-03-08 21:27:42’, ‘-03-08 21:27:42’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘856645’, ‘三星 Galaxy S4 (I9500) 16G版 星空黑 联通3G手机’, ‘年货特价来袭!三星经典旗舰机!’, ‘188800’, ‘99999’, null, ‘/jd/2cd67c806e054435bce4c931a731493a.jpg’, ‘560’, ‘1’, ‘-03-08 21:27:54’, ‘-03-08 21:27:54’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘858025’, ‘三星 I8552 白色 联通3G手机 双卡双待’, ‘经济实惠机器~~开春入手好时机~’, ‘79900’, ‘99999’, null, ‘/jd/d958a21cec814fdeab934d43b4fb2e06.jpg’, ‘560’, ‘1’, ‘-03-08 21:27:49’, ‘-03-08 21:27:49’);

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘860275’, ‘长虹(CHANGHONG) 3D51C1080i 51英寸 快门式3D智能Android 电视(黑色)’, ‘智能安卓系统 可自由安装应用程序 <a target=“blank” href=“/act/Kt0aHzbU7uR1M.html”>“点击进入长虹新年专场”’, ‘269900’, ‘99999’, null, ‘/jd/08dabc37342943ffb717632f9ee40685.jpg’, ‘76’, ‘1’, ‘-03-08 21:27:35’, ‘-03-08 21:27:35’);

插入完之后,我们到db1、db2、db3这三片进行查看,发现只有db1中的tb_item是有数据的。其余两个都没有数据。

db3库中没有数据,如下图所示。

db2库中没有数据,没有数据,如下图所示。

为什么会有上面的情景呢?这是因为mycat进行分片后,每片最大的存储量是五百万(5000000),而我们在schema.xml文件中配置的分片规则是按照Long型的ID来分片,每片数据库存储的ID的编号大于它能存储的最大编号就会自动将数据存到下一个分片,我们现在分了3片,第1片能存储的最大ID编号是5000000,第2片能存储的最大ID编号是10000000,第三片能存储的最大ID编号是15000000。如下图所示。

我们插入数据库中的最大ID才860275,远没有达到五百万,因此数据全都被存储到第1片(db1)上了。我们再存储一条ID为5000000的商品

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘5000000’, ‘夏普(SHARP)LCD-52DS51A 52英寸 日本原装液晶面板 内置WIFI智能全高清液晶电视’, ‘要好屏,选夏普!日本原装面板,智能电视,高画质高音质!<a target=“blank” href=“/1278664.html”>还有升级版安卓智能新机52DS52供您选择!’, ‘549900’, ‘99999’, null, ‘/jd/63af01c37a18454ab2fef4670046272e.jpg’, ‘76’, ‘1’, ‘-03-08 21:27:45’, ‘-03-08 21:27:45’);

插入成功后,我们查看db1,发现这条记录还是记录到了db1当中。

我们再插入一条记录,这次把ID设为5000001,

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘5000001’, ‘诺基亚(NOKIA) 106 (RM-962) 黑色 移动联通2G手机’, ‘小机器,大能耐!防尘键盘,超长待机!支持FM收音机,手电筒功能!’, ‘14900’, ‘99999’, null, ‘/jd/f22fd70d7d26492e88e3368e6d528779.jpg’, ‘560’, ‘1’, ‘-03-08 21:28:16’, ‘-03-08 21:28:16’);

插入成功后,我们发现db1当中没有这条数据,db3中有刚插入的数据,如下图所示。

我们再插入两条商品,一个ID为10000000,另一个ID为10000001的商品

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES (‘10000000’, ‘长虹(CHANGHONG)LED50C2080i 50英寸智能安卓LED液晶电视(黑色)’, ‘智能安卓系统,可自由安装应用程序,让您的电视无所不能!<a target=“blank” href=“/act/Kt0aHzbU7uR1M.html”>“点击进入长虹新年专场”’, ‘339900’, ‘99999’, null, ‘/jd/4055ccf141a143c99a6d51e9107f96c1.jpg’, ‘76’, ‘1’, ‘-03-08 21:27:39’, ‘-03-08 21:27:39’);

插入成功后,我们再看看db3,发现db3只存了ID为10000000的商品。

再看db2,发现存在了db2中,说明我们的分片没有问题。

Mycat的读写分离

数据库读写分离对于大型系统或访问量很高的互联网应用来说,是必不可少的一个重要功能。对于MySQL来说,标准的读写分离是主从模式,一个写节点Master后面跟着多个读节点,读节点的数据取决于系统的压力,通常是1-3个读节点的配置。

读写分离如果不用mycat的话,就需要配置两套数据源,读的时候用一套数据源,写的时候用另外一套数据源,然后配置数据库主从复制,然而这种做法无法进行分片,也就是说,当数据量很大时,依然会出现读取速度缓慢的问题。

但是用mycat的话,我们不用关心数据源的问题,只需配置主从复制,而且可以分片,操作也很简单,优势是很明显的。

下面我们看下主从复制原理图,如下图所示。writeHost专门复制增删改操作,而readHost专门负责读操作,那么当我向负责写的数据库插入一条数据时,读数据库如何知道我插入数据了呢?这其实用到了binlog文件,当有写操作时,会向binlog文件中记录相关操作,而readHost是可以读取到binlog文件的,从而可以根据binlog文件来实现数据同步。那么有个问题,就是当我有数据正在从写数据库同步到读数据库时,用户这时恰好要访问刚才插入的数据,会不会有问题呢?其实mycat帮我们考虑到了这个问题,当有同步正在进行时,mycat会让相关请求进行等待,等到同步完后,再响应数据。我们用户不用操心访问的是哪个数据库,只需要通过mycat进行操作就可以了。

mysql的主从复制与mycat没有什么关系,我们先来看下主从复制原理图,如下图所示。

主从配置需要注意的地方

1、主DB server和从DB server数据库的版本一致

2、主DB server和从DB server数据库数据一致【这里就可以把主的备份在从上还原,也可以直接将主的数据目录拷贝到从的相应数据目录】

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

下面我们来学习Mysql的 主从复制

Mysql主服务器的配置

第一步:修改/etc/f文件:

在[mysqld]段下添加:

#指定binlog文件在哪个数据库上,这里指定在db1上,这里特别需要注意的是,这里只指定了对数据库db1进行主从复制,也就意味着其它数据库是不能主从复制的

binlog-do-db=db1

#binlog忽略的数据库,这里忽略mysql数据库本身带的mysql库

binlog-ignore-db=mysql

#启用二进制日志

log-bin=mysql-bin

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

server-id=41

第二步:重启mysql

service mysqld restart

第三步:建立账户并授权slave

#创建一个用户"backup",并且密码设置为"123456"

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的状态,其中Position的值120(不是固定的)很重要,我们后面会用到。

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

Mysql从服务器的配置

第一步:修改/etc/f文件,在[mysqld]下面添加

[mysqld]

server-id=42

重启mysql

[root@mysql-server2 ~]# service mysqld restart

第二步:配置从服务器

mysql>change master to master_host=‘192.168.156.41’,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;

如果已经启动了slave,那么需要先关闭slave

mysql>stop slave

然后再启动。

第四步:检查从服务器复制功能状态:最好在mysql工具中执行,因为它的列非常多,工具类查看比较方便。

mysql> show slave status

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

Slave_IO_Running: Yes //此状态必须YES

Slave_SQL_Running: Yes //此状态必须YES

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

注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个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/f文件,重新启动服务。

下面我们便来测试下主从复制是否好用,配置

在主服务器的/etc/f文件当中,在[mysqld]下面我们配置了这么一个配置

binlog-do-db=db1

上面这句配置的意思是主从服务器只针对名称为"db1"的数据库进行主从复制,其它数据库不能进行主从复制。

那么,我们便来在主服务器上新建一个库"db1",并在db1库中新建一张表并在表中插入一条数据。刷新mysql-server(192.168.156.41)和mysql-server2(192.168.156.42),如下图所示,可以看到两个服务器中都有db1数据库了,而且db1库中都有hi_tb表以及表中的数据都一致。这说明主从复制没问题。

注:如果出现不成功的现象,请检查从服务器的从属状态,如下图所示,两个变量必须都是Yes,如果不全是Yes的话,就是错误的。

如果不全是Yes,请参考主服务器的show master status;命令的回显结果,如下图所示。

然后结合从服务器的这条sql命令进行对应的修改即可。

mysql>change master to master_host=‘192.168.156.41’,master_port=3306,master_user=‘backup’,master_password=‘123456’,master_log_file=‘mysql-bin.000002’,master_log_pos=616;

Mycat的配置

Mycat 1.4 支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠,Mycat所在的服务器是192.168.156.41,我们配置的文件是schema.xml,该文件所在的位置在/usr/local/software/mycat/conf目录 下。只修改localhost1,其余的与上篇博客一致即可,配置如下:

show slave status

下面是对上面配置的解释

(1) 设置 balance="1"与writeType=“0”

Balance参数设置:

balance=“0”, 所有读操作都发送到当前可用的writeHost上。balance=“1”,所有读操作都随机的发送到readHost。balance=“2”,所有读操作都随机的在writeHost、readhost上分发

WriteType参数设置:writeType=“0”, 所有写操作都发送到可用的writeHost上。writeType=“1”,所有写操作都随机的发送到readHost。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主从复制时延。

保存配置文件并重新启动mycat。这样mycat便具有读写分离及分片功能了。

[root@taotao-mysql mycat]# bin/mycat restart

以上便是mycat主从复制和读写分离。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。