• TB级数据秒查询之 - ClickHouse初探

    一.背景 1.公司的后端架构基于k8s的微服务体系,每个服务都拥有独立的Mysql库。而我们还有MongoDB集群,redis集群的数据分布,这样对于我们在做数据聚合的时候异常麻烦,数据抽象也不够具体。公司的平均日活大概在500W左右,最近在研发推荐系统,需要大量的数据来跑行为分析,所以搭建完善的数据聚合平台迫在眉睫。 2.每天会有百万次的查询请求,数据的查询粒度由上往下,愈发细,关键业务的数据需要穿插多个rpc,关联好几M的数据,维度的不同,导致查询的压力也极速上升 初始的时候,我们尝试将MySQL做Sharding,但数据量较大,成本还是比较高的。然后又尝试将热点扔到ES中,但是如果信息变化了,每次不得不刷全量数据,所以不太适合做大表的更新。 直到我们碰到ClickHouse! 二.基本介绍 https://clickhouse.yandex/docs/en/ 参考官方文档 下面来说说...
    • 0
    • 15
    • 3
    • 2019-09-14
  • gitlab配置邮件通知服务

    在使用gitlab的时候,我们会需要用邮件来注册验证,所以,邮件服务是需要配置的。 vi /etc/gitlab/gitlab.rb gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.qiye.aliyun.com" gitlab_rails['smtp_port'] = 25 gitlab_rails['smtp_user_name'] = "gitlab@moensun.com" gitlab_rails['smtp_password'] = "xxxx" gitlab_rails['smtp_domain'] = "moensun.com" gitlab_rails['smtp_authentication'] = "login" gitlab_rails['smtp_enable_star...
    • 0
    • 5
    • 0
    • 2019-09-14
  • mobx的初步使用

    最近开启一个新的项目,框架是react。但是在选择数据状态管理的时候,有点选择困难了。 总的说来,react状态管理,有如下几种: react-redux 写起来太过繁琐 dva 集成度太高,版本老旧,虽然是阿里的产品,但是目前基本处于不维护状态 rematch 作者不维护了 mobx 其实,前三个都是redux或者对redux的封装,mobx的另外一种模式,具体的区别,不赘述。 场景,我们设计一个全局的状态管理 1.添加依赖 "mobx": "^4.0.0", "mobx-react": "^5.0.0", "mobx-react-devtools": "^5.0.0", 2.定义一个store import {observable, computed, action} from 'mobx'; export default class CtxStore{ @observabl...
    • 0
    • 30
    • 0
    • 2019-09-08
  • Spring Security如何进行自定义密码校验

    众所周知,Spring Security框架中,关于登陆认证这一块,官方似乎过于封闭,仅仅提供了几个模式,比如密码模式,客户端模式,等等等,但是我们要想自己实现一个模式的话,就比较麻烦了。 我在项目中,其实由于产品的原因,是要求数据库存储的密码,要求非明文,并且是可逆的, 而spring security原生的密码校验,似乎和我们往常登陆中的校验有些不一样。 那我就来跟一下源码看看吧。 1,首先前面的咱们就不说了,无非是进入登陆的主入口,TokenEndpoint类中的/oath/token映射的方法中。 这个类在spring-security-oauth jar包中的,/org/springframeword/security/oauth2/provider包中。 这个做为入口类,执行认证方法,但是,在方法中并没有找到密码认证的过程。 正纳闷呢,偶然间发现在TokenEndpoint同包...
    • 0
    • 12
    • 1
    • 2019-09-08
  • 记一个spring注解式事物不生效问题

    今天同事找到我说我给的demo项目的Spring @Transactional注解无法生效了。由于框架是我搭的,于是我就开始排查问题。 思路一:怀疑异常被捕获了。 众所周知,spring @Transactional注解是利用动态代理的方式,生成一个当前被spring管理的类的代理对象,并通过在代理方法的前后进行事物的边界提交和回滚。如果异常被捕获了,那么代理方法后就无法捕获到异常,代理对象就无法对事物进行回滚。 然而,我看了他们的代码,并没有自己捕获异常,于是此怀疑推翻。 思路二:怀疑抛出的不是RuntimeException,Spring 的默认事物管理器无法捕获非RuntimeException。 然而,我尝试在方法里进行除0操作。也无法正常事物回滚。 思路三:会不会是没加@Transactional的方法调用了加了@Transactional的方法导致的事物失效。 然而,并没有。 ...
    • 0
    • 15
    • 1
    • 2019-09-04
  • 【水文】后续计划

    水文 最近好久没写文章了,其实最近一直在想整理 Kubernetes 集群系列文章,所以有了初步的计划 踩坑 Vagrant 这里说明下为啥要搞 Vagrant ,不玩 VM的虚机,通过 VM 的虚机去跑集群。通过思考几种方案得出如下结论: 首先 VM 那套着实比较麻烦,虽然我可以通过虚机镜像去维护可以集群,但是。。。。重点是不够【装逼】 Vagrant 有自己的 Vagrantfile 配置文件可以维护,对于后期的维护性有较好的保证 Vagrant 其实并没有 VM 那么重,内存稍微高配的机子其实没啥压力 Vagrant 相比 集群测试与验证比 VM 创建的虚机简单多了 其实还是感觉够装逼 摸一把 Vagrant 的好处: 考虑到在自己后续的学习和调研中 ,我确实没那么多服务器可以折腾,所以通过熟悉 Vagrant 的使用可以让我极大的为后续分布式和集群方面的场景提供很大的便利 在实际的...
    • 0
    • 13
    • 1
    • 2019-09-03
  • kotlin和java混合编码的时候遇到的坑

    在用kotlin做spring boot的项目的时候,因为properties的类,如果用kotlin写的话,idea没法自动提示。所以我是用Java去编写的properties的。但是,这样会有一个问题,就是这种混编的情况下,如果在kotlin类中引用java的类,在idea下执行没什么问题,但是在用java命令执行的时候,会报类找不到。 报错信息 java.lang.ClassCastException: java.lang.ClassNotFoundException cannot be cast to [Ljava.lang.Object;        at org.springframework.boot.context.properties.EnableConfigurationPropertiesImportSelector$ConfigurationPropertiesB...
    • 0
    • 10
    • 0
    • 2019-09-02
  • spring boot 不同name的@Cacheable独立设置属性

    我们在spring中使用缓存的时候,一般都是使用@Cacheable注解做的,但是,如果要做一些个性化的配置,大多还是选择了直接操作redisTempalte。 之前有类似需求的时候,还参考spring的redis实现,单独写了一套缓存注解以及实现。其实,spring的缓存是支持针对value对每个缓存空间进行独立的设置的。 在RedisCacheManager 这个类下面,有这么一个构造方法。 /** * Creates new {@link RedisCacheManager} using given {@link RedisCacheWriter} and default * {@link RedisCacheConfiguration}. * * @param cacheWriter must not be {@literal null}. * @param defaul...
    • 0
    • 25
    • 0
    • 2019-08-30
  • flink之TimeWindow

    在流处理应用中,数据是连续不断的,因此我们不可能等到所有数据都到了才开始处理。当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理。 窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。一种经典的窗口分类可以分成:翻滚窗口(Tumbling Window,无重叠),滚动窗口(Sliding Window,有重叠),和会话窗口(Session Window,活动间隙)。 从网络找了一张图,基本可以代表各种window。 Time Window Time Window 是根据时间对数据流进行分组的。各种概念,此处不赘述。 基于之前kafka datasource的代码,我们写一个timeWindow的demo,统计每分钟收到的消息条数。 首先将之前的,kafka的数据发送频率降低到3s每次。 C...
    • 0
    • 19
    • 0
    • 2019-08-29
  • k8s 生产环境 使用经验

    在生产环境使用K8S已经有一段时间了,从刚开始连概念都不知道,到最后有一整套集成发布、调度的系统上线,中间有比较多的经历,有的问题网上搜索一下就有答案,有的比较抓狂,需要各种摸索,诸多问题总结如下: 1: 为什么选用k8s 使用k8s相对于以前有比较大的变更,不紧紧是发布,连部署都已经变更,我们有着500+机器的集群,说大不大,说小不小,使用k8s并不是为了赶时髦,而的确是碰到了一些实际问题,而k8s是当前比较完善的解决方案 部署层面: 原先使用的是jenkins发布,权限不好控制,每次发布、回滚需要打包,特别是回滚,特别慢 资源浪费,比如申请个4核8G的机器,部署1到2个项目,剩下的资源是浪费的 无法做到无损和动态扩容,原有的通过HAproxy挂在前面的方式,在部署需要扩容的时候,需要人力参与 2: k8s 集群怎么部署 k8s的部署相对来说比较复杂,庆幸的是,我们在选型的时候,k8s已...
    • 0
    • 24
    • 1
    • 2019-08-27