linux

virtualbox 网络

静态ip 在通过virtaulbox搭建虚拟机时,网络配置是绕不开的功能,我们可选择NAT,即配置一个全局的NAT网络,在虚拟节node上选择NAT并配置全局的NAT网络配置,有时当启动node后,节点上无ip,这时可手动修改网络配置 # vi /etc/sysconfig/network-scripts/ifcfg-enp0s3 BOOTPROTO 的值修改为 static (设置静态 IP 模式) ONBOOT 的值修改为 yes (开机自启动) 添加 IP,GATEWAY,NETMASK,DNS 等信息 IP gateway等信息需要与全局的Nat网络对应 然后执行service

  • 凯文
1 min read
mysql

mysql Communications link failure

原因 mysql连接错误 复现 启动服务 请求接口,调用mysql获取数据 stop mysql 请求接口报错 启动mysql 请求接口,未自动恢复,仍报错Communications link failure 解决方案 使用DruidDataSource使用com.mysql.jdbc.Driver 当创建失败时,会通过com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread循环创建连接,间隔时间为timeBetweenConnectErrorMillis直到获取到正常的连接 使用DruidDataSource使用com.p6spy.engine.spy.P6SpyDriver

  • 凯文
1 min read
redis

redis库存方案

场景说明 设计秒杀活动时,因需要保证在高并发场景下库存不会超卖,或 抢券不会超量抢券的情况,可使用redis的decr功能 ,但是如果仅仅简单的使用decr,针对以下场景会有问题 剩余数量为1 线程1 decr 数量剩余0 线程2 decr 数量剩余-1 响应失败 线程1 因后续功能异常通过incr 归还数量 线程3 decr 数量剩余-1 响应失败 上述场景中,最后一个库存未使用便已不可用,在高并发场景下浪费的库存会较多,针对以上问题有以下两个方案 方案 方案1 当decr 结果小于0时,通过incr归还数量后返回失败 此方案的弊端是需要调用两次redis

  • 凯文
1 min read
技术问题总结

记录一次sim环境消费不到消息的问题

问题 在sim环境中,生产的消息已发送至中间件服务,但是无消费者进行消费 而sim环境是有对应的节点的 DD trace染色 在DD中所有的请求及mq均通过trace染色&sidecar方式实现的,该方案可解决多服务并行测试的问题 即,存在一套基准环境sim13,当某个服务上sim时,拉取一个新的环境如sim110,针对该环境的请求及mq消息trace均会染色为s110xxxx,当该服务请求其它服务时,请求该服务的基准环境,同样会染色trace,而其它服务基准环境sidecar收到请求后会判断是否存在sim110环境,如果存在,则转发;如果不存在,则转发给sim13基准环境处理请求 mq消息大概原理同上 生产段流量染色:在生产消息的时候统一通过设置消息的属性properties(map类型)值,来标记当前消息所属客户端环境 消费端环境标示:mq proxy会根据消息的客户端标识,

  • 凯文
2 min read
java

容器及java oom

容器oom 原因 当容器设置 memory limit 过小时,并且容器进程需要的memory大于 容器limit内存时,会报出容器oom,即进程可申请的内存小于系统分配给该进程的内存时oom 结果 linux内核会kill掉该进程,即容器会因为oom重启 解决方案 调大memory limit或限制进程使用内存大小 java.lang.OutOfMemoryError: Java heap space 原因 在启动java程序时,可设置堆内存大小xmx,如果该值设置的过小,导致jvm gc回收空间过小,并且堆无空间分配新的对象,即会报出java.lang.OutOfMemoryError: Java

  • 刘凯
1 min read
java

tomcat网络模型

Tomcat启动流程 tomcat中基本所有的组件均通过LifecycleMBeanBase管理,在启动时,依次调用该LifecycleMBeanBase实现类所管理的其它组件的start方法,实际调用为startInternal()方法 其中tomcat中的容器实现的是LifecycleMBeanBase的子类ContainerBase,在ContainerBase.startInternal()方法中会依次启动 Cluster,Realm,子容器,Pipleline等 selector.select(1000)。当 Poller 启动后因为 selector 中并没有已注册的 Channel,所以当执行到该方法时只能阻塞。所有的 Poller 共用一个 Selector,其实现类是 sun.nio.ch.EPollSelectorImpl

  • 凯文
6 min read
mysql

mysql数据结构之b+树

b树 b树(balance tree)和b+树应用在数据库索引,可以认为是m叉的多路平衡查找树,但是从理论上讲,二叉树查找速度和比较次数都是最小的,为什么不用二叉树呢? 因为我们要考虑磁盘IO的影响,它相对于内存来说是很慢的。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。 所以我们要减少IO次数,对于树来说,IO次数就是树的高度,而“矮胖”就是b树的特征之一,它的每个节点最多包含m个孩子,m称为b树的阶,m的大小取决于磁盘页的大小。 b树特征 一个M阶的b树具有如下几个特征: 定义任意非叶子结点最多只有M个儿子,且M>2; 根结点的儿子数为[

  • 凯文
6 min read
java

apollo使用及实现

apollo功能 配置功能 namespace config key 灰度 自定义字段,如uid 配置灰度百分比 在执行方法时传入该uid 端 服务端 agent监听zk,将该服务订阅的配置下载到本地,保存为文件 sdk监听文件,修改内存中的配置 app 将配置按服务端过程下载至服务器本地 app通过http接口,在返回前台时调用 小程序 同app 配置链路 修改或新增配置后,发布给distributor distributor分发给各机房独立的zk notifier服务通知agent监听指定的zk节点,agent为容器内部的apollo agent 业务服务集成sdk,初始访问时sdk在本地文件找不到开关配置,发请求给agent,

  • 凯文
4 min read
linux

linux之内存

问题 RAM为什么不能持久化? 内存管理的最小单位是什么? pagecache是什么? pagecache与buffercache的区别? 线程的内存大小? tmpfs是做什么的? 内存对齐的作用? 内存 概述 内存是计算机的主存储器。内存为进程开辟出进程空间,让进程在其中保存数据。 内存的大小 内存有一个最小的存储单位,大多数都是一个字节。内存用内存地址(memory address)来为每个字节的数据顺序编号。因此,内存地址说明了数据在内存中的位置。内存地址从0开始,每次增加1。这种线性增加的存储器地址称为线性地址(linear address)。为了方便,我们用十六进制数来表示内存地址,比如0x00000003、0x1A010CB0。这里的“0x”

  • 刘凯
31 min read
other

数据结构堆介绍及应用

什么是堆? 堆是一种特殊的树,只要满足以下两个条件,就可以称这棵树为堆 堆是一颗完全二叉树(完全二叉树要求,除了最后一层,其他节点个数都是满的,最后一层的节点都靠左排列) 堆中的每一个节点都必须大于等于(或者小于等于)其子树中每个节点的值。 每个节点的值都大于等于其子树每个节点的值的堆,我们称之为大顶堆,每个节点的值都小于等于其子树每个节点的值的堆,我们称之为小顶堆。如下图: 从上图可以看出,对于同一组数据,我们可以构建多种不同形态的堆。 如何存储堆? 堆是一颗完全二叉树,比较适合用数组存放,因为用数组存放不需要存储左右子节点的指针,非常节省空间,通过下标就可以找到一个节点的左右子节点和父节点。下图就是一个数组存放堆的例子: 从图中可以看出,下标i的节点的左子节点的下标是i2,右子节点的下标为i2+1,父节点的下标为i/2,

  • 凯文
10 min read