歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~
您可能已經熟悉Asterisk,一個廣泛部署的開源Telephony框架。如果你不太熟悉,你應該適當瞭解一下。這是一個非常酷的軟體。可以部署Asterisk的低負載例項來使用檔案系統來儲存電話註冊資料和語音郵件等內容。但是如果你想使用Asterisk做任何事情,或者如果你碰巧關心諸如容錯之類的事情,你可能會考慮將Asterisk指向資料庫。如果你碰巧有一個大的Asterisk叢集構建來處理重要的負載,你可以考慮指向一個可彈性擴充套件的資料庫的Asterisk。在這篇文章中,我將引導您通過NuoDB在一臺基於RPM的Linux機器上設定Asterisk的最小化安裝。Asterisk可以跨越多個資料中心進行遠端的安裝,但我會將這些問題留給更專業的人士。將這樣的安裝與NuoDB配對至少會讓資料庫痛苦不堪。讓我們開始吧。
安裝NuoDB
首先,下載並安裝NuoDB。
sudo rpm -i nuodb.rpm
複製程式碼
這將在該主機上啟動一個NuoDB代理。接下來,我們啟動一個事務引擎和儲存管理器:
java -jar /opt/nuodb/jar/nuodbmanager.jar --broker localhost --user domain --password bird --command "start process sm database asteriskCDR host localhost archive /tmp/ast-cdr initialize yes"
java -jar /opt/nuodb/jar/nuodbmanager.jar --broker localhost --user domain --password bird --command "start process te database asteriskCDR host localhost options `--dba-user asteriskUser --dba-password mySecret`"
複製程式碼
設定ODBC
儘管Asterisk支援直接與MySQL和PostgreSQL連線,但更多測試和強化的途徑是通過ODBC連線到資料庫。在這裡,我們安裝unixODBC,這是Unix類作業系統的ODBC驅動程式管理器。
as root:
yum install gcc gcc-c++ ncurses-devel unixODBC unixODBC-devel
複製程式碼
這建立了兩個檔案:/etc/odbc.ini和/etc/odbcinst.ini,我們現在編輯該檔案以指向我們的NuoDB例項。
/etc/odbc.ini
[NuoODBC]
Description = NuoDB ODBC3 Driver DSN
Driver = /opt/nuodb/lib64/libNuoODBC.so
Database = asteriskCDR
ServerName = localhost
User = asteriskUser
Password = mySecret
Schema = user
複製程式碼
我們可以讓/etc/odbcinst.ini為空,或者如果你想啟用(非常詳細!)日誌記錄:
/etc/odbcinst.ini
[ODBC]
TraceFile = /tmp/odbc.log
Trace = Yes
複製程式碼
這些絕不是唯一可以讓unixODBC啟動並執行的選項,但現在我們將為此進行推廣。讓我們確保到目前為止我們所做的工作:
isql NuoODBC asteriskUser mySecret -v -3
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
複製程式碼
安裝Asterisk
在撰寫本文時,Asterisk當前測試和穩定版本是11.4.0,但您可以在這裡檢視您選擇的版本。
as root:
yum install libtool-ltdl libtool-ltdl-devel sqlite-devel libxml2-devel openssl-devel libuuid-devel
cd /usr/src
wget http://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-11.4.0.tar.gz
wget http://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-11.4.0.tar.gz.sha1
sha1sum -c asterisk-11.4.0.tar.gz.sha1
tar zxvf asterisk-11.4.0.tar.gz
cd asterisk-11.4.0
./configure --libdir=/usr/lib64 --disable-xmldoc
make menuselect && make && make install && make samples && make config
複製程式碼
在make menuselect期間,請檢查呼叫詳細記錄(CDR)以確保cdr_odbc已啟用。按q離開使用menuselect。之後,你可以得到一杯咖啡,花幾分鐘時間檢視恐龍漫畫。如果您的系統上的編譯成功,並且make install階段可以識別您的發行版,那麼您應該能夠啟動Asterisk服務:
sudo service asterisk start
複製程式碼
連線Asterisk和NuoDB
Asterisk可以以各種方式使用資料庫。例如,我們將設定CDR日誌記錄。
/etc/asterisk/cdr_odbc.conf
[global]
dsn=NuoODBC
loguniqueid=no
dispositionstring=yes
table=cdr
usegmtime=yes
hrtime=yes
/etc/asterisk/res_odbc.conf
[NuoODBC]
enabled => yes
dsn => NuoODBC
username => asteriskUser
password => mySecret
pre-connect => yes
sanitysql => select 1 from dual
複製程式碼
我們強制重新載入配置檔案:
sudo service asterisk restart
複製程式碼
現在我們可以在Asterisk控制檯中用一個簡單的命令來檢查資料庫連線。
asterisk -rvvv
<snip>
p131*CLI> odbc show
ODBC DSN Settings
-----------------
Name: NuoODBC
DSN: NuoODBC
Last connection attempt: 2013-09-03 10:45:41
複製程式碼
正如您可能已經猜到的那樣,我們會將通話詳細記錄記錄到名為cdr的表格中。我們來建立表格:
/opt/nuodb/bin/nuosql asteriskCDR --user asteriskUser --password mySecret <<EOF
CREATE SEQUENCE "SEQ_cdr_cdrID" START WITH 1;
CREATE TABLE "cdr" ("cdrID" REAL GENERATED BY DEFAULT AS IDENTITY("SEQ_cdr_cdrID") NOT NULL, "calldate" TIMESTAMP NOT NULL DEFAULT `0000-00-00 00:00:00`, "clid" VARCHAR(80) NOT NULL DEFAULT ``, "src" VARCHAR(80) NOT NULL DEFAULT ``, "dst" VARCHAR(80) NOT NULL DEFAULT ``, "dcontext" VARCHAR(80) NOT NULL DEFAULT ``, "channel" VARCHAR(80) NOT NULL DEFAULT ``, "dstchannel" VARCHAR(80) NOT NULL DEFAULT ``, "lastapp" VARCHAR(80) NOT NULL DEFAULT ``, "lastdata" VARCHAR(80) NOT NULL DEFAULT ``, "duration" INTEGER NOT NULL DEFAULT `0`, "billsec" INTEGER NOT NULL DEFAULT `0`, "disposition" VARCHAR(45) NOT NULL DEFAULT ``, "amaflags" INTEGER NOT NULL DEFAULT `0`, "accountcode" VARCHAR(20) NOT NULL DEFAULT ``, PRIMARY KEY ("cdrID"));
CREATE INDEX "IDX_cdr_calldate" ON "cdr" ("calldate");
CREATE INDEX "IDX_cdr_dst" ON "cdr" ("dst");
複製程式碼
一個簡單的測試
為了表明這一切都有效,我們將在/etc/asterisk/extensions.conf底部新增幾行Dialplan,並用SIPp測試設定。
/etc/asterisk/extensions.conf
[sipp]
exten => 123,1,Answer
exten => 123,2,SetMusicOnHold(default)
exten => 123,3,WaitMusicOnHold(2)
exten => 123,4,Hangup
/etc/asterisk/sip.conf
[sipp]
type=friend
context=sipp
host=dynamic
user=sipp
canreinvite=no
disallow=all
allow=ulaw
複製程式碼
我們再次強制重新載入配置檔案,並安裝SIPp:
as root:
service asterisk restart
yum install sipp
複製程式碼
如果您的發行版的儲存庫不包含SIPp,解決辦法也很簡單。為了測試我們的安裝,我們執行以下命令。您可以通過檢視Asterisk控制檯中的日誌來驗證SIPp是否指向了您的Asterisk例項。
sipp -d 2000 -s 123 127.0.0.1 -l 10 -timeout 4s
複製程式碼
現在我們可以通過發出後看到一個非零數字來確認我們有通話記錄:
echo "select count(*) from cdr;" | /opt/nuodb/bin/nuosql asteriskCDR --user asteriskUser --password mySecret
複製程式碼
概括
由於Asterisk是一個可以執行各種電話應用程式的框架,因此它與資料庫之間有任意多個可能的連線點。我們已經測試了CDR功能以及其他一些路徑,但我們很樂意提供您的反饋。請讓我們知道您使用Asterisk和NuoDB的經歷!
問答
相關閱讀
此文已由作者授權騰訊雲+社群釋出,原文連結:https://cloud.tencent.com/developer/article/1144402?fromSource=waitui
歡迎大家前往騰訊雲+社群或關注雲加社群微信公眾號(QcloudCommunity),第一時間獲取更多海量技術實踐乾貨哦~