[Dr.Lib]跑起一个TiDB

TiDB 是新一代开源分布式 NewSQL 数据库,模型受 Google Spanner / F1 论文的启发, 实现了自动的水平伸缩,强一致性的分布式事务,基于 Raft 算法的多副本复制等重要 NewSQL 特性。 TiDB 结合了 RDBMS 和 NoSQL 的优点,部署简单,在线弹性扩容和异步表结构变更不影响业务, 真正的异地多活及自动故障恢复保障数据安全,同时兼容 MySQL 协议,使迁移使用成本降到极低。

PingCAP

TiDB 是 PingCAP 公司基于 Google Spanner / F1 论文实现的开源分布式 NewSQL 数据库,具备如下 NewSQL 核心特性:

  • SQL支持 (TiDB 是 MySQL 兼容的)
  • 水平线性弹性扩展
  • 分布式事务
  • 跨数据中心数据强一致性保证
  • 故障自恢复的高可用

一个完整的 TiDB 集群包括 PD,TiKV 以及 TiDB。

获取TiDB 官方 Binary

在 Archlinux 下可以使用AUR中的tidb-bin-nightly包。对于大多数发行版,官方的二进制都能完美的工作。

可以使用-V命令查询当前二进制的版本、编译时间。

部署TiDB

我的测试环境有三台机器,为方便起见做了如下配置

单节点部署

官方文档参考

启动TiDB需要按顺序启动 PD -> TiKV -> TiDB

在服务器上部署的时候,可以在nohup或者tmux中启动。笔者推荐使用基于tmux的byobu以方便管理与监控。

在以受限用户运行tikv的时候,可能会遇到这样的错误

此时可以选择以root用户启动或在配置文件中按实际情况指定RocksDB的max-open-files。

全部启动完成后,就可以使用mysql客户端连接了。TiDB默认的MySQL监听端口是0.0.0.0:4000

添加与卸载节点

官方文档参考

添加pd节点

在两台机器上分别启动pd节点并加入集群

添加tikv节点

可以使用pd-ctl查看当前集群状况

删除节点

可以用pd-ctl进行,或使用PD API

多节点集群模式部署

官方文档参考
在三个机器上分别启动pd实例

pd启动完成后,启动tikv实例

启动tidb

开始使用TiDB

你可以从 MySQL 无缝切换到 TiDB。如果您现有的业务已经基于 MySQL 开发,那么大多数情况下无需修改代码即可直接替换单机的 MySQL

 

更多信息可以参考官方文档

[Dr.Lib]各种.travis.yml

于是这两天撸mod和插件的.travis.yml的时候还是整出了不少东西的,记录一下什么的。

C++: 测试Clang3.8 & GCC 6 的 Coveralls 数据

这个是当年折腾数据结构时写的CI了,因为travis的Ubuntu环境目前还是古代的12.04 precise,所以很多东西要么走PPA要么直接下

这里我用的是两个镜像,分别测Clang与GCC。由于两个编译器的目标gconv版本不同所以还需要判断一下.

Java Minecraft Forge mod:repo无关的.travis.yml & 自动更新update.json

其实主要部分还是给了gradle来做= =

要做到.travis.yml和gradle里不带repo信息的话,善于利用环境变量吧。

有一个遗憾是 travis-ci/dpl issues#613 ,暂时没法自动设定是否为prerelease^

 

Java Spigot plugin:repo无关的.travis.yml & 自动更新maven repo

 gz

GeekyTeen Conference 青少年极客大会 2016

GeekyTeen Conference 青少年极客大会将于 2016.07.14-2016.07.15 于厦门举行~这是一个交流先进思想,了解先进技术的交流平台。虽说是青少年,但却不局限于他们。今年的活动将有Rust编程语言、二进制逆向、Docker 容器化部署、Meteor 等主题,将有相关的从业人员或者爱好者到场讲解,与听众交流。

继续阅读 “GeekyTeen Conference 青少年极客大会 2016” »

Posted on by

[海韵日常]以及图集


军训结束,开学了。
说好的昨天写的,可是时间关系拖到了今天。
今天早上班级一起做了素质拓展活动,感觉萌萌哒。
以及下午参观了图书馆总部。回来后我在宿舍东图随手借了几本。
)剩下的明天写吧
继续阅读 “[海韵日常]以及图集” »

[Dream YOLO]在漫漫长路的前方

一年前的12.28,注定是我人生的一个节点。

拿着算法导论,默默地走在那一段200米的距离,思考我的心愿与梦想。

而今天,也将是一个新的开始。Y510P,将会伴我在这段旅途上继续前行。

从头到尾看了一遍自己的日志,曾经那么在意的瞬间,现在想来,还是那么的温暖;曾经梦想过的前方,正在一点点的靠近。花鸟依旧,人已不同。回望过去的时间,每一步都是那么的偶然,却又是那么的合理。一步一步,一点一滴的努力,积累的能量能让自己感动。

。。在遥远的前路上。。 恍如昨日的邂逅。。 我不会忘记。。

一直在寻找着,是哪一个时间点,对我来说是最重要的。如今却忽然发现,那一点一滴,都不可或缺。那一夜的失眠找到了属于自己的梦想,那一次的惨败让我知道了梦想的意义,在我最脆弱,最无助的日子里,有你们的陪伴。

。。“Orz 15天图灵奖的图灵神”。。

一直期待一个属于自己的爆发,却发现真正的爆发需要的是背后几月几年的付出。差距还很大,时间却已不多了吧。没人会知道你的努力,但你知道,你必须知道。

还记得ACMICPC World Final之夜,我刷着broad,却有种想哭的冲动。

还记得IOI2013,clj怒夺#1那一天,我才发现梦想比我预想的更为艰辛。

还记得彻夜的调试,只为了几行写残的线段树。

还记得那一杯杯咖啡,只为了把一本薄薄的书啃完。

还记得NOIP前一天,纪爷来火箭班开讲座,而我却独自一人在机房。

曾经在场就好。

也许,前方的路还很长,梦想还很远。

7f32c92djw1ebxe6lz4vjj218g0xcn7t

Via http://graphbuster.com/?p=486

在MathOverFlow上有这样一段搞笑的问答:

Daniel McLaury: \(\sqrt[3]{2}\) 是无理数的证明:若不然,则存在整数 \(p,q\) 使得 \(\sqrt[3]{2}=\frac{p}{q}\) ,两边三次方得到 \(p^3=q^3+q^3\) ,这与费马大定理相悖,即证. 注意到把3换成更大的正整数仍然可以这么证明.

12+ Comments

R.Shreevatsa:

可惜费马大定理不够强,不能证明 \(\sqrt{2}\) 是无理数.

Vincent.Yu

这不是高射炮,明明是原子弹轰蚊子.

XXX:

说到这个,在一次比荷卢(比利时,荷兰,卢森堡)数学竞赛中,为了证明56不是一个整数立方,一个学生写道:因为 \(56=4^3-2^3\) ,取费马大定理 \(n=3\) 的情况,即证.

材料来源及翻译:Fall_Ark

C语言速成手册(四):指针、动态内存分配、标准输入

Via http://www.matrix67.com/blog/article.asp?id=271 by Matrix67

目录:
C语言速成手册(一):基本数据类型、标准输出、函数
C语言速成手册(二):布尔值、条件判断、循环
C语言速成手册(三):数组、字符串、结构
C语言速成手册(四):指针、动态内存分配、标准输入
C语言速成手册(五):其它运算符、文件操作、其它函数
C语言速成手册(六):其它问题、后记

指针的定义
    定义一个指针的方法如下:

    例如,下面的语句定义了一个指针:

    这样,pointer就是一个指针,它指向的是一个int类型的数据。

    一个指针可以是一个合法的内存地址,也可以为0(通常写成NULL)。
    你可以用printf语句输出一个指针,对应的标识为"%p"。下面的代码可以输出上面定义的指针指向的地址。

取地址与引用
    假如a是一个变量,p是一个指针,那么&a返回该变量的地址,*p返回该指针所指的内容(称做“引用”)。
    阅读下面的代码片段:


    程序输出如下。当执行了p=&a后,存取*p就相当于是存取变量a了。


动态内存分配
    首先介绍sizeof函数(准确地说是一个运算符),它的参数为一个变量名或类型名,返回的是它所占内存空间的大小。下面的代码输出1 8 800 4 1 。


    下面介绍四种动态内存分配函数,使用它们前需要在程序最前面包含头文件stdlib.h。四种函数的格式分别为:

    函数malloc将在内存里寻找一个大小为size的连续空间,把分配到的内存地址作为一个指向void类型的指针(默认的无类型指针)返回。如果空间分配失败,函数返回NULL。
    函数calloc将在内存里寻找一个大小为n * size的连续空间,并且把这段内存的数据全部清0,返回数据和malloc一样。如果空间分配失败,函数返回NULL。
    函数free用于释放内存空间,释放后的空间被回收,可以用于以后的malloc或calloc操作。
    函数realloc在保证已有数据不变的情况下改变已有指针的空间大小,返回重新分得的空间的内存地址(有可能和原来不同)。如果空间重新分配失败,函数返回NULL。
    Pascal中的new语句可以用前两个函数代替,free语句则相当于Pascal中的dispose。

    注意,malloc和calloc函数所返回的指针还没确定类型,理论上需要用类型转换。下面的程序合法地为p指针分配空间:

    事实上,由于赋值时C语言自动转换类型,因此那个类型转换是没有必要的(去掉(int *)没有影响)。

指针与结构
    一个指针可以指向一个结构,一个结构也可以包含一个指针。结构里包含一个指向结构的指针就构成了链表:

    这样,定义struct node *a,则(*a).next就是另一个指向node结构的指针。在C语言中,(*x).y的句型很常用,因此有一个专门的记号x->y来代替(*x).y这样繁杂的写法。
    你可以从下面的程序中看到链表的使用。


指针与函数
    前面说过,C语言中的函数参数和变量只能够供该函数使用。
    下面四个程序代码的输出分别是什么?

    代码一:

    代码二:

    代码三:

    代码四:

    答案:前两个程序输出520 1314,后两个程序输出1314 520。
    前两个程序中,待交换的两个数(即使是全局变量)作为参数传给了swap函数,该函数里的操作对函数外无影响。
    第三个程序中,swap函数对全局变量直接进行操作,其影响是全局的。
    最后一个程序巧妙地应用了指针来实现两数交换。函数的参数是指针类型,这个函数不能改变指针本身,但可以改变指针所指的内容。这是写此类函数通常所用的方法。
    为了强调函数void swap( int *a, int *b )中的指针本身不发生改变,很多地方喜欢写成void swap(const int *a, const int *b ) 。

指针与数组
    数组由内存的连续空间构成,因此可以用指针来访问。事实上,数组名本身就是一个指针。观察下列代码:


    看看输出结果(自己运行),你会发现,数组名其实就是一个指向数组起始位置的指针,其作用相当于&a[0]。而指针本身可以进行加减运算(表示内存地址的加减,具体加多少减多少取决于指针所指的类型),其本质是在数组中进行定位。因此,下面的两个代码是完全等价的:

    下面的程序输出0 1 2 3 4 0。函数init不能改变变量的值,但由于数组的实质是指针,因此它可以改变数组所储存的内容。


    你甚至可以用指针来创建数组。使用函数calloc可以方便地得到指定长度并已全部初始化为0的数组。再加上realloc函数后,你就可以实现真正意义上的动态数组(长度可变)。示例程序如下:

    上面的程序将输出012340123454321。

标准输入
    之所以现在才来说读入操作,是因为读入函数需要用到指针知识,否则解释不清楚。
    输入操作用scanf函数,和输出一样需要有stdio.h支持。
    和输出操作一样,scanf函数的第一个参数也是一个字符串,读入同样采用匹配标识符的方法进行。所不同的是,读入函数的参数是需要随函数变化的,因此变量作为scanf的参数时需要加上取地址符号,作为指针代入函数才行。除了读入%c类型之外,所有读入操作均自动跳过空格。
    看下面四个例子:

代码一:


输入:
8 2
则a为8,b为2。

===========性感的分割线===========

代码二:


输入:
8 2
则a为8,b为一个空格。

===========性感的分割线===========

代码三:


输入:
20:19:02
则h为20,m为19,s为2。

输入:
20:19-02
则h为20,m为19,s没有获得新的值(匹配失败)。

===========性感的分割线===========

代码四:


输入:
My favourite website is matrix67.com, I love it!
则st为"matrix67.com," 。

    注意最后这个例子,st是数组,本质上是一个指针,因此不需要加&符号。