• TiDB 集群扩容缩容方案
    • 概述
    • PD
      • 动态添加节点
      • 动态删除节点
      • 动态迁移节点
    • TiKV
      • 动态添加节点
      • 动态删除节点
      • 动态迁移节点
    • TiDB

    TiDB 集群扩容缩容方案

    概述

    TiDB 集群可以在不影响线上服务的情况下动态进行扩容和缩容。

    如果使用 Ansible 部署 TiDB 集群,请参考使用 Ansible 扩容缩容。

    下面分别介绍如何增加或者删除 PD,TiKV 以及 TiDB 的节点。

    下面用到的 pd-ctl 文档可以参考 pd-control。

    PD

    假设现在我们有三个 PD 服务,详细信息如下:

    Name ClientUrls PeerUrls
    pd1 http://host1:2379 http://host1:2380
    pd2 http://host2:2379 http://host2:2380
    pd3 http://host3:2379 http://host3:2380

    我们可以通过 pd-ctl 来查看当前所有 PD 节点的信息:

    1. ./pd-ctl -u http://host1:2379
    2. >> member

    动态添加节点

    我们可以使用 join 参数,将一个新的 PD 服务加入到现有的 PD 集群里面。
    如果我们需要添加 pd4,只需要在 --join 参数里面填入当前 PD 集群任意一个 PD 服务的 client url,比如:

    1. ./bin/pd-server --name=pd4 \
    2. --client-urls="http://host4:2379" \
    3. --peer-urls="http://host4:2380" \
    4. --join="http://host1:2379"

    动态删除节点

    如果我们需要删除 pd4,可以通过 pd-ctl 来完成:

    1. ./pd-ctl -u http://host1:2379
    2. >> member delete pd4

    动态迁移节点

    如果想把现有的 PD 节点迁移到新的机器上,我们可以先在新的机器上添加节点,然后把旧的机器上的节点删除掉。
    迁移过程中应该一个节点一个节点逐个迁移,每完成一个步骤可以先查看一下当前的所有节点信息来进行确认。

    TiKV

    我们可以通过 pd-ctl 来查看当前所有 TiKV 节点的信息:

    1. ./pd-ctl -u http://host1:2379
    2. >> store

    动态添加节点

    动态添加一个新的 TiKV 服务非常容易,只需要在新的机器上启动一个 TiKV 服务,不需要其他特殊操作。
    新启动的 TiKV 服务会自动注册到现有集群的 PD 中,PD 会自动做负载均衡,逐步地把一部分数据迁移到新的TiKV 服务中,从而降低现有 TiKV 服务的压力。

    动态删除节点

    安全地删除(下线)一个 TiKV 服务需要先告诉 PD,这样 PD 可以先把这个 TiKV 服务上面的数据迁移到其他 TiKV 服务上,保证数据有足够的副本数。

    假设我们需要删除 store id 为 1 的 TiKV 服务,可以通过 pd-ctl 来完成:

    1. ./pd-ctl -u http://host1:2379
    2. >> store delete 1

    然后可以查看这个 TiKV 服务的状态:

    1. ./pd-ctl -u http://host1:2379
    2. >> store 1
    3. {
    4. "store": {
    5. "id": 1,
    6. "address": "127.0.0.1:21060",
    7. "state": 1,
    8. "state_name": "Offline"
    9. },
    10. "status": {
    11. ...
    12. }
    13. }

    我们可以通过这个 store 的 state_name 来确定这个 store 的状态:

    • state_name=Up: 这个 store 正常服务
    • state_name=Disconnected: 当前没有检测到这个 store 的心跳,可能是故障或网络连接中断
    • state_name=Down: 超过一小时(可通过 max-down-time 配置)没有收到 store 心跳,此时 PD 会为这个 store 上的数据添加副本
    • state_name=Offline: 这个 store 正在下线,此时 store 仍在服务中
    • state_name=Tombstone: 这个 store 已经完成下线,此时 store 上已经没有数据,可以关闭实例

    动态迁移节点

    迁移 TiKV 服务也是通过先在新的机器上添加节点,然后把旧的机器上的节点下线来完成。
    迁移过程中可以先把新集群的机器全部添加到已有的集群中,然后再把旧的节点一个一个地下线。
    可以通过查看正在下线的节点的状态信息来确定这个节点是否已经完成下线,确认完成以后再下线下一个节点。

    TiDB

    TiDB 是一个无状态的服务,这也就意味着我们能直接添加和删除 TiDB。
    需要注意的是,如果我们在 TiDB 的服务的前面搭建了一个 proxy(譬如 HAProxy),则需要更新 proxy 的配置并重新载入。