mysql-cluster很早就有,以前用过,各种问题不断弃用了。
已经很久远了,近期又关注了一下,cluster版本已经有了很大的改进,于是又来尝试一下。
截至2018/11/6,mysql-cluster最新稳定版本为7.6.8
因为安装后发现有一个高级的功能尚未支持(后续说明),于是我果断又取了开发版本MySQL Cluster 8.0.13 ,又玩了一遍,遗憾的是仍然还未支持~~
Linux主机两个
远程机windows(auto-installer可以通过web-ui方式远程配置集群,这个服务有msi安装版,也可以从linux运行服务。总之操作时是通过浏览器界面进行)
官网下载linux版本包:mysql-cluster-community-7.6.8-1.el6.x86_64.rpm-bundle.tar
Windows MSI Installer:mysql-cluster-8.0.13-dmr-winx64.msi(这个装了之后可以直接从windows启动web服务,不装也可以通过安装上面的linux包中的服务运行python启动文件开启web服务。这个方便运行installer)
各linux上先进行以下安装
查看已安装的mysql服务
rpm -qa|grep mysql
卸载旧mysql(上面返回的名称)
rpm -e --nodeps mysql-libs-5.1.71-1.el6.x86_64
解压安装包
tar -xvf mysql-cluster-community-7.6.8-1.el6.x86_64.rpm-bundle.tar
安装依赖
yum install libaio perl perl-Time-HiRes numactl python-crypto python-paramiko
安装cluster服务
rpm -aivh mysql-cluster-community-server-7.6.8-1.el6.x86_64.rpm mysql-cluster-community-client-7.6.8-1.el6.x86_64.rpm mysql-cluster-community-common-7.6.8-1.el6.x86_64.rpm mysql-cluster-community-libs-7.6.8-1.el6.x86_64.rpm
安装cluster服务
rpm -aivh mysql-cluster-community-data-node-7.6.8-1.el6.x86_64.rpm mysql-cluster-community-embedded-7.6.8-1.el6.x86_64.rpm mysql-cluster-community-management-server-7.6.8-1.el6.x86_64.rpm mysql-cluster-community-memcached-7.6.8-1.el6.x86_64.rpm mysql-cluster-community-ndbclient-7.6.8-1.el6.x86_64.rpm mysql-cluster-community-nodejs-7.6.8-1.el6.x86_64.rpm
开启相关端口3306等,停用防火墙先完成安装测试
service iptables status
service iptables stop
...?复制启动文件,因为启动文件目录只能配置一个,但默认安装路径是多个,可以硬链接到一个文件夹
cp /usr/sbin/ndb_mgmd /usr/bin/
cp /usr/sbin/ndbmtd /usr/bin/
cp /usr/sbin/mysqld /usr/bin/
(后来发现这步骤可能不需要,主要是autoinstall时说找不到相关文件才做此拷贝)
创建用户mysqlcluster(直接用root会有一个报错,默认不允许以root启动)
useradd mysqlcluster
passwd mysqlcluster
以上,Linux上的服务基本安装完毕了。windows下msi安装,都是傻瓜式安装一路下一步即可。
安装好然后,进入安装目录运行setup.bat即可打开web界面。
(此处查看setup.bat脚本,可以看到是通过python运行ndb_setup.py,如果不安装msi可以在linux找到这个文件运行也是同样效果。linux:/usr/bin/ndb_setup.py,如果未找到可通过locate ndb_setup.py找一下,没有locate可以先yum install mlocate,然后执行updatedb更新索引,再locate ndb_setup.py即可找到)
运行setup.bat服务启动后会自动弹开浏览器:
上图默认只会有一个new的选项,后两个是我操作过的记录
输入两个相同的密码,continue一个配置就开始了,提示让输入一个配置的名称,作为下次的记录。
它会在你的用户目录下生成一个.mcc加密文件,另外这个pid是当前web服务运行的文件,如果web服务意外终止而pid未删除的话下次setup.bat启动会提示已有服务在运行,手动删除即可。
继续
host list填写多个服务ip,逗号相连。
application area选择运行在什么环境,三个选项:
simple testing 简单测试
web application 生产环境,会提示占用最大的资源,其它本机服务会被影响
realtime 与上一个配置基本类似,但会对超时更敏感,更快的相应失败,也就是timeout更多心跳频率更高。
(右上角有个help,其实文档说明还是很详细的,不过是全英文,每个页面有单独的说明详细到每个选项)
页面往下滚动一点:
这个厉害了,是安装cluster的选项,可从repo仓库、docker仓库或者both同时。
然而到最后发现当前版本并不支持,就是前面提到拉取开发版本的目的。
不过从规划来看,后续服务器上述操作都可以省略了,通过web方式傻瓜式安装,想想都很给力。
继续
open fw ports 在防火墙中帮你打开需要的端口,之前已经关掉了防火墙,可以忽略。
直接点 [save&next] 按钮
这个页面会解析前页填写的host,远程访问,获取相应状态信息,但bin目录填写的不对,需要自己手动调整到对的位置。数据目录可以自行指定,用来存储数据。此处可单独选择修改每个host的信息,也可以批量修改,但批量会有个bug,host也就是ip会批量成相同的~需要再一个个改回来……
[save&next]
这个界面,布置cluster各服务,api node用于api方式调用的监听服务,不太需要可以都移除。
management节点管理节点,属于中心节点,做各种决策,默认有一个,可以在其它服务器再加一个,挂了可以自动切换。
multi data node多线程数据节点,对应还有一个单线程数据节点,最终存储数据的服务节点。
sql node数据服务节点,实际客户端连接的就是这些节点了,向这个节点发sql如果是cluster的操作会发给中心再并行处理。
[save&next]
这个环节可以对各个服务节点进行详细的配置,点击每个服务,右侧点加号即可修改。每一项都有个“?”,还是很细致的。
注意:小节点与根节点都有配置项,根节点上是一些通用配置。
[save&next]
当前页面进来左侧各服务是齿轮图标,就是还没有启动。
已经是最后的环节了,可以看到[install cluster]是灰色的,开始我以为哪里出错了,调了很久,后发现右上角的help文档中有提及:
不支持你倒是别显示呀……
另外有一个坑,不要轻易刷新页面,随时可能丢失这些配置(虽然前面有保存名称,但……),不过即使丢了你仍可以重新输入正确的配置以找回相同的环境~
继续
[deploy cluster] 自动生成集群的配置
[start cluster]直接启动如果没deploy也会生成配置,并逐一启动服务。
顺利启动后就都是绿灯了。如果红绿灯交替变换,可能是端口没开或网络不畅。
分别连上两个sql节点,此时还没有密码,需要本机连,做一些基本配置。
设置root密码,以及可远程连接
mysql -uroot -h127.0.0.1 -A
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
flush privileges;
# 修改密码(如果你需要)
# update user set password=PASSWORD('123456') where user='root';
设置默认引擎(如果不需要也可以不配置)
当前默认引擎
show variables like '%engine%';
显示支持引擎
show engines;
设置默认ndbcluster
set default_storage_engine=ndbcluster;
set global default_storage_engine=ndbcluster;
引擎配置重启后失效,可修改配置文件 my.cnf
default-storage-engine = ndbcluster
为了便于后续测试,配置请求包最大允许100M
set global max_allowed_packet = 100 * 1024 * 1024
-> my.cnf
max_allowed_packet = 100M
这里my.cnf是installer自动生成的,修改后仍然用installer重启会被覆盖,很坑,于是我改了一下它的源码。
mysql-cluster\share\mcc\frontend\js\mcc\configuration\deploy.js
文件中搜索my.cnf,你会知道在哪加入下列代码的
// slzs 增加配置
addln(configFile, "default-storage-engine=ndbcluster"); // 默认cluster引擎
addln(configFile, "max_allowed_packet=100M"); // 单次请求包最大允许100M
此时已经可以通过客户端工具直接连接数据库了
创建两个连接,分别连两个sql节点
在174上创建一个数据库,刷新176,可以看到同步创建了数据库
建表测试
-> 在174创建一个InnoDB引擎的表test_innodb
=> 在176中没有同步生成
-> 在174中创建一个ndbcluster引擎的表test_cluster
=> 在176中刷新,发现表同步创建
-> 向test_cluster写入数据
=> 任意节点操作可互相同步
-> 在176中修改test_cluster引擎为innodb
=> 174中表被删除,176中表更新为innodb,数据未丢失
-> 再修改test_cluster引擎为ndbcluster
=> 174表恢复了,此处发现默认排序发生了变化,应该是完全同步了176中的默认排序,之前两个表的默认排序不同,与写入与同步顺序有关
支持多种引擎,其它引擎表仍然是单机操作,在应用时可以只连接一台作为主机,同时享受各种引擎便利又可享受cluster自动分片功能,缺点就是牺牲了部分集群特性,负载均衡、宕机切换等。
如果统一用ndbcluster引擎,则牺牲其它引擎的特性,行数据尺寸受限、事物级别READ COMMITTED等。
行数据尺寸这部分会在表设计时约束,比如varchar(2000),会检查各字段定义max的相加的总和进行约束限制,而不是插入数据时异常。
实际应用测试一下。