比特币nodejs
❶ 如何通过雪球查询股票之前的变动状况
一. 雪球公司介绍
雪球 聪明的投资者都在这里。
web 1.0:新闻资讯,股价信息,K线图
web 2.0:SNS 订阅,分享,聊天
web 3.0:移动 APP,交易闭环
雪球现在员工数还不到100,其中技术人员占一半。去年9月C轮融资4kw刀。我们现在的技术栈由下列组件组成:Java,Scala,Akka,Finagle,Nodejs,Docker ,Hadoop。我们当前是租用IDC机房自建私有云,正在往“公私混合云”方向发展。
在雪球上,用户可以获取沪深港美2w+股票的新闻信息,股价变化情况,也可以获取债券,期货,基金,比特币,信托,理财,私募等等理财产品的各类信息,也可以关注雪球用户建立的百万组合,订阅它们的实时调仓信息,还可以关注雪球大V。雪球当前有百万日活跃用户,每天有4亿的API调用。App Store 财务免费榜第 18 名。历史上曾排到财务第二,总免费榜第 19。
二. 雪球当前总体架构
作为一个典型的移动互联网创业公司,雪球的总体架构也是非常典型的设计:
最上层是三个端:web端,android端和iOS端。流量比例大约为 2:4:4 。web3.0 的交易功能,在 web 端并不提供。
接入层以及下面的几个层,都在我们的自建机房内部。雪球当前只部署了一个机房,还属于单机房时代。正在进行“私有云+公有云混合部署”方案推进过程中。
我们当前使用 nodejs 作为 web 端模板引擎。nodejs 模块与android 和 ios 的 app 模块一起属于大前端团队负责。
再往下是位于 nginx 后面的 api 模块。跟 linkedin 的 leo 和微博的 v4 一样,雪球也有一个遗留的大一统系统,名字就叫 snowball 。最初,所有的逻辑都在 snowball 中实现的。后来慢慢的拆出去了很多 rpc 服务,再后来慢慢的拆出去了一些 http api 做成了独立业务,但即便如此,snowball 仍然是雪球系统中最大的一个部署单元。
在需要性能的地方,我们使用 netty 搭建了一些独立的接口,比如 quoto server,是用来提供开盘期间每秒一次的股价查询服务,单机 qps 5w+,这个一会再细说;而 IM 服务,起初设计里是用来提供聊天服务,而现在,它最大的用途是提供一个可靠的 push 通道,提供 5w/s 的消息下发容量,这个也一会再细说。
雪球的服务化拆分及治理采用 twitter 开源的 finagle rpc 框架,并在上面进行了一些二次开发和定制。定制的功能主要集中在 access log 增强,和 fail fast,fail over 策略及降级开关等。 finagle 的实现比较复杂,debug 和二次开发的门槛较高,团队内部对此也进行了一些讨论。
雪球的业务比较复杂,在服务层中,大致可以分为几类:第一类是web1.0,2.0 及基础服务,我们称为社区,包括用户,帖子,新闻,股价,搜索等等,类比对象就是新浪财经门户+微博;第二类是组合及推荐,主要提供股票投资策略的展示和建议,类比对象是美国的motif;第三类是通道,类似股市中的“支付宝”,接入多家券商,提供瞬间开户,一键下单等等各种方便操作的功能。
雪球的业务实现中,包含很多异步计算逻辑,比如搜索建索引,比如股票涨跌停发通知,比如组合收益计算等等,为此,我们设计了一个独立的 Thread/Task 模块,方便管理所有的后台计算任务。但随着这些 task 越来越多,逻辑差异越来越大,一个统一的模块并不是总是最佳的方案,所以,我们又把它拆成了两大类:流式的,和批量式的。
雪球的推荐体系包括组合推荐“买什么”和个性化推荐。我们最近正在重新梳理我们的大数据体系,这个感兴趣的话可以单聊。
最下面是基础设施层。雪球基础设施层包括:redis,mysql,mq,zk,hdfs,以及容器 docker。
线上服务之外,我们的开发及后台设施也很典型:gitlab开发,jenkins打包,zabbix 监控系统向 openfalcon 迁移,redimine向confluence迁移,jira,以及内部开发的 skiing 后台管理系统。
** 三. 雪球架构优化历程**
首先描述一下标题中的“股市动荡”定语修饰词吧:
上证指数从年初的3000点半年时间涨到了5000多,6月12号达到最高点5200点,然后就急转直下,最大单日跌幅 8.48%,一路跌回4000点以下。最近一周都在3900多徘徊。
3月最后一周,A股开户 166万户,超过历史最高纪录 2007年5月第二周165万户。
4月份,证监会宣布A股支持单用户开设多账户。
6月底,证金公司代表国家队入场救市。
7月份,证监会宣布严打场外配资。
中国好声音广告第一晚,带来超过平时峰值200倍的注册量
挑战:小 VS 大:
小:小公司的体量,团队小,机器规模小
大:堪比大公司的业务线数量,业务复杂度,瞬间峰值冲击
雪球的业务线 = 1个新浪财经 + 1 个微博 + 1 个 motif + 1 个大智慧/同花顺。由于基数小,API调用瞬间峰值大约为平时峰值的 30+ 倍。
挑战:快速增长,移动互联网 + 金融,风口,A股大盘剧烈波动。
首先,在app端,在我们核心业务从 web2.0 sns 向 3.0 移动交易闭环进化的过程中,我们开发了一个自己的 hybrid 框架:本地原生框架,加离线 h5 页面,以此来支撑我们的快速业务迭代。当前,雪球前端可以做到 2 周一个版本,且同时并行推进 3 个版本:一个在 app store 等待审核上线,一个在内测或公测,一个在开发。我们的前端架构师孟祥宇在今年的 wot 上有一个关于这方面的详细分享,有兴趣的可以稍后再深入了解。
雪球App实践—构建灵活、可靠的Hybrid框架 http://wot.51cto.com/2015mobile/ http://down.51cto.com/data/2080769
另外,为了保障服务的可用性,我们做了一系列的“端到端服务质量监控”。感兴趣的可以搜索我今年4月份在环信SM meetup上做的分享《移动时代端到端的稳定性保障》。其中在 app 端,我们采用了一种代价最小的数据传输方案:对用户的网络流量,电池等额外消耗几乎为0
每个请求里带上前一个请求的结果
succ or fail : 1 char
失败原因:0 - 1 char
请求接口编号: 1 char
请求耗时:2 - 3 char
其它:网络制式,etc
炒股的人大多都会盯盘:即在开盘期间,开着一个web页面或者app,实时的看股价的上下跳动。说到“实时”,美股港股当前都是流式的数据推送,但国内的A股,基本上都是每隔一段时间给出一份系统中所有股票现价的一个快照。这个时间间隔,理论上是3秒,实际上一般都在5秒左右。 交了钱签了合同,雪球作为合作方就可以从交易所下属的数据公司那里拿到数据了,然后提供给自己的用户使用。
刚才介绍总体架构图的时候有提到 quote server ,说到这是需要性能的地方。
业务场景是这样的,雪球上个人主页,开盘期间,每秒轮询一次当前用户关注的股票价格变动情况。在内部,所有的组合收益计算,每隔一段时间需要获取一下当前所有股票的实时价格。起初同时在线用户不多,这个接口就是一个部署在 snowball 中的普通接口,股价信息被实时写入 redis ,读取的时候就从 redis 中读。后来,A股大涨,snowball 抗不住了。于是我们就做了一个典型的优化:独立 server + 本地内存存储。开盘期间每次数据更新后,数据接收组件主动去更新 quote server 内存中的数据。 后续进一步优化方案是将这个接口以及相关的处理逻辑都迁移到公有云上去。
对于那些不盯盘的人,最实用的功能就是股价提醒了。在雪球上,你除了可以关注用户,还可以关注股票。如果你关注的某只股票涨了或跌了,我们都可以非常及时的通知你。雪球上热门股票拥有超过 50w 粉丝(招商银行,苏宁云商)粉丝可以设置:当这支股票涨幅或跌幅超过 x%(默认7%)时提醒我。曾经连续3天,每天超过1000股跌停,证监会开了一个会,于是接下来2天超过1000股涨停
原来做法:
股票涨(跌)x%,扫一遍粉丝列表,过滤出所有符合条件的粉丝,推送消息
新做法:
预先建立索引,开盘期间载入内存
1%:uid1,uid2
2%:uid3,uid4,uid5
3%:uid6
问题:有时候嫌太及时了:频繁跌停,打开跌停,再跌停,再打开。。。的时候
内部线上记录:
4台机器。
单条消息延时 99% 小于 30秒。
下一步优化目标:99% 小于 10 秒
IM 系统最初的设计目标是为雪球上的用户提供一个聊天的功能:
送达率第一
雪球IM:Netty + 自定义网络协议
Akka : 每个在线client一个actor
推模式:client 在线情况下使用推模式
多端同步:单账号多端可登录,并保持各种状态同步
移动互联网时代,除了微信qq以外的所有IM,都转型成了推送通道,核心指标变成了瞬间峰值性能。原有架构很多地方都不太合适了。
优化:
分配更多资源:推送账号actor池
精简业务逻辑:重复消息只存id,实时提醒内容不推历史设备,不更新非活跃设备的session列表等等
本地缓存:拉黑等无法精简的业务逻辑迁移到本地缓存
优化代码:异步加密存储,去除不合理的 akka 使用
akka这个解释一下:akka 有一个自己的 log adapter,内部使用一个 actor 来处理所有的 log event stream 。当瞬间峰值到来的时候,这个 event stream 一下子就堵了上百万条 log ,导致 gc 颠簸非常严重。最后的解决办法是,绕过 akka 的 log adapter,直接使用 logback 的 appender
线上记录:5w/s (主动限速)的推送持续 3 分钟,p99 性能指标无明显变化
7月10号我们在中国好声音上做了3期广告。在广告播出之前,我们针对广告可能带来的对系统的冲击进行了压力测试,主要是新用户注册模块,当时预估广告播出期间2小时新注册100万
压测发现 DB 成为瓶颈:
昵称检测 cache miss > 40%
昵称禁用词 where like 模糊查询
手机号是否注册 cache miss > 80%
注册新用户:5 insert
优化:
redis store:昵称,手机号
本地存储:昵称禁用词
业务流程优化:DB insert 操作同步改异步
下一步优化计划:
将 sns 系统中所有的上行操作都改成类似的异步模式
接口调用时中只更新缓存,而且主动设置5分钟过期,然后写一个消息到 mq 队列,队列处理程序拿到消息再做其它耗时操作。
为了支持失败重试,需要将主要的资源操作步骤都做成幂等。
前置模块HA:
合作方合规要求:业务单元部署到合作方内网,用户的敏感数据不允许离开进程内存
业务本身要求:业务单元本身为有状态服务,业务单元高可用
解决方案:
使用 Hazelcast In-Memory Data Grid 的 replication map 在多个 jvm 实例之间做数据同步。
java 启动参数加上 -XX:+DisableAttachMechanism -XX:-UsePerfData,禁止 jstack,jmap 等等 jdk 工具连接
关于前置模块,其实还有很多很奇葩的故事,鉴于时间关系,这里就不展开讲了。以后有机会可以当笑话给大家讲。
组合净值计算性能优化:
一支股票可能在超过20万个组合里(南车北车中车,暴风科技)
离线计算,存储计算后的结果
股价3秒变一次,涉及到这支股票的所有组合理论上也需要每 3 秒重新计算一次
大家可能会问,为什么不用户请求时,实时计算呢?这是因为“组合净值”中还包括分红送配,分股,送股,拆股,合股,现金,红利等等,业务太过复杂,开发初期经常需要调整计算逻辑,所以就设计成后台离线计算模式了。当前正在改造,将分红送配逻辑做成离线计算,股价组成的净值实时计算。接口请求是,将实时计算部分和离线计算部分合并成最终结果。
实际上,我们的计算逻辑是比较低效的:循环遍历所有的组合,对每个组合,获取所有的价值数据,然后计算。完成一遍循环后,立即开始下一轮循环。
优化:
分级:活跃用户的活跃组合,其它组合。
批量:拉取当前所有股票的现价到 JVM 内存里,这一轮的所有组合计算都用这一份股价快照。
关于这个话题的更详细内容,感兴趣的可以参考雪球组合业务总监张岩枫在今年的 arch summit 深圳大会上的分享:构建高可用的雪球投资组合系统技术实践 http://sz2015.archsummit.com/speakers/201825
最后,我们还做了一些通用的架构和性能优化,包括jdk升级到8,开发了一个基于 zookeeper 的 config center 和开关降级系统
四. 聊聊关于架构优化的一些总结和感想
在各种场合经常听说的架构优化,一般都是优化某一个具体的业务模块,将性能优化到极致。而在雪球,我们做的架构优化更多的是从问题出发,解决实际问题,解决到可以接受的程度即可。可能大家看起来会觉得很凌乱,而且每个事情单独拎出来好像都不是什么大事。
我们在对一个大服务做架构优化时,一般是往深入的本质进行挖掘;当我们面对一堆架构各异的小服务时,“架构优化”的含义其实是有一些不一样的。大部分时候,我们并不需要(也没有办法)深入到小服务的最底层进行优化,而是去掉或者优化原来明显不合理的地方就可以了。
在快速迭代的创业公司,我们可能不会针对某一个服务做很完善的架构设计和代码实现,当出现各种问题时,也不会去追求极致的优化,而是以解决瓶颈问题为先。
即使我们经历过一回将 snowball 拆分服务化的过程,但当我们重新上一个新的业务时,我们依然选择将它做成一个大一统的服务。只是这一次,我们会提前定义好每个模块的 service 接口,为以后可能的服务化铺好路。
在创业公司里,重写是不能接受的;大的重构,从时间和人力投入上看,一般也是无法承担的。而“裱糊匠”式做法,哪里有性能问题就加机器,加缓存,加数据库,有可用性问题就加重试,加log,出故障就加流程,加测试,这也不是雪球团队工作方式。我们一般都采用最小改动的方式,即,准确定义问题,定位问题根源,找到问题本质,制定最佳方案,以最小的改动代价,将问题解决到可接受的范围内。
我们现在正在所有的地方强推3个数据指标:qps,p99,error rate。每个技术人员对自己负责的服务,一定要有最基本的数据指标意识。数字,是发现问题,定位根源,找到本质的最重要的依赖条件。没有之一。
我们的原则:保持技术栈的一致性和简单性,有节制的尝试新技术,保持所有线上服务依赖的技术可控,简单来说,能 hold 住。
能用cache的地方绝不用db,能异步的地方,绝不同步。俗称的:吃一堑,长一智。
特事特办:业务在发展,需求在变化,实现方式也需要跟着变化。简单的来说:遗留系统的优化,最佳方案就是砍需求,呵呵。
❷ 2018TPC必火,全解析
TPC 诞生背景:
TPC的诞生区别于现有模式,一般模式是先开发区块链应用并在区块链中产生,用来在区块链中作为记账单位而存在。然后依据应用的发展再炒高的价值。
显然,目前所有区块链都是这样的现状。而目前在所有可以用互联网技术服务的行业中基本处于饱和或垄断状态,所以目前区块链技术在真实的应用当中比较难落地,因为目前区块链整体行业处于萌芽状态中,对很多事物仍然处于探索之中。所以目前形势,区块链应该是一个重商业运营的技术服务,而非重技术服务轻商业运营。
缅甸银行业现状与支付系统的可行性
缅甸目前13家外资银行,本土银行24家,2016年央行对所有银行全部实现电算化,这对支付行业的外部环境是一个非常好的喜讯。缅甸6000万人口,有3000+万智能手机,却没有本土的APP,在这之前外部环境与第三方支付不在,所以基于互联网的创业基本都失败了。正是因为如此,第三方支付才能够成为缅甸的新经济基石。
缅甸3000+万智能手机用户,仅以仰光为例,每年600+亿美金的消费额度,线上消费更是难以估量,未来5亿的投放量,从0.14美金来看,如果线下市场占有率为10%就有60亿美金的流通,还未包含线上,其上涨空间甚至超过20倍。Grab在缅甸投资5亿美金就是缅甸移动互联网市场最好的写照。当第三方支付用户达到500万用户的时候,其资本估值将达到几十亿美金以上。
TPC
TPC基于以太坊智能合约,TPC就是以太坊的一条侧链,同时也是主链,而后续的所有基于金融、理财、基金等等的开发与探索将都依托TPC进行,其后的所有开发将都是TPC的侧链。TPC目前可以在imToken等以太坊钱包均可以进行收发,并预留未来开发接口:
其token完整版:
[ { "constant": true, "inputs": [], "name": "name", "outputs": [ { "name": "", "type": "string", "value": "TPC" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "totalSupply", "outputs": [ { "name": "", "type": "uint256", "value": "10000000000000" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "decimals", "outputs": [ { "name": "", "type": "uint8", "value": "4" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "name": "", "type": "address" } ], "name": "balanceOf", "outputs": [ { "name": "", "type": "uint256", "value": "0" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "owner", "outputs": [ { "name": "", "type": "address", "value": "" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "symbol", "outputs": [ { "name": "", "type": "string", "value": "TPC" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "_to", "type": "address" }, { "name": "_value", "type": "uint256" } ], "name": "transfer", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "name": "", "type": "address" } ], "name": "frozenAccount", "outputs": [ { "name": "", "type": "bool", "value": false } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "name": "target", "type": "address" }, { "name": "freeze", "type": "bool" } ], "name": "freezeAccount", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "name": "tokenName", "type": "string", "index": 0, "typeShort": "string", "bits": "", "displayName": "token Name", "template": "elements_input_string", "value": "TPC" }, { "name": "tokenSymbol", "type": "string", "index": 1, "typeShort": "string", "bits": "", "displayName": "token Symbol", "template": "elements_input_string", "value": "TPC" }, { "name": "decimalUnits", "type": "uint8", "index": 2, "typeShort": "uint", "bits": "8", "displayName": "decimal Units", "template": "elements_input_uint", "value": "4" }, { "name": "initialSupply", "type": "uint256", "index": 3, "typeShort": "uint", "bits": "256", "displayName": "initial Supply", "template": "elements_input_uint", "value": "10000000000000" } ], "payable": false, "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": false, "name": "target", "type": "address" }, { "indexed": false, "name": "frozen", "type": "bool" } ], "name": "FrozenFunds", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "name": "from", "type": "address" }, { "indexed": true, "name": "to", "type": "address" }, { "indexed": false, "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" } ]
完整内容会发布在GitHub中。
TPC选择以太坊是因为以太坊是一个成熟的开发平台,在区块链应用中可以节省大量时间,并为后续开发降低难度。独自开发私有链需要大量技术人员进行迭代更新,其维护成本、应用成本、使用成本、时间成本、开发成本、价值成本不成比例,因为TPC是为商业模式而诞生。最大限度去挖掘商业价值。
TPC 的未来
缅甸银行业的落后并不能阻挡TPC的布局,TPC将优先进驻银行,商场,通过已有钱包进行收发。第三方支付平台已经进入最后调试阶段,上线后再与之打通,成为必要的支付方式。TPC通过智能合约为银行、保险、数据分析、基金、现货、期货等金融行业提供数据解决方案,并共享信用数据,同时作为奖励为数据进行奖励支出。因为本身TPC就是智能合约,通过其接口的开放可以为未来所有的金融产业做数据支持。而TPC的未来会成为理财产品,其覆盖人群将会超过1500万人,未来的价值空间将会呈现一个几何式的增长。价格也会随之而爆发。
TPC 总量
总量为10亿,其中5亿作为政府基金存在逐步释放到市场进行流通,而后5亿将逐步用于支付市场的流通。
TPC 商业价值
TPC最大的价值在于打通与第三方支付与理财应用的信用数据。通过嵌入在第三方支付体系当中可以使TPC进行用于线上、线下支付,打通最重要的流通环节,因为之所以有价格就是因为其价值,而其价值背后就是流通属性。当有流通后就会产生买卖需求,所以才会有不同的价格走向。如果不能解决的流通性,那么就是空气币,TPC的商业价值就在于用商业思维解决区块链--应用的闭环模式。在TPC中,三者相对独立而又结合。但公开、透明、安全。
这就好比比特币一样,比特币之所以在2010年之前默默无闻不是因为没人知道,做极客的那一小撮人很早就知道了比特币的存在,但是他不具备流通属性而一直不值钱,2010年那个程序员拿1000个比特币换了一个披萨的新闻还不时被我们作为笑话,其实这就是背后流通性的不畅导致的。2011年丝绸之路的诞生2年时间150亿美金的交易额全部来自比特币,才让比特币成为了众人皆知。可以说丝绸之路是让沉睡的比特币觉醒的一剂猛药。
TPC 的商业生态
第三方支付 - 电商生态 - 游戏生态 - 社交生态
第三方支付相当于一个承接TPC的平台,因为缅甸目前没有第三方支付,所以第三方支付在实际运作中会成为类似支付宝或者paypal的应用,那支付宝或paypal的价值因为第三方支付支付平台的诞生只是商业生态中的第一步,正是因为支付平台的诞生,TPC才可以进行流通。而第三方支付平台的出现才可以解决目前缅甸没有电商、社交、游戏等等APP的局面,之前非常多的人都在缅甸建立电商、分类信息、游戏等平台,但是都倒闭了。其最重要的原因就是没有第三方支付平台,第三方支付平台可成为缅甸线上、线下的一个新支付通道。当第三方支付平台的建立之后,所有其他公司的应用都会将其作为一种支付渠道接入,而TPC作为一种货币基金就会充分成为流通需求而出现。
TPC 为什么依托以太坊而不是独自开发
1.以太坊开发平台成熟,稳定
2.开发难度低,使用方便,面向人群更广
TPC 运营团队
丁林,CEO,缅籍华侨,主导投资Grandland以及一系列投资方案,累计投资超过7000万美金。貌明,COO,缅籍华侨,原telenor缅甸高级经理,运营、执行能力强势。负责整体运营与市场销售。还有之前负责市场运营、市场调研员、文化分析员等大量优秀伙伴。
开发团队由新加坡郑忆安担任主研,精通JAVA与nodejs,10年开发经验,并且由来自中国、捷克的团队一起进行技术探索。TPC研究室为其提供基础支持。
TPC 分配方案
8%-----用于私募,早期投资者和对TPC前景看好的会员。
12%——ICO公募众筹投资者,战略投资伙伴。
10%——研究室基金,对技术的探索和未来应用落地
5%——-市场推广,宣传分发,战略合作
15%——-商业落地部署,商业合作,市场开拓
50%——存放政府,根据市场逐步释放
市场流通少,价值又可以落地实现。价格一定会几何级增长
如果用一句话讲 TPC
存在于第三方支付之中,未来覆盖与使用人群会在千万级以上,而现在能接近千万级的只有比特币,以太坊。
❸ 目前国内有哪些区块链技术应用开发平台
所谓区块链技术,简称BT(Blockchain technology),也被称之为分布式账本技术,是一种互联网数据库技术,其特点是去中心化、公开透明,让每个人均可参与数据库记录。
❹ 树莓派4B+ Centos7 部署k3s集群工具
kubernetes用于大型集群管理,而k3s属于kubernetes的一个轻量级版本,常用于嵌入式设备使用。现把它安装到树莓派上使用。
这里用到树莓派的系统是:CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-4-2009-sda.raw,型号是4B+,8g内存。
树莓派初次启动需要扩容,并且做一些基本调整:
cgroup是linux用来对进程分配cpu、内存资源的工具,需要在启动系统时开启他,k3s会用到。
在/boot/cmdline.txt后加入这个,然后reboot
k3s是一个轻量级的k8s,适用于树莓派这种嵌入式设备。
这个脚本跑完的时候,会把k3s添加到systemd里面,可以通过systemctl status k3s来查看运作状态。启动成功就可以使用啦
官方参考: https://rancher.com/docs/k3s/latest/en/installation/ha-embedded/
等它重启个好几次之后,基本就成功了。
如果一直失败,可以输入命令刷一下iptable缓冲
iptables --flush
iptables -tnat --flush
等第二个结点加入后,在任意结点执行命令,都能查看到已有的2个Server(Master)结点了
当Server结点数大于等于3个且为奇数时,集群才可以实现高可用。
大于等于3是因为k3s使用了Raft算法来实现一致性,而Raft算法的容崩率为1/3,也就是只要集群中有2/3台机器正常运作,集群就能正常运作,所以3台机器是最低要求;要奇数个结点是因为Raft算法过程中有一个很重要的随机投票选Leader的流程,结点们通过定期投票选举出一个Leader角色,然后其他结点在它的任期内就向他同步数据,这个时候如果结点数是偶数,那么容易出现平票问题,选不出leader,并且,崩溃后集群进行数据恢复过程中,实现一致的方法是多数服从少数,如果是偶数Master结点,且刚好被分割成2个结点规模一样的集团,就没办法恢复数据了[裂开],所以需要奇数个结点以避免权力平分问题。
以上为个人理解。
有兴趣的同学可以一起探讨这类共识算法,与此类似的还有联盟链的PBFT类算法,比特币PoW算法等等。
因为集群并非开放式集群,加入集群需要获取一个token作为校验。这个token可以从Master服务器上获取。(手动加入的话,仅需要使用相同的K3S_TOKEN参数启动即可。)
这样,结点就正常连接上啦:
关闭k3s进程后,后台还留存一些服务占用着端口,需要用官方脚本关闭他们
可以flush一下iptables,等他自己重启就行了。
有可能发生了一些冲突,可以试下重装k3s-agent
目前系统已经伴随k3s安装的一些软件:
crictl :类似与docker的命令行工具,比如:
k3s :封装了kubeneters基本工具在里面的集成,如使用kubectl:
这里示范部署一个最简单的web应用
--net host 代表与本机享受同一个网络命名空间
这里可以在docker容器内开启ssh服务: https://blog.csdn.net/Leo_csdn_/article/details/96150534
做好docker镜像后,就可以部署到集群上了。
等一会儿就能在pods列表里面看到了:
但这时候,这个pod并没有对外开放,只能在集群内部相互访问,通过get services命令查看集群的服务,发现并没有我们的hello-node服务。
expose命令其实是创建了一个service,用于给这个pod提供访问入口。
(如果使用--type=LoadBalancer,则代表一个deployment上管理的所有POD进行均衡负载,但这里还没用上deployment,第四章节会使用到)
等一会儿,pod上就有一个结点IP的对外端口,供外部访问了。
运行结束后,刚启动过的pod和service就不见了,服务也停止了。
docker容器,其实就是一个运行的轻量级系统,里面可以跑我们的业务应用。
而POD则是代表容器的集合,一个POD可以运行多个容器,一台机器上可以运行多个POD。
POD未必是一个对外开放的服务,他可能只是内部计算的程序,默认只能集群内部通信,所以还有Service的概念,用于让POD对外开放端口,供外部访问。这里的service本质上是个集群内部的负载均衡器,用来给同一个Deployment分流;对应的还有Ingress,外部负载均衡器,用于给多个Deployment分流。
而Deployment顾名思义,就是一次部署的抽象实例,比如说,现在需要部署一个3台机器均衡负载的nodejs业务应用,那么这个部署任务则代表一个deployment实例。
很快,我们可以看到POD和deployment的部署情况,都已经正常运作。
进入容器后可以使用基本linux命令,也可见8080端口已经被我们的node应用占用了。
但是此时service还没有他们,也就是正处于无法提供外部服务的状态。
这里对一个deployment里面的3个pod启动了个默认均衡负载服务,暴露出来的一个端口是30057,访问可通。
也能够通过logs命令查看控制台输出的日志。
因为deployment实例中包含了pod的部署配置,所以删除deployment时,k3s就会直接把pod也删除掉。
但service并不在deployment部署的范围内,所以需要同步删除它,在删除命令中通过","与deployment分割开来即可。
至此已经把刚起来的服务全部关闭掉了。
这里我们看到3个Server(Master)结点由于需要维护集群高可用,对CPU持续20%左右的消耗,内存也需要一个G左右。而Agent(Wroker)结点只需要执行部署任务,所以对内存与CPU的需求都相对低一些,仅维持在10%左右的CPU和半个G左右的内存消耗。
参考: https://zhuanlan.hu.com/p/120171512
参考: http://kubernetes.kansea.com/docs/hellonode/
❺ 区块链技术入门,涉及的编程语言有哪些
Go 语言为区块链主流语言
根据 BOSS 研究院数据调查显示,目前在招的区块链岗位
主流的语言是 Go 和 C++ 语言,早期的区块链系统和应用
程序主要是以 C++ 实现,现在多数公司都会用 Go 语言来
打造公链系统。
C++适合本地程序的开发.
Go语言适合网络程序和本地程序的开发.
相对于C++Go的优点:
垃圾回收
语意明确
格式统一
缺点:
效率目前没有C++高,但对于桌面程序而言,效率问题不大,因为硬件已经很快了.
C++是目前的主流语言,相信会和C一样成为经典.
成为经典的意思就是:学它的人能拿一份不错的工资,但也仅仅是不错而己.
将来的网络的世界,Go发热的机会很大,认为其前途看好.
Go的开发者包括Unix的创始人和C语言的创始人等,都是一代黑客之首,相信会做得很好.
现在go全栈+区块链市场出于前所未有的大风口,形势喜人。
❻ 什么是区块链,什么是大数据
1、区块链:是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。
区块链(Blockchain)是比特币的一个重要概念,货币联合清华大学五道口金融学院互联网金融实验室、新浪科技发布的《2014—2016全球比特币发展研究报告》提到区块链是比特币的底层技术和基础架构[2] 。本质上是一个去中心化的数据库,同时作为比特币的底层技术。区块链是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。
2、大数据:指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。
❼ Dart语言和go谁更先进
单从运行速度两个语言都很优秀,但运行速度不是我们唯一追求的指标,就像汇编语言写的程序运行速度很快,但我们绝大多场合都不会采用它。
背后更重要的还有这门语言对应的生态。
比如企业要用人的时候能不能快速招到会使用它的人? 对求职者来说,我学习这门语言能不能带来更多的工作机会?用这个语言开发应用的时候遇到问题的时候能不能快速找到资料并得以解决?
go语言历史长、生态好、运行速度快,在服务端上面有所作为,比如为比特币、莱特币开发的闪电网络就是用go写的。 语法上和类C语言有很大不同。
Dart是新出的语言,配合flutter是很好的客户端开发语言。 语法没那么奇怪, 因为新所以生态自然是跟不上的。
Dart能不能用在服务端? 我个人觉得是可以, 毕竟可以Dart是可以转成javascript的,运行在Nodejs下, 借助于NodeJs生态,dart也可以做很多事情。
不知道你们有没有注意到,现在有很多新语言都支持翻译成Javascript。比如新的dart、kotlin, 还有ts是直接针对javascript语法加强而获得成功。
话说得再多, 不如自己亲自去体验一下。 jsrun上面支持30多种语言的在线运行环境, 先体验再做决定你到底要学哪一门语言。
http://dart.jsrun.net
http://go.jsrun.net
❽ 区块链技术入门,涉及哪些编程语言
Go语言
Go语言(Golang)是谷歌2009年推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:“我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧。”
除比特币是由C++开发以外,目前最主流坊的客户端均有go语言开发,足以可见Go语言在整个区块链行业的地位。
C++
C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言。C++ 可运行于多种平台上,如 Windows、MAC 操作系统以及 UNIX 的各种版本。C++是一种使用十分广泛的计算机程序设计语言。它是一种通用程序设计语言,支持多重编程模式,例如过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计和设计模式等。
大多数的区块链企业都选择用C++编写区块链的底层,最著名的有比特币、ripple等,主要体现的是强计算性。
Java
Java不同于一般的编译语言或解释型语言。它首先将源代码编译成字节码,然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编写,到处运行”的跨平台特性。而区块链项目的开发,对Java有着明显的依赖性。
其他的还有Python、系统架构、以太坊、Linux、hyperledger、JavaScript等都会有涉及。
❾ 比特币是怎样运作的
从运作上看,比特币实际上是一个互联网上的去中心化账本。
1、中心化账本(银行)
银行是一个中心化账本,账本存储在银行的中心数据库,上面写着:
张三的A账号余额3000元,李四的B账号余额2000元……
当张三想要通过A账号转账1000元给李四的B账号时:
a张三到银行,向银行提交转账要求
b银行通过银行卡密码等方式确认张三身份,并检查张三的A账号是否有足够余额。
c检查通过后,银行增加一条转账记录:A账号向B账号转账1000元,
并修改余额:A账号余额=3000-1000=2000元,B账号余额=2000+1000=3000元
2、去中心化账本
假设有这样的一个小村庄,大家不是靠银行,而是自己用账本来记录谁有多少钱,每个人的账本上都写着:
张三的A账号余额3000元,李四的B账号余额2000元……
当张三想要通过A账号转账1000元给李四的B账号时,
a张三大吼一声:大家注意啦,我用A账号给李四的B账号转1000块钱。
b张三附近的村民听了确实是张三的声音,并且检查张三的A账号是否有足够余额。
c检查通过后,村民往自己的账本上写:A账号向B账号转账1000元,
并修改余额:A账号余额=3000-1000=2000元,B账号余额=2000+1000=3000元。
d张三附近的村民把转账告诉较远村民,一传十十传百,直到所有人都知道这笔转账,以此保证所有人账本的一致性。
3、去中心化账本(比特币)
比特币用户在电脑上运行比特币客户端软件,这样的电脑称为一个节点(node)。
大量节点电脑互相连接,形成一张像蜘蛛网一样的P2P(点对点)网络。
当张三想要通过A账号转账1比特币给李四的B账号时,当张三想要通过A账号转账1比特币给李四的B账号时,
a张三向周围节点广播转账交易要求:A账号转账1比特币给B账号,并用A账号的私钥签名。
(A账号的私钥可简单理解为A账号的密码,只要知道A账号的私钥就能使用A账号上的比特币)
b张三周围的节点通过A账号的公钥检查交易签名的真伪,并且检查张三的A账号是否有足够余额。
c检查通过后,节点往自己的账本上写:A账号向B账号转账1比特币元,
并修改余额:A账号余额=3比特币-1比特币=2比特币,B账号余额=2比特币+1比特币=3比特币。
d节点把这个交易广播给周围的节点,一传十十传百,直到所有节点都收到这笔交易。
比特币的去中心化公开账本称为区块链。这是比特币运行的一个最简化描述,当然比特币的实际运行远比这复杂。