一 硬件系统相关
硬件:阿里云ECS 4台(3台kafka + 1台各种服务主服务器) 8G内存+2核CPU
操作系统:Ubuntu 16.04 64位
带宽:16M(行情数据比较大,外网带宽太小可能会影响kafka的使用)
二 软件系统
2.1 消息中间件Kafka
kafka集群搭建
官方资料:
http://kafka.apache.org/documentation.html#quickstart
由于kafka集群分区与副本设计的特点,选取最小完备集群服务器数量3台ECS安装Kafka
安装步骤:
创建/kfkData/kafka目录
上传kafka文件,解压:tar -zxvf **.tar.gz -C /kfkData/kafka
修改配置文件
vim config/zookeeper.properties
在zookeeper这是的服务器列表中有server.X为ID
需要在dataDir所在目录建立一个文件myid内容为这个ID
vim config/server.properties
先启动zookeeper服务:sudo bin/zookeeper-server-start.sh config/zookeeper.properties &
启动kafka服务:sudo bin/kafka-server-start.sh config/server.properties & #后台运行
也可通过编写脚本kafka.sh管理启动和停止
测试:
创建主题:bin/kafka-topics.sh --create --zookeeper 192.168.0.2:2181 --replication-factor 1 --partitions 1 --topic test
生产者:bin/kafka-console-producer.sh --broker-list 192.168.0.2:9092,192.168.0.3:9092 --topic test
消费者:bin/kafka-console-consumer.sh --bootstrap-server 192.168.0.2:9092,192.168.0.3:9092 --topic test --from-beginning
zookeeper.properties修改要点:
tickTime=2000
dataDir=/kfkData/zkData
clientPort=2181
maxClientCnxns=0
initLimit=20
syncLimit=5
# 如果是云服务器,要设置为内网IP
server.1=172.16.61.99:2888:3888
server.2=172.16.61.98:2888:3888
server.3=172.16.61.97:2888:3888
server.properties修改要点:
broker.id=0 #0表示本机broker的编号,每个broker唯一值
listeners=PLAINTEXT://192.168.0.2:9092 #设置内部IP
advertised.listeners=PLAINTEXT://61.139.2.69:9092 #设置外部IP
# 在zookeeper中设置的地址
zookeeper.connect=172.16.61.99:2181,172.16.61.98:2181,172.16.61.97:2181
启动与重启
如果重启服务后,zookeeper自动重启,只需要启动kafka:
sudo ./kadmin.sh start kafka normal
如果要手动启动zookeeper:
sudo ./kadmin.sh start zookeeper normal
如果在线重启kafka,需要先关闭kafka,再关闭zookeeper:
sudo ./kadmin.sh stop kafka
sudo ./kadmin.sh stop zookeeper
2.2 TDGengine(涛思数据库)
官方资料
https://www.taosdata.com/cn/getting-started/
官方教程很详细,单台使用默认配置,不再详细介绍安装配置步骤。
主要介绍一下TDgengine特殊的用法-超级表。我们系统中对K线数据的存储很适合这种模式:存储的是不同的合约及不同的周期,但是拥有相同的K线数据结构。
创建超级表
一个物联网系统,往往存在多种类型的设备,比如对于电网,存在智能电表、变压器、母线、开关等等。为便于多表之间的聚合,使用TDengine, 需要对每个类型的数据采集点创建一超级表。以表一中的智能电表为例,可以使用如下的SQL命令创建超级表:
CREATE TABLE meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupdId int);
与创建普通表一样,创建表时,需要提供表名(示例中为meters),表结构Schema,即数据列的定义。第一列必须为时间戳(示例中为ts),其他列为采集的物理量(示例中为current, voltage, phase),数据类型可以为整型、浮点型、字符串等。除此之外,还需要提供标签的schema (示例中为location, groupId),标签的数据类型可以为整型、浮点型、字符串等。采集点的静态属性往往可以作为标签,比如采集点的地理位置、设备型号、设备组ID、管理员ID等等。标签的schema可以事后增加、删除、修改。具体定义以及细节请见 TAOS SQL 一节。 每一种类型的数据采集点需要建立一个超级表,因此一个物联网系统,往往会有多个超级表。对于电网,我们就需要对智能电表、变压器、母线、开关等都建立一个超级表。在物联网中,一个设备就可能有多个数据采集点(比如一台风力发电的风机,有的采集点采集电流、电压等电参数,有的采集点采集温度、湿度、风向等环境参数),这个时候,对这一类型的设备,需要建立多张超级表。一张超级表里包含的采集物理量必须是同时采集的(时间戳是一致的)。 一张超级表最多容许1024列,如果一个采集点采集的物理量个数超过1024,需要建多张超级表来处理。一个系统可以有多个DB,一个DB里可以有一到多个超级表。
创建表
TDengine对每个数据采集点需要独立建表。与标准的关系型数据一样,一张表有表名,Schema,但除此之外,还可以带有一到多个标签。创建时,需要使用超级表做模板,同时指定标签的具体值。以表一中的智能电表为例,可以使用如下的SQL命令建表:
CREATE TABLE d1001 USING meters TAGS ("Beijing.Chaoyang", 2);
其中d1001是表名,meters是超级表的表名,后面紧跟标签Location的具体标签值”Beijing.Chaoyang",标签groupId的具体标签值2。虽然在创建表时,需要指定标签值,但可以事后修改。详细细则请见 TAOS SQL。 TDengine建议将数据采集点的全局唯一ID作为表名(比如设备序列号)。但对于有的场景,并没有唯一的ID,可以将多个ID组合成一个唯一的ID。不建议将具有唯一性的ID作为标签值。
自动建表:在某些特殊场景中,用户在写数据时并不确定某个数据采集点的表是否存在,此时可在写入数据时使用自动建表语法来创建不存在的表,若该表已存在则不会建立新表。比如:
INSERT INTO d1001 USING METERS TAGS ("Beijng.Chaoyang", 2) VALUES (now, 10.2, 219, 0.32);
上述SQL语句将记录(now, 10.2, 219, 0.32) 插入进表d1001。如果表d1001还未创建,则使用超级表meters做模板自动创建,同时打上标签值“Beijing.Chaoyang", 2。
2.3 Redis
在 Ubuntu 系统安装 Redis 可以使用以下命令:
# sudo apt update
# sudo apt install redis-server
启动 Redis
# redis-server
查看 redis 是否启动?
# redis-cli
以上命令将打开以下终端:
redis 127.0.0.1:6379>
127.0.0.1 是本机 IP ,6379 是 redis 服务端口。现在我们输入 PING 命令。
redis 127.0.0.1:6379> ping
PONG
以上说明我们已经成功安装了redis。
三 编程语言
3.1 python
版本python3.6,编程工具:pycharm professional2008.1.1
编写服务:
- K线采集入库服务
- K线请求服务
- 前置服务
- 用户管理服务
3.2 C++
编程工具:visual studio2017
编写服务:
- 交易管理
- 交易实例
PC交易行情客户端
3.3 Java
编程工具:Android Studio
安卓端交易行情客户端