长春市教育局大数据中心需要准备的技术问题

一、ElasticSearch的备份与还原

============================================================================================================================================================
1. 问题

Elasticsearch 副本提供了高可靠性;它们让你可以容忍零星的节点丢失而不会中断服务。但是,副本并不提供对灾难性故障的保护。对这种情况,你需要的是对集群真正的备份——在某些东西确实出问题的时候有一个完整的拷贝。

2.解决方案

通过快照的方式,将Elasticsearch集群中的数据,备份到HDFS上,这样数据即存在于Elasticsearch(简称ES)集群当中,又存在于HDFS上。当ES集群出现不可恢复性的故障时,可以将数据从HDFS上快速恢复。

也可以选择NFS方式进行备份数据:https://www.cnblogs.com/keithtt/p/7189493.html


3、需要进行的测试
(1)如何进行快照备份
(2)如何进行快照还原
(3)在历史日志时间太久,还不想彻底删除掉,想要归档,可以使用快照方式吗。如果以后还想用,怎么还原回来?


https://www.jianshu.com/p/d2a189f704a2


可以采用rename_pattern和rename_replacement用于重命名index,因为无法将index还原到open的index。

如何删除N个月前的数据?

https://www.cnblogs.com/kasumi/p/6479733.html

https://www.cnblogs.com/zhzhang/p/6946264.html

 

1、已知:可以全库备份,也可以指定index备份。

2、能不能备份指定条件的呢?不知道...意义不大,研究不研究无所谓。

 

3、如果按这个方案,那么HDFS和ES的服务器在物理上要如何规划?比如3台物理服务器(什么样的配置CPU、内存、磁盘??)

组成VMWARE ESXI虚拟机集群,2台NTB的存储,HDFS和ES应该如何避免放在一个篮子里?这里需要规划和绘制示意图,要求教育局购买。 存储的容量如何规划???比如100T ,教育局会问,能用多久?以后扩容怎么办?

是不是需要单独购买硬件防火墙??DDOS攻击怎么办??

============================================================================================================================================================
二、整体的技术架构图

三、各业务系统数据汇集的办法

 

国内同类型软件的实现方法:

http://www.ruisoft.com/solution-smartcity-01.html

http://www.chinawiserv.com/home/news/detail/id/526

 

 

各业务系统需要提供全量和增量数据上报,增量数据上报肯定会要求上报最近新增、修改、删除的数据,最简单的办法是使用触发器,下面给出测试过的各主流数据库触发器方案:

https://www.cnblogs.com/littlehb/p/5614780.html

特殊需要说明的是:对于物理性删除的delete情况,我们需要规划一个deleted表来记录删除的主键ID。

 

 

(1) SqlServer

如果业务库是SqlServer的话,可以参考这篇文章:

http://www.cnblogs.com/iampkm/p/4082916.html  (时间戳方案)

https://blog.csdn.net/yenange/article/details/49636215 (CDC方案)

 

 

(2) Mongodb

如果业务库是Mongodb的话,可以参考这篇文章:

https://blog.csdn.net/u013066244/article/details/80004153

 

(3)Mysql

如果业务库是Mysql的话,还需要特殊注意下这个:

如果Mysql数据库版本低于5.6,可以考虑使用触发器方式:https://blog.csdn.net/heweimingming/article/details/51315895

(4) Oracle方案

https://blog.csdn.net/strawberry1019/article/details/79422071

伪列的方案不是很优雅,不建议使用,因为alter table无效。

 

四、数据汇集有两种方式:

(1)业务系统可能采取提供webservice ,http restful等形式,要求东师理想自己进行数据采集。 这个需要一个个接入。(推荐使用这种!!!)

          缺点:需要单独编码实现,不编码无法完成。

          优点:东师接入可以通过程序控制数据质量,及时发现问题。

 

(2) 业务系统通过东师理想大数据中心的API接口自行编码进行数据上报。

         优点:没有优势。

         缺点:需要单独编码实现,不编码无法完成。

 

(3)业务系统不提供webservice,https restful等形式,主动进行数据上报。(前置机)

         优点:东师理想提供前置机代码,通过简单配置即可完成上报工作,业务系统无开发量,简单。

         缺点:需要将前置机部署到业务系统中,业务系统会比较反感。

 

 

一、全量和增量

其实全量和增量我们可以看做从哪个时间戳开始的问题,从遥远的古代开始,就是从头开始。从昨天晚上18点开始,就可以理解为增量。其实真正的意思是一样的。这个开始的位置,是由服务器维护的,业务系统在上报前需要申请开始位置。

 

二、定时和实时

这类的大数据汇集中心,与东师理想的大数据中心不同。东师理想的大数据中心,采用的是准实时的mysql+canal数据上报方式,延迟时间一般在1秒至3秒间(指正常工作情况下,不出现故障的情况下)。而长春市教育局的大数据中心,个人理解业务系统的数据汇集可以是定时的,定时定长最小为10分钟,这已经足够让其完美的运行,现在流行的ETL工具等,都是定期调度进行数据变更汇集的思路,这无可厚非。

 

上面这些东西,都在一个主题:业务数据的增(改)、删。

我们的设计思路是,不管是增加,还是修改,这条数据都要重新上报覆盖掉旧的即可,所以,无所谓增加还是修改。对于删除,如果是伪删除的话,即标识b_deleted=1这样的删除,其实就是修改,不是真删除,不必讨论。如果是真删除,我们要求必须提供在指定时间戳后,获取删除掉了哪些主键,然后我们发送到大数据中心,对数据进行修改。

 

五、python前置机的功能组成

两个线程

(1) 第一个线程是:正常的增量数据上报,数据扫描时间设置为10分钟。

(2) 第二个线程是:心跳,向数据中心报告其存在,1分钟一次心跳。每次心跳时,向大数据中心获取是否有任务让其执行,比如:将某一个记录上报,从某个时间点开始重新上报(这个可以是增量,也可以是全量,看起始时间点)。

这样做的目的是架构最简单,最清晰,最不易出错。

 

业务系统提供一个只读帐号给python程序,python程序以源码形式提供给各业务系统,python程序不会把业务系统不允许的数据内容进行采集。因python程序也可能需要不断的完善,所有应该是有两个py文件,一个是update.py ,另一个是senddata,py. update.py负责向oss检查是否本地的senddata.py与oss上的同名文件是否md5值一致,不一致则下载回来,保证senddata.py 的自动更新。

 

六、核心 代码

1、全量获取es中的数据

 

#!user/bin/env python3
# -*- coding: gbk -*-

# https://es.xiaoleilu.com/060_Distributed_Search/20_Scan_and_scroll.html

from elasticsearch import Elasticsearch
from elasticsearch import helpers

es_servers = [{
    'host': 'data.edusoa.com',
    'port': 9200
}]
es = Elasticsearch(hosts=es_servers)
index_v="t_wkds_info"
doc_type_v="doc"

# 方式1:ES的API中提供了scan和scroll,这个方法有点类型传统数据库中的游标。
# query={"query" : {"match_all" : {}}}
# scanResp = helpers.scan(es, query, scroll="10m", index=index_v, doc_type=doc_type_v, timeout="10m")
#
# for resp in scanResp:
#     print(len(scanResp))
#     print(resp)

# 方式2:按地区Area_Code='aly'为例,以PK进行遍历
query={
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "area_code": "aly"
                    }
                },
                {
                    "range": {
                        "pk": {
                            "gt": 0
                        }
                    }
                }
            ]
        }
    },
    "size": 500
}

# 起始值

startId=0
allCount=0

while startId>-1:
    query['query']['bool']['must'][1]['range']['pk']['gt']=startId
    _searched = es.search(index=index_v, doc_type=doc_type_v, body=query)
    # 输出查询到的结果
    count=0
    for hit in _searched['hits']['hits']:
        print(hit['_source'], flush=True)
        count=count+1
        allCount=allCount+1
    if count>0:
        startId=_searched['hits']['hits'][count-1]['_source']['pk']
        print("allCount="+str(allCount))
    else:
        startId=-1

print("成功结束!")

 

2、操作Kafka的代码

 

 

Python3.6 连接Mssql

 https://www.cnblogs.com/xuhongfei/p/9145233.html

 https://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql

下载:pymssql-2.1.4.dev5-cp36-cp36m-win_amd64.whl

Python3.6连接oracle数据库

https://www.cnblogs.com/jsonhc/p/7283620.html

下载:cx_Oracle-6.3.1-cp36-cp36m-win_amd64.whl

https://pypi.org/project/cx_Oracle/

https://blog.csdn.net/mhmds/article/details/53079322

Oracle 11g Client x64

https://download.oracle.com/otn/nt/oracle11g/112010/win64_11gR2_client.zip

 

Python 3.6 MongoDb

https://www.cnblogs.com/JansXin/p/7885767.html

https://blog.csdn.net/ialexanderi/article/details/77744190

https://blog.csdn.net/u013066244/article/details/80004153

posted @ 2018-06-30 07:45  糖豆爸爸  阅读(439)  评论(0编辑  收藏  举报
Live2D