Linux MYSQL负载均衡集群的搭建
按照此配置完全可以配置成功!!
一、介绍 ======== 测试环境: Server1:ndbd 192.168.1.225 Server2:ndbd 192.168.1.226 Server3:mysqld --ndb-cluster 192.168.1.224 (ndbd_mgm ndbd_mgmd也在本机) Server4:LVS 192.168.1.111 (调度主服务器,利用此服务器进
按照此配置完全可以配置成功!!
一、介绍
========
测试环境:
Server1:ndbd 192.168.1.225
Server2:ndbd 192.168.1.226
Server3:mysqld --ndb-cluster 192.168.1.224 (ndbd_mgm ndbd_mgmd也在本机)
Server4:LVS 192.168.1.111 (调度主服务器,利用此服务器进行MYSQL的负载均衡,否则MYSQL CLUSTER只做到了数据同步的作用,好像在机制内部MYSQL NDB的各各节点上也会有负载均衡这一说!)
操作系统均为
RH AS4
所需软件包:
mysql-5.1.23-ndb-6.2.15-linux-i686-glibc23.tar.gz
下载地址:
首先,明确几个概念(参照下图):
ndbd: 数据库节点,需要更大的内存。
mysqld --ndb-cluster: MySQL服务器节点,程序直接访问的是这台机器的IP。默认端口仍是3306,。
ndbd_mgm ndbd_mgmd:管理节点。管理/查看各库节点和服务器节点的状态,最好自己单独一台服务器,测试发现只要ndbd_mgmd程序死掉,所有的节点全部停止工作.
二、在Server1、Server2、Server3上安装MySQL
=================================
1.安装:
# mv mysql-5.1.23-ndb-6.2.15-linux-i686-glibc23.tar.gz /usr/local/
# cd /usr/local/
# tar -zxvf mysql-5.1.23-ndb-6.2.15-linux-i686-glibc23.tar.gz
# ln -s mysql-5.1.23-ndb-6.2.15-linux-i686-glibc23.tar.gz mysql
# groupadd mysql
# useradd -g mysql mysql
# cd mysql
# scripts/mysql_install_db --user=mysql
# chown -R mysql:mysql .
2.编辑配置文件:
# cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
# vi /etc/my.cnf 在文件尾加入
............................................................
............................................................
# Options for mysqld process:
[MYSQLD]
ndbcluster # run NDB engine
ndb-connectstring=192.168.1.224 # location of MGM node
# Options for ndbd process:
[MYSQL_CLUSTER]
ndb-connectstring=192.168.1.224 # location of MGM node
保存&退出
............................................................
............................................................
3.在Server1、Server2上创建日志文件夹,默认
# mkdir /var/lib/mysql-cluster
4.在Server3上创建ndb_mgmd启动配置文件:
# mkdir /var/lib/mysql-cluster
# cd /var/lib/mysql-cluster
# vi config.ini
内容如下:
Options affecting ndbd processes on all data nodes:
[NDBD DEFAULT]
NoOfReplicas=2 # Number of replicas
DataMemory=80M # How much memory to allocate for data storage
IndexMemory=18M # How much memory to allocate for index storage
# For DataMemory and IndexMemory, we have used the
# default values. Since the "world" database takes up
# only about 500KB, this should be more than enough for
# this example Cluster setup.
# TCP/IP options:
[TCP DEFAULT]
portnumber=2202 # This the default; however, you can use any
# port that is free for all the hosts in cluster
# Note: It is recommended beginning with MySQL 5.0 that
# you do not specify the portnumber at all and simply allow
# the default value to be used instead
# Management process options:
[NDB_MGMD]
hostname=192.168.1.224 # Hostname or IP address of MGM node
datadir=/var/lib/mysql-cluster # Directory for MGM node logfiles
# Options for data node "A":
[NDBD]
# (one [NDBD] section per data node)
hostname=192.168.1.225 # Hostname or IP address
datadir=/usr/local/mysql/data # Directory for this data node's datafiles
# Options for data node "B":
[NDBD]
hostname=192.168.1.226 # Hostname or IP address
datadir=/usr/local/mysql/data # Directory for this data node's datafiles
# SQL node options:
[MYSQLD]
[MYSQLD]
[MYSQLD]
#hostname=192.168.1.224 # Hostname or IP address
# (additional mysqld connections can be
# specified for this node for various
# purposes such as running ndb_restore)
保存&退出
[MYSQLD]
[MYSQLD]
[MYSQLD]
表示允许有三台MySQL服务器从任何IP访问数据库结点。
各参数功能,请参考 ... config-example.html
三、启动服务
============
Server3 /usr/local/mysql/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
Server1 /usr/local/mysql/bin/ndbd --initial (只在第一次启动ndbd时使用--initial参数,通知ndbd执行初始化启动。初始化启动将删除以前ndbd实例为恢复目的创建的任何文件。它还 能重新创建恢复用日志文件。注意,在某些操作系统上,该进程可能会占用较长的时间)
Server2 /usr/local/mysql/bin/ndbd --initial
Server3 /usr/local/mysql/support-files/mysql.Server start
四、检查工作状态
================
回到管理节点服务器Server3上,并启动管理终端:
# /usr/bin/ndb_mgm
键入show命令查看当前工作状态:(下面是一个状态输出示例)
ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 (not connected, accepting connect from 192.168.1.225)
id=3 @192.168.1.226 (Version: 5.0.22, Nodegroup: 0, Master)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.1.224 (Version: 5.0.22)
[mysqld(API)] 3 node(s)
id=4 @192.168.1.224 (Version: 5.0.22)
id=5 (not connected, accepting connect from any host)
id=6 (not connected, accepting connect from any host)
mysqld(API)即mysqld --ndb-cluster,MySQL服务器节点。当前只有Server3 MySQL启动。
如果上面没有问题,现在开始测试MySQL:
注意,这篇文档对于MySQL并没有设置root密码,推荐你自己设置Server1、Server2、Server3的MySQL root密码。
在Server3中:
# /usr/local/mysql/bin/mysql
> use test;
> CREATE TABLE ctest (i INT) ENGINE=NDBCLUSTER;(一定要加上ENGINE=NDBCLUSTER或ENGINE=NDB,否则各主机无法同步数据!!)
> INSERT INTO ctest () VALUES (1);
> SELECT * FROM ctest;
应该可以看到1 row returned信息(返回数值1)。
如果上述正常,则换到Server1、Server2上重复上面的测试,观察效果,数据库应该是同步刷新的。但首先要启动这两台机器的MySQL服务
# /usr/local/mysql/support-files/mysql.Server start
如果都没有问题,那么恭喜成功!
FAQ:
失败原因,可能是启动顺序不对。
查找所有ndb和sql相关进程,杀掉,重新按顺序来。
ps -aux |grep ndb
ps -aux |grep sql
kill -9 <PID> <PID> ...<PID>
/usr/local/mysql/bin/ndb_mgm -e shutdown(此命令会关闭所有主机节点)
五、破坏性测试
==============
将Server1或Server2的网线拔掉,观察另外一台集群服务器工作是否正常(可以使用SELECT查询测试)。测试完毕后,重新插入网线即可。
如果你接触不到物理服务器,也就是说不能拔掉网线,那也可以这样测试:
在Server1或Server2上:
ifconfig eth0 down #如果只有一块网卡,默认是eth0
之后在Server3上使用SELECT查询测试。并且在管理节点服务器的管理终端中执行show命令会看到被破坏的那台服务器的状态。
测试完成后,只需要重新启动被破坏服务器的ndbd进程即可:
# ndbd
注意!前面说过了,此时是不用加--inital参数的!
至此,MySQL集群就配置完成,MySQL负载均衡功能完成!
===============================================
六.注意事项:
1.ndb_mgmd管理服务器,防火墙勿忘开1186端口.
2.ndb数据服务器,防火墙勿忘开2202端口.
3.LVS主服务器应该打开3306端口.
4.创建表时注意,在表后一定要加上ENGINE=NDBCLUSTER或ENGINE=NDB,否则各主机无法同步数据!!
===============================================
七:用于MySQL簇进程的命令选项
1.ndb_mgm -e show (查看各节点状态)
2. --skip-ndbcluster (禁止NDB簇存储引擎。对于包含该功能的二进制版本,在默认情况下,该功能是被禁止的,换句话讲,NDB簇存储引擎处于禁止状态,直至使用“—ndbcluster”选项激活了它为止。仅当所编译的服务器支持NDB簇存储引擎时,才能使用该选项。)
--ndb-connectstring=connect_string (使用NDB存储引擎时,通过设置该选项,能够指定分配簇配置数据的管理服务器)
3.ndb>
· SHOW
在使用多个管理节点的簇中,该命令仅显示与当前管理服务器实际相连的数据节点的信息
· node_id START
启动由node_id标识的数据节点(或所有数据节点)。
· node_id STOP
停止由node_id标识的数据节点(或所有数据节点)。
· node_id RESTART [-N] [-I]
重启由node_id标识的数据节点(或所有数据节点)。
· node_id STATUS
显示由node_id标识的数据节点(或所有数据节点)的状态信息。
· ENTER SINGLE USER MODE node_id
进入单用户模式,仅允许由节点ID“node_id”标识的MySQL服务器访问数据库。
· EXIT SINGLE USER MODE
退出单用户模式,允许所有的SQL节点(即所有运行的mysqld进程)访问数据库。
中止管理客户端。
· SHUTDOWN
关闭除SQL节点之外的所有簇节点,并退出。
4.用单用户模式,数据库管理员能够将对数据库系统的访问限制在1个MySQL服务器(SQL节点)。进入单用户模式时,与所有其他MySQL服务器的所有连接均将恰当关闭,而且所有正在运行的事务均将被放弃。不允许启动任何新事务.
NDB> ENTER SINGLE USER MODE 5
执行该命令而且簇进入单用户模式后,节点ID为5的SQL节点将成为簇中唯一允许的用户
NDB> EXIT SINGLE USER MODE
退出单用户模式
八.MYSQL CLUSTER 备份与恢复
1、在管理节点上进行备份。
ndb_mgm> start backup nowait
ndb_mgm> Node 3: Backup 4 started from node 1
Node 3: Backup 4 started from node 1 completed
StartGCP: 43010 StopGCP: 43013
#Records: 2138 #LogRecords: 0
Data: 53068 bytes Log: 0 bytes
ndb_mgm> shutdown
Node 3: Cluster shutdown initiated
Node 4: Cluster shutdown initiated
Node 4: Node shutdown completed.
Node 3: Node shutdown completed.
2 NDB Cluster node(s) have shutdown.
Disconnecting to allow management server to shutdown.
ndb_mgm> exit
2、删掉SQL节点的数据。
DROP DATABASE TEST_CLUSTER;
3、关闭MYSQLD服务器。
[root@localhost bin]# service mysqld stop
Shutting down MySQL… SUCCESS!
4、重新顺序启动所有节点。
[root@localhost mysql]# /usr/local/mysql/ndb_mgmd -f /etc/config.ini
[root@localhost data]# /usr/local/mysql/bin/ndbd –initial
我发现如果不带这个 –initial选项的话,恢复会失败。
[root@localhost bin]# service mysqld start
Starting MySQL SUCCESS!
4、在NDBD节点上进行恢复。(每个节点都得执行一次,因为数据分散在两个节点上)
第一个节点:
[root@localhost BACKUP]#
/usr/local/mysql/bin/ndb_restore -n3 -b4 -r -m \
–backup_path=/usr/local/mysql/data/BACKUP/BACKUP-4/
-r开关是记录集合。
-m是元数据。就是表和库的SCHEMA。
Nodeid = 3
Backup >backup path = /usr/local/mysql/data/BACKUP/BACKUP-4/
Ndb version in backup files: Version 5.1.21
Connected to ndb!!
Successfully restored table `test_cluster/def/lk4_test`
…
Successfully created index `PRIMARY` on `lk4_test`
…
_____________________________________________________
Processing data in table: test_cluster/def/lk4_test54) fragment 1
_____________________________________________________
…
Restored 37 tuples and 0 log entries
NDBT_ProgramExit: 0 - OK
第二个节点:
[root@localhost BACKUP-1]#
/usr/local/mysql/bin/ndb_restore -n4 -b4 -r \
–backup_path=/usr/local/mysql/data/BACKUP/BACKUP-4/
Nodeid = 4
Backup >backup path = /usr/local/mysql/data/BACKUP/BACKUP-4/
Ndb version in backup files: Version 5.1.21
Connected to ndb!!
_____________________________________________________
Processing data in table: sys/def/NDB$EVENTS_0(1) fragment 1
_____________________________________________________
Processing data in table: mysql/def/ndb_apply_status(4) fragment 1
_____________________________________________________
Processing data in table: mysql/def/NDB$BLOB_2_3(3) fragment 1
_____________________________________________________
Processing data in table: test/def/t11(5) fragment 1
_____________________________________________________
Processing data in table: sys/def/SYSTAB_0(0) fragment 1
_____________________________________________________
Processing data in table: mysql/def/ndb_schema(2) fragment 1
Restored 2 tuples and 0 log entries
NDBT_ProgramExit: 0 - OK
这里完成。
5、查看一下有没有数据,为了安全起见。
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| test |
+——————–+
3 rows in set (0.00 sec)
没有恢复的数据库?
MYSQL现在必须重新建立SCHEMA。
mysql> create database test_cluster;
Query OK, 1 row affected (0.33 sec)
mysql> use test_cluster;
Database changed
mysql> show tables;
+——————————+
| Tables_in_test_cluster |
+——————————+
| lk4_test |
| … |
+——————————+
27 rows in set (0.11 sec)
mysql> select * from cs_comment;
Empty set (0.00 sec)
不过MYSQL的backup 程序现在还只能进行完全备份。
[root@localhost BACKUP]# du -h
76K ./BACKUP-2
96K ./BACKUP-6
180K ./BACKUP-4
172K ./BACKUP-3
76K ./BACKUP-1
60K ./BACKUP-5
668K .
6、在NDBD节点上进行恢复的时候有一个要注意的问题。
因为NDBD节点以 –initial 方式启动的时候不会自动删除undo 和 data 文件(即保存到磁盘上的表数据),所以得手动在每个NDBD节点上进行RM操作:
[root@node239 ndb_6_fs]# rm -rf *.dat
然后开始备份。
在MASTER上备份的时候要加 -m 开关。
在SLAVE上要加-d 而且不要-m开关。
具体步骤如下:
MASTER :
[root@localhost ndb_3_fs]# /usr/local/mysql/bin/ndb_restore -n3 -b1 -r -m –backup_path=/usr/local/mysql/data/BACKUP/BACKUP-1/
Nodeid = 3
Backup >backup path = /usr/local/mysql/data/BACKUP/BACKUP-1/
Ndb version in backup files: Version 5.1.21
Connected to ndb!!
Creating logfile group: lg_1…done
Creating tablespace: ts_1…done
Creating datafile “data_1.dat”…done
Creating undofile “undo_1.dat”…done
Successfully restored table `test/def/t11`
Successfully restored table event REPL$test/t11
_____________________________________________________
Processing data in table: sys/def/NDB$EVENTS_0(1) fragment 0
_____________________________________________________
Processing data in table: mysql/def/NDB$BLOB_2_3(3) fragment 0
_____________________________________________________
Processing data in table: sys/def/SYSTAB_0(0) fragment 0
_____________________________________________________
Processing data in table: mysql/def/ndb_schema(2) fragment 0
_____________________________________________________
Processing data in table: mysql/def/ndb_apply_status(4) fragment 0
_____________________________________________________
Processing data in table: test/def/t11(10) fragment 0
Restored 26 tuples and 0 log entries
NDBT_ProgramExit: 0 - OK
其他的SLAVE上的操作:
[root@node239 ndb_6_fs]# /usr/local/mysql/bin/ndb_restore -n6 -b1 -r -d –backup_path=/usr/local/mysql/data/BACKUP/BACKUP-1/
Nodeid = 6
Backup >backup path = /usr/local/mysql/data/BACKUP/BACKUP-1/
Ndb version in backup files: Version 5.1.21
Connected to ndb!!
_____________________________________________________
Processing data in table: sys/def/NDB$EVENTS_0(1) fragment 3
_____________________________________________________
Processing data in table: mysql/def/NDB$BLOB_2_3(3) fragment 3
_____________________________________________________
Processing data in table: sys/def/SYSTAB_0(0) fragment 3
_____________________________________________________
Processing data in table: mysql/def/ndb_schema(2) fragment 3
_____________________________________________________
Processing data in table: mysql/def/ndb_apply_status(4) fragment 3
_____________________________________________________
Processing data in table: test/def/t11(10) fragment 3
Restored 20 tuples and 0 log entries
NDBT_ProgramExit: 0 - OK
-d 开关的意思即:
-d, –no-restore-disk-objects
Dont restore disk objects (tablespace/logfilegroups etc)
既忽略表空间和分组空间