Chinaunix首页 | 论坛 | 博客
  • 博客访问: 161173
  • 博文数量: 22
  • 博客积分: 2140
  • 博客等级: 大尉
  • 技术积分: 242
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-31 17:40
文章分类

全部博文(22)

文章存档

2014年(1)

2010年(1)

2009年(2)

2008年(18)

分类: 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的样本库

阅读(3610) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~