腾讯 Tars 是腾讯内部使用的 TAF(Tencent Application Framework)的对外开源版,去掉了许多冗杂多余的部分。该框架集开发、运维、微服务、RPC 等为一体。对程序员而言,这就是一个可以快速搭建整个微服务体系的开发框架。这个框架支持基于 C++、Node.js、PHP、Java 等语言开发,最新版本已经支持后台开发语言新贵——Go。node
系列文章mysql
Tars 实际的应用场景是多机器、多节点部署的,不过从实验验证的角度,我作的只是在单一一台机器上,实现 Tars 管理平台部署,以及任务的发布。因为 Tars 版本一直在迭代,为防止文章过期误导后来者,本文以 f3ef251013 节点为准,请读者 follow 最新的 Tars 版原本。官方安装文档在这里。linux
然而,正如不少新的开源项目同样,代码很丰满,文档很骨感。一步一步跟着官方文档走的话,是有可能没法一次走通的……本文跟随文档的安装脉络,进行了从新梳理,为读者呈现一个尽可能不挖坑的搭建过程。c++
请注意,“Tars” 这个概念,除了其基础框架以外,还包含开发工具(如 TarsCpp、TarsJava 等等)、协议等等许多内容。不过本文主要讲述 Tars 基础框架,所以下文所说起的 “基础框架”,如无特别说明,都专指 “Tars 基础框架”。git
前文说起,直接 follow 官方文档,是没法完成服务部署的。由于过程当中遇到不少坑,每个坑都致使基础框架没法搭建,或者是搭建后没法发布服务。笔者根据文档搭建过程当中遇到的坑有:程序员
sudo
——文档中有些舒适地提醒了 sudo
,可是另一些未提醒部署实验须要准备至少一台 Linux 机器。这能够是一台本地的实体机或虚拟机,也能够是一台云主机。因为部署过程当中,须要编译 Tars 框架以及 MySQL 代码(若是系统里没装 Oracle 的 MySQL 的话),强烈建议系统至少要求有 4GB 的内存!系统建议采用 CentOS 或 Ubuntu。本文采用 Ubuntu 来安装,但 CentOS 差异不大,读者能够参考执行。github
此外,笔者不采用 root 帐户,只有在须要 root 权限的时候才使用 sudo
操做。web
像笔者这样只有 1 核 1GB 云主机的,还须要在本地额外准备一台 Linux 虚拟机用于编译,再将编译出来的目标文件转移到云主机上。sql
使用 Ubuntu,基础框架和 C++ 开发环境须要如下开发组件:docker
gcc g++(CentOS 则是 gcc-c++) flex bison make cmake perl gcc zlibc gzip git libncurses5-dev protobuf-c-compiler protobuf-compiler libprotobuf-dev libprotobuf-c-dev libprotoc-dev libmariadb-client-lgpl-dev mariadb-client mariadb-server
此外,还须要手动安装的软件或库有:
mysql-server node.js(包括 npm) TarsCloud/TarsFramework TarsCloud/TarsWeb TarsClous/TarsCpp
这些手动安装的软件会在后问说明。
官方文档使用的 MySQL 版本是 5.6。可是这有两个问题:
本人的答案是:
笔者的方案是:
安装以前,强烈建议不熟悉 Tars 基础框架的读者先给本身的机器作下备份,好比打个快照或者作个镜像之类的,这样若是后面部署失败了,也便于回滚系统,而不是一个一个抓虫。
笔者所使用的用户名是 ubuntu
,后文会有一些 shell 命令中采用了这个用户名,请读者留意替换成为本身的用户名。
默认下载的 Tars 基础框架须要连接 MySQL 的静态库 libmysqlclient.a
,此外对库所在的位置也写死在了 Makefile 中。所以咱们须要为 Tars 基础框架准备环境。
首先建立供基础框架连接的路径:
$ sudo mkdir -p /usr/local/mysql $ sudo chown ubuntu:ubuntu /usr/local/mysql
而后须要寻找一下 mariadb
的动态库位置和头文件位置:
$ sudo find / -name 'mariadb_com.h' 2>/dev/null $ sudo find / -name 'libmariadbclient*' 2>/dev/null
笔者的环境中,二者分别在 /usr/include/mariadb
和 /usr/lib/x86_64-linux-gnu
下,那么咱们就建立两个软连接:
$ ln -s /usr/include/mariadb /usr/local/mysql/include $ ln -s /usr/lib/x86_64-linux-gnu /usr/local/mysql/lib
再建立一个目录给 MySQL 实际安装用:
$ mkdir /home/ubuntu/mysql-5.6 # /home/ubuntu 是笔者系统的家目录,读者请注意替换。如下同理。
直接从 GitHub 上 clone MySQL 的工程代码后,选择合适的版本:
$ mkdir -p ~/github.com/mysql/mysql-server $ cd ~/github.com/mysql/mysql-server $ git clone https://github.com/mysql/mysql-server.git ./ $ git checkout -b 5.6 origin/5.6 # 切换到 5.6 版
配置、编译、安装:
$ cmake . -DCMAKE_INSTALL_PREFIX=/home/ubuntu/mysql-5.6 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_USER=mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/home/ubuntu/others/boost $ make && make install
经过以后,咱们还须要将 mysql 的静态库复制(或者连接)到为 Tars 基础框架准备的目录下:
$ ln -s /home/ubuntu/mysql-5.6/libmysqlclient.a /usr/local/mysql/lib/
Tars 管理平台是使用 node.js 开发的,所以须要安装 nvm
。对不熟悉 node 的读者,这里也简单列下安装方式(不建议使用 root 帐户操做):
$ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash $ source ~/.bashrc $ nvm install v8.11.3 $ npm install -g pm2 --registry=https://registry.npm.taobao.org
首先,要下载 Tars 的基础框架代码:
$ mkdir -p /homes/ubuntu/github.com/TarsCloud/TarsFramework $ cd /homes/ubuntu/github.com/TarsCloud/TarsFramework $ git clone https://github.com/TarsCloud/TarsFramework.git ./
编译之:
$ cd build $ chmod +x build.sh $ ./build.sh prepare $ ./build.sh all
若是编译失败(通常是缺某些库或组件),建议在解决问题后,清掉 TarsFramework 下的全部文件,从新 clone 后再编译。
安装的过程复杂一点,安装路径是固定的(虽然能够在工程文件中调整,为统一块儿见,不建议修改):
$ sudo mkdir -p /usr/local/tars $ sudo chown ubuntu:ubuntu /usr/local/tars $ cd /homes/ubuntu/github.com/TarsCloud/TarsFramework/build $ ./build.sh install
Tars 使用用户名 tars
、密码 tars2015
的组合,操做 MySQL 数据库。高级玩法天然是修改 Tars 中的用户名/密码组合。这里为了简单起见,干脆就直接采用默认的就行了。不事后文会介绍如何使用自定义的用户名密码。
笔者作验证时的 MySQL 与 Tars 部署在同一台机器上,IP 地址是 172.19.16.13
。实际部署中,读者请注意换成实际地址。
添加相关帐户的命令以下:
$ mysql -u root -p
进入 mysql 命令行后:
MariaDB [(none)]> grant all privileges on *.* to tars@localhost identified by 'tars2015'; MariaDB [(none)]> flush privileges; MariaDB [(none)]> exit;
官方文档说的配置备份什么的,就不用关心了。使用 Tars 的系统基本是部署在云上的,大都会用云服务商提供的自带主备的数据库服务(推荐腾讯云 TDSQL 哦,金融级 DB,可是价格和普通 DB 一个等级)。
接下来,咱们经过执行 Tars 基础框架的 sql 脚原本建立相应的数据库结构:
$ cd /homes/ubuntu/github.com/TarsCloud/TarsFramework/sql/ $ sed -i "s/192.168.2.131/172.19.16.13/g" `grep 192.168.2.131 -rl ./*` $ sed -i "s/db.tars.com/172.19.16.13/g" `grep db.tars.com -rl ./*` $ sed -i "s/10.120.129.226/172.19.16.13/g" `grep 10.120.129.226 -rl ./*` $ chmod +x exec-sql.sh $ ./exec-sql.sh
其中,172.19.16.13
是笔者的 DB 的 IP 地址,读者实际部署时请注意修改。
这些命令也给咱们一个启发:数据库地址容许采用域名。
若是读者不使用 tars/tars2015
的用户名/密码组合来操做数据库,那么能够自行修改上述的 sql 脚本:
$ cd /homes/ubuntu/github.com/TarsCloud/TarsFramework/sql/ $ git status . On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: db_tars.sql modified: tarsconfig.sql modified: tarslog.sql modified: tarsnotify.sql modified: tarspatch.sql modified: tarsproperty.sql modified: tarsqueryproperty.sql modified: tarsquerystat.sql modified: tarsstat.sql
能够看到被 sed
语句修改了的文件。读者能够在这些文件中找到用户名和密码配置项进行修改后,再执行。
MariaDB server 安装以后默认监听 127.0.0.1
地址,但官方文档明确说明 DB 的 IP 地址不能使用 127.0.0.1
。读者须要修改 MariaDB 的配置文件中监听地址的选项,不然后续 Tars 基础框架启动后,会遇到没有权限访问数据库的错误。
Tars 核心基础框架指的是 tarsAdminRegistry, tarsregistry, tarsnode, tarsconfig, tarspatch
五个。前面咱们其实已经编译好了,咱们能够先把这些服务打包:
$ cd /homes/ubuntu/github.com/TarsCloud/TarsFramework/build $ make framework-tar
这会在 build
目录下生成 framework.tgz
文件。接下来咱们须要作一些操做:
$ sudo mkdir -p /data/log/tars $ sudo mkdir -p /home/tarsproto $ sudo mkdir -p /usr/local/app/tars $ sudo chown -R ubuntu:ubuntu /usr/local/app /data/log/tars /home/tarsproto $ mv /homes/ubuntu/github.com/TarsCloud/TarsFramework/build/framework.tgz /usr/local/app/tars $ cd /usr/local/app/tars $ tar zxvf framework.tgz
这会在 /usr/local/app/tars/
下面生成前述几个核心基础框架组件对应的文件夹。此外,还有 tars_install.sh
和 tarsnode_install.sh
两个脚本。不过咱们得先配置一下——
五个核心基础框架组件的目录下均有 conf
文件夹,能够看到各个组件的配置文件,好比 tars.tarsregistry.config.conf
。对操做已经很熟悉了的读者能够手动修改这些配置。不过也能够简单点地进行如下修改:
$ cd /usr/local/app/tars $ sed -i "s/192.168.2.131/172.19.16.13/g" `grep 192.168.2.131 -rl ./*` $ sed -i "s/db.tars.com/172.19.16.13/g" `grep db.tars.com -rl ./*` $ sed -i "s/registry.tars.com/172.19.16.13/g" `grep registry.tars.com -rl ./*` $ sed -i "s/web.tars.com/172.19.16.13/g" `grep web.tars.com -rl ./*`
四个 sed
命令修改的地址,对应的是:
127.0.0.1
;tarsregistry
的 部署地址,能够不是本机;web.tars.com
是 rsync
服务和 web 管理平台的部署地址。修改了 IP 地址以后,还须要检查 tars 访问数据库的用户名和密码。这里咱们最好是手动 vim 去改,由于几个文件的书写格式不彻底一致:
$ cd /usr/local/app/tars $ grep dbpass -rl ./*
检查搜索出来的 conf 文件中的 dbuser
和 dbpass
字段。
最后就是启动核心框架服务和 rsync(好艰难):
$ cd /usr/local/app/tars $ chmod +x tars_install.sh $ ./tars_install.sh $ sudo ./tarspatch/util/init.sh $ chmod +x tarsnode_install.sh $ ./tarsnode_install.sh
而后咱们能够在 croncab
中配置核心基础框架的监控项:
* * * * * /usr/local/app/tars/tarsnode/util/monitor.sh
这样一来,五个框架核心服务就启动起来了。
Tars web 管理系统在另外一个 Git repo 中:
$ mkdir -p /homes/ubuntu/github.com/TarsCloud/TarsWeb $ cd /homes/ubuntu/github.com/TarsCloud/TarsWeb $ git clone https://github.com/TarsCloud/TarsWeb.git ./ $ sed -i 's/db.tars.com/172.19.16.13/g' config/webConf.js $ sed -i 's/registry.tars.com/172.19.16.13/g' config/tars.conf
其中 172.19.16.13
是笔者机器的 IP,读者请注意
Tars web 是用 node.js 编写的,不须要编译。管理平台默认监听在 3000 端口上,可在 config/webConf.js
中修改 port
参数的值。
配置了端口以后,就能够启动 Tars web 管理平台了:
$ cd /homes/ubuntu/github.com/TarsCloud/TarsWeb $ npm install --registry=https://registry.npm.taobao.org $ npm run prd
能够查看 TarsWeb
目录下的 package.json
文件能够看到更多的信息——毕竟并非每一个人都懂得 node.js 开发。
Tars web 管理平台启动后,若是按照默认设置的话,平台会在 3000 端口创建 http 服务。使用浏览器访问,能够看到以下界面:
这三个组件,就是前文所述的 “tars 框架核心服务” ,若是按照前述逻辑部署后,在 web 页面就能够看到的。能够依次点开这三个服务,确保服务的状态都以下图所示:
若是服务的状态不对,那么多是前面哪一步操做不恰当。能够查找 log 来定位(log 文件的路径参见后文)。
剩下的几个基础框架服务就须要进行手动部署。但部署的方法其实仍是蛮简单的,这里挑一个出来细讲,其余的相似。
首先,咱们须要把其余的基础框架打包出来:
$ cd /homes/ubuntu/github.com/TarsCloud/TarsFramework/build $ make tarsstat-tar $ make tarsnotify-tar $ make tarsproperty-tar $ make tarslog-tar $ make tarsquerystat-tar $ make tarsqueryproperty-tar
这样会在 /homes/ubuntu/github.com/TarsCloud/TarsFramework/build
目录下分别生成上述六个组件的 tgz
文件。
接下来咱们以 tarsstat
为例说明部署方法:
点击 web 主页的 “运维管理” 选项卡,进入服务界面:
各参数按照以下填写:
tars
”tarsstat
”tars_cpp
”tars.tarsstat
”172.19.16.13
StatObj
”其余默认便可。填好后,点 “肯定” 便可部署。注意,此时的 “部署”,只是在 tars 内注册了一个服务(占了个坑),但这个服务尚未上线提供可用的功能。
部署了服务后,须要刷新页面,这样就能够看到左边 tars 的服务列表多了一项:“tarsstat
”
如今,咱们须要真正地发布这个服务了。
点击 “tarsstat
” 选项卡,能够看到上面有六个功能选项。点击 “发布管理”,视图以下:
勾选节点,而后点击 “发布选中节点”,界面以下:
这个时候点 “发布版本” 的下拉菜单,是没有内容的。咱们须要点 “上传发布包”,在新打开的窗口,选择上一步 “建立服务” 时打包的 tarsstat.tgz
文件上传便可。上传成功后,咱们再在 “发布版本” 下拉菜单中选择刚刚上传的包,而后点 “发布”。稍等一会后,咱们只要看到 tarsstat
的状态变成以下,就是发布成功了:
除了不须要额外配置数据库以外,接下来的五个服务的配置发布流程基本一致。但也有如下一些不一样,读者在发布剩余服务的时候请注意修改:
tars_cpp
”,可是模板不一样——每个服务均有其对应的专用模板,好比 tarsconfig
对应 tars.tarsconfig
模板;tarsquerystat
和 tarsqueryproperty
的 “协议” 应选 “非TARS”,其余服务为 “TARS”;各服务对应的 Obj 名称以下:
tarsnotify
: NotifyObj
tarsproperty
: PropertyObj
tarslog
: LogObj
tarsquerystat
: NoTarsObj
(非 TARS 协议)tarsqueryproperty
: NoTarsObj
(非 TARS 协议)此外,如下这一步是 tarsstat
特有的步骤:在发布服务以前,须要进入数据库进行如下操做,防止 tarsstat
启动失败:
MariaDB [(none)]> use db_tars; MariaDB [db_tars]> CREATE TABLE `t_server_notifys` ( `id` int(11) NOT NULL AUTO_INCREMENT, `application` varchar(128) DEFAULT '', `server_name` varchar(128) DEFAULT NULL, `container_name` varchar(128) DEFAULT '' , `node_name` varchar(128) NOT NULL DEFAULT '', `set_name` varchar(16) DEFAULT NULL, `set_area` varchar(16) DEFAULT NULL, `set_group` varchar(16) DEFAULT NULL, `server_id` varchar(100) DEFAULT NULL, `thread_id` varchar(20) DEFAULT NULL, `command` varchar(50) DEFAULT NULL, `result` text, `notifytime` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `index_name` (`server_name`), KEY `servernoticetime_i_1` (`notifytime`), KEY `indx_1_server_id` (`server_id`), KEY `query_index` (`application`,`server_name`,`node_name`,`set_name`,`set_area`,`set_group`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; MariaDB [db_tars]> exit;
全部服务均发布完成并状态正确以后,Tars 基础框架就部署完成啦,恭喜你!
若是部署 Tars 框架服务过程当中遇到什么错误,能够查阅的 log 在如下路径:
/usr/local/app/TarsWeb/log
/usr/local/app/tars/app_log/tars
Tars 其实还提供了一套比较简易的快速部署脚本。那个脚本我没有尝试过,但听说也是有一些坑……这里我推荐 maq128 同窗 的文章:tars小白安装必成手册,分别讲述了快速部署、手工部署、docker 部署的内容。另外,若是有问题,读者也能够加入 Tars 官方交流群,不保证全部问题都可以精准回答,可是群里很多大神仍是给了我很多启发。群号参见 Tars 官方文档。
按照官方的建议,Tars 的全部基础服务都须要至少进行灾备部署,可是部署方式如何实现,并无明确的说明或者建议。这是笔者后续准备实验的。
本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
本文地址:http://www.javashuo.com/article/p-mdmvsqin-gg.html。
原文发布于:https://cloud.tencent.com/developer/article/1372998,也是本人的博客。