標籤:

使用 Ansible 安裝部署 TiDB

背景知識

n

TiDB 作為一個分散式資料庫,在多個節點分別配置安裝服務會相當繁瑣,為了簡化操作以及方便管理,使用自動化工具來批量部署成為了一個很好的選擇。

n

Ansible 是基於 Python n研發的自動化運維工具,糅合了眾多老牌運維工具的優點實現了批量操作系統配置、批量程序的部署、批量運行命令等功能,而且使用簡單,僅需在管理工作站上安裝n Ansible 程序配置被管控主機的 IP 信息,被管控的主機無客戶端。基於以上原因,我們選用自動化工具 Ansible n來批量的安裝配置以及部署 TiDB。

n

下面我們來介紹如何使用 Ansible 來部署 TiDB。

n

TiDB 安裝環境配置如下

n

操作系統使用 CentOS7.2 或者更高版本,文件系統使用 EXT4。

說明:低版本的操作系統(例如 CentOS6.6 )和 XFS 文件系統會有一些內核 Bug,會影響性能,我們不推薦使用。

我們選擇使用 3 個 PD、2 個 TiDB、3 個 TiKV,這裡簡單說一下為什麼這樣部署。

n

  • 對於 PD 。PD 本身是一個分散式系統,由多個節點構成一個整體,並且同時有且只有一個主節點對外提供服務。各個節點之間通過選舉演算法來確定主節點,選舉演算法要求節點個數是奇數個 (2n+1) ,1 個節點的風險比較高,所以我們選擇使用 3 個節點。
  • 對於 TiKV 。TiDB 底層使用分散式存儲,我們推薦使用奇數 (2n+1) 個備份,掛掉 n 個備份之後數據仍然可用。使用 1 備份或者 2 備份的話,有一個節點掛掉就會造成一部分數據不可用,所以我們選擇使用 3 個節點、設置 3 個備份 (默認值)。
  • 對於 TiDB 。我們的 TiDB 是無狀態的,現有集群的 TiDB 服務壓力大的話,可以在其他節點直接增加 TiDB 服務,無需多餘的配置。我們選擇使用兩個 TiDB,可以做 HA 和負載均衡。
  • 當然如果只是測試集群的話,完全可以使用一個 PD 、一個 TiDB 、三個 TiKV (少於三個的話需要修改備份數量)


    下載 TiDB 安裝包並解壓

    n

    #創建目錄用來存放 ansible 安裝包nmkdir /root/workspace nn#切換目錄ncd /root/workspace nn#下載安裝包nwget https://github.com/pingcap/tidb-ansible/archive/master.zip nn#解壓壓縮包到當前目錄下nunzip master.zip nn#查看安裝包結構,主要內容說明如下ncd tidb-ansible-master && ls n

    n

    部分內容含義

    n

    ansible.cfg: ansible 配置文件ninventory.ini: 組和主機的相關配置nconf: TiDB 相關配置模版ngroup_vars: 相關變數配置nscripts: grafana 監控 json 模版nlocal_prepare.yml: 用來下載相關安裝包nbootstrap.yml: 初始化集群各個節點ndeploy.yml: 在各個節點安裝 TiDB 相應服務nroles: ansible tasks 的集合nstart.yml: 啟動所有服務nstop.yml: 停止所有服務nunsafe_cleanup_data.yml: 清除數據nunsafe_cleanup.yml: 銷毀集群n

    n

    修改配置文件

    n

    主要配置集群節點的分布情況,以及安裝路徑。

    n

    會在 tidb_servers 組中的機器上安裝 TiDB 服務(其他類似),默認會將所有服務安裝到變數 deploy_dir 路徑下。

    n

    #將要安裝 TiDB 服務的節點n[tidb_servers]n192.168.1.102n192.168.1.103nn#將要安裝 TiKV 服務的節點n[tikv_servers]n192.168.1.104n192.168.1.105n192.168.1.106nn#將要安裝 PD 服務的節點n[pd_servers]n192.168.1.101n192.168.1.102n192.168.1.103nn#將要安裝 Promethues 服務的節點n# Monitoring Partn[monitoring_servers]n192.168.1.101nn#將要安裝 Grafana 服務的節點n[grafana_servers]n192.168.1.101nn#將要安裝 Node_exporter 服務的節點n[monitored_servers:children]ntidb_serversntikv_serversnpd_serversnn[all:vars]n#服務安裝路徑,每個節點均相同,根據實際情況配置ndeploy_dir = /home/tidb/deploynn## Connectionn#方式一:使用 root 用戶安裝n# ssh via root:n# ansible_user = rootn# ansible_become = truen# ansible_become_user = tidbnn#方式二:使用普通用戶安裝(需要有 sudo 許可權)n# ssh via normal usernansible_user = tidbnn#集群的名稱,自定義即可ncluster_name = test-clusternn# miscnenable_elk = Falsenenable_firewalld = Falsenenable_ntpd = Falsenn# binlog triggern#是否開啟 pump,pump 生成 TiDB 的 binlog n#如果有從此 TiDB 集群同步數據的需求,可以改為 True 開啟nenable_binlog = Falsen

    n

    安裝過程可以分為 root 用戶安裝和普通用戶安裝兩種方式。有 root n用戶當然是最好的,修改系統參數、創建目錄等不會涉及到許可權不夠的問題,能夠直接安裝完成。 但是有些環境不會直接給 root n許可權,這種場景就需要通過普通用戶來安裝。為了配置簡便,我們建議所有節點都使用相同的普通用戶;為了滿足許可權要求,我們還需要給這個普通用戶 sudon 許可權。 下面介紹兩種安裝方式的詳細過程,安裝完成之後需要手動啟動服務。

    n

    1. 使用 root 用戶安裝

    n

  • 下載 Binary 包到 downloads 目錄下,並解壓拷貝到 resources/bin 下,之後的安裝過程就是使用的 resources/bin 下的二進位程序

ansible-playbook -i inventory.ini local_prepare.ymln

n

  • 初始化集群各個節點。會檢查 inventory.ini 配置文件、Python 版本、網路狀態、操作系統版本等,並修改一些內核參數,創建相應的目錄。n
    • 修改配置文件如下

    ## Connectionn# ssh via root:nansible_user = rootn# ansible_become = truenansible_become_user = tidbnn# ssh via normal usern# ansible_user = tidbn

    n

    • 執行初始化命令

    ansible-playbook -i inventory.ini bootstrap.yml -k #ansible-playboo命令說明請見附錄n

  • 安裝服務。該步驟會在伺服器上安裝相應的服務,並自動設置好配置文件和所需腳本。n
    • 修改配置文件如下

    ## Connectionn# ssh via root:n ansible_user = rootn ansible_become = truen ansible_become_user = tidbnn# ssh via normal usern# ansible_user = tidbn

    n

    • 執行安裝命令

    ansible-playbook -i inventory.ini deploy.yml -kn

2. 使用普通用戶安裝

n

  • 下載 Binary 包到中控機

ansible-playbook -i inventory.ini local_prepare.ymln

n

  • 初始化集群各個節點。n
    • 修改配置文件如下

    ## Connectionn# ssh via root:n# ansible_user = rootn# ansible_become = truen# ansible_become_user = tidbnn# ssh via normal usernansible_user = tidbn

    n

    • 執行初始化命令

    ansible-playbook -i inventory.ini bootstrap.yml -k -Kn

  • 安裝服務

ansible-playbook -i inventory.ini deploy.yml -k -Kn

n

啟停服務

n

  • 啟動所有服務

ansible-playbook -i inventory.ini start.yml -kn

n

  • 停止所有服務

ansible-playbook -i inventory.ini stop.ymln

n

附錄

ansible-playbook -i inventory.ini xxx.yml -k -Knn-k 執行之後需要輸入 ssh 連接用戶的密碼,如果做了中控機到所有節點的互信,則不需要此參數n-K 執行之後需要輸入 sudo 所需的密碼,如果使用 root 用戶或者 sudo 無需密碼,則n不需要此參數 n

推薦閱讀:

申礫:細說分散式資料庫的過去、現在與未來
三篇文章了解 TiDB 技術內幕——說存儲
GopherChina 2017 演講實錄|申礫:Go in TiDB
TiDB 在 360 金融貸款實時風控場景應用
gRPC-rs:從 C 到 Rust

TAG:TiDB |