一、背景
随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。
使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。
二、现有方法及问题
对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张MySQL 表中,这张中间表对应了业务需要的 Elasticsearch 索引,每一列对应索引中的一个Mapping 字段。通过脚本以 Crontab 的方式,读取 MySQL 中间表中 UTime 大于上一次读取时间的所有数据,即该段时间内的增量,写入Elasticsearch。
所以,一旦业务逻辑中有相应字段的数据变更,需要同时顾及 MySQL 中间表的变更;如果需要 Elasticsearch 中的数据即时性较高,还需要同时写入 Elasticsearch。
随着业务数据越来越多,MySQL 中间表的数据量越来越大。当需要在 Elasticsearch 的索引中新增 Mapping 字段时,相应的 MySQL 中间表也需要新增列,在数据量庞大的表中,扩展列的耗时是难以忍受的。
而且 Elasticsearch 索引中的 Mapping 字段随着业务发展增多,需要由业务方增加相应的写入 MySQL 中间表方法,这也带来一部分开发成本。
三、方案设计
1. 整体思路
现有的一些开源数据同步工具,如阿里的 DataX 等,主要是基于查询来获取数据源,这会存在如何确定增量(比如使用utime字段解决等)和轮询频率的问题,而我们一些业务场景对于数据同步的实时性要求比较高。为了解决上述问题,我们提出了一种基于 MySQL Binlog 来进行 MySQL 数据同步到 Elasticsearch 的思路。Binlog 是 MySQL 通过 Replication 协议用来做主从数据同步的数据,所以它有我们需要写入 Elasticsearch 的数据,并符合对数据同步时效性的要求。
使用 Binlog 数据同步 Elasticsearch,业务方就可以专注于业务逻辑对 MySQL 的 *** 作,不用再关心数据向 Elasticsearch 同步的问题,减少了不必要的同步代码,避免了扩展中间表列的长耗时问题。
经过调研后,我们采用开源项目 go-mysql-elasticsearch 实现数据同步,并针对马蜂窝技术栈和实际的业务环境进行了一些定制化开发。
2. 数据同步正确性保证
公司的所有表的 Binlog 数据属于机密数据,不能直接获取,为了满足各业务线的使用需求,采用接入 Kafka 的形式提供给使用方,并且需要使用方申请相应的 Binlog 数据使用权限。获取使用权限后,使用方以 Consumer Group 的形式读取。
这种方式保证了 Binglog 数据的安全性,但是对保证数据同步的正确性带来了挑战。因此我们设计了一些机制,来保证数据源的获取有序、完整。
1). 顺序性
通过 Kafka 获取 Binlog 数据,首先需要保证获取数据的顺序性。严格说,Kafka 是无法保证全局消息有序的,只能局部有序,所以无法保证所有 Binlog 数据都可以有序到达 Consumer。
但是每个 Partition 上的数据是有序的。为了可以按顺序拿到每一行 MySQL 记录的 Binglog,我们把每条 Binlog 按照其 Primary Key,Hash 到各个 Partition 上,保证同一条 MySQL 记录的所有 Binlog 数据都发送到同一个 Partition。
如果是多 Consumer 的情况,一个 Partition 只会分配给一个 Consumer,同样可以保证 Partition 内的数据可以有序的 Update 到 Elasticsearch 中。
2). 完整性
考虑到同步程序可能面临各种正常或异常的退出,以及 Consumer 数量变化时的 Rebalance,我们需要保证在任何情况下不能丢失 Binlog 数据。
利用 Kafka 的 Offset 机制,在确认一条 Message 数据成功写入 Elasticsearch 后,才 Commit 该条 Message 的 Offset,这样就保证了数据的完整性。而对于数据同步的使用场景,在保证了数据顺序性和完整性的情况下,重复消费是不会有影响的。
四、技术实现
1. 功能模块
配置解析模块
负责解析配置文件(toml 或 json 格式),或在配置中心(Skipper)配置的 json 字符串。包括 Kafka 集群配置、Elasticsearch 地址配置、日志记录方式配置、MySQL 库表及字段与 Elasticsearch 的 Index 和 Mapping 对应关系配置等。
规则模块
规则模块决定了一条 Binlog 数据应该写入到哪个 Elasticsearch 索引、文档_id 对应的 MySQL 字段、Binlog 中的各个 MySQL 字段与索引 Mapping 的对应关系和写入类型等。
在本地化过程中,根据我们的业务场景,增加了对 MySQL 表各字段的 where 条件判断,来过滤掉不需要的 Binlog 数据。
Kafka 相关模块
该模块负责连接 Kafka 集群,获取 Binlog 数据。
Binlog 数据解析模块
原项目中的 Binlog 数据解析针对的是原始的 Binlog 数据,包含了解析 Replication 协议的实现。在我们的使用场景中,Binlog 数据已经是由 canal 解析成的 json 字符串,所以对该模块的功能进行了简化。
binlog json字符串示例
上面是一个简化的 binlog json 字符串,通过该条 binlog 的 database 和 table 可以命中一条配置规则,根据该配置规则,把 Data 中的 key-value 构造成一个与对应 Elasticsearch 索引相匹配的 key-value map,同时包括一些数据类型的转换:
Elasticsearch相关模块
Binlog 数据解析模块生成的 key-value map,由该模块拼装成请求_bulk 接口的 update payload,写入 Elasticsearch。考虑到 MySQL 频繁更新时对 Elasticsearch 的写入压力,key-value map 会暂存到一个 slice 中,每 200ms 或 slice 长度达到一定长度时(可以通过配置调整),才会调用 Elasticsearch 的_bulk 接口,写入数据。
2. 定制化开发
1). 适应业务需求
upsert
业务中使用的索引数据可能是来自多个不同的表,同一个文档的数据来自不同表的时候,先到的数据是一条 index,后到的数据是一条 update,在我们无法控制先后顺序时,需要实现 upsert 功能。在_bulk 参数中加入
Filter
实际业务场景中,可能业务需要的数据只是某张表中的部分数据,比如用 type 字段标识该条数据来源,只需要把 type=1或2的数据同步到 Elasticsearch 中。我们扩展了规则配置,可以支持对 Binlog 指定字段的过滤需求,类似:
2)快速增量
数据同步一般分为全量和增量。接入一个业务时,首先需要把业务现有的 历史 MySQL 数据导入到 Elasticsearch 中,这部分为全量同步。在全量同步过程中以及后续增加的数据为增量数据。
在全量数据同步完成后,如果从最旧开始消费 Kafka,队列数据量很大的情况下,需要很长时间增量数据才能追上当前进度。为了更快的拿到所需的增量 Binlog,在 Consumer Group 消费 Kafka 之前,先获取各个 Topic 的 Partition 在指定时间的 offset 值,并 commit 这些 offset,这样在 Consumer Group 连接 Kafka 集群时,会从刚才提交的 offset 开始消费,可以立即拿到所需的增量 Binlog。
3). 微服务和配置中心
项目使用马蜂窝微服务部署,为新接入业务提供了快速上线支持,并且在业务 Binlog 数据突增时可以方便快速的扩容 Consumer。
马蜂窝配置中心支持了各个接入业务的配置管理,相比于开源项目中的 toml 格式配置文件,使用配置中心可以更方便的管理不同业务不同环境的配置。
五、日志与监控
从上图中可以看出,订单各个表的数据同步延时平均在 1s 左右。把延时数据接入 ElastAlert,在延时数据过多时发送报警通知。
另一个监控指标是心跳检测,单独建立一张独立于业务的表,crontab 脚本每分钟修改一次该表,同时检查上一次修改是否同步到了指定的索引,如果没有,则发送报警通知。该心跳检测,监控了整个流程上的 Kafka、微服务和 ES,任何一个会导致数据不同步的环节出问题,都会第一个接到通知。
六、结语
目前接入的最重要业务方是电商的订单索引,数据同步延时稳定在 1s 左右。这次的开源项目本地化实践,希望能为一些有 Elasticsearch 数据同步需求的业务场景提供帮助。
本次设计的《网上购物系统》是采用JSP、JAVABean、Servlet、C3P0、JSTL、mail、以及JDBC等技术综合开发出来的网上购物系统。前台的主要功能包括登录、注册、分类查询商品信息、搜索商品、购物车管理、订单管理和在线支付等,后台的主要更能包括管理员登陆、商品分类的增删改查、商品的增删改查、订单分状态的查询以及在订单中对已付款的订单进行发货。
针对本系统的开发设计和各项需求,包括软件需求说明书、开发计划、设计报告等,在论文中进行了详细的介绍,并针对详细的设计、编写及报告的书写规范进行了阐述。
功能需求
网上购物系统,目的是在网络上建立一个虚拟的购物商城,避免了挑选商品的烦琐过程,使购物过程变得轻松、快捷、方便,很适合现代人快节奏的生活。主要包括基础登录、注册、商品分类显示、搜索功能、购物车管理、订单管理、在线支付、后台管理员登录、后台商品管理(CRUD)、分类管理(CRUD)、订单查看以及做出管理员发货。
功能描述:
(1) 前台
a 分类查询
该模块主要是可以让用户可以按分类进行查看商品,这样减轻了用户一下查看浏览商品的臃肿。
b 搜索
该模块主要是可以让用户可以根据自己想要的物品来进行查看,这样更有效的让用户找到自己想要的商品。
c 购物车
该模块主要是用户查看过商品后,如果喜欢可以直接添加购物车,然后可以继续浏览商品,达到了一起结算商品的效果。
d 订单管理
该模块主要是用户可以查看自己所有的订单,并显示订单的状态,用户可以在订单中付款以及确认收货。
e 在线付款管理
该模块主要是用户挑选完商品后,可以直接在线支付,实现了无纸化交换。然后用户就可以坐等商品了。
f 用户管理
该模块主要是用户注册、登录。当未登录时用户不能进行商品的购买,并且在注册的时候需要验证邮箱。
(2) 后台
a 分类管理
该模块主要是管理员可以直接进入后台对前台显示的分类进行增删改查。并直接同步到前台。
b 商品管理
该模块主要是管理员可以直接进入后台对前台显示的商品进行修改、下架、以及添加商品。并直接同步到前台。
c 订单管理
该模块主要是管理员可以直接进入后台所有用户的所有订单,进行查看以及发货的功能。并直接同步到前台。
2.5 系统特点
页面模块化:系统在界面设计上采用了模块化处理思想,把很多页面共有部分集成一个模块。
系统界面应美观大方,易于接受,方便的规范管理。
85488c2fb5b3d888ce44e6df825f07ad.png
34b9b8924783e8920a945f67e6fbf1a5.png
76c4559d5141e04b98bb072b935dd803.png
252947c47e12b34fffe35c92faea2205.png
b7aea0387fff3df804b24da24e9ab9d1.png
a73ed3f05e3d4764913bf77f4369850a.png
2d26a30bcc4ff6b63ad0d9de49ab0e7d.png
e05b786d64af86289476d28d370c3899.png
目 录
摘 要I
ABSTRACTII
1 绪论1
1.1 项目背景和意义1
1.2 基本原理1
1.3 开发工具2
2 需求说明3
2.1 概述3
2.1.1 文档目的3
2.1.2 需求分析目的3
2.1.3 项目对象范围3
2.2 任务概述4
2.2.1 系统概述4
2.2.2 目标4
2.3 性能需求4
2.4 功能需求5
2.5 系统特点6
2.6 运行需求7
2.6.1 用户界面7
2.6.2 硬件接口7
2.6.3 软件接口7
3 系统解决方案8
3.1 JAVA 简介8
3.2 JDK 简介8
3.3 B/S架构8
3.4 JSP简介9
3.5 MVC简介10
3.6 功能模块设计11
3.6.1 前台模块设计11
3.6.2 后台模块设计12
3.7 系统功能流程图12
3.7.1 系统登陆流程图12
3.7.2 数据添加流程图13
3.8 数据库详细设计13
3.8.1 用户信息表13
3.8.2 商品分类表14
3.8.3 商品表14
3.8.4 订单表15
3.8.5 订单项表15
4 网上购物系统的运行效果及实现(前台)16
4.1 首页设计16
4.2 用户模块17
4.2.1 用户注册17
4.2.2 用户登录18
4.2.3 用户退出19
4.3 商品模块19
4.3.1 商品列表19
4.3.2 商品详细19
4.4 购物车20
4.4.1 添加商品到购物车20
4.4.2 我的购物车21
4.4.3 删除条目21
4.5 订单模块21
4.5.1 生成订单/支付页面21
4.5.2 订单列表22
4.5.3 订单状态23
5 网上购物系统的运行效果及实现(后台)24
5.1 管理员登录24
5.2 后台主页24
5.3 分类管理25
5.3.1 分类列表25
5.3.2 添加分类25
5.3.3 修改分类26
5.3.4 删除分类26
5.4 商品管理26
5.4.1 商品列表页面26
5.4.2 添加商品27
5.4.3 商品详细27
5.5 订单管理28
5.5.1 订单列表28
5.5.2 订单发货29
6 系统测试30
6.1 测试的目的与目标30
6.2 测试方法30
6.3 测试用例30
6.4 测试结论31
结束语32
致谢33
参考文献34
相关资源:PHP+MYSQL—食品购物管理系统(前端+后端全套源码)-PHP文档类资源...
文章知识点与官方知识档案匹配
MySQL入门技能树设计优化反范式设计
28659 人正在系统学习中
打开CSDN,阅读体验更佳
基于PHP+MySQL的小型购物系统网站_biyezuopinvip的博客
现在点击查看购物车,发现购物车是空的,让我们点击“继续购物”去添加商品吧~ 点击任意物品加入购物车,自动跳转到购物车界面: 如果要改变物品数量,只要改变输入框内的内容,然后点击保存更改即可,如果输入 0,系统会自动从购物车中删除这个...
继续访问
...系统(建表语句、检索语句)_比个柒的博客_mysql购物系统
mysql>delimiter$$ mysql>createproceduretest1()->begin->selectt2.`name`asp_name,t2.type,sum(t1.gm_num)asnum->fromcarast1->leftjoinproductast2ont1.pid=t2.id->groupbyt2.id->end$$ Query OK,0rowsaffected(0.04sec...
继续访问
最新发布 基于javaweb+mysql的简单购物车
基于javaweb+mysql的简单购物车 运行环境 Java≥8、MySQL≥5.7、Tomcat≥8 开发工具 eclipse/idea/myeclipse/sts等均可配置运行 适用 课程设计,大作业,毕业设计,项目练习,学习演示等 功能说明 注册、登录、注销 商品加入购物车,查看购物车,删除购物车中的商品和清空购物车 生成订单,查看历史订单及订单详情等 技术框架 **JSP Servlet MySQL** JDBC Tomcat
继续访问
网上购物平台数据库设计
该文档详细介绍了电商平台后台数据库开发流程,对没有开发经验的人员具有参考意义。
基于Java的网上购物系统的设计与实现【附源码】
本文主要通过对系统的前台系统和后台管理系统进行了功能性需求分析,对系统的安全性和可扩展性进行了非功能性需求分析。在详细的需求分析的基础上,根据系统的功能设计确定了数据库结构,实现完整的代码编写。网上购物系统使用 Dreamweaver、MyEclipse代码编辑器、Tomcat服务器等开发工具,完成了系统的主要模块的页面设计和功能实现。本文展示了首页页面的实现效果图,并通过代码和页面介绍了用户注册功能、商品搜索功能、加入订单和查看订单功能、生成订单和查看我的订单功能、在线付款功能以及商品推荐功能的实现过程。
jsp mysql购物系统
一个完整的系统,下载后连上数据库就能用,特别不错
网上购物系统数据库设计
该数据库用于网上购物系统,能够支持一般网上超市的网上营业。
基于JavaMaven+MySQL的网上B2C商城系统前后台设计
id=15217另一部分是商城的后台,是管理员用来管理商城的,这部分包括,商成数据展示、商品分类管理、商品信息管理、会员管理、订单管理。2.用户提交后会对表单数据进行校验,用户名不可用重复,邮箱格式也必须正确且不允许重复,密码用户自定义,重复密码需要与密码栏书写一致,防止用户 *** 作失误输入错误的密码。登录模块、注册模块、首页商品列表显示模块、商品列表显示模块、 商品详情模块、购物车模块、收获地址模块、订单模块、个人中心模块。6.5 测试设计与测试结果 40。6.4 测试需求分析 39。
继续访问
python+mysql基础项目:商场购物+管理系统
利用python和mysql来实现简易商场购物和管理系统
继续访问
网上商城系统MySql数据库设计项目实战
网上商城系统MySql数据库设计
继续访问
使用MYeclipse写的注册登录页面
注册页面 因为doget的内容和dopost的内容相同,所以doget调用了dopost。 由于个人 *** 作失误,这张图片与上面一张图片位置反了 登录页面
继续访问
myEclipse实现购物车
使用JDBC数据库驱动及 *** 作数据及使用JSP内置对象的使用 开发一个简易购物车程序
如何制作自己的网页java_怎样制作自己的购物网站页面?
如果是自己去做一个购物网站,推荐你采用以下步骤一、项目大致分析我这个网站做来干什么,有什么用,几个人做,多长时间做完,采用什么架构,需要用到什么技术等。二、具体分析既然是用Java做,你就不得不用面向对象的思维来分析问题。首先,找出整个项目中的实体及属性比方说,你这个系统至少应该抽象出这么几个实体用户(用户编号、用户名、密码、性别等其他信息)商品(商品编号、商品名、商品分类、单价、描述等信息)商品...
继续访问
mysql购物数据表_购物商城数据库设计-商品表DDL(Mysql)
大家好,之前我们设计了购物商城的商品表结构(原文链接),现在我们来具体实现表的DDL。下载地址:前往下载新建一个数据库,名字叫mall,基字符集:utf-8,:数据库排序规则:utf-8_general_ci对于商品模块,统一使用goods_做前缀。首先是两个比较简单的表:分类表和品牌表分类表:CREATE TABLE `goods_category` (`id` bigint(20) unsig...
继续访问
mysql数据库原理及设计_MySQL数据库原理、设计与应用
内容简介本书是面向MySQL数据库初学者推出的一本入门教材,以通俗易懂的语言、丰富实用的案例,详细讲解了MySQL的开发和管理技术。全书共12章。第1章讲解了数据库基本概念和MySQL的安装步骤;第2~3章讲解了数据库的基本 *** 作,第4章讲解了数据库设计的理论与实践;第5~6章讲解了单表和多表的查询 *** 作;第7~11章讲解了用户与权限、视图、事务、存储过程、索引等,适合需要提高自身技术的读者;第12章...
继续访问
基于JAVA的网上购物系统设计_基于Java的网上购物系统的设计与实现
访问等关键事务,只负责显示部分,所以维护人员不再为程序的维护工作奔波于每个客户机之间,而把主要精力放在功能服务器上程序的更新工作。这种三层结构在层与层之间相互独立,任何一层的改变不会影响其它层的功能。2.4 系统主要技术简介SSH 为 struts+spring+hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架。集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数...
继续访问
基于JSP+Servlet+MySQL简单的购物商城系统
基于JSP+Servlet+MySQL简单的购物商城系统,包含普通用户,整体功能包含登陆注册,商品浏览,搜索,添加购物车,购物车管理,订单管理等。后端框架: Spring+SpringMVC+Mybatis。后端框架: Spring+SpringMVC+Mybatis。基于JSP+Servlet+MySQL简单的购物商城系统。开发工具: Idea/Eclipse。开发工具: Idea/Eclipse。前段框架:jquery/Jsp。前段框架:jquery/Jsp。数据库: mysql。
继续访问
热门推荐 (三)购物商城数据库设计-商品表DDL(Mysql)
大家好,之前我们设计了购物商城的商品表结构(原文链接),现在我们来具体实现表的DDL。对于建表规范,可以参考本系列第一篇文章:前期准备 下载地址:前往下载 新建一个数据库,名字叫mall,基字符集:utf-8,:数据库排序规则:utf-8_general_ci 对于商品模块,统一使用goods_做前缀。 首先是两个比较简单的表:分类表和品牌表 分类表: CREATE TABLE...
继续访问
MyEclipse2015破解安装与使用
现在进行Java、CSS、JavaScript开发的越来越多了,没有一个合适的便利的编译器怎么能提高开发效率呢?俗话说“工欲善其事必先利其器”,一个优秀的编译器除了具有良好的代码提示功能、美观的界面、便捷的安装配置与快捷按钮等除外(大神除外,对于他们来说使用集成开发环境IDE来说就是多余的,只需要简单的文本编译器各种代码就可以手到擒来),还需要将众多的开发工具集中在一起,这样开发起来就会更加的高效...
继续访问
java购物网站怎么做_用JAVA写的一个购物网站
【实例简介】自己用JAVA写的一个购物网站 主要用了JSP+SERVLET 技术 发生来跟大家交流一下 有什么宝贵意见可以提【实例截图】【核心代码】Shopping└── Shopping├── WebContent│ ├── Addgoods.jsp│ ├── Backorder.jsp│ ├── GoodsDetails.jsp│ ├── Goodsview.jsp│ ├─...
继续访问
用asp.net写的一个购物网站
基于ASP.Net写的一个购物网站 文章目录基于ASP.Net写的一个购物网站一、数据库设计二、登录注册三、功能说明以及运行1.首页2.商品分类3.热门零食4.推荐零食5.商品详情页6.我的购物车总结 一、数据库设计 二、登录注册 1.登录界面 2.注册界面 首先先在数据库表users中插入几条数据,表示这是已经注册过的用户,如果在登录时,输入的用户名和密码和数据表中的数据一致,则表明该用户存在,则会显示登录成功,并跳转到首页页面去。如果用户之前没注册过,需要先注册,注册的用户名不能重复,如果用
继续访问
Java web 购物网站开发
Java web 购物网站开发 开发工具 MyEclipse SQL sever 2008 Dreamweaver Tomcat 管理系统的网页是套的模板,购物网页以及所有功能的实现自己写的,下载内容包括数据库。 如果Tomcat打不开端口要么改8005,8080,8009或8885,8888,8889. 提取码:kl5j 下载地址
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)