TiDB Ansible 部署方案

    本部署工具可以通过配置文件设置集群拓扑,完成以下各项运维工作:

    准备机器

    1. 部署目标机器若干

      • 建议 4 台及以上,TiKV 至少 3 实例,且与 TiDB、PD 模块不位于同一主机,详见部署建议
      • 推荐安装 CentOS 7.3 及以上版本 Linux 操作系统,x86_64 架构 (amd64)。
      • 机器之间内网互通。
    2. 部署中控机一台:

      • 中控机可以是部署目标机器中的某一台。
      • 推荐安装 CentOS 7.3 及以上版本 Linux 操作系统(默认包含 Python 2.7)。
      • 该机器需开放外网访问,用于下载 TiDB 及相关软件安装包。

    在中控机上安装系统依赖包

    root 用户登录中控机

    如果中控机是 CentOS 7 系统,执行以下命令:

    如果是中控机是 Ubuntu 系统,执行以下命令:

    1. # apt-get -y install git curl sshpass python-pip

    在中控机上创建 tidb 用户,并生成 ssh key

    root 用户登录中控机,执行以下命令

    创建 tidb 用户

    1. # useradd tidb

    设置 tidb 用户密码

    1. # passwd tidb

    配置 tidb 用户 sudo 免密码,将 tidb ALL=(ALL) NOPASSWD: ALL 添加到文件末尾即可。

    1. # visudo
    2. tidb ALL=(ALL) NOPASSWD: ALL

    生成 ssh key: 执行 su 命令从 root 用户切换到 tidb 用户下,创建 tidb 用户 ssh key, 提示 Enter passphrase 时直接回车即可。执行成功后,ssh 私钥文件为 /home/tidb/.ssh/id_rsa, ssh 公钥文件为 /home/tidb/.ssh/id_rsa.pub

    1. # su - tidb
    2. $ ssh-keygen -t rsa
    3. Generating public/private rsa key pair.
    4. Enter file in which to save the key (/home/tidb/.ssh/id_rsa):
    5. Created directory '/home/tidb/.ssh'.
    6. Enter passphrase (empty for no passphrase):
    7. Enter same passphrase again:
    8. Your identification has been saved in /home/tidb/.ssh/id_rsa.
    9. Your public key has been saved in /home/tidb/.ssh/id_rsa.pub.
    10. The key fingerprint is:
    11. SHA256:eIBykszR1KyECA/h0d7PRKz4fhAeli7IrVphhte7/So tidb@172.16.10.49
    12. The key's randomart image is:
    13. +---[RSA 2048]----+
    14. |=+o+.o. |
    15. |o=o+o.oo |
    16. | .O.=.= |
    17. | . B.B + |
    18. |o B * B S |
    19. | * + * + |
    20. | o + . |
    21. | o E+ . |
    22. |o ..+o. |
    23. +----[SHA256]-----+

    tidb 用户登录中控机并进入 /home/tidb 目录。

    使用以下命令从 Github 上下载 TiDB-Ansible 相应版本,默认的文件夹名称为 tidb-ansible,以下为各版本下载示例,版本选择可以咨询官方。

    下载 2.0 GA 版本:

    1. $ git clone -b release-2.0 https://github.com/pingcap/tidb-ansible.git

    下载 master 版本:

    1. $ git clone https://github.com/pingcap/tidb-ansible.git

    :请务必按文档操作,将 tidb-ansible 下载到 /home/tidb 目录下,权限为 tidb 用户,不要下载到 /root 下,否则会遇到权限问题。

    在中控机器上安装 Ansible 及其依赖

    tidb 用户登录中控机,请务必按以下方式通过 pip 安装 Ansible 及其相关依赖的指定版本,否则会有兼容问题。安装完成后,可通过 ansible --version 查看 Ansible 版本。目前 release-2.0 及 master 版本兼容 Ansible 2.4 及 Ansible 2.5 版本,Ansible 及相关依赖版本记录在 tidb-ansible/requirements.txt 文件中。

    1. $ cd /home/tidb/tidb-ansible
    2. $ sudo pip install -r ./requirements.txt
    3. $ ansible --version
    4. ansible 2.5.0

    在中控机上配置部署机器 ssh 互信及 sudo 规则

    tidb 用户登录中控机,将你的部署目标机器 IP 添加到 hosts.ini 文件 [servers] 区块下。

    1. $ cd /home/tidb/tidb-ansible
    2. $ vi hosts.ini
    3. [servers]
    4. 192.168.0.2
    5. 192.168.0.3
    6. 192.168.0.5
    7. 192.168.0.6
    8. 192.168.0.7
    9. 192.168.0.8
    10. 192.168.0.10
    11. [all:vars]
    12. username = tidb
    13. ntp_server = pool.ntp.org

    执行以下命令,按提示输入部署目标机器 root 用户密码。该步骤将在部署目标机器上创建 tidb 用户,并配置 sudo 规则,配置中控机与部署目标机器之间的 ssh 互信。

    1. $ ansible-playbook -i hosts.ini create_users.yml -k

    在部署目标机器上安装 NTP 服务

    如果你的部署目标机器时间、时区设置一致,已开启 NTP 服务且在正常同步时间,此步骤可忽略。可参考。

    该步骤将在部署目标机器上使用系统自带软件源联网安装并启动 NTP 服务,服务使用安装包默认的 NTP server 列表,见配置文件 /etc/ntp.conf 中 server 参数,如果使用默认的 NTP server,你的机器需要连接外网。
    为了让 NTP 尽快开始同步,启动 NTP 服务前,系统会 ntpdate hosts.ini 文件中的 ntp_server 一次,默认为 pool.ntp.org,也可替换为你的 NTP server。

    tidb 用户登录中控机,执行以下命令,按提示输入部署目标机器 root 密码。

    1. $ cd /home/tidb/tidb-ansible
    2. $ ansible-playbook -i hosts.ini deploy_ntp.yml -k

    部署目标机器数据盘请格式化成 ext4 文件系统,挂载时请添加 nodelalloc 和 noatime 挂载参数。nodelalloc 是必选参数,否则 Ansible 安装时检测无法通过,noatime 是可选建议参数。

    1. # umount /dev/nvme0n1

    下面以 /dev/nvme0n1 数据盘为例:

    查看数据盘

    1. # fdisk -l
    2. Disk /dev/nvme0n1: 1000 GB

    创建分区表

    1. # parted -s -a optimal /dev/nvme0n1 mklabel gpt -- mkpart primary ext4 1 -1

    格式化文件系统

    1. # mkfs.ext4 /dev/nvme0n1

    查看数据盘分区 UUID,本例中 nvme0n1 的 UUID 为 c51eb23b-195c-4061-92a9-3fad812cc12f。

    编辑 文件,添加 nodelalloc 挂载参数

    1. # vi /etc/fstab
    2. UUID=c51eb23b-195c-4061-92a9-3fad812cc12f /data1 ext4 defaults,nodelalloc,noatime 0 2

    挂载数据盘

    1. # mkdir /data1
    2. # mount -a

    执行以下命令,如果文件系统为 ext4,并且挂载参数中包含 nodelalloc 表示生效:

    1. # mount -t ext4
    2. /dev/nvme0n1 on /data1 type ext4 (rw,noatime,nodelalloc,data=ordered)

    分配机器资源,编辑 inventory.ini 文件

    tidb 用户登录中控机,inventory.ini 文件路径为 /home/tidb/tidb-ansible/inventory.ini

    注: 请使用内网 IP 来部署集群。

    标准 TiDB 集群需要 6 台机器:

    • 2 个 TiDB 节点
    • 3 个 PD 节点
    • 3 个 TiKV 节点,第一台 TiDB 机器同时用作监控机

    默认情况下,单台机器上只需部署一个 TiKV 实例。如果你的 TiKV 部署机器 CPU 及内存配置是的两倍或以上,并且拥有两块 SSD 硬盘或单块容量超 2T 的 SSD 硬盘,可以考虑部署两实例,但不建议部署两个以上实例。

    1. [tidb_servers]
    2. 172.16.10.1
    3. 172.16.10.2
    4. [pd_servers]
    5. 172.16.10.1
    6. 172.16.10.2
    7. 172.16.10.3
    8. [tikv_servers]
    9. 172.16.10.4
    10. 172.16.10.5
    11. 172.16.10.6
    12. [monitoring_servers]
    13. 172.16.10.1
    14. [grafana_servers]
    15. 172.16.10.1
    16. [monitored_servers]
    17. 172.16.10.1
    18. 172.16.10.2
    19. 172.16.10.3
    20. 172.16.10.4
    21. 172.16.10.5
    22. 172.16.10.6

    单机多 TiKV 实例集群拓扑

    以两实例为例:

    1. [tidb_servers]
    2. 172.16.10.1
    3. 172.16.10.2
    4. [pd_servers]
    5. 172.16.10.1
    6. 172.16.10.2
    7. 172.16.10.3
    8. [tikv_servers]
    9. TiKV1-1 ansible_host=172.16.10.4 deploy_dir=/data1/deploy tikv_port=20171 labels="host=tikv1"
    10. TiKV1-2 ansible_host=172.16.10.4 deploy_dir=/data2/deploy tikv_port=20172 labels="host=tikv1"
    11. TiKV2-1 ansible_host=172.16.10.5 deploy_dir=/data1/deploy tikv_port=20171 labels="host=tikv2"
    12. TiKV2-2 ansible_host=172.16.10.5 deploy_dir=/data2/deploy tikv_port=20172 labels="host=tikv2"
    13. TiKV3-1 ansible_host=172.16.10.6 deploy_dir=/data1/deploy tikv_port=20171 labels="host=tikv3"
    14. TiKV3-2 ansible_host=172.16.10.6 deploy_dir=/data2/deploy tikv_port=20172 labels="host=tikv3"
    15. [monitoring_servers]
    16. 172.16.10.1
    17. [grafana_servers]
    18. 172.16.10.1
    19. [monitored_servers]
    20. 172.16.10.1
    21. 172.16.10.2
    22. 172.16.10.3
    23. 172.16.10.4
    24. 172.16.10.6
    25. [pd_servers:vars]
    26. location_labels = ["host"]
    • 服务配置文件参数调整

      1. 多实例情况下,需要修改 tidb-ansible/conf/tikv.yml 中的 block-cache-size 参数:

        • rocksdb defaultcf block-cache-size(GB) = MEM 80% / TiKV 实例数量 30%
        • rocksdb writecf block-cache-size(GB) = MEM 80% / TiKV 实例数量 45%
        • rocksdb lockcf block-cache-size(GB) = MEM 80% / TiKV 实例数量 2.5% (最小 128 MB)
        • raftdb defaultcf block-cache-size(GB) = MEM 80% / TiKV 实例数量 2.5% (最小 128 MB)
      2. 多实例情况下,需要修改 tidb-ansible/conf/tikv.ymlhigh-concurrencynormal-concurrencylow-concurrency 三个参数:

        1. readpool:
        2. coprocessor:
        3. # Notice: if CPU_NUM > 8, default thread pool size for coprocessors
        4. # will be set to CPU_NUM * 0.8.
        5. # high-concurrency: 8
        6. # normal-concurrency: 8
        7. # low-concurrency: 8
        • 推荐设置:实例数参数值 = CPU 核数 0.8。
      3. 如果多个 TiKV 实例部署在同一块物理磁盘上,需要修改 conf/tikv.yml 中的 capacity 参数:

        • capacity = 磁盘总容量 / TiKV 实例数量,例如 “100GB”

    inventory.ini 变量调整

    部署目录调整

    部署目录通过 deploy_dir 变量控制,默认全局变量已设置为 /home/tidb/deploy,对所有服务生效。如数据盘挂载目录为 /data1,可设置为 ,样例如下:

    1. ## Global variables
    2. [all:vars]
    3. deploy_dir = /data1/deploy

    如为某一服务单独设置部署目录,可在配置服务主机列表时配置主机变量,以 TiKV 节点为例,其他服务类推,请务必添加第一列别名,以免服务混布时混淆。

    1. TiKV1-1 ansible_host=172.16.10.4 deploy_dir=/data1/deploy

    其他变量调整

    注: 以下控制变量开启请使用首字母大写 True,关闭请使用首字母大写 False

    部署任务

    1. 确认 tidb-ansible/inventory.ini 文件中 ansible_user = tidb,本例使用 tidb 用户作为服务运行用户,配置如下:

      ansible_user 不要设置成 root 用户,tidb-ansbile 限制了服务以普通用户运行。

      1. ## Connection
      2. # ssh via normal user
      3. ansible_user = tidb

      执行以下命令如果所有 server 返回 tidb 表示 ssh 互信配置成功。

      1. ansible -i inventory.ini all -m shell -a 'whoami'

      执行以下命令如果所有 server 返回 root 表示 tidb 用户 sudo 免密码配置成功。

      1. ansible -i inventory.ini all -m shell -a 'whoami' -b
      1. ansible-playbook local_prepare.yml
    2. 初始化系统环境,修改内核参数

      1. ansible-playbook bootstrap.yml
    3. 部署 TiDB 集群软件

      1. ansible-playbook deploy.yml

      :Grafana Dashboard 上的 Report 按钮可用来生成 PDF 文件,此功能依赖 fontconfig 包和英文字体。如需使用该功能,登录 grafana_servers 机器,用以下命令安装:

      1. $ sudo yum install fontconfig open-sans-fonts
    4. 启动 TiDB 集群

    测试集群

    • 使用 MySQL 客户端连接测试,TCP 4000 端口是 TiDB 服务默认端口。

      1. mysql -u root -h 172.16.10.1 -P 4000
    • 通过浏览器访问监控平台。

      地址:http://172.16.10.1:3000 默认帐号密码是:admin/admin

    修改 inventory.ini 文件,在相应服务 IP 后添加以下主机变量即可:

    如何自定义部署目录

    修改 inventory.ini 文件,在相应服务 IP 后添加以下主机变量即可:

    如何检测 NTP 服务是否正常

    执行以下命令输出 running 表示 NTP 服务正在运行:

    1. $ sudo systemctl status ntpd.service
    2. ntpd.service - Network Time Service
    3. Loaded: loaded (/usr/lib/systemd/system/ntpd.service; disabled; vendor preset: disabled)
    4. Active: active (running) since 2017-12-18 13:13:19 CST; 3s ago

    执行 ntpstat 命令,输出 synchronised to NTP server(正在与 NTP server 同步)表示在正常同步:

    1. $ ntpstat
    2. synchronised to NTP server (85.199.214.101) at stratum 2
    3. time correct to within 91 ms
    4. polling server every 1024 s

    注: Ubuntu 系统需安装 ntpstat 软件包。

    以下情况表示 NTP 服务未正常同步:

    1. $ ntpstat
    2. unsynchronised

    以下情况表示 NTP 服务未正常运行:

    1. $ ntpstat
    2. Unable to talk to NTP daemon. Is it running?

    使用以下命令可使 NTP 服务尽快开始同步,pool.ntp.org 可替换为你的 NTP server:

    1. $ sudo systemctl stop ntpd.service
    2. $ sudo ntpdate pool.ntp.org
    3. $ sudo systemctl start ntpd.service

    在 CentOS 7 系统上执行以下命令,可手工安装 NTP 服务:

    1. $ sudo yum install ntp ntpdate
    2. $ sudo systemctl start ntpd.service
    3. $ sudo systemctl enable ntpd.service
    1. # process supervision, [systemd, supervise]
    2. process_supervision = systemd

    TiDB-Anisble 在 TiDB v1.0.4 版本之前进程监管方式默认为 supervise, 之前安装的集群可保持不变,如需更新为 systemd,需关闭集群按以下方式变更:

    1. ansible-playbook stop.yml
    2. ansible-playbook deploy.yml -D
    3. ansible-playbook start.yml

    如何手工配置 ssh 互信及 sudo 免密码

    root 用户依次登录到部署目标机器创建 tidb 用户并设置登录密码。

    1. # useradd tidb
    2. # passwd tidb

    执行以下命令,将 tidb ALL=(ALL) NOPASSWD: ALL 添加到文件末尾,即配置好 sudo 免密码。

    1. # visudo
    2. tidb ALL=(ALL) NOPASSWD: ALL

    tidb 用户登录到中控机,执行以下命令,将 172.16.10.61 替换成你的部署目标机器 IP,按提示输入部署目标机器 tidb 用户密码,执行成功后即创建好 ssh 互信,其他机器同理。

    1. [tidb@172.16.10.49 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.10.61

    tidb 用户登录到中控机,ssh 登录目标机器 IP,不需要输入密码并登录成功,表示 ssh 互信配置成功。

    1. [tidb@172.16.10.49 ~]$ ssh 172.16.10.61
    2. [tidb@172.16.10.61 ~]$

    tidb 用户登录到部署目标机器后,执行以下命令,不需要输入密码并切换到 root 用户,表示 tidb 用户 sudo 免密码配置成功。

    1. [tidb@172.16.10.61 ~]$ sudo -su root
    2. [root@172.16.10.61 tidb]#

    You need to install jmespath prior to running json_query filter 报错

    请参照 在中控机器上安装 Ansible 及其依赖 在中控机上通过 pip 安装 Ansible 及相关依赖的指定版本,默认会安装 jmespath

    可通过以下命令验证 jmespath 是否安装成功:

    1. $ pip show jmespath
    2. Name: jmespath
    3. Version: 0.9.0

    请检查 inventory.ini 里的 zookeeper_addrs 参数配置与 Kafka 集群内的配置是否相同、是否填写了命名空间。关于命名空间的配置说明如下:

    1. # ZooKeeper connection string (see ZooKeeper docs for details).
    2. # ZooKeeper address of Kafka cluster, example:
    3. # zookeeper_addrs = "192.168.0.11:2181,192.168.0.12:2181,192.168.0.13:2181"
    4. # You can also append an optional chroot string to the URLs to specify the root directory for all Kafka znodes. Example: