利用MySQL Cluster 7.0 + LVS 搭建高可用环境
目录:
1、前言
随着数据量规模的扩大,企业对 MySQL 的要求就不仅仅是能用了,也在寻求各种高可用方案。以前我们的大部分高可用方案其实还存在一定缺陷,例如 MySQL Replication 方案,Master 是否存活检测需要一定时间,而和 Slave 的切换也需要时间,因此其高可用程度较大依赖监控软件或自动化管理工具。而早先的 MySQL Cluster 实在不能令人满意,性能差的不行,也让我们的期待一次次落空。本次 MySQL Cluster 7.0 的推出,终于实现了质的飞跃,性能上得到了很大提高。MySQL Cluster 7.0 新特性主要体现在以下几个方面:
- 数据节点多线程
- 可以在线增加节点
- 大记录存取改进
- 支持windows平台
本身MySQL Cluster已经实现了高可用,不过由于SQL节点无法对外部负载均衡,因此我们采用 LVS 来实现这一需求。
2、安装
内核:2.6.9-78.0.17.ELsmp 硬件:DELL 2950, 146G 15K RPM SAS * 6(raid 1+0), 8G Ram
各个节点描述:
IP | 描述 |
192.168.0.2 | ndb mgm node |
192.168.0.3 | data node1, sql node 1, LVS DR Server |
192.168.0.4 | data node2, sql node 2 |
192.168.0.5 | data node3, sql node 3 |
192.168.0.6 | data node4, sql node 4 |
192.168.0.7 | sql node 5 |
192.168.0.8 | sql node 6 |
192.168.0.9 | sql node 7 |
192.168.0.10 | sql node 8 |
是这样安排这些服务器的,192.168.0.2 作为 MySQL Cluster 的管理节点,2 ~ 6 既做数据节点(DATA node),也做SQL节点(SQL node),7 ~ 10 也做SQL节点。LVS采用 VS/DR 的模式,因此把 192.168.0.2 也同时作为 LVS 的 DR Server。
分配好机器,接下来就是安装响应的软件包了。
2.1 LVS 安装、配置
老实说,我对LVS并不十分在行,以前折腾过一次,差点快崩溃了,后来才发现是我下载的版本太高了,没想到这次也是这样 :(,白折腾了1天。其实过程比较简单,只要下载的版本能对的上就快了。
在这里,我下载的是源码rpm包,因此需要用rpmbuild编译一次。
[yejr@imysql.cn ~]# rpm -ivhU ~/kernel-2.6.9-78.0.17.EL.src.rpm [yejr@imysql.cn ~]# cd /usr/src/redhat/SPECS [yejr@imysql.cn ~]# rpmbuild -bp kernel-2.6.spec #解开源码包,打上各种pache [yejr@imysql.cn ~]# rpm -ivhU ~/ipvsadm-1.24-5.src.rpm #安装ipvsadm的源码包 [yejr@imysql.cn SPECS]# ls ipvsadm.spec kernel-2.6.spec #需要做一下链接,编译ipvsadm时用得着 [yejr@imysql.cn SPECS]# ln -s /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9 /usr/src/linux [yejr@imysql.cn SPECS]# rpm -bb ipvsadm.spec #编译出ipvsadm的rpm包 [yejr@imysql.cn SPECS]# ls -l /usr/src/redhat/RPMS/x86_64/ total 36 -rw-r--r-- 1 root root 30941 May 4 18:06 ipvsadm-1.24-5.x86_64.rpm -rw-r--r-- 1 root root 2968 May 4 18:06 ipvsadm-debuginfo-1.24-5.x86_64.rpm [yejr@imysql.cn ~]# rpm -ivhU /usr/src/redhat/RPMS/x86_64/ipvsadm-1.24-5.x86_64.rpm
看到了吧,其实很简单。网上的有些资料说要把 ipvsadm.spec 中的 Copyright 这个 Tag 改成 License,可能是因为版本较老,我用的这个版本就不需要这样。
接下来就是加载 ip_vs 模块,然后开始做 LVS DR 转发了。
[yejr@imysql.cn ~]# /sbin/modprobe ip_vs [yejr@imysql.cn ~]# lsmod | grep ip_vs ip_vs 103169 3 ip_vs_rr
直接编辑 /etc/sysconfig/ipvsadm 文件:
[yejr@imysql.cn ~]# cat /etc/sysconfig/ipvsadm -C -A -t lvs_vip:mysql -s rr -a -t lvs_vip:mysql -r ndb_data_node_1:mysql -g -w 1 -a -t lvs_vip:mysql -r ndb_data_node_2:mysql -g -w 1 -a -t lvs_vip:mysql -r ndb_data_node_3:mysql -g -w 1 -a -t lvs_vip:mysql -r ndb_data_node_4:mysql -g -w 1 -a -t lvs_vip:mysql -r ndb_sql_node_1:mysql -g -w 1 -a -t lvs_vip:mysql -r ndb_sql_node_2:mysql -g -w 1 -a -t lvs_vip:mysql -r ndb_sql_node_3:mysql -g -w 1 -a -t lvs_vip:mysql -r ndb_sql_node_4:mysql -g -w 1
保存退出。上面显示的是 hostname 的格式,因为我都在 /etc/hosts 里设置各自对应的 hostname 了。
然后就是在 DR Server 上绑定 vip,然后打开 ip_forward,启动 ipvsadm,LVS 就可以开始工作了。
[yejr@imysql.cn ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #修改内核,打开转发 [yejr@imysql.cn ~]# /sbin/ifconfig eth0:0 192.168.0.11 netmask 255.255.255.0 #绑定vip [yejr@imysql.cn ~]# /etc/init.d/ipvsadm start #启动ipvsadm [yejr@imysql.cn ~]# ipvsadm -L #查看列表 ipvsadm -L IP Virtual Server version 1.2.0 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP lvs_vip:mysql rr -> gs_ndb_sql_node_1:mysql Route 1 0 0 -> gs_ndb_sql_node_2:mysql Route 1 0 0 -> gs_ndb_sql_node_3:mysql Route 1 0 0 -> gs_ndb_sql_node_4:mysql Route 1 0 0 -> gs_ndb_data_node_1:mysql Route 1 0 0 -> gs_ndb_data_node_2:mysql Route 1 0 0 -> gs_ndb_data_node_3:mysql Route 1 0 0 -> gs_ndb_data_node_4:mysql Route 1 0 0 [yejr@imysql.cn ~]# lsmod | ip_vs #查看已加载模块 lsmod | grep ip_vs ip_vs_rr 3649 1 ip_vs 103169 3 ip_vs_rr
DR Server 上设置完后,再在 Real Server 上绑定 vip,然后测试,没问题的话,就可以用了。
[yejr@imysql.cn ~]# /sbin/ifconfig lo:0 192.168.0.11 netmask 255.255.255.255 broadcast 192.168.0.11 #设定noarp [yejr@imysql.cn ~]# echo '2' > /proc/sys/net/ipv4/conf/lo/arp_announce;echo '1' > /proc/sys/net/ipv4/conf/lo/arp_ignore;echo '2' > /proc/sys/net/ipv4/conf/all/arp_announce;echo '1' > /proc/sys/net/ipv4/conf/all/arp_ignore
2.2 MySQL Cluster安装
MySQL Cluster的安装重点在于管理节点的配置文件,只要把配置文件设置好了,其他的就很快了。我在这里是直接用 rpm 包安装的,因为下载整个预编译好的 tar.gz 文件实在太大了,这点上 MySQL 是越来越臃肿了 :(
[yejr@imysql.cn ~]# cat /home/mysql/config.ini [TCP DEFAULT] SendBufferMemory=2M ReceiveBufferMemory=2M [NDB_MGMD DEFAULT] PortNumber=1186 Datadir=/home/mysql/ [NDB_MGMD] id=1 Datadir=/home/mysql/ Hostname=192.168.0.2 [NDBD DEFAULT] NoOfReplicas=2 Datadir=/home/mysql/ DataMemory=2048M IndexMemory=1024M LockPagesInMainMemory=1 MaxNoOfConcurrentOperations=100000 StringMemory=25 MaxNoOfTables=4096 MaxNoOfOrderedIndexes=2048 MaxNoOfUniqueHashIndexes=512 MaxNoOfAttributes=24576 DiskCheckpointSpeedInRestart=100M FragmentLogFileSize=256M InitFragmentLogFiles=FULL NoOfFragmentLogFiles=6 RedoBuffer=32M TimeBetweenLocalCheckpoints=20 TimeBetweenGlobalCheckpoints=1000 TimeBetweenEpochs=100 MemReportFrequency=30 BackupReportFrequency=10 ### Params for setting logging LogLevelStartup=15 LogLevelShutdown=15 LogLevelCheckpoint=8 LogLevelNodeRestart=15 ### Params for increasing Disk throughput BackupMaxWriteSize=1M BackupDataBufferSize=16M BackupLogBufferSize=4M BackupMemory=20M #Reports indicates that odirect=1 can cause io errors (os err code 5) on some systems. You must test. #ODirect=1 ### Watchdog TimeBetweenWatchdogCheckInitial=30000 ### TransactionInactiveTimeout - should be enabled in Production #TransactionInactiveTimeout=30000 ### CGE 6.3 - REALTIME EXTENSIONS #RealTimeScheduler=1 #SchedulerExecutionTimer=80 #SchedulerSpinTimer=40 ### DISK DATA #SharedGlobalMemory=384M #read my blog how to set this: #DiskPageBufferMemory=3072M ### Multithreading MaxNoOfExecutionThreads=8 [NDBD] id=2 Datadir=/home/mysql/ Hostname=192.168.221.3 #LockExecuteThreadToCPU=X #LockMaintThreadsToCPU=Y [NDBD] id=3 Datadir=/home/mysql/ Hostname=192.168.0.4 #LockExecuteThreadToCPU=X #LockMaintThreadsToCPU=Y [NDBD] id=4 Datadir=/home/mysql/ Hostname=192.168.0.5 #LockExecuteThreadToCPU=X #LockMaintThreadsToCPU=Y [NDBD] id=5 Datadir=/home/mysql/ Hostname=192.168.0.6 #LockExecuteThreadToCPU=X #LockMaintThreadsToCPU=Y [MYSQLD] id=6 Hostname=192.168.0.3 [MYSQLD] id=7 Hostname=192.168.0.4 [MYSQLD] id=8 Hostname=192.168.0.5 [MYSQLD] id=9 Hostname=192.168.0.6 [MYSQLD] id=10 Hostname=192.168.0.7 [MYSQLD] id=11 Hostname=192.168.0.8 [MYSQLD] id=12 Hostname=192.168.0.9 [MYSQLD] id=13 Hostname=192.168.0.10
然后启动 ndb_mgmd 进程:
[yejr@imysql.cn ~]# /usr/sbin/ndb_mgmd -f /home/mysql/config.ini --configdir=/home/mysql/
如果是修改了配置文件里的某些参数,则需要先关闭 ndb_mgmd 进程,然后重新启动,不过必须加上 --reload 选项,因为 7.0 版本中,会把配置文件放在 cache 里,如果不注意到这点,可能会被搞得莫名其妙的。
[yejr@imysql.cn ~]# /usr/sbin/ndb_mgmd -f /home/mysql/config.ini --configdir=/home/mysql/ --reload
然后在数据节点上启动 ndbd 进程:
[yejr@imysql.cn ~]# /usr/sbin/ndbd --initial
首次启动,需要加上 --initial 选项,其后的启动后就不需要了。
最后,修改SQL节点上的配置文件 my.cnf,然后启动 mysqld 进程:
[yejr@imysql.cn ~]# cat /etc/my.cnf #my.cnf [mysql_cluster] ndb-connectstring="192.168.0.2:1186" [MYSQLD] ...... ndb-cluster-connection-pool=1 ndbcluster ndb-connectstring="192.168.0.2:1186" ndb-force-send=1 ndb-use-exact-count=0 ndb-extra-logging=1 ndb-autoincrement-prefetch-sz=256 engine-condition-pushdown=1 ...... [yejr@imysql.cn ~]# /etc/init.d/mysql start [yejr@imysql.cn ~]# mysqladmin pr +------+-------------+-----------+----+---------+------+-----------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +------+-------------+-----------+----+---------+------+-----------------------------------+------------------+ | 1 | system user | | | Daemon | 0 | Waiting for event from ndbcluster | | | 1579 | root | localhost | | Query | 0 | | show processlist | +------+-------------+-----------+----+---------+------+-----------------------------------+------------------+
在管理节点上看下 cluster 的状态:
[yejr@imysql.cn ~]# ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 4 node(s) id=2 @192.168.0.3 (mysql-5.1.32 ndb-7.0.5, Nodegroup: 0, Master) id=3 @192.168.0.4 (mysql-5.1.32 ndb-7.0.5, Nodegroup: 0) id=4 @192.168.0.5 (mysql-5.1.32 ndb-7.0.5, Nodegroup: 1) id=5 @192.168.0.6 (mysql-5.1.32 ndb-7.0.5, Nodegroup: 1) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.2 (mysql-5.1.32 ndb-7.0.5) [mysqld(API)] 10 node(s) id=6 @192.168.0.3 (mysql-5.1.32 ndb-7.0.5) id=7 @192.168.0.4 (mysql-5.1.32 ndb-7.0.5) id=8 @192.168.0.5 (mysql-5.1.32 ndb-7.0.5) id=9 @192.168.0.6 (mysql-5.1.32 ndb-7.0.5) id=10 @192.168.0.7 (mysql-5.1.32 ndb-7.0.5) id=13 @192.168.0.8 (mysql-5.1.32 ndb-7.0.5) id=14 @192.168.0.9 (mysql-5.1.32 ndb-7.0.5) id=15 @192.168.0.10 (mysql-5.1.32 ndb-7.0.5) ndb_mgm> exit
可以看到,一切正常。
3、测试
我们主要进行一下对比测试,看看新版本的 ndbcluster 引擎相对 MyISAM 和 InnoDB 到底区别多大。
3.1 mysqlslap测试结果
纵坐标是总共运行时间。
mysqlslap完整执行参数类似下面:
mysqlslap -hlocalhost -uroot --engine=myisam --auto-generate-sql-write-number=100000 --auto-generate-sql-guid-primary \ --concurrency=50,100,200 --number-of-queries=500000 --iterations=2 --number-char-cols=10 --number-int-cols=10 \ --auto-generate-sql --create-schema=ndb --auto-generate-sql-load-type=mixed
3.2 sysbench测试结果
纵坐标是每秒运行的事务数。
sysbench完整执行参数类似下面:
sysbench --mysql-user=root --test=oltp --mysql-host=localhost --oltp-test-mode=complex \ --mysql-table-engine=ndbcluster --oltp-table-size=10000000 --mysql-db=ndb --oltp-table-name=mdb_1kw \ --num-threads=200 --max-requests=500000 run
从上面的测试结果我们也可以看到,单独的mysqld实例下,MyISAM适合并发很小的业务,InnoDB适合类似连接池模式下的高并发业务,不适合非常大并发的情景,而采用了LVS后的ndbcluster则是真正的适合高并发环境,尽管其性能相对InnoDB来说不是太好,不过比以往版本也已经提升了很多,用于正式生产环境的时候真是指日可待了。
评论
大头刚 (未验证)
周三, 2009/05/13 - 17:56
Permalink
--mysql-host=localhost 测试
--mysql-host=localhost
测试在本机的话,通过LVS的响应肯定没有单机快,因为通过LVS已经转发了1次。
建议另外找一台测试机。
yejr
周三, 2009/05/13 - 18:55
Permalink
测试lvs时,是在其他l
测试lvs时,是在其他lvs环境外的机器上发起请求的,并非在本机发起。上面的2个只是例子,只需重点关注数据量、并发量、查询请求次数这几个。
MySQL方案、培训、支持
游客 (未验证)
周三, 2011/07/13 - 17:41
Permalink
我还以为可以上生产
我还以为可以上生产线了,原来还是指日可待。
druggo
周六, 2009/05/30 - 11:29
Permalink
打开 ip_forward
打开 ip_forward 这个只在NAT方式下需要,DR和TUN方式都不需要。
另外要是碰上机房断电,那数据。。。
uuuu (未验证)
周四, 2009/06/04 - 13:17
Permalink
You're totally wrong
You're totally wrong
popgo (未验证)
周二, 2009/10/13 - 15:53
Permalink
老叶,这个配置insert
老叶,这个配置insert的参数:--auto-generate-sql-write-number=100000和那个--auto-generate-sql-load-type=mixed有没有冲突呢?(mixed(half inserts, half scanning selects))。我了解下一般很少配置这个--auto-generate-sql-write-number参数的吧
请教!
游客 (未验证)
周二, 2009/10/27 - 16:13
Permalink
这篇文章介绍lvs的安
这篇文章介绍lvs的安装多过于mysql cluster,我想知道tar.gz是怎么安装的好像找到,rpm的安装上以后是管理节呢?还是管理节点,sql节点和data节点都一起安装了?
晕糊中,有没有单独下载的tar.gz的格式,因为是ubuntu不能安装rpm
zlinux (未验证)
周二, 2009/10/27 - 16:15
Permalink
这篇文章介绍lvs的安
这篇文章介绍lvs的安装多过于mysql cluster,我想知道tar.gz是怎么安装的好像找到,rpm的安装上以后是管理节呢?还是管理节点,sql节点和data节点都一起安装了?
晕糊中,有没有单独下载的tar.gz的格式,因为是ubuntu不能安装rpm
QQ农场 (未验证)
周四, 2010/05/27 - 13:58
Permalink
学习并转载到论坛。
学习并转载到论坛。
游客 (未验证)
周三, 2010/06/23 - 10:13
Permalink
叶老师我在启动mgm
叶老师我在启动mgm data 节点之后 报一下错误
-- Node 3: Forced node shutdown completed. Occured during startphase 4. Caused by error 2310: 'Error while reading the REDO log(Ndbd file system inconsistency error, please report a bug). Ndbd file system error, restart node initial'.
yejr
周四, 2010/06/24 - 09:53
Permalink
尝试按照提示信息做
尝试按照提示信息做一下: Ndbd file system error, restart node initial
wade (未验证)
周六, 2010/08/21 - 17:55
Permalink
数据库数据稳定性,
数据库数据稳定性,可用性是第一位的,如果机房断电的话 。岂不是所有东西都没有了。5.1虽然支持非主键的数据存放到磁盘,但是索引还是放到了内存。这样一重启的话,怎么保证数据的完整性呢,就算索引可以自动重建,那也是一个不可完成的任务。如果不解决把内存放到磁盘,mysql cluster肯定是不能用的。不知道老叶有什么看法?
yejr
周一, 2010/08/23 - 14:05
Permalink
ndb
ndb cluster也是支持事务日志的,因此可以从日志中恢复;另外,就想你所说,关键数据还是要有冗余方案,不能产生单点故障
游客 (未验证)
周三, 2011/05/04 - 21:47
Permalink
可不可以简单介绍一
可不可以简单介绍一下需要下载安装的RPM包名,以及各节点的安装和配置,谢谢!
yejr
周四, 2011/05/05 - 09:16
Permalink
上面的内容已经比较
上面的内容已经比较详细了,还要“简单介绍一下”?
jessica
周一, 2011/06/20 - 16:56
Permalink
你好,最近在做mysql集
你好,最近在做mysql集群布署,但是中途有个问题一直未能解决:
背景:mgmd节点、ndbd节点、mysqld节点均正常启动,mgmd节点能检测到ndbd节点,一直不能检测到mysqld节点;
动作:我检查了mysqld节点服务器,防火墙处于关闭状态,mysqladmin pr查看状态正常;
所以想请教站主这可能是哪方面的问题。万分感谢。期待站主的回复!
yejr
周一, 2011/06/20 - 22:10
Permalink
还需要检查mgmd节点的
还需要检查mgmd节点的防火墙是否正确,查看mgmd、mysqld节点日志,另外,再检查下id是否有重复。
jessica
周二, 2011/06/21 - 09:43
Permalink
谢谢站主的提醒,我
谢谢站主的提醒,我检查过了,mgmd节点的防火墙一直是关着的,mgmd的日志上面显示Communication to Node 4 opened连接mysqld节点,但是一直没有连接上的显示。
但是mysqld在建表的时候日志上出现了一个Warning
NDB: Could not acquire global schema lock (4009)Cluster Failure
我上网上搜了,挺多这样的问题,但是基本上没有答案,请问站主有遇到过这样的问题吗?
yejr
周一, 2011/06/27 - 18:51
Permalink
mysqld节点对外的防火
mysqld节点对外的防火墙规则正确吗?印象中以前貌似碰到过,什么原因忘了...多看看mgmd节点的日志,说不定会有所发现
游客 (未验证)
周五, 2012/09/07 - 18:57
Permalink
disabled selinux config
disabled selinux
config 請用 IP address, 不要用 hostname
另請參考此網站
http://johanandersson.blogspot.tw/2009/05/cluster-fails-to-start-self-diagnosis.html