CentOS7下源碼安裝CTDB並嘗試使用

CTDB概述
CTDB(Cluster Trivial Database)是一種輕量級的集羣數據庫實現,是集羣Samba的集羣數據庫組件,主要用於處理Samba的跨節點消息以及在所有集羣節點上實現分佈式的TDB數據庫。
CTDB是一個集羣TDB數據庫,可以被Samba或者其他的應用使用來存儲數據。如果一個應用是使用TDB來暫時存放數據,那麼這個應用可以很輕鬆的使用CTDB擴展爲集羣模式。CTDB提供與TDB相同的函數接口,並且是構建在多臺物理機器上的集羣。
CTDB的主要功能:
1) 提供TDB數據庫的集羣版本,並在節點故障時自動重建/恢復數據庫;
2) 監視集羣中的節點和每個節點上運行的服務;
3) 管理用於向客戶端提供服務的公共IP地址池。或者,CTDB可與LVS一起使用;

現今,CTDB不僅支持管理Samba,而且也支持管理NFS、HTTPD、VSFTPD、ISCSI、WINBIND等應用。

特性:

  • CTDB提供一個橫跨多個節點的並且數據一致、鎖一致的TDB數據庫;
  • CTDB非常快速;
  • 對於節點故障,CTDB將自動恢復和修復其所管理的所有TDB數據庫;
  • CTDB是Samba3/4的一個核心組件;
  • CTDB提供高可用特性,例如節點監控、節點切換、IP切換;
  • CTDB爲其多個節點上的應用提供可靠的傳輸通道;
  • CTDB提供可熱拔插的後端傳輸通道,目前實現了TCP和IB;
  • CTDB可以提供爲應用指定特定的管理腳本,使得應用能夠實現高可用。

CTDB 實現共享層高可用

通常的設計是提供全局命名空間的節點不直接對外提供共享,或者更確切地說不使用實際 IP 對外提供共享。通常幾個節點對外提供一組虛擬的 IP ,而虛擬的 IP 與這些實際的節點 IP 有着相應的映射關係。與用戶更緊密的虛擬 IP ,用戶連接共享時是通過連接虛擬 IP ,他們並不關心實際節點是哪一個。
當某個實際節點宕機之後,對應的虛擬 IP 會轉移到其他的實際節點上去,這一過程對於用戶來說是透明的,不會影響共享的使用。

而 CTDB 正是承擔了這一項工作。

對於個人來說。。沒有那麼深的理解,學習CTDB的第一個小目標就是先運行起來,然後測試對外提供一個虛擬IP,通過虛擬IP來訪問共享。

首先是一個錯誤。通過yum安裝的ctdb無法啓動。。。有誰知道怎麼解決指教一下吧。

查看可安裝版本

yum list samba
yum list ctdb

只有4.9版本
只有4.9版本,說明一下 我的CentOS7鏡像應該是目前CentOS最後一版的鏡像 CentOS71908。。。
安裝

yum -y install samba
yum -y install ctdb

安裝完成進入 /etc/ctdb 目錄創建一個 nodes 文件 內容就寫各個ctdb節點的IP,最後一個IP後面要空一行。否則最後一個IP失效。

192.168.199.81
192.168.199.82

啓動ctdb服務 這時候既未指定虛擬IP 也沒有指定共享鎖,只是測試一下服務是否可以啓動。。。

systemctl start ctdb

啓動失敗
查看日誌文件 默認位置 /var/log/log.ctdb
日誌文件
這也太籠統了 Faild to run init event 無法執行初始化事件。。。
然後學習他人博客 在所有節點設置配置文件 /etc/ctdb/ctdb.conf 的 在/etc/ctdb目錄下 創建public_addresses文件,然後重新啓動,還是報錯。實在是想不明白爲什麼。。。
另外,通過YUM安裝的ctdb版本是4.9 ,ctdb配置文件的設置風格更像Samba。而不是以前的風格了。所以參考前輩博客時參數設置需要配合官方文檔。但是該失敗 CTDB服務還是運行不起來。。。
https://wiki.samba.org/index.php/Basic_CTDB_configuration

通過源碼安裝CTDB

CTDB在不知道哪個版本起完全支持Samba,至多4.2之後,Samba的源碼包中會附帶安裝ctdb。安裝過程就和源碼安裝Samba一致,只不過在構建時./configure加上參數 --with-cluster-support --with-shared-modules=idmap_rid,idmap_tdb2,idmap_ad
This enables clustering support in Samba and includes CTDB in the build(官方原話。百度翻譯就是這允許Samba中的集羣支持,並在構建中包含cdb。)

安裝Samba步驟https://wiki.samba.org/index.php/Build_Samba_from_Source

  1. 安裝依賴包 不同的linux系統需要的依賴包可能不同。
  2. 下載Samba源碼壓縮文件到本地
  3. 解壓壓縮文件並進入解壓後目錄
  4. 構建 ./configure --with-cluster-support --with-shared-modules=idmap_rid,idmap_tdb2,idmap_ad
  5. 安裝 make && make install
  6. 配置動態鏈接庫
  7. 將相關命令添加到環境變量

具體一點 本人下載的是Samba4.4.3的源碼包Samba的各個版本安裝包
安裝依賴環境 如果使用VMware等虛擬機管理 。不要安裝完依賴環境後克隆。。。可能導致 構建失敗

yum install attr bind-utils docbook-style-xsl gcc gdb krb5-workstation \
       libsemanage-python libxslt perl perl-ExtUtils-MakeMaker \
       perl-Parse-Yapp perl-Test-Base pkgconfig policycoreutils-python \
       python2-crypto gnutls-devel libattr-devel keyutils-libs-devel \
       libacl-devel libaio-devel libblkid-devel libxml2-devel openldap-devel \
       pam-devel popt-devel python-devel readline-devel zlib-devel systemd-devel \
       lmdb-devel jansson-devel gpgme-devel pygpgme libarchive-devel -y

下載壓縮包到本地 略過
解壓並進入解壓目錄

tar -zxvf samba-4.4.3.tar.gz 
cd samba-4.4.3

構建 這一步不設置其它參數將會把軟件全部都安裝在 /usr/local/samba 其它參數設置參考官方文檔。

./configure --with-cluster-support --with-shared-modules=idmap_rid,idmap_tdb2,idmap_ad

構建成功
安裝

make &&make install

安裝成功
安裝完成後,我們需要配置動態鏈接庫路徑,因爲運行samba的進行smbd和nmbd需要到目錄/usr/local/samba/lib下的動態鏈接庫文件。但是該目錄不是系統默認的動態鏈接庫文件搜索路徑,於是我們需要將該目錄添加到文件ld.so.conf中。執行下面的命令

vi /etc/ld.so.conf

打開ld.so.conf文件,並在該文件中加入下面這一行內容。

/usr/local/samba/lib

然後執行命令來更新動態鏈接庫緩衝。

ldconfig

將命令等添加到環境變量,方式有多種。如編輯 當前用戶家目錄的 .bashrc 文件,最後一行添加

export PATH=/usr/local/samba/bin/:/usr/local/samba/sbin/:$PATH
vi ~/.bashrc

添加完成後生效 source ~/.bashrc
這樣 通過源碼安裝Samba就算完成了,ctdb的相關進程文件和命令也隨着Samba一起安裝了。。。

沒有按照官方所說將ctdb加入到系統服務,暫時先以進程的方式運行 測試

說明一下。源碼安裝4.4.3版本,如果步驟和我的一樣,那麼ctdb的配置目錄應該是

/usr/local/samba/etc/ctdb/

默認是沒有配置文件的。而Samba4.8版本之前的配置文件名是 ctdbd.conf


一,安裝官方基本設置測試ctdb的啓動。

設置一個節點集羣,每個節點都在運行CTDB。集羣中每個節點都運行一個CTDB的守護進程ctdbd

集羣將沒有用處。特別是:

Samba將不由cdb管理。
將不配置cdb公共ip地址。
將不配置cdb恢復鎖。
但是,所有有用的配置都是默認配置的擴展,因此首先測試這一點非常重要。

1 準備三個安裝有ctdb的主機 節點 IP分別是
192.168.199.41
192.168.199.42
192.168.199.43

節點之間可以互相ping 通

2 在三個節點的 /usr/local/samba/etc/ctdb/ 目錄新增文件 nodes 文件內容是 三個節點的ip

vim /usr/local/samba/etc/ctdb/nodes

注 最後一個節點後要Enter(官方建議,否則無法初始化)

192.168.199.41
192.168.199.42
192.168.199.43

3 依次啓動三個節點中的ctdbd 守護線程。

可以先查看一下未啓動線程時 狀態
無法連接client socket
啓動守護線程 爲什麼是這樣啓動的,下文有解釋,也不一定正確。。。歡迎指教(CTDB看了好多博客,都說啓動是否簡單。。。可能確實簡單吧。。。但是我就是沒通過服務啓動成功過)

 ctdbd_wrapper /var/run/ctdb/ctdbd.pid start

未設置恢復鎖
過一會再查看 當前節點的狀態。需要時間來初始化

ctdb status

ctdb status
另外兩個節點還沒有啓動守護進程。所以狀態不是 OK。。。先查看一下守護進程

ps -ef | grep ctdb

守護線程
當其他兩個節點也啓動了守護進程後,再從某一節點查看 ctdb status
Status OK
可以看到三個節點的狀態都是OK的。。。

通過 守護進程(ctdbd) 爲ctdb提供的各種操作訪問。因此關閉該線程的方法有兩種
推薦使用第一種

 ctdbd_wrapper /var/run/ctdb/ctdbd.pid stop

或者 直接根據進程 PID號殺死進程 1124 是進程號,基本每次都不相同。

kill -9 1124

由於一切都是默認配置。所以日誌文件是 /usr/loacl/samba/var/log/log.ctdb 可以查看一下 挺長的

cat /usr/local/samba/var/log/log.ctdb 

ctdb 日誌文件

嘗試將進程添加進服務 使用systemctl 管理。(這個我失敗了,服務怎麼樣都啓動不了4.4.3)

首先參考他人博客。如何設置自定義服務。CentOS7,應該是systemctl 基本取代了 service 。可以看看這一篇(網上大神好多)
https://www.cnblogs.com/dsc65749924/p/5841731.html
基本瞭解概念後。。。根據官方的文檔 This will depend on how CTDB was installed. If installing from source, consider installing the provided init script (ctdb/config/ctdb.init) or system service file (ctdb/config/ctdb.system) in the appropriate place. A binary package should already contain the correct method of starting CTDB.

在解壓縮的文件夾裏 可以找到兩個文件 samba-4.4.3/ctdb/config/ctdb.init samba-4.4.3/ctdb/config/ctdb.service

網上也可以找到加入到系統服務的方法。。。
一種是編寫可執行shell腳本。格式類似於samba-4.4.3/ctdb/config/ctdb.init 將其放入到 /etc/init.d/ 目錄然後重新加載服務 systemctl daemon-reload 然後就可以 使用 systemctl 控制了
另一種 是 編寫格式類似於 samba-4.4.3/ctdb/config/ctdb.service 的文件,將其放入 /usr/lib/systemd/system/ 目錄,然後重新加載服務systemctl daemon-reload 就可以 使用 systemctl 控制了

兩者任選一種,不過CentOS7 版本 基本使用第二種 方式。。。可以查看ctdb.service 文件內容

[Unit]
Description=CTDB
After=network.target

[Service]
Type=forking
LimitCORE=infinity
PIDFile=/run/ctdb/ctdbd.pid
ExecStart=/usr/sbin/ctdbd_wrapper /run/ctdb/ctdbd.pid start
ExecStop=/usr/sbin/ctdbd_wrapper /run/ctdb/ctdbd.pid stop
KillMode=control-group
Restart=no

[Install]
WantedBy=multi-user.target

文 件分爲三個小節。第一個是[Unit]部分,這裏僅僅有一個描述信息。after 應該標明該服務啓動應該在上述服務啓動之後。第二部分是 Service 定義ExecStart 定義啓動服務的具體命令行語法。ExecStop就是定義停止服務的具體命令語法。第三部分是[Install],WangtedBy 表明這個服務是在多用戶模式下所需要的。
修改一下PIDFile和ExexStart 和ExecStop 的具體命令。

PIDFile=/var/run/ctdb/ctdbd.pid
ExecStart=/usr/local/samba/sbin/ctdbd_wrapper /var/run/ctdb/ctdbd.pid start
ExecStop=/user/local/samba/usr/sbin/ctdbd_wrapper /var/run/ctdb/ctdbd.pid stop

將ctdb.service 文件放入 /usr/lib/systemd/system/ 目錄,重新加載服務systemctl daemon-reload 然後啓動該服務。。。

systemctl start ctdb

不知其他人如何,反正我啓動一直失敗。日誌文件大概如下。

2020/03/20 04:17:13.522092 [10340]: CTDB starting on node
2020/03/20 04:17:13.522201 [10340]: Recovery lock file set to "". Disabling recovery lock checking
2020/03/20 04:17:13.530422 [10341]: Starting CTDBD (Version 4.4.3) as PID: 10341
2020/03/20 04:17:13.530568 [10341]: Created PID file /var/run/ctdb/ctdbd.pid
2020/03/20 04:17:13.530599 [10341]: Set real-time scheduler priority
2020/03/20 04:17:13.530766 [10341]: Set runstate to INIT (1)
2020/03/20 04:17:13.530956 [10341]: Set event helper to "/usr/local/samba/libexec/ctdb/ctdb_event_helper"
2020/03/20 04:17:13.546765 [10341]: 00.ctdb: /usr/local/samba/etc/ctdb/events.d/00.ctdb: line 23: tdbtool: command not found
2020/03/20 04:17:13.550013 [10341]: 00.ctdb: WARNING: The installed 'tdbtool' does not offer the 'check' subcommand.
2020/03/20 04:17:13.550042 [10341]: 00.ctdb:  Using 'tdbdump' for database checks.
2020/03/20 04:17:13.550159 [10341]: 00.ctdb:  Consider updating 'tdbtool' for better checks!
2020/03/20 04:17:13.591690 [10341]: 10.interface: No public addresses file found. Nothing to do for 10.interfaces
2020/03/20 04:17:13.735688 [10341]: PNN is 0
2020/03/20 04:17:13.735999 [10341]: Set runstate to SETUP (2)
2020/03/20 04:17:13.944356 [10341]: Keepalive monitoring has been started
2020/03/20 04:17:13.944416 [10341]: Set runstate to FIRST_RECOVERY (3)
2020/03/20 04:17:13.945475 [recoverd:10439]: monitor_cluster starting
2020/03/20 04:17:13.946740 [recoverd:10439]: Initial recovery master set - forcing election
2020/03/20 04:17:13.946895 [10341]: This node (0) is now the recovery master
2020/03/20 04:17:14.489543 [10341]: Unknown db_id 0x6645c6c4 in ctdb_set_db_priority
2020/03/20 04:17:14.489928 [10341]: This node (0) is no longer the recovery master
2020/03/20 04:17:14.946279 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:15.947274 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:16.948313 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:17.949295 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:17.956282 [recoverd:10439]: Election period ended
2020/03/20 04:17:17.957139 [recoverd:10439]:  Current recmaster node 1 does not have CAP_RECMASTER, but we (node 0) have - force an election
2020/03/20 04:17:17.957517 [10341]: This node (0) is now the recovery master
2020/03/20 04:17:18.460678 [10341]: This node (0) is no longer the recovery master
2020/03/20 04:17:18.945356 [10341]: 192.168.199.41:4379: connected to 192.168.199.42:4379 - 1 connected
2020/03/20 04:17:18.945454 [10341]: 192.168.199.41:4379: connected to 192.168.199.43:4379 - 2 connected
2020/03/20 04:17:18.950345 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:19.951503 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:20.952451 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:21.953527 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:21.965504 [recoverd:10439]: Election period ended
2020/03/20 04:17:21.968265 [recoverd:10439]: Initial interface fetched
2020/03/20 04:17:21.968321 [recoverd:10439]: The interfaces status has changed on local node 0 - force takeover run
2020/03/20 04:17:21.968662 [recoverd:10439]: Trigger takeoverrun
2020/03/20 04:17:22.068728 [10341]: Vacuuming is disabled for persistent database ctdb.tdb
2020/03/20 04:17:22.068793 [10341]: Attached to database '/usr/local/samba/var/lib/ctdb/persistent/ctdb.tdb.0' with flags 0x400
2020/03/20 04:17:22.074453 [10341]: ../ctdb/server/ctdb_monitor.c:523 Node 1 became healthy - force recovery for startup
2020/03/20 04:17:22.074735 [recoverd:10439]: Node 1 has changed flags - now 0x0  was 0x2
2020/03/20 04:17:22.075595 [10341]: ../ctdb/server/ctdb_monitor.c:523 Node 2 became healthy - force recovery for startup
2020/03/20 04:17:22.075822 [recoverd:10439]: Node 2 has changed flags - now 0x0  was 0x2
2020/03/20 04:17:22.087151 [10341]: ../ctdb/server/ctdb_recover.c:958 startrecovery eventscript has been invoked
2020/03/20 04:17:22.315207 [10341]: Freeze db: ctdb.tdb
2020/03/20 04:17:22.315261 [10341]: Set lock helper to "/usr/local/samba/libexec/ctdb/ctdb_lock_helper"
2020/03/20 04:17:22.371747 [10341]: Thaw db: ctdb.tdb generation 1088623483
2020/03/20 04:17:22.371807 [10341]: Release freeze handle for db ctdb.tdb
2020/03/20 04:17:22.372810 [10341]: ../ctdb/server/ctdb_recover.c:567 Recovery mode set to NORMAL
2020/03/20 04:17:22.373438 [10341]: Recovery has finished
2020/03/20 04:17:22.595555 [10341]: Set runstate to STARTUP (4)
2020/03/20 04:17:22.609122 [recoverd:10439]: Disabling takeover runs for 60 seconds
2020/03/20 04:17:22.840576 [recoverd:10439]: Reenabling takeover runs
2020/03/20 04:17:22.841105 [10341]: Recovery has finished
2020/03/20 04:17:22.954484 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:22.954531 [10341]: ../ctdb/server/ctdb_monitor.c:335 wait for pending recoveries to end. Wait one more second.
2020/03/20 04:17:23.059519 [recoverd:10439]: Disabling takeover runs for 60 seconds
2020/03/20 04:17:23.293229 [recoverd:10439]: Reenabling takeover runs
2020/03/20 04:17:23.611853 [recoverd:10439]: Daemon has exited - shutting down client
2020/03/20 04:17:23.611968 [recoverd:10439]: CTDB recoverd: shutting down

看不出來哪裏錯了。。。通過上面說的,儘管沒有服務沒有運行成功。但是也應該知道 爲什麼 通過ctdbd_wrapper 來啓動ctdbd進程了,服務文件中就這樣設置的。。。

但是使用 4.6 版本就可以使用systemctl 啓動,只是每次啓動後再次重啓的話會報錯,
/usr/local/samba/var/lib/ctdb 中數據庫已存在之類的,還要刪除後才能再次啓動,因此設置爲開機自啓也是不行。。。不知道原因是不是未設置 初始配置文件?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章