騰訊 Tars 基礎框架手動搭建——填掉官方 Guide 的坑

背景

Tars 簡介

騰訊 Tars 是騰訊內部使用的 TAF(Tencent Application Framework)的對外開源版,去掉了許多冗雜多餘的部分。該框架集開發、運維、微服務、RPC 等爲一體。對程序員而言,這就是一個可以快速搭建整個微服務體系的開發框架。這個框架支持基於 C++Node.jsPHPJava 等語言開發,最新版本已經支持後臺開發語言新貴——Gonode

系列文章mysql

安裝任務

Tars 實際的應用場景是多機器、多節點部署的,不過從實驗驗證的角度,我作的只是在單一一臺機器上,實現 Tars 管理平臺部署,以及任務的發佈。因爲 Tars 版本一直在迭代,爲防止文章過期誤導後來者,本文以 f3ef251013 節點爲準,請讀者 follow 最新的 Tars 版原本。官方安裝文檔在這裏linux

然而,正如不少新的開源項目同樣,代碼很豐滿,文檔很骨感。一步一步跟着官方文檔走的話,是有可能沒法一次走通的……本文跟隨文檔的安裝脈絡,進行了從新梳理,爲讀者呈現一個儘可能不挖坑的搭建過程。c++

請注意,「Tars」 這個概念,除了其基礎框架以外,還包含開發工具(如 TarsCpp、TarsJava 等等)、協議等等許多內容。不過本文主要講述 Tars 基礎框架,所以下文所說起的 「基礎框架」,如無特別說明,都專指 「Tars 基礎框架」。git

本文解決的問題

前文說起,直接 follow 官方文檔,是沒法完成服務部署的。由於過程當中遇到不少坑,每個坑都致使基礎框架沒法搭建,或者是搭建後沒法發佈服務。筆者根據文檔搭建過程當中遇到的坑有:程序員

  • 部分操做須要 sudo——文檔中有些舒適地提醒了 sudo,可是另一些未提醒
  • 數據庫採用 MySQL 5.6 版,但部分說明不適用於 MariaDB
  • 說明文字與配圖不徹底一致
  • 不一樣代碼處的數據庫用戶名和密碼不統一
  • 啓動所需的數據庫表信息有缺失

環境準備

系統準備

部署實驗須要準備至少一臺 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 問題

官方文檔使用的 MySQL 版本是 5.6。可是這有兩個問題:

  1. Oracle 維護的開源 MySQL 已經發展到 5.7 和 8.0 版了,Tars 是否向後兼容?
  2. 最新的 CentOS 和 Ubuntu 的軟件包中已移除 MySQL,以 MariaDB 取代,Tars 是否支持?

本人的答案是:

  1. 網上的資料看,基礎框架支持 5.7,但須要修改 cmake 的選項,麻煩點;此外,在交流羣中也有反饋 5.7 版有問題,但沒有深刻了解。
  2. 支持,詳見後文操做。

筆者的方案是:

  • 使用 mariadb 做爲數據庫
  • 使用 libmysqlclient.a 做爲 TarsCpp 開發環境建立時連接的庫(基礎框架編譯時強制連接靜態庫)
  • 使用 libmariadb.so 做爲實際應用開發時用的庫

備份

安裝以前,強烈建議不熟悉 Tars 基礎框架的讀者先給本身的機器作下備份,好比打個快照或者作個鏡像之類的,這樣若是後面部署失敗了,也便於回滾系統,而不是一個一個抓蟲。


安裝支持軟件

筆者所使用的用戶名是 ubuntu,後文會有一些 shell 命令中採用了這個用戶名,請讀者留意替換成爲本身的用戶名。

MySQL

安裝路徑準備

默認下載的 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/

Node.js

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 基礎框架

首先,要下載 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 使用用戶名 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 地址,讀者實際部署時請注意修改。

這些命令也給咱們一個啓發:數據庫地址容許採用域名。

TIPS-1

若是讀者不使用 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 語句修改了的文件。讀者能夠在這些文件中找到用戶名和密碼配置項進行修改後,再執行。

TIPS-2

MariaDB server 安裝以後默認監聽 127.0.0.1 地址,但官方文檔明確說明 DB 的 IP 地址不能使用 127.0.0.1。讀者須要修改 MariaDB 的配置文件中監聽地址的選項,不然後續 Tars 基礎框架啓動後,會遇到沒有權限訪問數據庫的錯誤。


部署 Tars 基礎框架

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.shtarsnode_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 命令修改的地址,對應的是:

  1. 本機地址,不能寫 127.0.0.1
  2. 前述數據庫的地址;
  3. tarsregistry 的 部署地址,能夠不是本機;
  4. web.tars.comrsync 服務和 web 管理平臺的部署地址。

修改了 IP 地址以後,還須要檢查 tars 訪問數據庫的用戶名和密碼。這裏咱們最好是手動 vim 去改,由於幾個文件的書寫格式不徹底一致:

$ cd /usr/local/app/tars
$ grep dbpass -rl ./*

檢查搜索出來的 conf 文件中的 dbuserdbpass 字段。

最後就是啓動核心框架服務和 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 管理平臺

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 框架基礎服務

檢查覈心服務狀態

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
  • SET:現階段不用填,這是 tars 的進階功能
  • OBJ:填 「StatObj
  • OBJ 綁定地址端口:能夠手動調整,也能夠點 「獲取端口」 按鈕自動分配
  • 端口類型:TCP
  • 協議:TARS

其餘默認便可。填好後,點 「肯定」 便可部署。注意,此時的 「部署」,只是在 tars 內註冊了一個服務(佔了個坑),但這個服務尚未上線提供可用的功能。

發佈服務

部署了服務後,須要刷新頁面,這樣就能夠看到左邊 tars 的服務列表多了一項:「tarsstat

如今,咱們須要真正地發佈這個服務了。

點擊 「tarsstat」 選項卡,能夠看到上面有六個功能選項。點擊 「發佈管理」,視圖以下:

勾選節點,而後點擊 「發佈選中節點」,界面以下:

這個時候點 「發佈版本」 的下拉菜單,是沒有內容的。咱們須要點 「上傳發布包」,在新打開的窗口,選擇上一步 「建立服務」 時打包的 tarsstat.tgz 文件上傳便可。上傳成功後,咱們再在 「發佈版本」 下拉菜單中選擇剛剛上傳的包,而後點 「發佈」。稍等一會後,咱們只要看到 tarsstat 的狀態變成以下,就是發佈成功了:

其餘各個服務的特殊參數

除了不須要額外配置數據庫以外,接下來的五個服務的配置發佈流程基本一致。但也有如下一些不一樣,讀者在發佈剩餘服務的時候請注意修改:

  • 各服務的名稱不一樣,請相應地修改;
  • 各服務的服務類型均爲 「tars_cpp」,可是模板不一樣——每個服務均有其對應的專用模板,好比 tarsconfig 對應 tars.tarsconfig 模板;
  • tarsquerystattarsqueryproperty 的 「協議」 應選 「非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,也是本人的博客。

相關文章
相關標籤/搜索