分类: BSD
2010-02-08 10:23:25
因帮朋友忙,实现mysql的双机复制。于是到官方去看文档,看到关于MySQL簇这块内容,发现其中提及在FreeBSD上可以实现。但除了给个编译参数外就没有其他说明手工编译实现mysql NDB的内容。加之,GG上搜了下没发现FreeBSD下实现NDB文档。于是乎,萌发了搭建个基于FreeBSD的MySQL簇的想法。
经过几天的抓摸,最终实现MySQL簇。本文文档是MySQL簇实现过程中的笔记,且主体思路只是实现MySQL簇在FreeBSD的运行,不对性能和稳定性进行讨论。因此,在此算是抛砖引玉,希望大家指正。
准备工作:
硬件装备:
4-5台 pc server
1台 100Mb交换机
系统装备:
FreeBSD 7.2 release, Mini方式安装完成后, 通过csup获取ports源和src源.
软件装备:
通过ports来获取,本次实验NDB cluster的方案用的是mysql-server-5.1.40版本
预规划:
预留地址: 10.10.10.1 - 10.10.10.7
管理(MGM)节点: 10.10.10.8 - 10.10.10.10
管理客户端: 10.10.10.11 - 10.10.10.15
MySQL客户端: 10.10.10.16 - 10.10.10.63
SQL节点(NDB): 10.10.10.64 - 10.10.10.127
数据节点(Data Node): 10.10.10.128 - 10.10.10.254
现网规划:
MGM节点: 10.10.10.10
SQL节点: 10.10.10.64
数据节点: 10.10.10.129 / 10.10.10.130
拓扑结构:
实施步骤:
在各节点系统/etc/hosts填加:
10.10.10.10 DB_MGM //管理节点
10.10.10.64 DB_SQL_1 //SQL节点
10.10.10.129 DB_DataNode_1 //Node节点1
10.10.10.130 DB_DataNode_2 //Node节点2
PORTS编译安装:
# cd /usr/ports/database/mysql51-client
# make WITH_CHARSET=utf8 WITH_XCHARSET=complex install clean
# cd /usr/ports/database/mysql51-server
# make WITH_CHARSET=utf8 WITH_XCHARSET=complex BUILD_STATIC=yes WITHOUT_INNODB=yes BUILD_OPTIMIZED=yes WITH_NDB=yes install clean
#说明: 各节点编译方式都是一样的,但需求不同,MGM节点的运行进程序为ndb_mgmd,SQL节点运行程序为mysqld,Node节点为ndbd。
#编译完成后,SQL节点和Node节点需要使用mysql_install_db命令来初使化一次哈。
pkg_info得到的安装包
gettext-0.17_1 GNU gettext package
gmake-3.81_3 GNU version of 'make' utility
libiconv-1.11_1 A character set conversion library
libtool-1.5.26 Generic shared library support script
mysql-client-5.1.40 Multithreaded SQL database (client)
mysql-server-5.1.40 Multithreaded SQL database (server)
配置SQL节点 && Node节点:
配置my.cnf(由于默认安装,我的my.cnf放在/var/db/mysql/data/)
在对应位置增加以下项后保存退出
# Options for mysqld process:
[MYSQLD]
ndbcluster
ndb-connectstring=DB_MGM
# Options for ndbd process:
[MYSQL_CLUSTER]
ndb-connectstring=DB_MGM
配置MGM节点:
# mkdir /usr/local/etc/mysql-cluster
# cd /usr/local/etc/mysql-cluster
# cat > config.ini << EOF
# Options affecting ndbd processes on all data nodes:
[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M
# TCP/IP options:
[TCP DEFAULT]
portnumber=2202
# Management process options:
[NDB_MGMD]
id=1
hostname=DB_MGM
datadir=/usr/local/etc/mysql-cluster
# Options for data node "A":
[NDBD]
id=2
hostname=DB_DataNode_1
datadir=/var/db/mysql
# Options for data node "B":
[NDBD]
id=3
hostname=DB_DataNode_2
datadir=/var/db/mysql
# SQL node options:
[MYSQLD]
id=4
hostname=DB_SQL_1
EOF
架构各节点的初始化以及启动:
启动顺序:
管理服务器(ndb_mgmd) -> 存储引擎节点(ndbd) -> MySQL服务器进程(mysqld)
关闭顺序:
MySQL服务器进程(mysqld) -> 存储引擎节点(ndbd) -> 管理服务器(ndb_mgmd)
MGM节点的启动:
/usr/local/libexec/ndb_mgmd -f /usr/local/etc/mysql-cluster/config.ini
SQL节点的启动:
/usr/local/etc/rc.d/mysql-server start
DataNode的启动:
初始化启动:
su -l mysql -c "/usr/local/libexec/ndbd --initial --ndb-mgmd-host=DB_MGM"
#注意,仅应在首次启动ndbd时,或在备份/恢复或配置变化后重启ndbd时使用“--initial”参数
日常启动:
su -l mysql -c "/usr/local/libexec/ndbd --ndb-mgmd-host=DB_MGM"
启动后进程状态:
MGM节点:
# sockstat -4l
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root ndb_mgmd 94443 3 tcp4 *:1186 *:*
root sendmail 623 4 tcp4 127.0.0.1:25 *:*
root sshd 608 4 tcp4 *:22 *:*
root syslogd 482 7 udp4 *:514 *:*
SQL节点:
# sockstat -4l
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
mysql mysqld 13635 14 tcp4 *:3306 *:*
root sshd 14530 4 tcp4 *:22 *:*
root syslogd 13911 7 udp4 *:514 *:*
root sendmail 599 4 tcp4 127.0.0.1:25 *:*
DataNode节点:
# sockstat -4l
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
mysql ndbd 5780 7 tcp4 10.10.10.129:2202 *:*
root sshd 885 4 tcp4 *:22 *:*
root sendmail 633 4 tcp4 127.0.0.1:25 *:*
root syslogd 495 7 udp4 *:514 *:*
查看连接、状态等情况:
MGM节点:
MGM_Node# sockstat -4c
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root ndb_mgmd 94443 5 tcp4 127.0.0.1:58765 127.0.0.1:1186
root ndb_mgmd 94443 8 tcp4 127.0.0.1:1186 127.0.0.1:58765
root ndb_mgmd 94443 9 tcp4 10.10.10.10:1186 10.10.10.130:51676
root ndb_mgmd 94443 10 tcp4 10.10.10.10:1186 10.10.10.129:60067
root ndb_mgmd 94443 11 tcp4 10.10.10.10:1186 10.10.10.18:49390
MGM_Node# pwd
/usr/local/etc/mysql-cluster
MGM_Node# ll -G
total 140
-rw-r--r-- 1 root wheel - 486B Nov 19 23:18 config.ini
-rw-r--r-- 1 root wheel - 6B Nov 20 00:12 ndb_1.pid
-rw-r--r-- 1 root wheel - 133K Dec 11 11:24 ndb_1_cluster.log
-rw-r--r-- 1 root wheel - 264B Nov 20 01:02 ndb_1_out.log
SQL节点:
SQL_Node_1# sockstat -4c
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
mysql mysqld 13635 10 tcp4 10.10.10.18:49390 10.10.10.10:1186
mysql mysqld 13635 12 tcp4 10.10.10.18:65336 10.10.10.129:2202
mysql mysqld 13635 13 tcp4 10.10.10.18:56529 10.10.10.130:2202
SQL_Node_1# pwd
/var/db/mysql
SQL_Node_1# ll -G
total 20544
-rw-rw---- 1 mysql mysql - 7.3K Nov 19 22:44 SQL_Node_1.err
-rw-rw---- 1 mysql mysql - 6B Nov 19 22:44 SQL_Node_1.pid
-rw-rw---- 1 mysql mysql - 5.0M Nov 19 22:49 ib_logfile0
-rw-rw---- 1 mysql mysql - 5.0M Nov 19 20:27 ib_logfile1
-rw-rw---- 1 mysql mysql - 10M Nov 19 22:49 ibdata1
-rw-r--r-- 1 mysql mysql - 144B Nov 19 20:34 my.cnf
drwx------ 2 mysql mysql - 2.0K Nov 19 20:36 mysql
drwx------ 2 mysql mysql - 512B Nov 19 23:17 world
DataNode1节点:
Data_Node_1# sockstat -4c
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
mysql ndbd 5780 3 tcp4 10.10.10.129:60067 10.10.10.10:1186
mysql ndbd 5780 8 tcp4 10.10.10.129:2202 10.10.10.130:63398
mysql ndbd 5780 20 tcp4 10.10.10.129:2202 10.10.10.18:65336
Data_Node_1# pwd
/var/db/mysql
chunk2# ll -G
total 1120
drwxr-x--- 3 mysql mysql 512 Nov 19 23:23 BACKUP
-r-------- 1 mysql mysql 144 Nov 19 20:59 my.cnf
drwx------ 2 mysql mysql 2048 Nov 19 20:32 mysql
-rw-r--r-- 1 mysql mysql 5 Nov 19 23:08 ndb_2.pid
-rw-r--r-- 1 mysql mysql 568 Nov 19 21:36 ndb_2_error.log
drwxr-x--- 9 mysql mysql 512 Nov 19 21:00 ndb_2_fs
-rw-r--r-- 1 mysql mysql 14042 Nov 19 23:58 ndb_2_out.log
-rw-r--r-- 1 mysql mysql 1085744 Nov 19 21:36 ndb_2_trace.log.1
-rw-r--r-- 1 mysql mysql 1 Nov 19 21:36 ndb_2_trace.log.next
DataNode2节点:
Data_Node_2# sockstat -4c
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
mysql ndbd 5601 3 tcp4 10.10.10.130:51676 10.10.10.10:1186
mysql ndbd 5601 9 tcp4 10.10.10.130:63398 10.10.10.129:2202
mysql ndbd 5601 17 tcp4 10.10.10.130:2202 10.10.10.18:56529
DataNode2# pwd
/var/db/mysql
DataNode2# ll -G
total 30
drwxr-x--- 3 mysql mysql 512 Nov 19 23:24 BACKUP
-r-------- 1 mysql mysql 144 Nov 19 21:00 my.cnf
drwx------ 2 mysql mysql 2048 Nov 19 20:33 mysql
-rw-r--r-- 1 mysql mysql 5 Nov 19 23:09 ndb_3.pid
drwxr-x--- 9 mysql mysql 512 Nov 19 21:01 ndb_3_fs
-rw-r--r-- 1 mysql mysql 18734 Nov 19 23:59 ndb_3_out.log
建立和导入测试数据:
注意: 数据的操作只能SQL节点上完成,建库时须在涉及的每个SQL节点重复输入一次命令,测试数据为官方下的world库,下载地址见参考文献章节
建立数据库:
# mysql mysql> CREATE DATABASE world DEFAULT CHARACTER SET = utf8 COLLATE utf8_general_ci; //5.02之前版本须使用命令
# mysql> CREATE SCHEMA world DEFAULT CHARACTER SET = utf8 COLLATE utf8_general_ci; //#5.02之后版可使用命令:
# mysql> FLUSH TABLES;
导入数据:
//world数据样本默认存储引擎为MyISAM,因此注意在导入每个表数据工作前需将原表的存储引擎的内容改为NDBCLUSTER,更改完成后再导入。
# mysql world < world.sql.ndbcluster
官方文档中摘抄的一些注意事项
注意:
1. 仅管能够按任何顺序启动节点,但官方建议,应首先启动管理节点,然后启动存储节点,最后启动SQL节点
2. 簇管理节点的默认端口是1186,数据节点的默认端口2202。从MySQL 5.0.3开始,该限制已被放宽,簇能够根据空闲的端口自动地为数据节点分配端口。
3. 数据节点的最大数目为48(mysql 5.1版本)
4. 所有的MySQL簇表必须有主键,这点极其重要
5. 所有的数据节点应具有相同的RAM量,这是因为,簇中任何数据节点所能使用的内存均不超过任意单独数据节点的最低可用内存。换句话讲,如果有三台运行簇数据节点的计算机,在其中两台计算机上,有3GB用于保存簇数据的RAM,另一台计算机只有1GB RAM,那么每个数据节点仅能为簇贡献1GB。
6. 簇节点能够通过下述三种协议中的任何一种进行通信:TCP/IP、SHM(共享内存)和SCI(规模可扩展的计算机连接接口)。
7. 表必须用ENGINE=NDB或ENGINE=NDBCLUSTER选项创建,或用ALTER TABLE选项更改,以使用NDB簇存储引擎在簇内复制它们。
8. 对于IndexMemory和DataMemory,重要的是,总的数据库大小是各节点组的所有数据内存和所有索引内存之和。每个节点组用于保存复制信息,因此,如果有4个节点和2个副本,将有2个节点组。对于每个数据节点,可用的总数据内存是2*DataMemory。
9. 强烈建议为所有的节点设置相同的DataMemory值和IndexMemory值。由于数据是平均分布在簇中的所有节点上,任何节点可用的最大空间不超过簇中最小节点的可用空间。
10. 启动ndbd时,它实际上将启动两种进程。第1种进程称为“angel process”(天使进程),它的唯一任务是发现执行进程在何时完成,然后重启ndbd进程(如果作了该配置的话)。因此,如果你打算使用Unix的kill命令杀死ndbd进程,就需要杀死这两个进程。中止ndbd进程的更恰当方法是使用管理客户端,并通过该管理客户端停止进程。
11. 注意,在MySQL 5.1中,NDB簇不支持自动发现数据库的功能,这点很重要(请参见17.8节,“MySQL簇的已知限制”)。这意味着,一旦在一个数据节点上创建了世界(world)数据库和它的表,在簇中的每个SQL节点上还需要发出命令CREATE DATABASE world(从MySQL 5.0.2开始,可以使用CREATE SCHEMA world取而代之),后跟FLUSH TABLES。这样,节点就能识别数据库并读取其表定义。
参考文献:
MySQL 5.1参考手册 :: 17. MySQL簇
http://dev.mysql.com/doc/refman/5.1/zh/ndbcluster.html
MySQL集群配置
相关软件:
mysql 下载
http://dev.mysql.com/downloads/
样本数据
http://dev.mysql.com/doc/ //在此页面可找个world的样本库