使用memcached可以轻松地访问NDB Cluster

考虑到明年可能会发布1TB以上的内存(NVDIMM-F),我们来讨论一下内存数据库的话题。

请查看Oracle官方员工提供的资料,以了解有关NDB Cluster的说明。
该内存数据库之前被称为MySQL Cluster,
但随着InnoDB Cluster的发布,它的名称改为了NDB Cluster。
在日本几乎没有得到支持,因此很少被使用,
但在中国,许多人在没有得到支持的情况下使用它。

目前版本是7.5版本已经发布了一年多。
7.6版本预计在明年上半年发布。
NDB Cluster容易被误解,
但可以存储数据到SSD(性能是1/10),
并可以通过Memcache API在memcached中访问。
今天我将写关于后者的内容。

使用本地的中文进行同义改写:

手册

很遗憾,关于Memcache API只有英文手册。
https://dev.mysql.com/doc/ndbapi/en/ndbmemcache.html
关于NDB Cluster本身的配置等,有日语手册,稍后会提及。

安装准备

虚拟机需要两个SQL节点和两个数据节点,并且MGMT在SQL节点上。最少需要4台虚拟机。
由于Docker不太可能在K8s或无服务容器中部署NDB Cluster生产环境,所以没有太多意义。
在Docker中创建网络热点是不建议的。

安装文档
日文档
https://dev.mysql.com/doc/refman/5.6/ja/mysql-cluster-install-linux.html
英文档
https://dev.mysql.com/doc/refman/5.7/en/mysql-cluster-install-linux.html
虽然这些文档中提到了MySQL的安装方法,但我认为熟悉MySQL的人会注意到有更简便的方法。
可以通过apt或yum注册存储库并安装NDB Cluster。

Debian/Ubuntu系
https://dev.mysql.com/downloads/repo/apt/ でバージョンを確認し
sudo su
VER=0.8.9-1
wget https://dev.mysql.com/get/mysql-apt-config_${VER}_all.deb
dpkg -i mysql-apt-config_${VER}_all.deb
exit

Oracle Linux/RHEL系
https://dev.mysql.com/downloads/repo/yum/ でバージョンを確認し
wget https://dev.mysql.com/get/mysql57-community-release-xxx-xx.noarch.rpm
yum -y install mysql57-community-release-xxx-xx.noarch.rpm

在选择哪个操作系统时,我认为应该选择支持广泛并且受支持的Oracle Linux/RHEL系。可以通过查看此链接https://www.mysql.com/jp/support/supportedplatforms/cluster.html了解相关支持信息。但是,我知道新的内核可以提高性能,而且大家也都知道我不会写RHEL系的文章,所以这次我将在Ubuntu16.04上进行构建。

Clipboard02.png

安装

[全台]
使用sudo apt-get update命令进行更新
确认在软件包列表中是否有反映
使用sudo apt-cache search mysql命令并使用grep ^mysql-cluster筛选结果

[mysql1][manager]
sudo apt-get -y 安装 mysql-cluster-community-server
sudo apt-get -y 安装 mysql-cluster-community-memcached(仅在使用 Memcache API 时)
sudo apt-get -y 安装 mysql-cluster-community-management-server

[mysql2]
sudo apt-get -y 安装 mysql 集群社区服务器
sudo apt-get -y 安装 mysql 集群社区 memcached(仅用于 Memcache API)

[data1]
使用命令行运行以下指令以安装MySQL集群社区版数据节点:
sudo apt-get -y install mysql-cluster-community-data-node

安装 mysql-cluster-community-data-node 数据节点:sudo apt-get -y install mysql-cluster-community-data-node。

配置

首先是设置管理服务器。
由于没有样本配置文件之类的东西,所以需要新建。
使用sudo命令创建目录/var/lib/mysql-cluster。
使用sudo vi命令打开/var/lib/mysql-cluster/config.ini文件。

[ndb_mgmd]
DataDir = /home/mysql/mysqlc/data/mgmd/
HostName = 10.146.0.1

[ndbd default]
NoOfReplicas                  = 2
DataMemory                    = 2048M
IndexMemory                   = 512M
ODirect                       = true

[ndb_mgmd]
NodeId=1
HostName=10.146.0.2

[ndbd]
NodeId=4
HostName=10.146.0.4
DataDir= /var/lib/mysql-cluster

[ndbd]
NodeId=5
HostName=10.146.0.5
DataDir= /var/lib/mysql-cluster

[mysqld]
NodeID=2
HostName=10.146.0.2

[mysqld]
NodeID=3
HostName=10.146.0.3

[api]
NodeID=6

[api]
NodeID=7

[api]
NodeID=8

[mysqld][api]这两个部分的含义相同,但在这次中我有意将它们分开写。
[mysqld][api]由于根据配置的不同可能会被频繁使用,建议保留一些余地可能会更好。

启动管理节点并注意事项

以下是对 [ndb_mgmd] 设定的服务器进行的设置:
通过以下命令启动:sudo ndb_mgmd –initial –ndb-nodeid=1 –config-file=/var/lib/mysql-cluster/config.ini
然后通过以下命令显示:sudo ndb_mgm -c 127.0.0.1:1186 -e show

Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=7 (not connected, accepting connect from 10.146.0.7)
id=8 (not connected, accepting connect from 10.146.0.8)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @10.146.0.2  (mysql-5.7.20 ndb-7.5.8)

[mysqld(API)]   4 node(s)
id=2 (not connected, accepting connect from 10.146.0.2)
id=3 (not connected, accepting connect from 10.146.0.3)
id=5 (not connected, accepting connect from any host)
id=6 (not connected, accepting connect from any host)
id=8 (not connected, accepting connect from any host)

以以下方式在中文中表达:
显示为该方式。
停止使用sudo ndb_mgm -e “1 STOP”
需要注意的是,配置文件已被缓存,
因此在停止后需要使用sudo ndb_mgmd –config-file=/var/lib/mysql-cluster/config.ini –reload
重新加载选项。

启动SQL节点

这是针对通过[mysqld]指定的服务器的设置,请运行以下命令:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
log-error       = /var/log/mysql/error.log
# By default we only accept connections from localhost
# Disabling symbolic-links is recommended to prevent assorted security risks
ndbcluster
ndb_use_exact_count             = 0
ndb_index_stat_enable           = 0
ndb_force_send                  = 1
ndb_log_update_as_write         = OFF
optimizer_switch                = "engine_condition_pushdown=on"
transaction_isolation           = REPEATABLE-READ
explicit_defaults_for_timestamp = ON
default_storage_engine          = InnoDB
sql_mode                        = NO_ENGINE_SUBSTITUTION
max_connections                 = 1000

ndb-connectstring = 10.146.0.2:1186

sudo /etc/init.d/mysqld start – 用sudo命令启动/etc/init.d/mysqld
mysql -uroot -p でログインします。 – 使用mysql -uroot -p命令进行登录。

启动数据节点

这是针对使用[ndbd]指定的服务器的设置,我们将在服务器上使用nodeid进行执行。
sudo mkdir /var/lib/mysql-cluster
sudo ndbd –initial –ndb-nodeid=4 –ndb-connectstring=10.146.0.2:1186
sudo ndbd –initial –ndb-nodeid=5 –ndb-connectstring=10.146.0.2:1186
应该会创建/var/lib/mysql-cluster/目录和文件。
ls -l /var/lib/mysql-cluster/

确认连接

通过运行命令sudo ndb_mgm -c 127.0.0.1:1186 -e show,确认已经识别了设置的5台服务器。

Connected to Management Server at: 127.0.0.1:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=4    @10.146.0.4  (mysql-5.7.20 ndb-7.5.8, Nodegroup: 0, *)
id=5    @10.146.0.5  (mysql-5.7.20 ndb-7.5.8, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @10.146.0.2  (mysql-5.7.20 ndb-7.5.8)

[mysqld(API)]   5 node(s)
id=2    @10.146.0.2  (mysql-5.7.20 ndb-7.5.8)
id=3    @10.146.0.3  (mysql-5.7.20 ndb-7.5.8)
id=6 (not connected, accepting connect from any host)
id=7 (not connected, accepting connect from any host)
id=8 (not connected, accepting connect from any host)

启动Memcache API

确认 ndb_memcache_metadata.sql 文件。
ls -l /usr/share/mysql/memcache-api/ndb_memcache_metadata.sql
从 SQL 节点导入配置文件。
cat /usr/share/mysql/memcache-api/ndb_memcache_metadata.sql | mysql -uroot -p
为了确认,从另一个 SQL 节点进行检查。
mysql -uroot -p -e “SELECT * FROM ndbmemcache.containers”
在每个 SQL 节点上启动 Memcache API。
memcached -E /usr/lib/x86_64-linux-gnu/ndb_engine.so -e “connectstring=10.146.0.2:1186” &

确认连接

从命令执行结果可以看出,[api]被使用了。
对于“空きapiスロット”这个词的意思,一开始我不太理解,遇到了些困难。
将一个[api]保留下来是因为在某个地方我记得它还可以用于备份之用。

使用以下命令在本地查看sudo ndb_mgm -c 127.0.0.1:1186 -e show的内容。

Connected to Management Server at: 127.0.0.1:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=4    @10.146.0.4  (mysql-5.7.20 ndb-7.5.8, Nodegroup: 0, *)
id=5    @10.146.0.5  (mysql-5.7.20 ndb-7.5.8, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @10.146.0.2  (mysql-5.7.20 ndb-7.5.8)

[mysqld(API)]   5 node(s)
id=2    @10.146.0.2  (mysql-5.7.20 ndb-7.5.8)
id=3    @10.146.0.3  (mysql-5.7.20 ndb-7.5.8)
id=6    @10.146.0.2  (mysql-5.7.20 ndb-7.5.8)
id=7    @10.146.0.3  (mysql-5.7.20 ndb-7.5.8)
id=8 (not connected, accepting connect from any host)

在中文中以本地方式释义以下内容,仅需要一个选项:
通过以下命令查看活动网络连接:sudo netstat -natp | grep 11211

tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      4917/memcached
tcp6       0      0 :::11211                :::*                    LISTEN      4917/memcached

你可以确认一下memcached是否已经启动。

基準测试

我們可以直接將數據放入memcached,但為了更容易與普通的memcached進行比較,我們將使用Higepon的博客中提到的工具進行基準測試。

wget https://github.com/downloads/higepon/mcbench/mcbench-0.0.1.tar.gz
tar zxvf mcbench-0.0.1.tar.gz
cd mcbench-0.0.1
sudo apt-get -y install make gcc erlang
sudo make
cd scripts
./mcbench -b 10000 -t 10 -n 1000 -s 127.0.0.1 -p 11211 -c get
データが格納されていることを確認します。
mysql -uroot -p -e "SELECT * FROM ndbmemcache.demo_table"

备份

备份可以在指定的时间进行。
似乎不会自动将其写入磁盘。
有两种方法,但我认为使用mysqldump来备份更简单。
mysqldump -h127.0.0.1 -uroot -p ndbmemcache > dump.sql
less dump.sql

请在MySQL5.6的日文手册中查看。

NDB Cluster 7.4 直到现在都已经本地化成日语了,所以请不用担心地阅读和操作。
https://dev.mysql.com/doc/refman/5.6/ja/mysql-cluster-config-example.html
https://dev.mysql.com/doc/refman/5.6/ja/mysql-cluster-system-variables.html
虽然你可能会认为 7.5 是英文的,但是有关重要的更新参数仅限于 SQL 节点上的 ndb_read_backup 和 ndb_fully_replicated 这两个,其他的可以通过日本语资料解决。

结束

那么,你对此有什么看法呢?
这次我们在GCP上进行了搭建,虽然至少需要4台机器,但是相比MySQL被认为比较困难的NDB Cluster作为memcached似乎更容易使用。
当然,它也可以作为普通的NDB Cluster运行,可以通过MySQL进行访问,并可以进行5.7兼容的join等操作(性能比纯MySQL差)。
而且,手册中写明了每台机器可以达到50000TPS的指标,这也很有帮助。

我在突发奇想下选择了Memcache API,但是只有由yoku0825撰写的日语资料,使得我遇到了困难。

虽然这是一项特定需求,但在广告技术领域中并不是完全没有需求吧。
如果NDB Cluster能够在NVDIMM-F上重启时保留数据,需求可能会扩大。 (如果NVDIMM-F上NDB Cluster重启时可以保留数据,需求可能会扩大。)

对不起

当初我曾经写道,通过Memcache API写入的数据会被持久化,但在验证时发现并没有被持久化。替代无用的复制功能的是正确的选择。然而,NDB Cluster也遵循相同的限制条件,对此感到非常惊讶,也提供了很大的学习机会。

广告
将在 10 秒后关闭
bannerAds