Chinaunix

标题: MySQL集群配置 [打印本页]

作者: Nanu    时间: 2005-11-03 22:38
标题: MySQL集群配置
一、介绍
========
这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行。

注意!
虽然这是基于2台服务器的MySQL集群,但也必须有额外的第三台服务器作为管理节点,但这台服务器可以在集群启动完成后关闭。同时需要注意的是并不推荐在集群启动完成后关闭作为管理节点的服务器。尽管理论上可以建立基于只有2台服务器的MySQL集群,但是这样的架构,一旦一台服务器宕机之后集群就无法继续正常工作了,这样也就失去了集群的意义了。出于这个原因,就需要有第三台服务器作为管理节点运行。

另外,可能很多朋友都没有3台服务器的实际环境,可以考虑在VMWare或其他虚拟机中进行实验。

下面假设这3台服务的情况:

Server1: mysql1.vmtest.net 192.168.0.1
Server2: mysql2.vmtest.net 192.168.0.2
Server3: mysql3.vmtest.net 192.168.0.3

Servers1和Server2作为实际配置MySQL集群的服务器。对于作为管理节点的Server3则要求较低,只需对Server3的系统进行很小的调整并且无需安装MySQL,Server3可以使用一台配置较低的计算机并且可以在Server3同时运行其他服务。


二、在Server1和Server2上安装MySQL
=================================
http://www.mysql.com上下载mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
注意:必须是max版本的MySQL,Standard版本不支持集群部署!

以下步骤需要在Server1和Server2上各做一次
# mv mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz /usr/local/
# cd /usr/local/
# groupadd mysql
# useradd -g mysql mysql
# tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
# rm -f mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
# mv mysql-max-4.1.9-pc-linux-gnu-i686 mysql
# cd mysql
# scripts/mysql_install_db --user=mysql
# chown -R root  .
# chown -R mysql data
# chgrp -R mysql .
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chmod +x /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld

此时不要启动MySQL!



三、安装并配置管理节点服务器(Server3)
=====================================
作为管理节点服务器,Server3需要ndb_mgm和ndb_mgmd两个文件:

http://www.mysql.com上下载mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz

# mkdir /usr/src/mysql-mgm
# cd /usr/src/mysql-mgm
# tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
# rm mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
# cd mysql-max-4.1.9-pc-linux-gnu-i686
# mv bin/ndb_mgm .
# mv bin/ndb_mgmd .
# chmod +x ndb_mg*
# mv ndb_mg* /usr/bin/
# cd
# rm -rf /usr/src/mysql-mgm

现在开始为这台管理节点服务器建立配置文件:

# mkdir /var/lib/mysql-cluster
# cd /var/lib/mysql-cluster
# vi config.ini

在config.ini中添加如下内容:

[NDBD DEFAULT]
NoOfReplicas=2
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
# Managment Server
[NDB_MGMD]
HostName=192.168.0.3 #管理节点服务器Server3的IP地址
# Storage Engines
[NDBD]
HostName=192.168.0.1 #MySQL集群Server1的IP地址
DataDir= /var/lib/mysql-cluster
[NDBD]
HostName=192.168.0.2 #MySQL集群Server2的IP地址
DataDir=/var/lib/mysql-cluster
# 以下2个[MYSQLD]可以填写Server1和Server2的主机名。
# 但为了能够更快的更换集群中的服务器,推荐留空,否则更换服务器后必须对这个配置进行更改。
[MYSQLD]
[MYSQLD]

保存退出后,启动管理节点服务器Server3:
# ndb_mgmd

启动管理节点后应该注意,这只是管理节点服务,并不是管理终端。因而你看不到任何关于启动后的输出信息。



四、配置集群服务器并启动MySQL
=============================
在Server1和Server2中都需要进行如下改动:

# vi /etc/my.cnf

[mysqld]
ndbcluster
ndb-connectstring=192.168.0.3 #Server3的IP地址
[mysql_cluster]
ndb-connectstring=192.168.0.3 #Server3的IP地址

保存退出后,建立数据目录并启动MySQL:

# mkdir /var/lib/mysql-cluster
# cd /var/lib/mysql-cluster
# /usr/local/mysql/bin/ndbd --initial
# /etc/rc.d/init.d/mysqld start

可以把/usr/local/mysql/bin/ndbd加到/etc/rc.local中实现开机启动。
注意:只有在第一次启动ndbd时或者对Server3的config.ini进行改动后才需要使用--initial参数!


五、检查工作状态
================
回到管理节点服务器Server3上,并启动管理终端:

# /usr/bin/ndb_mgm
键入show命令查看当前工作状态:(下面是一个状态输出示例)

[root@mysql3 root]# /usr/bin/ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @192.168.0.1  (Version: 4.1.9, Nodegroup: 0, Master)
id=3    @192.168.0.2  (Version: 4.1.9, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.0.3  (Version: 4.1.9)

[mysqld(API)]   2 node(s)
id=4   (Version: 4.1.9)
id=5   (Version: 4.1.9)

ndb_mgm>

如果上面没有问题,现在开始测试MySQL:
注意,这篇文档对于MySQL并没有设置root密码,推荐你自己设置Server1和Server2的MySQL root密码。

在Server1中:

# /usr/local/mysql/bin/mysql -u root -p
> use test;
> CREATE TABLE ctest (i INT) ENGINE=NDBCLUSTER;
> INSERT INTO ctest () VALUES (1);
> SELECT * FROM ctest;

应该可以看到1 row returned信息(返回数值1)。

如果上述正常,则换到Server2上重复上面的测试,观察效果。如果成功,则在Server2中执行INSERT再换回到Server1观察是否工作正常。
如果都没有问题,那么恭喜成功!


六、破坏性测试
==============
将Server1或Server2的网线拔掉,观察另外一台集群服务器工作是否正常(可以使用SELECT查询测试)。测试完毕后,重新插入网线即可。

如果你接触不到物理服务器,也就是说不能拔掉网线,那也可以这样测试:
在Server1或Server2上:

# ps aux | grep ndbd
将会看到所有ndbd进程信息:

root      5578  0.0  0.3  6220 1964 ?        S    03:14   0:00 ndbd
root      5579  0.0 20.4 492072 102828 ?     R    03:14   0:04 ndbd
root     23532  0.0  0.1  3680  684 pts/1    S    07:59   0:00 grep ndbd

然后杀掉一个ndbd进程以达到破坏MySQL集群服务器的目的:

# kill -9 5578 5579

之后在另一台集群服务器上使用SELECT查询测试。并且在管理节点服务器的管理终端中执行show命令会看到被破坏的那台服务器的状态。
测试完成后,只需要重新启动被破坏服务器的ndbd进程即可:

# ndbd
注意!前面说过了,此时是不用加--inital参数的!

至此,MySQL集群就配置完成了!
作者: jackylau    时间: 2005-11-04 09:22
兄弟,我帮你顶一下!
作者: hongfengyue    时间: 2005-11-04 16:27
谢谢!非常感谢。改天测试一下找一个机器。哈哈

可惜现在用不了mysql的cluster,只能自己玩玩。
作者: iammecn    时间: 2005-11-27 21:15
已经收藏了
作者: 鸿羽    时间: 2005-12-14 08:29
好东西,谢谢
作者: wanghl    时间: 2005-12-20 08:14
感谢,收藏先!
作者: greysky-zfj    时间: 2005-12-20 16:46
好贴!但我有一事不明,请教楼主:
这样的话,假如是在php里写代码,如"mysql_connect(ip,user,pass)",那么这个ip应该写那个呢?如果写192.168.0.1的话,这台机器down掉后,程序还正常么?没有环境,不能试验^_^
作者: bnq    时间: 2005-12-22 18:06
标题: 佩服
按文试一下
作者: jackylau    时间: 2005-12-31 12:22
按照你的做通了,回头测试一下性能.看看如何!
作者: net_sky    时间: 2006-01-13 13:38
收藏!!!
作者: 遥望    时间: 2006-01-13 14:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: kaiyuen    时间: 2006-01-20 15:58
标题: ???
贴很好,感谢楼主,但我也有和6楼那位同志一样的疑问????
作者: kedy    时间: 2006-01-22 17:20
收藏下先。
作者: swh01    时间: 2006-01-23 11:59
收藏!!!
作者: leera    时间: 2006-01-23 20:09
标题: 测试性能了么?
能瞬间同步?
作者: benbenblood    时间: 2006-01-24 08:57
这个配置可以在freebsd下通过吗?
作者: unixXiaoqiang    时间: 2006-01-26 10:18
原帖由 greysky-zfj 于 2005-12-20 16:46 发表
好贴!但我有一事不明,请教楼主:
这样的话,假如是在php里写代码,如"mysql_connect(ip,user,pass)",那么这个ip应该写那个呢?如果写192.168.0.1的话,这台机器down掉后,程序还正常么?没有环境,不 ...

同问。
作者: rardge    时间: 2006-01-26 11:46
呵呵,大家有兴趣做集群的,就动手做一遍,顺便测试一下该怎么用php连接吧,不要等答案了。
作者: abbish    时间: 2006-01-27 23:46
那PHP连接是应该连接管理节点还是随便连接一个数据库服务器?如果两个数据库服务器的连接密码不一致会出现什么情况?
这样做的集群能否保证数据的同步?当一个数据库服务器当机,恢复后是否还能保持数据的同步?
作者: asdasd    时间: 2006-02-01 09:51
收藏,非常好啊
作者: 可爱的蜘蛛    时间: 2006-02-01 13:41
好东动
作者: 网络闲人    时间: 2006-02-05 10:51
我现在的环境是 rh3+cluster+oracle
cluster组件是用redhat的 只用2台机器就可以实现 切换。不知道mssql 是不是也可以!
作者: ipaddr    时间: 2006-02-07 09:29
收藏先。
作者: lubber    时间: 2006-02-11 20:03
谢谢楼主.
可惜没有环境,有同样的问题,到底应该访问那台机器啊,个人凭直觉认为应该访问管理节点啊
作者: badeager    时间: 2006-02-14 11:01
据说mysql 做集群 效果不好
作者: archangle    时间: 2006-02-14 11:25
据说mysql 做集群 效果不好

看具体情况了,我做了一个集群为dns提供数据,我的要求是没有单点读和写的单点故障,查询速度不是问题。更新量很小,所以满足我的要求。已经跑了快一个月了,很稳定。
作者: haohaoo    时间: 2006-02-18 16:09
好东西,不过当管理服务器挂了的话就全完了。
有没有类似lvs的功能一样,有backup机器来接替管理服务器
作者: dishanqian    时间: 2006-03-24 11:32
标题: 可以用多个management node
Is it helpful to have more than one management node for a cluster?

It can be helpful as a fail-safe. Only one MGM node controls the cluster at any given time, but it is possible to configure one MGM as primary, and one or more additional management nodes to take over in the event that the primary MGM node fails.
作者: dishanqian    时间: 2006-03-24 13:12
原帖由 archangle 于 2006-2-14 11:25 发表

看具体情况了,我做了一个集群为dns提供数据,我的要求是没有单点读和写的单点故障,查询速度不是问题。更新量很小,所以满足我的要求。已经跑了快一个月了,很稳定。


数据必须保存在内存, 这点限制太大了。
5。1可以把数据保存在磁盘,但是索引还是在内存。
作者: zqlogin    时间: 2006-03-25 18:24
谢谢,支持呀!!!
作者: 日出    时间: 2006-04-21 10:21
问个问题. 为什么我弄完ndb_mgmd只有当前目录是/var/lib/mysql-cluster 下才能执行.
作者: 日出    时间: 2006-04-21 10:26
解决了.要指定一下config.ini位置  -f /var/lib/mywql-cluster/config.ini
作者: lzfzl    时间: 2006-06-01 14:26
我用rhel3+cluster+mysql 5.21 max两台机子就够了。我没有用到mysql的集群管理部件,我想这种结构下mysql非max版本也是可以实现故障转移集群的。
作者: mageguoshi    时间: 2006-06-01 16:20
原帖由 greysky-zfj 于 2005-12-20 16:46 发表
好贴!但我有一事不明,请教楼主:
这样的话,假如是在php里写代码,如"mysql_connect(ip,user,pass)",那么这个ip应该写那个呢?如果写192.168.0.1的话,这台机器down掉后,程序还正常么?没有环境,不 ...

这个问题有人回答么,或者有没有人测试过!
作者: caichang    时间: 2006-06-01 17:53
好帖!顶上!
作者: goodboy1881    时间: 2006-06-01 18:38
原帖由 greysky-zfj 于 2005-12-20 16:46 发表
好贴!但我有一事不明,请教楼主:
这样的话,假如是在php里写代码,如"mysql_connect(ip,user,pass)",那么这个ip应该写那个呢?如果写192.168.0.1的话,这台机器down掉后,程序还正常么?
作者: rardge    时间: 2006-06-02 11:38
原帖由 goodboy1881 于 2006-6-1 18:38 发表
原帖由 greysky-zfj 于 2005-12-20 16:46 发表
好贴!但我有一事不明,请教楼主:
这样的话,假如是在php里写代码,如"mysql_connect(ip,user,pass)",那么这个ip应该写那个呢?如果写192.168.0.1的话,这台机器down掉后,程序还正常么?


另贴说明了,在这里标示一下作个链接。
http://bbs.chinaunix.net/viewthr ... &extra=page%3D1
看手册第 15 章(MySQL Cluster)第 3 和 3.5 小节。
作者: thatday    时间: 2006-06-02 17:03
原帖由 goodboy1881 于 2006-6-1 18:38 发表
好贴!但我有一事不明,请教楼主:
这样的话,假如是在php里写代码,如"mysql_connect(ip,user,pass)",那么这个ip应该写那个呢?如果写192.168.0.1的话 ...



数据库连接ip是MYSQL群集节点服务器的IP地址。

这种冗余技术,类似帖子 http://bbs.chinaunix.net/viewthread.php?tid=660467 中提到的两台openbsd加一台freebsd组成防火墙阵列,freebsd是节点服务器。

[ 本帖最后由 thatday 于 2006-6-2 17:04 编辑 ]
作者: rardge    时间: 2006-06-02 17:25
原帖由 thatday 于 2006-6-2 17:03 发表



数据库连接ip是MYSQL群集节点服务器的IP地址。

这种冗余技术,类似帖子 http://bbs.chinaunix.net/viewthread.php?tid=660467 中提到的两台openbsd加一台freebsd组成防火墙阵列,freeb ...


兄弟,你要早点来多好啊,呵呵
正所谓话不说不明啊,很多东西没点明之前就是一团疑问。
作者: thatday    时间: 2006-06-03 10:02
原帖由 rardge 于 2006-6-2 17:25 发表


兄弟,你要早点来多好啊,呵呵
正所谓话不说不明啊,很多东西没点明之前就是一团疑问。


有没有这么伟大啊,吼吼
作者: imxae    时间: 2006-06-03 14:45
这种可以在win2000下使用么?
作者: xinglp    时间: 2006-06-04 19:29
看看官方文档 还不支持win的mdbd dbd cluster 不支持sqlcluster
作者: lincoln_834100    时间: 2006-08-03 19:38
好帖,顶!
作者: pulf    时间: 2006-08-03 22:27
hao
作者: kyxy3465    时间: 2006-08-07 16:26
标题: 连接不上啊
按照楼主说的做了。可是不能完成三机互连啊
数据接点PC1和PC2输入/usr/local/mysql/bin/ndbd 后都提示
Unable to connect with connect string: nodeid=0,210.40.39.8:1186
Retrying every 5 seconds. Attempts left: 12 11 10 9 8 7 6 5 4 3 2 1, failed.
error=2350
2006-08-03 09:40:43 [ndbd] INFO     -- Error handler restarting system
2006-08-03 09:40:43 [ndbd] INFO     -- Error handler shutdown completed - exiting
sphase=0
exit=-1
而管理接点pc3输入 ndb_mgm后
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 210.40.39.8:1186
Cluster Configuration
后边就提示不能连接到PC1和2
不知道那出了问题,求教!!!
作者: zaochun_liyi    时间: 2006-08-17 17:52
原帖由 kyxy3465 于 2006-8-7 16:26 发表
按照楼主说的做了。可是不能完成三机互连啊
数据接点PC1和PC2输入/usr/local/mysql/bin/ndbd 后都提示
Unable to connect with connect string: nodeid=0,210.40.39.8:1186
Retrying every 5 seconds. Attem ...


lz 把你的防火墙关闭/添加 1186:tcp 允许访问
我们也被这个 So  silly 的底层问题弄得郁闷了很久的 呵呵

archangle 老大的精辟讲解如下:

配置一个集群,简单说来,需要规划好管理节点(manage node),数据节点(ndb node),mysql节点(也可以叫api node).这些节点可以分散在不同的机器上,也可以在同一台机器上。
设置步骤简单说来是,
1.首先写好管理节点的配置文件,然后启动管理节点。
2.配置ndb节点并启动
3.启动mysql 节点
4.用ndb_mgm 查看集群的信息。
其实参考mysql的官方手册,详细的读几遍,自然一眼就能看出问题出在哪里了。

1186端口是ndb_mgmd节点的监听端口,ndb和mysql节点通过这端口来读取集群的配置文件。所以你要在你的管理节点上启动ndb_mgmd服务。你确认你启动了吗?

[ 本帖最后由 zaochun_liyi 于 2006-8-17 17:53 编辑 ]
作者: kyxy3465    时间: 2006-08-18 11:40
lz 把你的防火墙关闭/添加 1186:tcp 允许访问
我们也被这个 So  silly 的底层问题弄得郁闷了很久的 呵呵

呵呵 ,偶和我的合作伙伴也是这么做的,顺利解决!
作者: freemanxp2005    时间: 2006-12-27 14:42
ndb_mgm 这个文件怎么没有?
作者: freemanxp2005    时间: 2006-12-27 14:44
我用的是 mysql-standard-5.0.24a-linux-i686-glibc23.tar.gz
bin目录下没有这个文件
作者: qlks    时间: 2006-12-27 14:49
原帖由 freemanxp2005 于 2006-12-27 14:44 发表
我用的是 mysql-standard-5.0.24a-linux-i686-glibc23.tar.gz
bin目录下没有这个文件


需要max版本的
作者: freemanxp2005    时间: 2006-12-27 14:54
谢谢楼上的,max版本和普通版本,有什么区别啊?
作者: wildcat707    时间: 2006-12-27 15:59
不错。
作者: freemanxp2005    时间: 2006-12-27 16:32
原帖由 greysky-zfj 于 2005-12-20 16:46 发表
好贴!但我有一事不明,请教楼主:
这样的话,假如是在php里写代码,如"mysql_connect(ip,user,pass)",那么这个ip应该写那个呢?如果写192.168.0.1的话,这台机器down掉后,程序还正常么?没有环境,不 ...




版主请解释一下啊!
作者: yejr    时间: 2006-12-27 21:12
解释什么?
作者: Jeff_z    时间: 2006-12-27 22:01
这帖子都有太多人翻版了,楼主有没有集群备份的资料,如果有可否传上来分享下。
作者: raid_fifa    时间: 2006-12-28 10:16
原帖由 freemanxp2005 于 2006-12-27 16:32 发表




版主请解释一下啊!



那个ip地址是mysqld所在的机器地址;如果有多个mysqld机器,可以在多个mysqld之前使用lvs,php代码里面的ip写lvs的浮动ip
作者: qlks    时间: 2006-12-28 10:37
原帖由 freemanxp2005 于 2006-12-27 16:32 发表




版主请解释一下啊!



多个mysql是做负载均衡用的
可以用lvs来制定一个vip
你在php用这个vip
作者: freemanxp2005    时间: 2006-12-28 11:06
作了mysql cluster 还要lvs配合才能在php上使用吗?
作者: freemanxp2005    时间: 2006-12-28 11:09
原帖由 yejr 于 2006-12-27 21:12 发表
解释什么?



假如是在php里写代码,如"mysql_connect(ip,user,pass)",那么这个ip应该写那个呢?是管理机的ip,还是两台node的ip?
如果一台node挂了,另一台能自动顶上去吗?
作者: zhumao    时间: 2006-12-28 13:43
我已经照做了,失败!
估计楼主不知道从哪里抄来的,自己也没有测试吧?
作者: freemanxp2005    时间: 2006-12-29 09:26
同意楼上的,呵呵
作者: yejr    时间: 2006-12-29 17:42
原帖由 freemanxp2005 于 2006-12-28 11:09 发表

假如是在php里写代码,如"mysql_connect(ip,user,pass)",那么这个ip应该写那个呢?是管理机的ip,还是两台node的ip?
如果一台node挂了,另一台能自动顶上去吗?


当然是连接sql节点了。
不管你有几个db node,都会同时工作,如果其中一个坏了,那么他会被管理节点从集群中踢出,不影响集群的使用

[ 本帖最后由 yejr 于 2006-12-29 17:43 编辑 ]
作者: feiyi    时间: 2008-04-16 11:12
性能不太好。
作者: ylcqen    时间: 2008-06-03 15:52
不错!
作者: 阿里西瓜    时间: 2008-10-24 14:22
http://dev.mysql.com/tech-resour ... or-two-servers.html
作者: feiyi    时间: 2008-10-26 23:33
安装简单,性能很一般。
作者: turionboy    时间: 2008-10-27 08:35
收藏
作者: ruochen    时间: 2008-10-27 09:31
LZ的图片很爆呀
作者: sndyntuem    时间: 2009-12-18 18:08
好贴!但我有一事不明,请教楼主:
这样的话,假如是在php里写代码,如"mysql_connect(ip,user,pass)",那么这个ip应该写那个呢?如果写192.168.0.1的话,这台机器down掉后,程序还正常么?没有环境,不能试验^_^

这个集群做成功,只是和这位老兄一样IP问题???
不过正考虑加上LVS_mysql  或者 MMM来做;有那老兄做过的指教一下

[ 本帖最后由 sndyntuem 于 2009-12-18 18:16 编辑 ]
作者: 枫影谁用了    时间: 2009-12-18 18:18
原帖由 sndyntuem 于 2009-12-18 18:08 发表
好贴!但我有一事不明,请教楼主:
这样的话,假如是在php里写代码,如"mysql_connect(ip,user,pass)",那么这个ip应该写那个呢?如果写192.168.0.1的话,这台机器down掉后,程序还正常么?没有环境,不能试验^ ...


所有sql节点均可

或你用ndb api连接。


太老的贴了,有问题开新贴吧。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2