騰訊 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,也是本人的博客。