XJin


  • Home

  • About

  • Tags

  • Categories

  • Archives

MySQL定时计划事件的使用

Posted on 2018-10-22

Note

  • show variables like 'event%'; 查看event_scheduler是否开启

  • set global event_scheduler =1; 开启事件计划

  • 创建存储过程

  • 1
    2
    3
    4
    create procedure test()
    BEGIN
    update user_info set update_time = now() where id = 1;
    END;
  • 创建事件(每隔30s执行存储过程test)

    1
    2
    3
    4
    create event if not exists e_test 
    on schedule every 30 second
    on completion preserve
    do call test();

区块链基础百问-下篇

Posted on 2018-10-13 | In 区块链

本文主要内容来自火币资讯区块链100问科普摘录,方便自己翻阅,仅供参考

50. 区块链资产的特点——全球流通

  • 区块链资产首先是基于互联网的。只要有互联网的地方,区块链资产就可以进行流通。这里的互联网可以是万维网,也可以是各种局域网

51. 区块链资产的特点——匿名性

  • 别人无法知道你的区块链资产有多少,以及和谁进行了转账。这种匿名性是分不同程度的
  • 比特币的匿名性是最基本的。你在区块链网络上只能查到转账记录,但是不知道地址背后是谁。但是,一旦知道这个地址背后对应的人是谁,也就能查到其所有相关的转账记录及资产
  • 达世币和门罗币匿名性做得更高。即使你查到了这个地址背后的人是谁,你也无法知道它所有的转账信息
  • Zcash将匿名性做到极致,只有拥有私钥的人才能查到所有的转账信息

52. 区块链资产的特点——去中心化记账

  • 去中心化记账让区块链资产公开透明且无法作弊
  • 记账是全网共同进行的。你给别人转账记录的账本,这个账本是全网共同维护,每个全节点都有备份
  • 可以直接在全网数据查看数据:是否到账、达到了几个确认等

53. 区块链资产的特点——不可复制

  • 传统资源如文字、图片、影像很容易被拷贝,给它们的版权所有者带来很大困扰
  • 区块链资产可传递是通过加密技术而不是拷贝,不可复制性,是保证它成为资产的一个重要因素

54. 区块链的共识机制

  • 区块链系统上没有类似银行的中心化记账机构,所以让全网节点保持一致性,即达成共识成为重要问题。目前主要的共识机制有工作量证明PoW和权益证明PoS
  • PoW通过评估节点的工作量来决定获得记账权的机率,PoS通过评估节点持有代币的数量和时长决定获得记账权的机率。DPoS属于PoS变种,主要在节点间选举若干代理人,由代理人验证和记账。共识机制还在不断进化中。

55. 工作量证明机制(PoW)

  • 比特币采用的就是工作量证明机制,挖矿即工作,比特币网络通过调节计算难度,保证每次竞争记账都需要全网节点计算大约十分钟。所以一定程度上,获得记账权的几率与工作量占比(算力占比)成正比。
  • 竞争记账权需要巨大的算力,所以国内形成了大量的矿池于线下专用矿机组成的矿场,造成了极大的电力消耗。

56. 权益证明机制(PoS)

  • 也称股权证明机制,类似于把资产存进银行里,银行会根据你持有的资产的数量和时间给你相应的收益。采用PoS的数字资产,根据币龄给节点分配权益,币龄一般为持币数量和时间的乘积(数量*天数)。
  • 相对于PoW的两点优势:1. 不会因大量运算造成大量电力浪费。2. 更难进行51%攻击,PoW网络可以被占据51%或以上的算力攻击,而PoS则需要有能力的攻击者拥有51%的币,持有大量币的人一般不会自己主动攻击网络。
  • 目前很多数字资产采用PoW发行新币,用PoS维护区块链网络安全。

57. 股份授权证明机制(DPoS)

  • 类似于董事会投票,持币者投票给一定数量的节点,代理进行验证和记账,为了激励更多节点参与竞选,系统会产生代币进行奖励。
  • 如果“董事”不能履行职责,如果在需要他们记账时他们没能完成则会被除名,网络会选出新的节点来取代他们。
  • DPoS大幅提高区块链处理数据的能力,甚至可以实现秒到账,同时大幅降低维护区块链网络安全的费用,这就使代币交易速度接近于支付宝、网银等中心化结算系统。

58. 零知识证明

  • 证明者不向验证者提供信息内容本身的情况下,使验证者完成信息为真的验证。
  • 比如A有一栋房子的钥匙,且假定房子只能用钥匙进入,A要向B证明自己有该房子的钥匙,又不让B看到钥匙本身的样子,就可以自己用钥匙进入房子后,让B看到自己在房子内,也就证明了A确实拥有钥匙,且没有让B看到。

59. 哈希算法

  • 单向加密的密码学算法,将任意长度的信息转换为固定长度的字符串。
  • 雪崩效应:输入值即使修改一点点,输出串就会变化巨大;一般情况下,只有完全一样的输入值才会得到相同的输出值(但也会有很小概率的哈希碰撞存在,即不同输入值得到相同的输出值);不能由输出值推导出输入值,单向性。

60. 非对称加密算法

  • 对称加密算法指的是在加密和解密时使用的是同一个密钥。而非对称加密则有公钥和私钥的概念,公钥和私钥是成对的,用公钥对数据进行加密,只有用对应的私钥才能解密。
  • 非对称加密安全性更好,对称加密一旦密钥泄露,整个网络上的内容就会被破解。而非对称加密中的私钥是自己的,不需要同步私钥。

61. 扩容

  • 比特币最初区块大小默认上限为32MB,后来为防止大量算力浪费以及DDOS攻击,中本聪临时将区块大小调整到1MB。后来比特币节点大量增多,网络变得拥堵,比特币开发团队尝试修改底层代码提高交易能力。

62. 扩容原因

  • 目前比特币区块大小为1MB,每秒大约只能处理7个交易,随着交易量增长,比特币网络已经处于拥堵,最高时产生上万笔交易积压,手续费高达数十美元,交易要经过好几天才能被打包。
  • 17年采用隔离见证提升了70%的信息处理能力。

63. 隔离见证

  • 区块链扩容的一种方式,已经在莱特币和比特币上运用。
  • 目前比特币上每个区块内不仅记录每笔交易信息,还包括了每笔交易的数字签名,用来验证交易的合法性。矿工在将对每一笔交易的数字签名进行验证。
  • 隔离见证也就是把区块中的签名信息拿出去,所以每个区块可以承载更多交易

64&65. 区块链分叉与糖果

  • 去中心化系统升级,节点意见分歧,产生区块链分叉。分叉又根据是否兼容之前的链分为软分叉和硬分叉。
  • 比特币社区有多种扩容方案,如果某种方案得到足够的算力支持,就会重新激活,比特币网络就不会分叉。如果没有方案得到足够的算力支持。那么比特币网络将产生分叉,原先拥有比特币的人将自动并免费拥有分叉后的每种币,因为这些币都是免费的,又被称为糖果。

66. 软分叉和硬分叉

  • 硬分叉:比特币底层代码改变后,旧节点拒绝接受由新节点创造的区块,不符合原规则的区块将被忽略。矿工会按照原规则,在他们之前最后验证的区块之后创建新的区块。
  • 软分叉:旧节点并不会意识到比特币代码改变,继续接受新节点产生的区块,矿工可能会在他们完全没有理解或者验证过的区块上进行工作,两种分叉都可以向后兼容,但软分叉可以向前兼容。

67. 重放攻击

  • 比特币若发生分叉,普通用户最大的风险就是重放攻击。如果比特币分叉为多个分叉币,由于分叉币间加密方式相同,在其中一条链上的交易,完全可以在另一条链上重新广播,可能也会得到确认,即重放攻击。

68. 硬分叉的以太经典

  • 以太坊ETH和以太经典ETC是硬分叉的经典案例。THE DAO基于以太坊智能合约打造了一个众筹平台,募资资金超过1.6亿美元,之后这个平台被黑客利用漏洞转移了5000万美元的资产。之后以太坊社区投票决定修改以太坊代码,回滚所有交易来索回资金。但是有一部分人认为这种做法违背了去中心化和不可篡改精神,坚持在旧链挖矿,也就成了以太经典。

69-70. 区块链项目分类和应用

  • 目前主要分为四类:币类、平台类、应用类,资产代币化。
  • 币类充当交换媒介,比如传统的黄金银票等。这类包括比特币,莱特币等。
  • 平台类指建立技术平台用于满足各种区块链应用开发,降低区块链应用开发门槛
  • 应用类就很多了,涵盖诸多领域的DApp,也是目前增长最快的领域
  • 资产代币化指实物资产的区块链映射,也就是实物资产上链,可行度有待考证。

71. 莱特币LTC

  • 莱特币的宗旨是改进比特币,所以它和比特币有很多相似之处。

  • 莱特币总量是比特币的四倍,8400万枚;它的产量减半时间和比特币一样都是4年;它的共识机制和比特币一样都是工作量证明机制(PoW);它的区块时间是2.5分钟,是比特币的四分之一,每2.5分钟打包一个区块;莱特币的区块奖励最早是50枚莱特币,截止目前(2018年1月)莱特币区块奖励为25莱特币,已发行量约为5400万。

72. 新经币NEM

  • 是第一个采用测试驱动开发模式开发出来的数字资产。
  • 测试驱动:先进行测试,然后再进行编程。举个常用的例子,建筑工人在盖房子的时候,喜欢先锤一根线下来,然后按照这根线去垒砖,就能把墙砌得笔直。如果直接垒砖,后面有可能会把墙砌歪了。测试驱动开发就是仅用通过测试的代码开发。
  • 新经币采用重要性证明PoI共识机制(配音备注:poi),根据交易量、活跃度等维度决定记账权利,所以它每60秒就能打包一个区块,相较比特币、莱特币快很多。但是激励不足。

73. 达世币DASH

  • 匿名币类区块链项目的典型代表之一,还可以用即时支付实现秒到账
  • 它有三种转账方式,一是像比特币一样的普通转账;二是即时交易。不需要矿工打包确认,就可以确认交易,几乎可以实现秒到;三是匿名交易。从区块链上看不到是谁和谁进行了转账。
  • 如何实现匿名交易:除了普通节点之外,还有一种节点叫“主节点”。主节点可以提供一系列服务,如:匿名交易和即时支付。想进行匿名交易的交易者发起匿名申请,由主节点进行混币,一般是3笔交易一起进行混币。举个例子,一桌人把自己的钱都放在桌上,混在一起,然后再分别拿回相应面值的钱,这样就不知道你手里的钱到底是谁的了,这就是混币。混币后,网络就不知道究竟谁转账给了谁。

74. 门罗币XMR

  • 它的总量为1844万,2018年1月已发行1562万。门罗币的区块大小没有限制,所以不存在扩容风险。
  • 通过环形签名的方式提供匿名性。环形签名:在门罗币的区块链网络里面,网络首先将签名者的公钥和另外一个公钥进行一起混合,然后对消息进行签名,使得外界无法区分集合中哪个公钥对应真正的签名者。
  • 门罗币的匿名性甚至可以做到让发送币的人不知道币打给了哪个地址、接受币的人仅打开钱包也不知道是谁打来的币。

75.大零币Zcash

  • 前最高匿名性最强的数字资产,采用零知识证明机制提供完全的支付保密性。
  • Zcash匿名转账的时间周期比较长,大概需要20分钟。网络可以选择普通转账或匿名转账,对隐私保护级别有所影响。
  • 进一步完善了比特币匿名功能方面的不足,发行时引起了密码学和区块链界的轰动,导致其刚诞生时价格一度飙升至比特币的7倍以上。

76. 区块链项目-平台类

  • 平台类应用让开发者可以在区块链上直接发行数字资产、编写智能合约等。智能合约就是在区块链数据库上运行的计算机程序,可以在满足其源代码设定条件下自行执行。
  • 比如你在区块链上开发一个基于房屋租金协议的智能合约,当业主收到租金时就会触发自动执行,并将公寓的安全密钥给到租户。目前市值最高的平台类为以太坊。

77&79. 以太坊

  • 平台类应用的典型代表,被称为区块链2.0,
  • 与比特币不同,它是一个可编程、可视化、更易用的区块链,相当于一个去中心化的全球计算机,它允许任何人编写智能合约和发行代币。
  • 虽然都是采用PoW挖矿机制,但是以太坊的出块机制和比特币还是有所区别。由于以太坊的出块时间短,导致以太坊很容易形成孤块,孤块是指不在最长链上的区块。比特币的孤块没有任何区块奖励,但是在以太坊中,孤块可以被引用,被引用的孤块被称为“叔块”(uncle block),它们打包的数据也会记录在区块链中。和比特币不一样,以太坊的叔块有奖励,每个叔块最多可以获得4.375个以太币的奖励。
  • JAVA有JVM,在以太坊里,也有以太坊的虚拟机EVM,可以执行任意复杂的算法代码。开发者可以使用现有的JavaScript 或Python等编程语言,在以太坊上创造出自己想要的应用。通过以太坊的虚拟机,你可以很简便地发行数字资产,编写智能合约,建立和运行去中心化的应用,成立去中心化自治组织等。

78. EOS

  • 与以太坊同为区块链开发平台,具有扩展性强,支持大规模商业应用等特点。
  • EOS 采取DPoS共识算法及其他技术手段预期实现每秒百万级别交易请求,将能够支持数千个商业级的DAPPs
  • 以太坊是一条公链,在以太坊链上运行的每一个应用都会消耗整条链的资源,但EOS 只是区块链基础架构,开发者可以自由地在 EOS 上创建公链,链与链之间不会影响彼此的资源使用,不会出现因个别应用资源消耗巨大而造成网络大面积拥堵
  • 在 EOS 上转账与运行智能合约并不需要消耗 EOS代币,这将吸引更多的用户,最后,EOS上出现系统错误时,其“宪法”可用于区分此错误是否确实为 bug,判断社区的修复举措是否得当。

80. 区块链项目-应用类

  • 基于区块链开发平台(例如以太坊)开发的能够解决实体经济各个领域诸多问题的区块链项目。
  • 例如基于区块链的预测平台Aug基于以太坊区块链打造的去中心化预测平台。
  • ur,基于区块链的算力交易平台Golem,基于区块链的奢侈品溯源平台VeChain,基于区块链提供资产兑换及转移服务的OmiseGo。利用区块链技术,这些项目可以更好地解决信任问题、跨国界流通等问题,同时,利用区块链上的智能合约和代币,可以更好地实现自动执行,大大提高社会经济活动的效率。

81. Augur

  • 基于以太坊区块链打造的去中心化预测平台。采用了群体智慧的一个群体手段,用像我这类高精尖的人才群体来发散思维,以三个臭皮匠顶个诸葛亮的技能来进行判断。然后就会更接近事实走向。
  • 用户用QUGUR代币进行预测和下注。正确获得奖励,错误失去所有代币。

82. Golem

  • 基于以太坊区块链打造的计算资源交易平台。通过区块链,Golem能链接全球的算力资源,从而实现计算能力的全球共享。应用所有者和个体用户(算力“请求方”)可以点对点地从其他用户处租用算力(算力“供应商”)。
  • Golem代币简称GNT,在使用算力资源时需要支付GNT酬劳给算力供应商、软件开发商。GNT总量为10亿枚,82%的GNT在外面出售和流通,18%的GNT保留在Golem团队手里。

83. 区块链项目-资产代币化

  • 资产代币化是指将区块链资产挂钩黄金和美元等实物资产,是实物资产的区块链映射,目前只有不超过10个品种,比较典型的代表是对标美元的USDT,对标黄金的Digix Dao,DigixDAO每个代币代表 1 克由伦敦金银市场协会认证的黄金。
  • 资产代币化具有方便交易,便于保管等优势。

84. 对标黄金的Digix

  • 黄金是避险的不二选择。Digix发行的黄金代币则是数字资产世界里的黄金,其代币简称DGX,能够在数字资产世界中起到避险的作用。
  • 它将黄金资产进行了上链(即:区块链)操作。举个例子,假如你有1公斤黄金准备出售,你可以将黄金切割出售,但这样太麻烦,而且容易形成损耗。你也可以将1公斤黄金寄到新加坡,让伦敦金银协会(LBMA) 验证黄金,验证合格后会给你发放黄金资产所有权的证书。该数字化证书可以转换为1000枚DGX代币,即1个DGX代币=1克黄金。大大地提高了黄金的流通效率。同理,需要提取黄金时,只要你拥有相应的代币,即可换成证书去提取黄金。

85. 对标美元的USDT

  • 1USDT=1美元,用户可以随时使用USDT与USD进行1:1兑换。Tether公司执行1:1准备金保证制度,即每个 USDT 代币,都会有1美元的准备金保障,对USDT价格的恒定形成支撑。某个数字资产单价是多少USDT,也就相当于是它的单价是多少美元(USD)。
  • 由于USDT与等量的美元是等值的,因此它是价值比较稳定的数字资产。在市场价格波动剧烈时,用户可以将账户中的区块链资产替换成USDT,达到保值避险的作用。

86. 山寨币和竞争币

  • 山寨币是指以比特币代码为模板,对其底层技术区块链进行了一些修改的区块链资产,其中有技术性创新或改进的又称为竞争币。因为比特币代码开源,导致比特币的抄袭成本很低,甚至只需复制比特币的代码,修改一些参数,便可以生成一条全新的区块链。
  • 大多数山寨币由于创始人技术实力弱、缺少技术维护、缺少市场推广等原因并不被市场认可,不具有投资价值。少数技术实力、创新能力都很强的团队开发的优秀竞争币才能被市场认可,具有投资价值,我们比较熟悉的竞争币有莱特币、以太坊等。

87. 区块链能否像互联网改变世界?

  • 互联网是一种去中心化的信息传输体系,区块链是一种去中心化的价值传输体系。
  • 互联网的主要用途是实现信息的快速发送和接收,在互联网上传输word文档,是信息的拷贝,你有一份,别人也有一份。
  • 区块链用于价值传输,在区块链上传递比特币,本质上是传递所有权,你的比特币变成了别人的比特币。

88. 区块链的缺点

  • 多数是信息公开透明的,可以有效地防止黑箱操作等现象。但也意味着如果知道某个人的账户,我就能知道他的所有财富和每一笔交易,没有隐私可言。
  • 信息不可修改,意味着如果你转账信息填错,谁也无法帮你找回损失。
  • 是去中心化的,节点之间无需中心化机构便可以自证其信,但也意味着每个人都需有一本完整的账本,随着时间推进,账本越来越大,普通计算机可能难以运行。同时,去中心化意味着没有中心化机构替你保存密钥,一旦丢失便永远无法找回。
  • 去中心化网络网络在各个节点之间达成一致的效率很低,很难像中心化支付方式那样快速。

89. 区块链适用领域

  • 去中心化的价值传输体系,具有信息公开透明、不可篡改、全球联通且交易成本低等特点。适合运用于暂时无信任中心、解决信任的成本非常高、跨中心间价值传输等领域。目前,区块链的应用领域广泛。
  • 档案管理、专利保护等社会管理领域,物品溯源、防伪等物联网领域,慈善捐款等公益领域均运用了区块链上信息公开透明且不可篡改的特点。
  • 交易清算结算、私募等金融服务领域运用了区块链低交易成本的特点。
  • 社交、通讯领域,共享租赁等共享经济领域运用了区块链全球联通的特点。

90. 目前的区块链联盟盘点

  • 近两年,区块链联盟涌现,截止2017年7月,目前已有由约40多家国际银行组成的R3、由Linux基金会发起的超级账本(hyperledger)、位于中国互联网核心腹地的中关村区块链产业联盟、由11家机构共同发起的China Ledger联盟、由25家金融机构联合成立的金链盟、被称为“俄罗斯版R3”的俄罗斯区块链联盟、寻求与微金融结合点的区块链微金融产业联盟、由深圳前海管理局主导的前海国际区块链生态圈联盟、位于陆家嘴的陆家嘴区块链金融发展联盟。

(完)

###

水平分库的分页方案思考

Posted on 2018-08-12 | In 数据库 , 业务实现

​ 很多业务都有分页获取信息列表的需求,在数据量、读写负载都不大的情况下,不需要分库分表。但是在大型流量和负载量面前,是需要进行分库分表来缓解数据库的存储压力的。上次Jeri老师提到思考分表时如何处理分页查询的问题,就思考了几个解决方案,同时查阅了一些文章,目前还在完善中…

需求概述

​ 比如淘宝上面的商品,有很多排序的维度,比如价格、好评、销量等。但是数据库的表往往是有一个与业务字段无关的主键id作为记录的唯一标识,且默认从数据库中取出数据是按主键id排序的,但业务中的场景要求我们根据其它字段来排序。单表的话只需要在排序字段上建立索引,通过limit就可以完成分页查询需求。

1
SELECT * FROM product ORDER BY price offset 20 limit 10;

​ 大流量、数据量的项目,随着数据量增大,需要将数据库进行水平切分来达到扩容的目的。一般水平分表时,采用的partition key都是主键id。为了保证负载均衡和数据量均衡,可以采用id取模或者做一次hash再取模来分库,这也是必要常用的实现负载均衡的方式,我观察了一下,“联名卡”项目的分表就是直接对主键进行取模,不过有几个表主键不是简单递增的,可能直接取模就不是最好的均衡的手段,我觉得可以做一个随机性高的hash再取模。

​ 举个需求例子,从这个例子开始谈方案。比如商品列表查询,通过主键id取模分了3个表,但查询时有“价格从低到高”的需求,每页十条数据。问题就来了:解决水平分表,且分库key与排序key不同的分页查询需求。

全局数据内存排序(暴力法)

​ 比如要按照价格从低到高取第三页的数据,为保证数据准确性,需要考虑极端情况:价格从高到低的前三页数据都来自于其中一张分表。但正常情况是前三页数据可能在每个表的前三页里都取数据,所以需要每个表都取三页数据出来,在内存中进行类似归并的排序,排序后再进行单表类似的简单查询,假设每页10条数据,

  • 步骤

    1. 每个表都取出前三页的数据

      1
      SELECT * FROM product ORDER BY price offset 0 limit 30;
  1. 各个分表执行这条SQL,业务层将得到90条数据

  2. 业务代码对这90条数据进行排序,排序后再取offset 20 limit 10的数据

  • 优点

    • 数据准确,代码修改简单,易于理解和实现
  • 缺点

    • 每个分库都需要返回大量的数据,占据网络带宽严重
    • 很明显,上面的缺点在指定页码大和分表数目多时,是非常致命的

Redis维护索引字段有序的List

​ 这个方案是我不确定能否实践的想法,这里选择用redis而不是关系型数据库是因为性能的考虑,不过我认为redis这块可能会存在可用性问题。

id price table_no
12 80 1
6 100 3
3 102 1
7 104 2
54 120 2
  • 步骤:
    1. 维护一个list,这里面有id和price、table_no的关联,且按照price排序
    2. 数据入库时会在这里同步一条数据,list保证price有序
    3. 查询时从这里取出所需要的id序列再依次去对应表查询需要的结果并组合返回。

业务折衷-不指定页查询:设置锚点

​ 很多时候业务上进行一下折衷可以降低很多开发难度(要看能不能怼过PM了)。我们可以发现,现在我们日常浏览很多的信息流产品,并没有指定页跳转,而是下滑刷新。首先这也是业务上的特点,信息流产品的用户主要功能为浏览,对于跳页的需求不高,所以这里去掉指定页跳转没有问题。这里就有一个不错的方案,可以解决第一个方案的传输量过大的问题,我称他为“设置锚点”。

  • 步骤

    1. 对于每个分表的查询语句为,初始时min变量为0,因为价格都大于0

      1
      SELECT * FROM product ORDER BY price where price > $min limit 10;
    2. 三个表一共取出30条数据,在内存中进行归并排序,再取出结果中的前10条,完成第一页查询。记录结果中的最后一条,作为下一页查询的初始锚点,即变量min。

    3. 下滑刷新,即获取下一页数据时,把min代入,继续执行第一步中的SQL,同样只接受30条数据,就完成了第二页的查询,之后无论多少“下一页”都是固定的数据量:分表数*单页数据量

  • 优点:查询性能有保证,不会根据分表数和页数的增加而大量占用带宽。

  • 缺点:需要业务折衷,商品、信息流适用,管理系统不一定适用。

业务性能兼顾-二次查询

​ 从网上的技术文章学习到了一个终极武器:二次查询法。在此自己梳理一下,假设每页需要5个数据,要查第19页的数据。感觉语言描述不是很清楚,之后做几张图出来。

  • 步骤

    1. 查询语句改写

      1
      2
      3
      4
      5
      # 单表查询时的语句
      SELECT * FROM product ORDER BY price offset 90 limit 5;
      # 改写后发送到分表的语句
      SELECT * FROM product ORDER BY price offset 30 limit 5;
      # 这个30 = 总偏移量offset/分表数
    2. 得到三页按照price递增的数据后,比较三页的第一个数据,找到最小的,即使这三页里面的最小数据,记为min

    3. 第二次查询,所有分表执行,max_n为第二步得到的n页数据中分别的最大数据。

      1
      SELECT * FROM product ORDER BY price WHERE price between $min and $max_n;

      对于min所在表之外的两张表,查询条件事实上是放宽了,会得到更多的数据。

    4. 在每个结果集中虚拟一个min记录,得到min对应记录全局的offset。假设min确实来自表1,则min在表1中的偏移量为30,第二次查询中,对于表2,min和表2第一次查询的最小项的在第二次查询中序号差为k,那么在表2中min的offset就是30-k1;同理,表3中min的offset为30-k2。所以min的全局offset为30+30-k1+30-k2 = 90-k1-k2

    5. 利用全局offset和步骤2得到的结果,为三页数据带上全局offset就可以排序。

  • 优点:实现巧妙;查询量不会激增。

  • 缺点:实现理解有一些难度;数据准确度上有折衷,不能很好的处理极端情况;有一定的需要进行两次数据库查询,性能差一丢丢。

浅谈数据库的水平/垂直扩展

Posted on 2018-08-11 | In 数据库

一次Linux开发机Debug的记录

Posted on 2018-08-09 | In 排坑合集

近期在鹅厂实习做后端,使用的是公司自研的C++框架,开发自测属于常说的“远程开发”,需要部署到开发机上测试。也就是说,每次改完代码想要调试,需要同步代码到开发机上编译部署,这样有一个好处就是迫使自己在运行代码之前做更充分的考虑,争取一次完成,在这样的情况下,感觉自己在Linux系统上定位和分析问题的能力有了一些提高,这次选出一个与配置和系统函数相关的Bug,在记录一下分析问题的思路(完全没有泄露任何业务)。

背景

因为一些原因,需要大范围重写项目CGI框架所用的配置文件。每个CGI运行时都会加载所需要的配置,观察log会发现,接口运行时会首先检查硬盘上的配置文件是否有更新,如果有则从文件加载配置,如果没有就直接从缓存中取配置,毕竟缓存读取比文件IO快多了。改完配置文件后,发现怎么跑都跑不同,一直挂在Log上,这种不出现在业务代码上的bug一直都是我觉得最难缠的。

看日志,走源码

image-20180809205750517

报的错误信息一头雾水,执行的还是框架的运行基础代码,那就进入报错的代码部分看一下:

image-20180809205847442

可以看到报错部分的代码执行的正是上面所说的检查文件是否更新,可以看到这里调用了是一个Linux系统C函数stat,那就再往下一层,看一下这个函数的具体信息,尤其是错误码,在Linux下执行man 2 stat查看Linux手册说明,下面是错误码部分:

image-20180809205952636

梳理需要的关键信息:

  • 对于stat()和lstat(),需要获得指向目标文件整个路径的执行权限
  • 获取的文件信息保存在结构体stat中,其中有errorlog中的获取失败的mtime,就是指文件修改时间
  • 错误返回中,我们看到了几种情况,但是居然没有和具体的errno对应起来,看来需要排除一下了

通过排除做选择

首先文件权限没开执行权限的可能性很大,检查了一下,开得是777,不是权限的问题。

再阅读一下几个错误的描述,文件描述符错误、文件有符号链接问题,存取被拒绝,好像都不是我们会遇到的问题。

相对的其中ENOTDIR的描述就很有趣:文件前缀的路径存在但不是一个真正的路径。这个时候去配置文件夹目录前执行ll,发现配置文件路径是个软链接,会不会就是因为这个函数需要执行在真实路径上的文件而非软链接呢?

image-20180809210014889

尝试修改配置文件路径为真实路径,配置文件正常加载,Debug完成~

总结

  • 通过这种自测方式,改掉了之前没有目的性的尝试的解决Bug的方式,能更加主动去思考
  • 要做errorlog刨根问底,即使最终指向的代码不是业务代码
  • 要对项目运行加载和环境了解更多,确保地底层知识的充足。

补充

之前对于Linux的软硬链接就有点疑问,这次就记录清楚。

Linux通过ln命令来创建软/硬链接,也就是为一个文件在另外一个位置建立一个同步的链接,通常的用法是

1
ln -s 源文件 目标文件(即链接)

-s是最常用的参数,它是指软链接,它只会在指定的目标位置上生成一个同步的镜像,并不会占用磁盘空间。硬链接就是不带s参数,它在目标位置生成一个与源文件大小相同的文件。不过硬链接有限制,不能给目录建立硬链接,且只有root才有简历硬链接的权限。

软链接:也叫做“符号链接”,软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

硬链接:硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

多角度分析NoSQL和RDBMS

Posted on 2018-05-14 | In 数据库

在日常的学习开发中,越来越感觉到技术选型的重要性,在这其中,数据库选择占了很大一部分。针对不同的需求场景去选择适合的数据库(关系型or非关系型)就是一个重要的能力了,一直都有听说NoSQL如何如何完爆关系型数据库,真的有那么神奇吗?下面就各类取一个典型,简单分析一下。

关系型数据库的一些缺陷

  • 不支持存储数据结构,比如想使用接近Java集合框架的特性是不能直接通过它做到的。
  • 扩展性不够好,一旦在迭代过程中有需求要增删改字段,就需要执行修改表结构的语句,而修改期间表是被加锁的,会需要暂停服务。

  • 大数据场景下IO过高,因为关系型数据库采取的是“按行存储”,而大数据处理中很多时候需要的反而是很长一段的单列数据,但是关系型数据库还需要按行把整行数据读取到内存中。

  • 全文检索功能残缺。并不是说不可以使用,只是不建议也不应该使用关系型数据库做全文检索,性能较差。
  • 大并发场景的表现不够好,需要开发人员精细地控制锁粒度。

K-V数据库

KV数据库里应用最多的就是Redis了,我们知道在实际场景中它更多的被用于内容缓存、访问负载大的场景、Session分离、排行榜、点赞功能,购物车等等。最主要的优点就在于性能,大约可以支持10W左右的TPS(Transactions per second),支持众多的数据结构,比如Hash,SortedSet,Bitmap,Hyperlog等等。

但是就Redis来说,事务上的ACID特性就不能得到保证了,主要就是A,原子性。Redis是单线程模型,但Redis的普通操作是原子性的,只是Redis事务不支持回滚。也就是说,涉及到一个以上的键去关联数据和需要严格事务支持的场景,是不能选择Redis的。

文档式数据库

我自己接触过比较典型的是MongoDB。首先在MongoDB中存储的数据是以JSON的行形势展现,JSON本身是一个可读的强大的描述语言。主要就是解决了关系型数据库在表结构不明确的场景下的无奈。就比如说我们经常会需要的在线填写用户信息,就比如一些职场类网站的个人信息,有很多必填项和选填项且用户可以定制自己的额外信息,在这种场景下,固定的表结构就不好解决这个问题,这也正是文档式数据库的用武之地(当然,你也可以在一个字段里面放一个复杂的JSON,相当于在MySQL里面套了一个文档数据库,解析的性能损耗不言而喻了。)

优点有:字段更改方便,对旧数据兼容,从代码层面处理判空即可,存储信息结构更灵活。缺点也比较明显,如果业务中大量需要多条数据之间的关联查询,单靠MongoDB就不够了。它对于多条数据事务可以说是不支持的。拿ACID来说,事务仅在单文档中保证原子性,且不支持像我们在MySQL那样复杂的join查询。

全文搜索引擎

ElasticSearch应该就是最受欢迎的企业搜索引擎了。它是一个可扩展、开源的全文搜索分析引擎。几乎能实时地进行对大量数据的存储、搜索和分析。海量数据查询的场景就很多了,论坛搜索文章,电商搜索商品都会用到,并且将数据存入ElasticSearch中可以很方便的进行聚合和数据分析的工作。生产上采用的ElasticSearch集群保证了极大的数据容量和可扩展性,是代替关系型数据库全文检索功能的良好解决方案。

最主要的优势就是全文检索的高性能,这个优势的原理是基于“倒排索引”,关于它的介绍之后会单独写一篇文章来详细分析。

列式数据库

HBase是大数据上广泛应用的列式数据库,基于HDFS文件系统,并参考了BigTable文档模型。

它有着很高的存储空间利用率。首先我们可以知道,传统关系型数据库是按行存储的,一行数据各个字段的数据类型一般都会有不同。列式数据库对不同列各自的类型的特征而选择特定的压缩算法使得它有更高的压缩率。普通行式数据库压缩率大概在1/5-1/3左右,列式数据库的压缩率大概在1/30-1/8左右(常用的方式就是字典表压缩)。

在大数据场景需要对一列进行读取时,列式数据库的性能是远远高于行式的,因为一列数据是存储在一起的,一次磁盘IO可以将整列都读取到内存中。

和其它非关系型数据库一样,对于多行数据,它同样不支持多行事务的原子性,也保证不了多行的一致性。且由于按列读取的操作,也不适合频繁的少量行数据读取,不适合做更新和删除的实时操作。

Hello World

Posted on 2018-04-15

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

区块链基础百问-上篇

Posted on 2018-01-20 | In 区块链

本文主要内容来自火币资讯区块链100问科普摘录,方便自己翻阅,仅供参考

1. 从物物交换到比特币

  • 一般等价物->实物货币->纸币(依靠国家信用背书)->记账货币(银行卡)
  • 08经济危机中,美国有记账权,通过无限增发货币缓解危机。中本聪想创建一种新型支付体系:人人有权记账,货币不能超发,整个账本完全公开透明

2. 什么是比特币

  • 中本聪提出,点对点、去中心化的数据资产
  • 09年中本聪打包了第一个区块,获得50BTC的挖矿奖励
  • 挖矿奖励每四年减半一次,预计2140年发行完毕,总量为2100万枚
  • 德国是首个接受比特币支付的国家,微软/戴尔等企业也接受比特币支付

3. 比特币白皮书的诞生

  • 08年中本聪论文,比特币系统是一个去中心化的电子现金系统。
  • 解决了在没有中心机构的情况下,总量恒定的数据资产的发行和流通问题。
  • 信息公开透明,每一笔转账信息都会被全网记录,白皮书问世也代表着比特币底层技术区块链的诞生

4. 第一个比特币诞生

  • 中本聪在位于芬兰赫尔辛基的一个小型服务器上,亲手创建了第一个区块——即比特币的创世区块(Genesis Block),并获得了第一笔50枚比特币的奖励,第一个比特币就此问世
  • 当时正处于08年金融危机,为了纪念比特币的诞生,中本聪将当天的《泰晤士报》头版标题——“The Times 03/Jan/2009 ,Chancellor on brink of second bailout for banks”刻在了第一个区块上。

5. 谁是中本聪

6. 密码朋克是什么

  • 狭义地说,“密码朋克”是一套加密的电子邮件系统
  • 1992年,英特尔的高级科学家Tim May发起了密码朋克邮件列表组织
  • 用户约1400人,讨论的话题包括数学、加密技术、计算机技术、政治和哲学,也包括私人问题,早期的成员有非常多IT精英

7. 比特币如何发行

  • 没有特定的发行机构,而是依靠一套去中心化的发行机制,逐步将比特币发行出去
  • 相当于一个去中心化大账本,每个区块就是这个账本中的一页,系统自动生成比特币作为奖励激励矿工参与记账
  • 每10分钟,全体矿工一起计算一道问题,最先算出答案的矿工获得记一页账的权利,记账完成后,他将自动获得一定量的比特币,这就是新增比特币的发行过程
  • 根据中本聪的设计,最开始每记一次账奖励50个比特币,每记21万页账(也就是21万个区块,大约需要4年),记账的奖励就会减少一半,直到大约2140年,比特币将无法继续细分,至此,比特币发行完毕,总量2100万

8. 第一个比特币实体交易(披萨)

  • 美国程序员拉兹勒1000btc买了一个英国志愿者2个价值25美元的披萨
  • 为了纪念这次交易,把每年的5月22日称为“比特币披萨日”,比特币爱好者们聚在一起吃披萨庆祝

9. 加文安德烈森继任中本聪

  • 加文·安德烈森是比特币核心开发团队的成员之一,中本聪从互联网上销声匿迹之前用邮件保持联系的少数几个人之一
  • 2010年,加文开始接触比特币,并开始向中本聪提交代码,以优化比特币的核心系统,中本聪逐渐对加文的代码有了信赖
  • 后来,中本聪退到了幕后,加文变成了比特币的领导者,加文组建了比特币核心开发团队,致力于修复比特币代码的安全漏洞,提升比特币软件的稳定性使其更易用,并创建了非盈利性的比特币基金会

10. 比特币水龙头

  • 为了让更多人知道并尝试使用比特币,程序员加文·安德烈森花50美元买入10,000个比特币(2010),创建了“比特币水龙头”网站,向所有访问网站的人无偿赠送5个比特币
  • 比特币水龙头网站甚至形成一种新型商业模式,早期有约50%的比特币网站靠其导流(大量浏览量,向主要比特币网站导流赚取广告费)

11. 比特币为什么还没被挖完

  • 全网算力上升,比特币系统靠调节难度系数来保证比特币不被太快挖完
  • 为了保证比特币稳定在约10分钟挖出一个区块(竞争记账权和比特币奖励),中本聪设计出调整挖矿获得比特币难度这一方案,即每过2016个区块(约2周时间)动态调整一次,这样调整后的难度使每生成一个区块的预期时间为10分钟
  • 现在的难度系数约为480PH/s,大约是创世区块的680亿倍,也就是说,以现在的算力,全网矿工需要经过约3000万亿亿次哈希运算才能找到一个符合条件的答案,生成新的区块

12. 比特币如何实现总量恒定

  • 中本聪设计每个比特币可以细分到小数点后8位,最初每个区块发行50个比特币,每21万个区块后每个区块产量减半
  • 大约在2045年,99.95%的比特币将会发行完毕,2140年,比特币无法继续细分,至此比特币完全发行完毕
  • 特币通缩的货币政策是否合理在货币学上争议很大,但这一发行机制激励着矿工尽早投入到比特币挖矿中,使得比特币系统获得了大量算力并保证了安全性

13. 比特币和Q币有哪些不同

  • 比特币是一种去中心化的数字资产,没有发行主体。Q币是由腾讯公司发行的电子货币,类似于电子积分,其实不是货币
  • Q币需要有中心化的发行机构,依靠腾讯的信用背书
  • 比特币不通过中心化机构发行,但却能够得到全球的广泛认可,是因为比特币可以自证其信,比特币的发行和流通由全网矿工共同记账,不需要中心机构也能确保任何人都无法窜改账本

14. 各国对区块链资产的态度

  • 态度不一,都处于探索期
  • 欧美国家积极监管,德国最早将数字资产认定为私有财产,美国CFTC将比特币定性为大宗商品
  • 亚洲方面,日本积极支持,韩国积极监管,中国严格监管:交易平台不得从事法定货币与虚拟货币之间的兑换业务。

15. 比特币怎么转账

  • 对比银行,银行转账是在银行账户之间进行的,比特币转账就是把比特币从一个比特币地址转移到另一个比特币地址上的过程
  • 如果你想要转账比特币给别人,你需要在比特币交易平台、比特币钱包或者比特币客户端中,输入你的比特币地址、接收方地址、转账金额和手续费金额
  • 确定支付后交易信息会在比特币网络进行全网广播。矿工每隔10分钟会将比特币网络中未被记账的交易打包进一个区块,这就完成了一次确认,此时比特币已转到对方账户
  • 通常需要经过6次确认,确保交易记录不能被任何人窜改,转账才算真正完成

16. 比特币转账要付多少手续费

  • 比特币转账手续费是交易者付给矿工的一笔费用,用于激励矿工竞争记账,为比特币提供足够的算力,从而确保比特币网络的安全,有的地方也叫做矿工费
  • 用户在比特币网络发起一笔转账时,一般需要支付给记账矿工一定的转账手续费。转账手续费一般为0.001-0.0015个比特币,由于区块能容纳交易记录的容量有限,矿工会优先打包手续费高的交易,所以多付手续费可以更快被记账
  • 比特币交易手续费的存在能提高转账门槛,有效防止区块链中充斥垃圾信息,并且能够保证在比特币被挖完之后矿工仍有动力维护比特币网络

17. 区块链转账按字节收费(对比银行)

  • 银行:比如跨行转账手续费约为5‰,异地转账的手续费为1‰-1%不等,而跨国转账除了支付以上手续费以外,还需支付50-200元每笔的电报费
  • 区块链资产之间的转账手续费与转账的金额大小无关,按字节收费。以比特币转账为例,一笔普通交易约占250字节,手续费约为0.001-0.0015个比特币
  • 如果你需要在一笔交易中同时转账给多个比特币地址,那么这笔交易所占字节数会更大,所以你需要多付一些手续费,才会有矿工及时打包你的交易

18. 比特币地址是什么

  • 比特币地址是一串由字母和数字组成的26位到34位字符串,看起来有些像乱码
  • 通过区块链可以查到每个比特币地址的所有转账记录
  • 比特币地址就是个人的比特币账户,相当于你的银行卡卡号,任何人都可以通过你的比特币地址给你转账比特币
  • 获取自己专属的比特币地址:可以下载一个比特币客户端或比特币钱包,或者在交易平台上注册。每个人的比特币地址都是独一无二的,有地址就可以进行比特币转账

19. 比特币节点是什么

  • 区块链账本可以实现去中心化,是因为全网节点互相同步账本,保持一致
  • 比特币是一种点对点的电子现金系统,更直接地说,是节点对节点。每笔交易由发起方向周围的节点进行广播,节点收到之后再广播给自己周围的节点,最终扩散至全网
  • 每一个比特币钱包都是一个节点,其中拥有完整区块链账本的节点叫做全节点
  • 截止2017年10月,比特币全网约有9300个全节点,负责比特币转账交易的广播和验证,转账交易发生后,由所有节点共同广播至全网,挖矿的节点验证该交易正确后会记录至区块链账本
  • 运行比特币节点不提供任何奖励,且不需要全节点也可以进行比特币转账,所以比特币的全节点数只占节点数的一小部分

20. 从发出交易到矿工打包需要几步

  • 起一笔比特币转账后,你需要将交易广播至全网
  • 挖矿节点接到这笔交易后,先将其放入本地内存池进行一些基本验证,比如该笔交易花费的比特币是否是未被花费的交易
  • 如果验证成功,则将其放入“未确认交易池”(Unconfirm Transaction),等待被打包;如果验证失败,则该交易会被标记为“无效交易”(Invalid Transaction),不会被打包
  • 节点抢到记账权后,将从“未确认交易池”中抽取约近千笔“未确认交易”进行打包
  • “未确认交易池”中的交易笔数太多,而每个区块能记录的交易笔数有限,这时候就会造成区块拥堵

21. 比特币的数字签名是什么

  • 只有比特币转账的转出方生成的,一段防伪造的字符串。通过验证该数字串,一方面证明该交易是转出方发起的,另一方面证明交易信息在传输中没有被更改
  • 数字签名通过数字摘要技术把交易信息缩短成固定长度的字符串,A发起一笔转账,需要先将该交易进行数字摘要,缩短成一段字符串,再使用自己的私钥对摘要进行加密,形成数字签名
  • A需要将交易信息原文和数字签名一起广播给矿工,矿工使用A的公钥进行验证,验证成功则证明该交易由A发起且未被更改

22. 比特币交易和找零机制

  • 比特币转账可以一次把多个地址的余额转出,也可以一次转入多个地址
  • 如果你的比特币地址有5个比特币,但是你只需要转1个给B。你需要在转账的时候告诉矿工:我有5个比特币,其中1个转给B,另外4个转回给我自己(可以是原地址或创建新的地址,不然剩余的4个比特币就全给矿工当手续费了。这就是比特币的找零机制)

23. 挖矿是什么

  • 挖矿是将一段时间内比特币系统中发生的交易进行确认,并记录在区块链上形成新区块的过程,挖矿的人叫做矿工。简单说来,挖矿就是记账的过程,矿工是记账员,区块链就是账本
  • 比特币系统的记账权力是去中心化的,即每个矿工都有记账的权利。成功抢到记账权的矿工,会获得系统新生的比特币奖励,因此,挖矿就是生产比特币的过程
  • 比特币和黄金一样总量有限。所以比特币被称为数字黄金,比特币生产也俗称挖矿

24. 比特币怎么挖矿

  • 每10分钟,全网矿工一起计算一道算术题,谁先算出答案,就相当于挖到了这个区块,该矿工便能获得系统新生的比特币奖励
  • 在比特币刚诞生的时候,通过计算机的CPU便可以挖矿。随着挖矿的矿工越来越多,目前用CPU已经不能挖出比特币了,大家开始用矿机挖矿
  • 如果你想挖矿,首先需要准备好矿机、比特币地址、挖矿软件等。但是目前比特币网络算力太大,个人购置少量矿机也很难挖出区块。很多矿工加入矿池一起挖矿,矿场只负责计算,矿池负责信息打包。矿池挖到比特币之后根据矿场的算力占比分配收益,以此保证更加稳定的投入产出

25. 矿工是怎样挖矿的

  • 矿工的主要工作是交易确认和数据打包
  • 购买一台专用的计算设备,下载挖矿软件,就可以开始挖矿了
  • 挖矿不需要矿工亲自动手,实际是由电脑在执行特定的运算,对于矿工来说只要保证矿机电力供应和网络连接就可以了

26. 矿机是什么

  • 以比特币为例,比特币矿机就是通过运行大量计算争夺记账权从而获得新生比特币奖励的专业设备,一般由挖矿芯片、散热片和风扇组成,只执行单一的计算程序,耗电量较大
  • 在电脑上下载比特币挖矿软件,用该软件分配好每台矿机的任务,就可以开始挖矿了,针对不同币,算法不同矿机也不同

27. 比特币挖矿机的进化史

  • CPU挖矿→GPU挖矿→专业矿机挖矿→矿池挖矿
  • 2010年9月18日第一个显卡挖矿软件发布。一张显卡相当于几十个CPU,挖矿能力得到明显提升
  • 之后又有人发明了基于挖矿芯片的专业挖矿设备,即矿机。目前行业领先的蚂蚁矿机装有将近200张BM1387芯片,相当于3万多张GPU的算力
  • 后来矿工将自己的矿机集中起来,形成了矿场和矿池

28. 矿场长什么样

  • 矿场是集中管理矿机的场所,一般选址在电费相对比较便宜并且比较稳定的地方
  • 通风、还有隔尘、静音等方案,再往后发展,就有了有室内温度和湿度的严格控制。现在整个矿场的运营方案还在不断升级和进化

29. 矿池怎么挖矿

  • 矿池突破地理位置的限制,将分散在全球的矿工及矿场的算力进行联结,一起挖矿
  • 矿池挖矿所产生的比特币奖励会按照每个矿工贡献算力的占比进行分配。相较单独挖矿,加入矿池可以获得更加稳定的收益
  • 目前全球算力较大的矿池有鱼池(F2Pool)、蚁池(AntPool)、币网(BW Pool)、国池(BTCC Pool)、BitFury。除了BitFury,其余都来自中国

30. 算力是什么

  • 挖矿过程中我们需要找到其相应的解,而要找到其解,并没有固定算法,只能靠计算机随机的哈希碰撞
  • 一台矿机每秒钟能做多少次哈希碰撞,就是其“算力”的代表,单位写成hash/s
  • 算力可以简单的理解为计算能力。目前主流的矿机为14T左右的计算量级,即一台矿机就能每秒做至少1.4*10的13次方次哈希碰撞
  • 矿工所掌握的所有矿机占比特币全网总算力的百分比是多少,就代表TA在这10分钟竞争中能够获胜的概率就是多少

31. 竞争记账是什么

  • 比特币系统中没有中心化的记账机构,每一个节点都有记账权,如何保证账本一致性是一个重要的问题
  • 竞争记账是比特币系统的记账方式,它解决了如何在去中心化的记账系统中,保证比特币账本一致性的问题
  • 竞争中算力高的矿工更容易获得记账权。成功抢到记账权的矿工负责记账,并将账本信息同步给整个网络。作为回报,矿工将获得系统新生成的比特币奖励

32. 如何投资区块链资产

  • 投资渠道:场内交易、场外交易、中心化交易平台、去中心化交易平台
  • 投资方式:趋势交易、对冲、跨平台搬砖等

33. 如何在交易平台投资区块链资产

  • 相较于点对点交易、挖矿等,在交易平台购买是目前获得区块链资产最主流的方式,即场内交易
  • 区块链资产的场内交易和股票类似
  • 无论是买入还是卖出,交易平台会记录所有人的挂单价格,买卖双方通过实时买卖盘可以获取最新成交价格

34. 量化交易是什么(成熟交易市场的标志)

  • 量化交易,有时候也称自动化交易,是指以先进的数学模型替代人为的主观判断
  • 极大地减少了投资者情绪波动的影响,避免在市场极度狂热或悲观的情况下做出非理性的投资决策
  • 种类有很多,包括跨平台搬砖、趋势交易、对冲等
    • 跨平台搬砖:当不同目标平台价差达到一定金额,在价高的平台卖出,在价低的平台买入
    • 趋势交易会更加复杂一些,它根据趋势的指标来发出卖出和买入的信号
    • 对冲是指同时进行两笔与行情相关、买卖方向相反、数量相当、盈亏相抵的交易,以达到对冲风险的效果

35. 区块链资产如何在场外交易(最原始的交易方式)

  • 场外交易也叫OTC交易。用户需要自己寻找交易对手,不通过撮合成交,成交价格由交易双方协商确定,交易双方可以借助当面协商或者电话通讯等方式充分沟通
  • 目前比较主流的场外交易平台有Localbitcoins和huobi.pro等

36. 去中心化交易平台是什么

  • 与中心化交易平台不同,去中心化交易平台不需要注册账户,使用个人数字资产账户即可参与交易
  • 去中心化交易平台每笔交易都通过区块链进行,需要等待区块链的确认才算交易成功
  • 流动性低、交易处理速度慢,交易总量仅占全球数字资产交易总量的0.03%

37. 币币交易是什么

  • 币币交易是指用一种区块链资产定价另一种区块链资产,比如说用比特币定价以太坊会产生ETH/BTC交易对。该交易对的价格表示你需要用多少比特币可以买到一个以太坊
  • 现在全球比特币的交易量,将近一半来自币币交易,法定货币与比特币交易的比例逐渐缩小

38. 比特币钱包是干嘛的

  • 存储用户的比特币信息,包括比特币地址和私钥(可存放多个),钱包丢失就会失去这些比特币
  • 核心功能就是保护私钥
  • 钱包有很多种形态:客户端,网页,手记都可以
  • 采用多种方式分散式存储可减低风险(???)

39. 冷钱包/热钱包

  • 比特币钱包按照私钥的存储方式,可以分为冷钱包、热钱包两种
  • 冷钱包是指网络不能访问到你私钥的钱包
  • 热钱包是指互联网能购访问你私钥的钱包。热钱包往往是在线钱包的形式
  • 只要其他人知道了你的比特币私钥,就能转走你的比特币。记住,谁手握私钥,谁才是比特币真正的主人

40. 全节点钱包、轻钱包

  • 全节点的代表是bitcoin-core 核心钱包,需要同步所有区块链数据,占用很大的内存,但是可以完全实现去中心化。
  • 轻钱包依赖比特币网络上其他全节点,仅同步与自己相关的数据,基本可以实现去中心化。
  • 中心化钱包不依赖比特币网络,所有的数据均从自己的中心化服务器中获得,但是交易效率很高,可以实时到账,你在交易平台注册的账号就是中心化钱包

41. 区块链和比特币关系

  • 区块链技术是比特币的底层技术,比特币是区块链的第一个应用
  • 把区块链类比成一个实物账本,那么每个区块就相当于这个账本中的一页,每10分钟生成一页新的账本,每一页账本上记载着比特币网络这10分钟的交易信息
  • 每个区块之间依据密码学原理,按照时间顺序依次相连,形成链状结构,因此得名区块链

42. 比特币可以用于支付吗

  • 日本和德国接受直接交易支付
  • 大部分商家通过第三方支付机构间接接受比特币,即买方购物支付比特币,第三方机构收到比特币后立即兑换成法币,商家收到的是法币而不是比特币
  • 使用比特币支付,手机比特币钱包扫码之后会先展示比特币的实时汇率,买卖双方确认后再进行支付

43. 区块链技术的发展历史

  • 比特币刚诞生的时候,并没有“区块链”这个概念
  • 17年九月中国政府公开支持区块链技术发展,区块链在金融、保险、零售、公证等实体经济领域的应用开始加速落地

44. 区块链,制造信用的机器

  • 区块链技术具有匿名性、去中心化、公开透明等特点
  • 区块链并不是新发明的一种技术,而是一系列技术的集成,包括非对称加密技术、时间戳、共识机制等
  • 以比特币为例,区块链通过时间戳(Timestamp)和工作量证明(Proof of Work)机制解决了双重支付(Double Spending)和拜占庭将军问题(Byzantine Generals’ Problem),即保证同一笔比特币不可能被花费2次,并且在整个去中心化的区块链网络中,在所有节点间保持一致。
  • 非对称加密机制保证私钥的安全性,时间戳保证区块按顺序连接成链,工作量证明机制解决了在去中心化系统中如何公平地分发2100万个比特币的问题

45. 区块如何连接成区块链

  • 区块链由一串使用密码学算法产生的区块连接而成。每一个区块上写满了交易记录,区块按顺序相连形成链状结构,也就是区块链大账本
  • 以比特币为例,矿工在生成新区块时,需要根据前一个区块的哈希值、新交易区块和随机数,来计算新的哈希值和随机数。每一个区块都是在前一个区块数据的基础上生成的,该机制保证了区块链数据的唯一性.
  • 因为交易记录细微的变化也会彻底改变哈希值的结果,所以矿工在进行算力竞争的时候无法作弊,每个矿工都必须等前一个区块生成之后才能根据前一个区块的数据开始计算符合条件的随机数,保证了挖矿的公平性

46. 区块链记录哪些信息

  • 区块链是比特币网络的大账本,而每个区块相当于账本中的一页
  • 比特币每个区块内主要记载了区块头、交易详情、交易计数器和区块大小等数据
    • “区块头”内包含了除交易信息以外的所有信息,主要包括上一区块头哈希值:用于保证区块按顺序串连;时间戳:记录该区块的生成时间;随机数:即全网矿工一起PK的算术题答案;难度目标:该算术题的难度系数打分。
    • “交易详情”详细记载了每笔交易的转出方、收入方、金额及转出方的数字签名,是每个区块内的主要内容。
    • “交易计数器”表述每个区块中包含交易的数量。
    • “区块大小”表示每个区块数据的大小,当前每个区块限定在1MB以内,不排除以后有扩大的可能。

47. 时间戳是什么

  • 时间戳使区块链上每一笔数据都具有时间标记。简单来说,时间戳证明了区块链上什么时候发生了什么事情,且任何人无法篡改
  • 时间戳在区块链中扮演公证人的角色,而且比传统的公证制度更为可信,因为区块链上记录的信息无法被任何人以任何方式修改
  • 因为运用了时间戳,区块链技术很适合用于知识产权保护等领域。举个例子,你写了一篇论文,在发布之前想先找行业专家指点一下,但是你担心专家直接用他的名义发表。这时候你只需先保存在链上,便可以轻松证明版权。

48. 最长区块链才是正确的区块链?

  • 比特币白皮书规定,节点永远认为最长链是正确的区块链,并将持续在它上面延长
  • 矿工都在最长链上挖矿,有利于区块链账本的唯一性。如果给你转账的比特币交易不记录在最长链上,你将有可能面临财产损失
  • 全世界的矿工同时在挖矿,有可能同时有2个矿工算出了正确的答案,那么区块链就会形成分叉,剩下的矿工有可能在其中任意一条分叉上继续挖矿,延长区块链。所以我们通常要求在比特币转账被打包之后,还需要经历6个区块的确认,确保矿工不会再回到另一条分叉上挖矿时,才算真正的转账成功。

49. 区块链如何分类

  • 区块链按准入机制分成3类:公有链,私有链和联盟链,以后还可能诞生其他类型的区块链
  • 公有链公开透明。世界上任何个体或者团体都可以在公有链发送交易,且交易能够获得该区块链的有效确认。每个人都可以竞争记账权。比特币区块链就是公有链的典型代表
  • 联盟链半公开。是某个群体或组织内部使用的区块链,需要预先指定几个节点为记账人,每个区块的生成由所有预选记账人共同决定,其他节点可以交易,但是没有记账权
  • 私有链则完全封闭。仅采用区块链技术进行记账,记账权并不公开,且只记录内部的交易,由公司或者个人独享

CentOS 7部署MySQL线上环境的完整方案

Posted on 2017-09-26 | In 环境部署

后端在做上线项目的过程中,是必须要部署生产环境服务器的数据库的,而远程服务器安装又会比本地安装多一些坑(开发远程连接、调整最大连接数等)以及一些简单功能的使用(导入导出数据库),这里就从安装到线上部署的实际用法做一个总结,欢迎补充~

准备

  • 一台装好CentOS 7.X的云服务器
  • 使用SSH连接

安装、初始化过程

1. 添加MySQL Yum Repository

SSH登录服务器后,执行

1
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

然后安装该yum repository

1
yum -y install mysql57-community-release-el7-8.noarch.rpm

2. 安装MySQL Server

在yum仓库中搜索可用的社区版

1
yum search mysql-com

选择安装mysql server

1
yum -y install mysql-community-server.x86_64

等待安装完毕后,启动MySQL

1
systemctl start mysqld

在每次yum update时都会检查MySQL的版本更新,但大多数时间我们是不需要的,而且这也会影响yum update的速度,可以在安装后移除该yum源yum -y remove mysql57-community-release-el7-8.noarch

3. 初始配置

首先要登录MySQL服务,我遇到过三种情况

  • root密码为空,直接mysql -u root就可以登录
  • root密码是系统自动生成的,被记录在mysql日志中,可以通过cat /var/log/mysqld.log | grep "password"来获取,会看到日志中有一条temporary password,是一个随机串,然后使用mysql -u root -p,copy这个密码登录

  • 没在日志中找到密码,或者忘记密码:首先在配置文件/etc/my.cnf中的[mysqld]下面加上skip-grant-tables,重启服务,这样可以跳过登录验证,然后登录进MySQL后,重置密码,然后回到配置文件去掉那条危险的配置并重启服务

    1
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
  • 如果是5.7以上的版本,上面这一条就不适用了,要换成这条

    1
    UPDATE mysql.user SET authentication_string=password('your_password') WHERE user='root' AND Host = 'localhost';
  • 在设置密码时,如果提示出现Your password does not satisfy the current policy requirements.,说明MySQL5.7后的版本设置了数据库密码安全强度限制,主要是两个全局设置字段:validate_password_policy和validate_password_length,分别是密码复杂度和长度设置,在MySQL中运行两条命令

    • set global validate_password_policy=0; 设置密码安全级别为LOW
    • set global validate_password_length=4; 设置密码最短长度为4

4. 远程连接配置

这应该是坑最多的地方了,所以尽量多列几种情况,首先要定位问题

  1. 在乱改MySQL配置前,先检查一下防火墙是否允许开放3306端口,或者可以选择关闭防火墙,iptables和firewalld都检查一下

  2. 确定防火墙开放后,开始

    1
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

    在password中填写你的连接密码,然后一定要刷新权限命令:

    1
    FLUSH PRIVILEGES
  3. 如果还是不行,那就本地登录mysql,然后user mysql执行select user,host from user,可以查看现有用户可可以连接的主机,如果只有localhost或者127.0.0.1,就需要走第二步授权新用户访问了,可以指定IP也可以用’%’表示所有主机都可以连接

    1
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION;
  4. 如果还是不行的话,就可能你用的是Ubuntu版本的,它会在默认的配置里写上只允许本地连接,要修改/etc/mysql/mysql.conf.d/mysqld.cnf里面有一条bind-address: 127.0.0.1把这条配置注释掉重启服务即可。

其他配置

  • 查询时如果提示查询包过大,需要在my.cnf(windows上是my.ini)上的[mysqld]下面设置max_allowed_packet = 20M
  • 导出sql和csv:导出SQL比较简单:mysqldump -u root -p dbname [tablename] > dbdump.sql;导出excel表格,使用select ... into outfile例如:

    1
    2
    3
    SELECT * FROM article INTO OUTFILE '/tmp/test.csv'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n';
  • 导入SQL:mysql -u root -p dbname < xxxx.sql

XJin

XJin

Live With Various Faces.

9 posts
5 categories
10 tags
GitHub E-Mail
© 2017 — 2018 XJin

Hosted by Coding Pages