MySQL Cluster篇08 — 推荐的全局配置文件

概述

本章,您将学习管理节点中全局配置文件 config.ini 的推荐配置。

前面的文章 《MySQL Cluster篇03 — 部署最小化的环境》 提到了管理节点的配置文件 config.ini。

管理节点的配置文件为 config.ini,主要告知管理节点需要:

  • 维护多少数量的片段副本
  • 为每个数据节点上的数据与索引分配多少内存
  • 在哪里找到数据节点
  • 在哪里找到任意的 SQL 节点
  • 在哪里将数据保存到每个数据节点的磁盘上

该文件有时也称为 全局配置文件,仅由管理节点进行读取,然后将其中包含的信息分发给参与集群的所有进程。有关该文件的详细说明,参阅这里 —— https://dev.mysql.com/doc/refman/8.4/en/mysql-cluster-config-example.html#mysql-cluster-config-ini-sections

您可以将该文件存放在任意的位置,稍后启动进程时指定该文件即可。

原先,为了快速测试与启动,管理节点的 config.ini 是这样配置的(ini 文件的注释以行开头的 "#" 为标准,实际的文件内容应该将这些非标准的注释行删除,在这里只是为了方便读者阅读):

Shell > vim /etc/mysql-cluster/config.ini
[ndbd default]
# 影响所有数据节点上 ndbd 进程的选项(键值对):
NoOfReplicas=2    # 段副本的数量。数据节点的数量除以该值得到的必须是整数。当前数据节点的数量是2,2/2=1
DataMemory=98M    # 要为数据存储分配多少内存,分配多少内存取决于物理内存的多少。值范围 1M~16T

[ndb_mgmd]
# 管理节点的选项(键值对):
HostName=192.168.100.10         # 管理节点的主机名或 IP 地址
DataDir=/var/log/mysql-cluster  # 该管理节点存放数据文件的目录

[ndbd]
# 每个数据节点都有一个 [ndbd]
HostName=192.168.100.12         # 主机名 或 IP地址
NodeId=2                        # 节点 ID 号,值范围 1~144,必须是唯一的
DataDir=/usr/local/mysql/data   # 该数据节点存放数据文件的目录

[ndbd]
HostName=192.168.100.14
NodeId=3
DataDir=/usr/local/mysql/data  # 该数据节点存放数据文件的目录

[mysqld]
# SQL节点 选项:
HostName=192.168.100.16        # 主机名 或 IP 地址

推荐的配置

官方给出了一个最佳性能的示例,当然,集群环境的最佳性能取决于:

  • NDB Cluster 的软件版本
  • 数据节点数量和 SQL 节点数量
  • 硬件
  • 操作系统
  • 存储的数据量
  • 集群环境所能承受的负载大小与类型
提示
获得最佳的性能配置是一个持续不断迭代的过程,不可能适用于所有的使用场景。
# 管理节点的默认全局参数
[ndb_mgmd default]
DataDir=/var/log/mysql-cluster # 可以为每个管理节点使用不同的数据目录,但为了便于管理,数据目录的位置最好一致。

# 每个管理节点都需要有一个 [ndb_mgmd]
[ndb_mgmd]
HostName=172.16.100.11
NodeId=1

# 官方的示例中拥有两个管理节点
[ndb_mgmd]
HostName=172.16.100.12
NodeId=2

# 数据节点的默认全局参数
[ndbd default]
NoOfReplicas=2                # 片段副本的数量,只使用一个片段副本不会提供任何冗余,在 NDB Cluster 8 中,尽管可以使用 2 个以上的片段副本,但其实 2 个片段副本已经完全足够提供高可用性
LockPagesInMainMemory=1       # 将数据节点的进程锁定到内存当中,锁定后就不能与物理磁盘进行数据页的交换,这可以用来帮助保证集群的实时特性。设置值为 0,表示禁用锁定,这是默认值;设置值为1,表示为进程分配内存后执行锁定;设置值为 2,表示为进程分配内存前执行锁定。
DataMemory=3456M              # 数据在内存当中的大小。因为 NDB 存储引擎是一种内存集群存储引擎,因此需要将所有的数据(包含索引)加载到内存当中。假设每个数据节点的物理内存为 4GB,则推荐的值为3456M。通常情况下,该值为可用物理内存的 80%~85%
ODirect=1                     # 启用该参数,则 NDB Cluster 会尝试对本地的检查点和 undo log 使用 O_DIRECT 写入,这可以减少 CPU 的负载。
NoOfFragmentLogFiles=300      # 设置 redo log 的数量。单组 redo log 由 4 个 16MB 的文件组成,即单组 redo log 占用 64MB 的总大小。设置为 300,即 300 组 redo log,共占用 19200MB
DataDir=/usr/local/mysql/data        # 数据节点的数据目录。建议所有的数据节点都使用相同的数据目录,这样便于统一管理
MaxNoOfConcurrentOperations=100000   # 根据事务的大小与数量合理设置该值。例如您有四个数据节点,预期是要使用事务处理一百万并发更新,则此处的值设置为 1000000/4=250000。每条更新的记录大约消耗 1KB 内存
SchedulerSpinTimer=400               # 线程休眠前在调度器中的执行时间(单位为微秒)。
SchedulerExecutionTimer=100          # 指定线程在发送前在调度器中的执行时间(单位为微秒)。设置为 0,可使响应时间减少到最低。您可以增加该参数值,以牺牲响应时间为代价,实现更高的吞吐量
RealTimeScheduler=1                  # 是否启用数据节点线程的实时调度
TimeBetweenGlobalCheckpoints=1000    # 全局检查点(Global Checkpoint, GCP)之间的时间间隔,以毫秒为单位,其主要是为了满足事务提交的 "持久性"(ACID 特性中的 D)。
TimeBetweenEpochs=200                # 一项非常核心的参数,是实现‌分布式事务一致性‌与‌故障检测‌的底层心跳机制。其定义了‌节点间心跳与事务 epoch 同步的最小时间间隔(单位:毫秒)。所谓事务 epoch ,简单来说就是分布式系统的 "时间戳" 或 "时间锚点"。在 NDB Cluster 中,每个 epoch 是一个全局递增的事务序列号,由管理节点广播给所有数据节点。节点通过 epoch 同步确认 "哪些事务已提交、哪些未提交"。当一个事务在某个数据节点提交后,它不会立即被视作 "全局完成",而是等待管理节点将该事务打包进一个 epoch,并广播给所有节点。只有当‌所有节点都确认收到并处理了该 epoch 中的事务‌,这个 epoch 才被视为 "完成"。
RedoBuffer=32M                       # 设置写入到 redo log 缓冲区的大小。如果设置过小,则 NDB 存储引擎会出现 1221 错误 —— "REDO log buffers overloaded"
MaxNoOfTables=1024                   # 非常关键的参数之一,在 NDB Cluster 中,每个表和每个唯一哈希索引都会分配一个表对象(Table Object),而这个参数定义了集群中允许存在的最大表对象数量。每个表对象占用的内存大小大约为 20KB。默认值为 ‌128,在生产环境中极容易触发限制。需要注意!变更此参数的值后,您必须完全重启整个集群才能生效
MaxNoOfOrderedIndexes=256            # 控制 NDB Cluster 中允许存在的有序索引对象总数的上限。每一个有序索引(ORDERED INDEX),无论是普通 B-tree 索引、复合索引,还是外键索引,都会在集群中分配一个独立的索引对象‌,并占用 MaxNoOfOrderedIndexes 的配额。同样的,变更此参数的值后,您必须完全重启整个集群才能生效

# 每个数据节点都需要有一个 [ndbd]
[ndbd]
HostName=172.30.100.13
NodeId=3

[ndbd]
HostName=172.30.100.14
NodeId=4

# 每个 SQL 节点都需要有一个 [mysqld]
[mysqld]                            
HostName=172.16.100.15
NodeId=5

Q & A

Q:既然有两个管理节点,那么 SQL 节点与数据节点的 /etc/my.cnf 怎么配置呢?

Shell > vim /etc/my.cnf
[mysqld]
ndbcluster

[mysql_cluster]
ndb-connectstring=172.16.100.11,172.16.100.12

Q:若部署超大型的 MySQL NDB Cluster 集群环境,是否有机器数量的限制?

有。因为节点 ID 的范围为 [1,144],若每台机器只运行一个进程,则最多支持 144 台机器部署 MySQL NDB Cluster。

Q:一个管理节点就需要对应一个 config.ini 文件,那么是否是说,所有管理节点的 config.ini 文件内容必须都是一样的?

是的。

Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇