定时任务-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-scheduler.org/,可以从官方网站下载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表达式,大家可以参考http://blog.csdn.net/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-20151019230038-linux.tar.gz

2.解压缩安装包mycat
解压后,我们来看看mycat目录下的文件,首先看bin目录,如下所示,其中mycat是用来启动的。
[root@taotao-mysql mycat]# ll bin/
总用量 376
-rwxr-xr-x. 1 root root 15714 10月 19 2015 mycat
-rwxr-xr-x. 1 root root 2947 6月 17 2015 rehash.sh
-rwxr-xr-x. 1 root root 2502 6月 17 2015 startup_nowrap.sh
-rwxr-xr-x. 1 root root 140198 10月 19 2015 wrapper-linux-ppc-64
-rwxr-xr-x. 1 root root 99401 10月 19 2015 wrapper-linux-x86-32
-rwxr-xr-x. 1 root root 111027 10月 19 2015 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 2015 autopartition-long.txt
-rwxrwxrwx. 1 root root 340 10月 19 2015 cacheservice.properties
-rwxrwxrwx. 1 root root 439 10月 19 2015 ehcache.xml
-rwxrwxrwx. 1 root root 931 10月 19 2015 index_to_charset.properties
-rwxrwxrwx. 1 root root 1647 6月 17 2015 log4j.xml
-rwxrwxrwx. 1 root root 15 10月 19 2015 partition-hash-int.txt
-rwxrwxrwx. 1 root root 102 10月 19 2015 partition-range-mod.txt
-rwxrwxrwx. 1 root root 943 10月 19 2015 router.xml
-rwxrwxrwx. 1 root root 4510 10月 19 2015 rule.xml
-rwxrwxrwx. 1 root root 4130 10月 19 2015 schema.xml
-rwxrwxrwx. 1 root root 413 10月 19 2015 sequence_conf.properties
-rwxrwxrwx. 1 root root 75 10月 19 2015 sequence_db_conf.properties
-rwxrwxrwx. 1 root root 51 10月 19 2015 sequence_time_conf.properties
-rwxrwxrwx. 1 root root 2549 10月 19 2015 server.xml
-rwxrwxrwx. 1 root root 4152 10月 19 2015 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 2015 mycat
-rwxr-xr-x. 1 root root 2947 6月 17 2015 rehash.sh
-rwxr-xr-x. 1 root root 2502 6月 17 2015 startup_nowrap.sh
-rwxr-xr-x. 1 root root 140198 10月 19 2015 wrapper-linux-ppc-64
-rwxr-xr-x. 1 root root 99401 10月 19 2015 wrapper-linux-x86-32
-rwxr-xr-x. 1 root root 111027 10月 19 2015 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/my.cnf中 [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 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=‘商品表’;

在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’, ‘’, ‘http://image.taotao.com/jd/4ef8861cf6854de9889f3db9b24dc371.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:33:18’, ‘2015-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’, ‘’, ‘http://image.taotao.com/jd/d2ac340e728d4c6181e763e772a9944a.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:27:54’, ‘2015-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, ‘http://image.taotao.com/jd/a69d0d09a1a04164969c2d0369659b1a.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:33:18’, ‘2015-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, ‘http://image.taotao.com/jd/9c1fcdf2bf20450788195c707da00a87.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:33:18’, ‘2015-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, ‘http://image.taotao.com/jd/65e2007d41dc4e3cb308833a1a910f8d.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:32:31’, ‘2015-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=“http://sale.jd.com/act/bxYeI1346g.html?erpad_source=erpad”>“领券更优惠!”’, ‘49900’, ‘99999’, null, ‘http://image.taotao.com/jd/b3251c85da8e4302b7389f3371dd0a68.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:31:36’, ‘2015-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, ‘http://image.taotao.com/jd/c1775819c7e44b1c903f27514e70b998.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:29:27’, ‘2015-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, ‘http://image.taotao.com/jd/089b79cbe19f454dab24cce65f2e9602.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:28:16’, ‘2015-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, ‘http://image.taotao.com/jd/29e1b92dc7e146489ce46a2262479a0f.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:28:30’, ‘2015-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, ‘http://image.taotao.com/jd/5a45e88aeca046ec88d7b7ffbc47092a.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:28:44’, ‘2015-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=“http://item.jd.com/1278686.html”>还有升级版安卓智能新机46DS52供您选择!’, ‘379900’, ‘99999’, null, ‘http://image.taotao.com/jd/2e45ff47f2e7424cb6d95fb9f05151bd.jpg’, ‘76’, ‘1’, ‘2015-03-08 21:27:39’, ‘2015-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, ‘http://image.taotao.com/jd/4f1d41baa6c84219a622f20a4f1c32bb.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:28:30’, ‘2015-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, ‘http://image.taotao.com/jd/4021f8a1ffcc4ae2a313c2012d9f35c8.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:28:44’, ‘2015-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, ‘http://image.taotao.com/jd/e638243d8341474293be09ad157546b8.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:28:01’, ‘2015-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, ‘http://image.taotao.com/jd/657c61e5018043f89d9fe0f9a1519884.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:28:30’, ‘2015-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, ‘http://image.taotao.com/jd/306b2287ce1c4b3bb541f37984d67929.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:28:09’, ‘2015-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, ‘http://image.taotao.com/jd/c687f304b5164b1b84736b9a4d34a37c.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:27:42’, ‘2015-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, ‘http://image.taotao.com/jd/2cd67c806e054435bce4c931a731493a.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:27:54’, ‘2015-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, ‘http://image.taotao.com/jd/d958a21cec814fdeab934d43b4fb2e06.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:27:49’, ‘2015-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=“http://sale.jd.com/act/Kt0aHzbU7uR1M.html”>“点击进入长虹新年专场”’, ‘269900’, ‘99999’, null, ‘http://image.taotao.com/jd/08dabc37342943ffb717632f9ee40685.jpg’, ‘76’, ‘1’, ‘2015-03-08 21:27:35’, ‘2015-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=“http://item.jd.com/1278664.html”>还有升级版安卓智能新机52DS52供您选择!’, ‘549900’, ‘99999’, null, ‘http://image.taotao.com/jd/63af01c37a18454ab2fef4670046272e.jpg’, ‘76’, ‘1’, ‘2015-03-08 21:27:45’, ‘2015-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, ‘http://image.taotao.com/jd/f22fd70d7d26492e88e3368e6d528779.jpg’, ‘560’, ‘1’, ‘2015-03-08 21:28:16’, ‘2015-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=“http://sale.jd.com/act/Kt0aHzbU7uR1M.html”>“点击进入长虹新年专场”’, ‘339900’, ‘99999’, null, ‘http://image.taotao.com/jd/4055ccf141a143c99a6d51e9107f96c1.jpg’, ‘76’, ‘1’, ‘2015-03-08 21:27:39’, ‘2015-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/my.cnf文件:
在[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/my.cnf文件,在[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/auto.cnf文件,重新启动服务。
在这里插入图片描述

下面我们便来测试下主从复制是否好用,配置
在主服务器的/etc/my.cnf文件当中,在[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参数设置:

  1. balance=“0”, 所有读操作都发送到当前可用的writeHost上。
  2. balance=“1”,所有读操作都随机的发送到readHost。
  3. balance=“2”,所有读操作都随机的在writeHost、readhost上分发
    WriteType参数设置:
  4. writeType=“0”, 所有写操作都发送到可用的writeHost上。
  5. writeType=“1”,所有写操作都随机的发送到readHost。
  6. 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主从复制和读写分离。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我了解了您的问题。在Spring Cloud集成Quartz时,需要进行以下数据库配置: 1. 首先,在您的Spring Boot项目中添加Quartz的依赖项。您可以在pom.xml文件中添加以下依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 2. 接下来,在application.properties文件中配置Quartz数据库属性,例如: ``` spring.quartz.job-store-type=jdbc spring.quartz.jdbc.initialize-schema=always spring.datasource.url=jdbc:mysql://localhost:3306/quartz spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.jdbc.Driver ``` 其中,spring.quartz.job-store-type设置为jdbc,表示Quartz将使用数据库存储作业和触发器,spring.quartz.jdbc.initialize-schema设置为always表示每次启动应用程序时都会初始化Quartz数据库,spring.datasource.url、spring.datasource.username、spring.datasource.password和spring.datasource.driver-class-name为您的数据库连接属性。 3. 最后,定义您的定时任务,例如: ``` @Configuration public class QuartzConfiguration { @Bean public JobDetail myJobDetail() { return JobBuilder.newJob(MyJob.class) .withIdentity("myJob") .storeDurably() .build(); } @Bean public Trigger myTrigger() { return TriggerBuilder.newTrigger() .forJob(myJobDetail()) .withIdentity("myTrigger") .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build(); } } @Component public class MyJob implements Job { @Override public void execute(JobExecutionContext context) { // 任务逻辑 } } ``` 其中,定时任务使用Cron表达式配置,该表达式将在每分钟的第0秒开始,每5秒执行一次任务。 以上就是Spring Cloud集成Quartz数据库配置定时任务的方法。希望能够帮助到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值