Ansible playbooks 说明

本文档是对 TenDB Cluster Ansible playbooks 仓库 https://github.com/TenDBCluster/TenDBCluster-Ansible 的重要文件和变量进行说明,分为 host inventory 定义以及 group_vars/ 的变量注释。

Inventory hosts 说明

定义一个如下拓扑的 TenDB Cluster

                          +-------------------------+   +-------------------------+
                          |   +-----------------+   |   |   +-----------------+   |
                          |   |   tendb-spt0    | <-|---|-- |   tendb-spt0-1  |   |
                          |   +-----------------+   |   |   +-----------------+   |
                          |                         |   |                         |
+-----------------+       |   +-----------------+   |   |   +-----------------+   |
| tspider-node-01 |       |   |   tendb-spt1    | <-|---|-- |   tendb-spt1-1  |   |
+-----------------+       |   +-----------------+   |   |   +-----------------+   |
                          +-------------------------+   +-------------------------+

                          +-------------------------+   +-------------------------+
+-----------------+       |   +-----------------+   |   |   +-----------------+   |
| tspider-node-02 |       |   |   tendb-spt2    | <-|---|-- |   tendb-spt2-1  |   |
+-----------------+       |   +-----------------+   |   |   +-----------------+   |
                          |                         |   |                         |
                          |   +-----------------+   |   |   +-----------------+   |
                          |   |   tendb-spt3    | <-|---|-- |   tendb-spt3-1  |   |
                          |   +-----------------+   |   |   +-----------------+   |
                          +-------------------------+   +-------------------------+


+----------------++----------------++----------------+                             
| tdbctl-node-01 || tdbctl-node-02 || tdbctl-node-03 |                             
+----------------++----------------++----------------+

每个小框是一个 TenDB/TSpider/Tdbctl 实例 每个大框代表一台机器,图所示一台机器2个实例

对应的 hosts.tendbcluster 定义 :

[all:vars]
ansible_ssh_user=root
ansible_ssh_port=22
ansible_ssh_private_key_file=/root/.ssh/tendbcluster_rsa
# set the ssh public key to remote hosts
ansible_ssh_public_key_file=/root/.ssh/tendbcluster_rsa.pub

# the shard_number must be the number of tendb:children
[tendbcluster:vars]
tendbcluster_name=test
tendbcluster_shard_num=4
node_status=1

mysql_home_dir=/home/mysql/mysqldata
mysql_log_dir=/home/mysql/mysqllog
innodb_buffer_pool_size_mb={{innodb_buffer_pool_size_mb_auto}}
mysql_data_dir="{{mysql_home_dir}}/{{mysql_port}}"

################
[tendbcluster:children]
tendb
tspider
tdbctl

# all this child must be defined later
[tendb:children]
SPT0
SPT1
SPT2
SPT3

################
#### SPIDER ####
# the ansible_host:mysql_port MUST be unique in this inventory
[tspider]
tspider-node-01 ansible_host=192.168.1.106 mysql_port=25000
tspider-node-02 ansible_host=192.168.1.26 mysql_port=25000

################
#### TDBCTL ####
# MGR will be setup when tdbctl node num >=3
# you need to set group_replication_local_address to different port when installing tdbctl on the same machine
[tdbctl]
tdbctl-node-01 ansible_host=192.168.1.26  mysql_port=26000 group_replication_local_address={{ansible_host}}:23306
tdbctl-node-02 ansible_host=192.168.1.2   mysql_port=26000 group_replication_local_address={{ansible_host}}:23306
tdbctl-node-03 ansible_host=192.168.1.106 mysql_port=26000 group_replication_local_address={{ansible_host}}:23306

################
#### SPT0 ####
[SPT0]
tendb-spt0 ansible_host=192.168.1.95 mysql_shard=SPT0 mysql_port=20000 role=master
tendb-spt0-1 ansible_host=192.168.1.147 mysql_shard=SPT0 mysql_port=20000 role=slave master=tendb-spt0

#### SPT1 ####
[SPT1]
tendb-spt1 ansible_host=192.168.1.95 mysql_shard=SPT1 mysql_port=20001 role=master
tendb-spt1-1 ansible_host=192.168.1.147 mysql_shard=SPT1 mysql_port=20001 role=slave master=tendb-spt1

#### SPT2 ####
[SPT2]
tendb-spt2 ansible_host=192.168.1.2 mysql_shard=SPT2 mysql_port=20002 role=master
tendb-spt2-1 ansible_host=192.168.1.130 mysql_shard=SPT2 mysql_port=20002 role=slave master=tendb-spt2

#### SPT3 ####
[SPT3]
tendb-spt3 ansible_host=192.168.1.2 mysql_shard=SPT3 mysql_port=20003 role=master
tendb-spt3-1 ansible_host=192.168.1.130 mysql_shard=SPT3 mysql_port=20003 role=slave master=tendb-spt3

inventory说明:

  1. 所有inventory_hostname不得相同

  2. Tdbctl, TSpider, TenDB 三个组件的主机名和端口( ansible_host:mysql_port ) 不得相同 TenDB 同一分片下的 server_id 自动生成,所以在 GTID 主备环境下,server_id 不会相同。 但注意如果增删 TenDB 节点,或者修改了 host 顺序之后,根据 groups[mysql_shard].index(inventory_hostname) 生成的 server_id 会变,如果没有同步重启 TenDB,可能会导致server_id 相同。 最安全的情况是,这里给每个 host 设置 server_id 变量

  3. TenDB同一分片下的 host 变量 mysql_shard 必须相同,且必须是 SPT + 序号 格式

  4. TenDB的各分片 host role 必须正确配置是 master 还是 slave。 包括如果后续做了主备切换,这里必须及时更新,否则可能引起整个集群问题

  5. 建议存储节点(TenDB)的主备使用相同端口,且主备分布在不同的机器上。

  6. TSpider的变量 autoinc_value 每加一个节点,保持自增。 在不是 TSpider 时会自动按照 index 来维持,所以部署好后,不要轻易改变这里的顺序 同理 TSpider 的 server_id 也是自动生成的。

  7. Tdbctl 如果只给一个节点,则安装成单节点,如果给 3 个节点,则自动安装成 MGR 模式 正式环境建议安装成 MGR 模式,否则 Tdbctl 故障时无法做 DDL 操作。

  8. 全局变量:

    • tendbcluster_shard_num 设置分片个数,即 TenDB 实例个数。 具体的分片定义,必须准确给出,如下面的 SPT0, SPT1, SPT2, SPT3

    • tendbcluster_name TenDBCluster 的集群名,主要用于监控时标识集群

    • node_status - 待实现 节点状态,默认为1

      • 1: 正常工作,或者预期正常工作的节点
      • 2: 预期正常工作,但确认已经故障的节点
      • 3: 节点等待退役下线
      • 4: 节点已下线,可被安全从 inventory 中清除
    • tendbcluster:vars 设置影响集群性能的关键变量,比如 mysql 数据目录 mysql_home_dir,innodb 缓冲池大小innodb_buffer_pool_size_mb

      • mysql_home_dir, mysql_data_dir 单机多分片(多实例)情况下,默认通过 mysql_port 来区分数据目录。 如果机器有多个高性能磁盘,也可以直接在 host 上设置变量 mysql_data_dir
      • innodb_buffer_pool_size_mb 默认会根据 inventory 里面配置单机实例数,自动计算每个实例的 buffer pool 大小。 在 group_vars 里面设置变量 innodb_buffer_pool_size_pct_total,默认使用总内存的 0.8 。 当为特定实例设置不同的 buffer pool 时,直接在 host 上设置该变量来覆盖全局配置,单位 MB。

group_vars 变量

ansible 会自动从 group_vars/ 目录下,找到对应主机组的变量,进行替换。关于变量生效的优先级,请参考 ansible 官方文档 Variable precedence.

举例:group_vars/all:

fileserver: http://tendbcluster.com/downloads
ansible_python_interpreter: /usr/bin/python

# iface: eth1
mysql_version: "tendb-3.3"
mysql_pkg: "mysql-5.7.20-linux-x86_64-{{mysql_version}}-gcs"
mysql_pkg_md5: 01b0f74ff7a1d6a9b6fa31190adbac0a

tspider_version: tspider-3.6.1
tspider_pkg: "mariadb-10.3.7-linux-x86_64-{{tspider_version}}-gcs"
tspider_pkg_md5: 326c4874e56be4d6d84e6f60e08af050

tdbctl_version: tdbctl-2.1
tdbctl_pkg: "mysql-5.7.20-linux-x86_64-{{tdbctl_version}}"
tdbctl_pkg_md5: 3b127981aa5835e914f71d6777982646

checksum_enabled: false

innodb_buffer_pool_size_pct_total: 0.8

# my.cnf [mysqld]
mycnf_mysqld:
  innodb_flush_log_at_trx_commit: 0
  character-set-server: utf8mb4

# my.cnf [mysql]
mycnf_mysql:
  default-character-set: utf8mb4

backup_dir: /data/dbbak
mysql_charset: utf8mb4
mysql_conf_dir: /home/mysql/etc

mysql_socket: "{{mysql_data_dir}}/mysql.sock"
mysql_pid_file: "{{mysql_data_dir}}/mysqld.pid"
mysql_conf_file: "{{mysql_conf_dir}}/my.cnf.{{mysql_port}}"

# user admin
tendbcluster_user_admin: tendbcluster
tendbcluster_user_admin_pass: xxxxxx
# user repl
tendbcluster_user_repl: repl_user
tendbcluster_user_repl_pass: xxxxxx
  • fileserver 设置安装包的下载链接地址

  • mysql_version, mysql_pkg, mysql_pkg_md5 设置 TenDB 的介质包版本、名称、md5 同理 TSpider, Tdbctl 也需要配置。

  • innodb_buffer_pool_size_pct_total TenDB 实例占机器总内存比例,默认 0.8 。 比如机器内存 16384MB,则 buffer pool 大小为 int(16384 * 0.8) = 13107,当机器上部署4个分片时,每个实例 innodb_buffer_pool_size 为 int(13107 / 4) = 3276 M。 也可以直接在 host inventory 里面配置具体的大小,来覆盖自动计算。

  • mycnf_mysqld 自定义 my.conf 配置文件里面 mysqld 的配置项。 如果要为 TenDB, TSpider 的 my.cnf 配置不同的值,在对应的 group_vars/tendbgroup_vars/tspider 里面设置

    注意 my.cnf 的生成没有完全依赖这个 mycnf_mysqld ,在 roles/tendb/templates/my.cnf.tendb.j2 里面内置了一些配置。使用时以防重复

  • backup_dir MySQL备份目录,主要用在自动 build slave 时,mysqldump 的存放的备份的地址

  • tendbcluster_user_admin, tendbcluster_user_repl 集群运行所必须要创建的两个用户,在部署集群时,会自动创建,在后续维护集群时,也要用到管理用户。

    • tendbcluster_user_admin 指定管理用户名,创建 admin 用户时会限制访问ip。后续 Tdbctl 会用这个用户在各个节点创建表
    • tendbcluster_user_admin_pass 指定 admin 用户密码,建议使用 ansible-vault 加密,见上文
    • tendbcluster_user_repl 指定 mysql replication 的用户名,授权 %
    • tendbcluster_user_repl_pass 指定复制用户的密码
    • tendbcluster_user_root_pass 指定 mysql root 的密码,默认与 tendbcluster_user_admin_pass 相同。后续不再需要root

results matching ""

    No results matching ""