0. "NDB" 是什么意思?
它的意思是: "网络数据库".NDB(也叫NDB Cluster或者NDBCLUSTER),使用它才能让MySQL支持集群.
1. 什么是mysql集群?
Mysql Cluster(集群)是Mysql适合于分布式计算环境的高实用,高冗余版本(其实是Mysql发布的一个版本)。它采用了NDB Cluster存储引擎,允许在一个集群中运行多个Mysql服务器。在mysql5.0及以上的的二进制版本中,以及与最新的Linux版本兼容RPM包中提供了该存储引擎。
Mysql Cluster是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的Cluster(集群).通过无共享体系结构,系统能够使用低廉的硬件,而且对软硬件无特殊要求。此外每个组件有自己的内存和硬盘,不存在单点故障。
Mysql Cluster由一组计算机组成,每台计算机上均运行着多种进程,包括Mysql服务器,NDB Cluster的数据节点,管理服务器,以及(可能)专门的数据访问程序,关于Cluster中这些组件的关系图如下:
图一
名词解释:
A:冗余:通常指通过多重备份来增加系统的可靠性。
Mysql cluster的一些概念:
1-1 . NDB Management Server(NDB_MGMD)
这里节点的作用是管理Mysql Cluster内的其他节点,如提供配置数据,启动并停止节点,运行备份等。由于这里节点负责管理其他节点的配置,应在启动其他节点前首先启动这类节点。启动命令是:“ndb_mgmd"。
1-2 .SQL Node(客户节点)
这是用来访问Cluster数据的节点。对于Mysql Cluster,客户端节点是使用NDB Cluster存储引擎的传统Mysql服务器。通常,SQL节点是使用命令"mysqld -ndbcluster"启的,或将"ndbcluster"添加到"my.cnf"后使用"mysqld"启动。
1-3 .Data Node(数据节点)
数据节点用于保存Cluster的数据。数据节点的数据与副本的数目有关,是片段的倍数。例如:对于两个副本,每个副本有两个片段,那么就有四个数据节点。不过没有必要设置多个副本。数据节点是用命令"ndbd"启动的。
管理服务器负责管理Cluster配置文件和Cluster日志。Cluster中的每个节点从管理服务器检索配置数据,并请求确定管理服务器所在的位置的方式。当数据节点内出现新的事件时,节点奖关于这类事件的信息传输到管理服务器,然后将这里信息写入Cluster日志。
1-4 . 如果上面的描述还不是太清晰,请参见下面的连接,应该可以了解的更清晰
http://dev.mysql.com/doc/refman/5.1/zh/ndbcluster.html#mysql-cluster-overview
2. 为什么要实现高可用的mysql集群
对于外部应用来说,访问ndb,还是要使用ip地址的方式来连接sql节点来使用数据库。如果只有一个sql节点,当该节点宕机后,外部应用将无法使用ndb,也就是对外部应用程序的单节点故障。解决sql的单点故障的方法就是引入多个sql节点,再透过lvs技术给外部应用提供统一的ip地址来实现负载均衡。为了负载均衡器的宕机不影响使用,又引入了多台负载均衡器,再透过keepalived技术来实现高可用性。当某一个sql节点和负载均衡节点宕机后不影响外部应用程序的使用。
3. mysql集群实现的步骤
3-1. 规划
在MySql集群中分3类,5个节点
管理节点(mgm)-------------------ip:192.168.1.52
SQL节点1(sql1)------------------ip:192.168.1.53
SQL节点2(sql2)------------------ip:192.168.1.54
数据节点1(ndbd1)---------------ip:192.168.1.55
数据节点2(ndbd2)---------------ip:192.168.1.573-2.软件包下载与安装
下载地址:
http://ftp.ntu.edu.tw/pub/MySQL/Downloads/MySQL-Cluster-7.1/
下载包如下:
下载的时候注意os版本以及是否是64位,因为我的redhat5是64位的,所以,我下载了如下包:
MySQL-Cluster-gpl-client-7.1.14-1.rhel5.x86_64.rpm #sql节点安装
MySQL-Cluster-gpl-management-7.1.14-1.rhel5.x86_64.rpm #管理节点安装
MySQL-Cluster-gpl-server-7.1.14-1.rhel5.x86_64.rpm #sql节点安装
MySQL-Cluster-gpl-storage-7.1.14-1.rhel5.x86_64.rpm # ndbd节点安装
MySQL-Cluster-gpl-tools-7.1.14-1.rhel5.x86_64.rpm #管理节点安装
安装命令如下:
安装管理节点
#rpm –ivh MySQL-Cluster-gpl-management-7.1.14-1.rhel5.x86_64.rpm #rpm –ivh MySQL-Cluster-gpl-tools-7.1.14-1.rhel5.x86_64.rpm
安装sql节点
#rpm –ivh MySQL-Cluster-gpl-server-7.1.14-1.rhel5.x86_64.rpm #rpm –ivh MySQL-Cluster-gpl-client-7.1.14-1.rhel5.x86_64.rpm
安装ndb节点
#rpm –ivh MySQL-Cluster-gpl-storage-7.1.14-1.rhel5.x86_64.rpm
3-3. 配置管理(mgm)节点
#mkdir /etc/mysql-cluster #vi /etc/mysql-cluster/config.ini
内容如下:
[ndbd default] NoOfReplicas=2 DataMemory=80M IndexMemory=18M #TCP/IP options: [tcp default] portnumber=2202 #Management process options: [ndb_mgmd] id=1 hostname=192.168.1.52 datadir=/var/lib/mysql-cluster #Options for data node [ndbd] id=2 hostname=192.168.1.55 datadir=/var/lib/mysql [ndbd] id=3 hostname=192.168.1.57 #Set SQL node [mysqld] id=4 hostname=192.168.1.53 [mysqld] id=5 hostname=192.168.1.54
创建目录
#mkdir/var/lib/mysql-cluster
3-4.启动管理节点
#ndb_mgmd -f /etc/mysql-cluster/config.ini
启动成功后的提示:
MySQL Cluster Management Servermysql-5.1.56 ndb-7.1.14
查看启动后的端口号
#netstat –ntlp
3-5 .配置NDB节点
#vi /etc/my.cnf
在文件的末尾加入下面两行:
[mysql_cluster] nbd-connectstring=192.168.1.52 #管理节点的ip
创建目录
#mkdir/var/lib/mysql #如已存在,则放弃
3-6. 启动NDB节点
#ndbd –initial
3-7.配置sql节点
#vi /etc/my.cnf 内容如下: #The MySQL server [mysqld] port=3306 socket=/var/lib/mysql/mysql.sock ndbcluster default-storage-engine=NDBCLUSTER [mysql_cluster] ndb-connectstring=192.168.1.52
3-8. 启动sql节点
#servicemysql start
3-9.在管理节点中查看mysql Cluster的状态
#ndb_mgm Ndb_mgm>show
Connected to Management Server at:localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.1.55 (mysql-5.1.56 ndb-7.1.14, Nodegroup: 0,Master)
id=3 (not connected, accepting connect from 192.168.1.57)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.1.52 (mysql-5.1.56 ndb-7.1.14)
[mysqld(API)] 2 node(s)
id=4 (not connected, accepting connect from 192.168.1.53)
id=5 @192.168.1.54 (mysql-5.1.56 ndb-7.1.14)
上面红色的都是正常的,成功的ok的
浅绿色的都是 ng的,需要重新处理的,具体处理,视具体情况而定。比如说重新配置节点,重启等。3-10 . 注意各节点的启动顺序
注意启动顺序:(不能乱)
启动管理节点
启动ndb节点
启动sql节点3-11. 以上mysql集群的安装完毕。
4. 高可用性的加入
4-1 . 在Mysql cluster集群完成后,现在加入lvs和keepalived软件来实现高可用性,规划如下:
建立两台新的物理主机,作为调度器.
调度器(Mysql-ha-lb1)----Ip:192.168.1.59
调度器(Mysql-ha-lb2)----Ip:192.168.1.60
Vip设置为192.168.1.584-2. 下载软件
ipvsadm-1.24-8.1.x86_64.rpm
keepalived-1.1.17.tar.gz网上搜下就可以了,不再提供下载链接。
4-3. 在调度器上安装lvs
#rpm -ivh ipvsadm-1.24-8.1.x86_64.rpm
4-4. 在调度器上安装keepalived
注意在安装去前需要执行如下语句:
# ln -s /usr/src/kernels/2.6.18-92.el5-x86_64/ /usr/src/linux
红色部分可以根据具体的os系统来指定。目的(keepalived默认编译时是在/usr/src/linux下找内核源代码。可是我的内核源代码都在:/usr/src/kernels/2.6.18-53.el5-x86_64/)
#tar zxvf keepalived-1.1.17.tar.gz #cd keepalived-1.1.17 # ./configure && make && make install ( #find / -name keepalived # 查看keepalived位置 )
在屏幕中打印的安装log中查看,是否有如下内容:
Keepalived configuration
------------------------
Keepalived version : 1.1.17
Compiler : gcc
Compiler flags : -g -O2
Extra Lib : -lpopt -lssl -lcrypto
Use IPVS Framework : Yes
IPVS sync daemon support: Yes
Use VRRP Framework : Yes
Use LinkWatch : No
Use Debug flags : No
如果红色字体部分为yes,则表示ok.(# ln -s /usr/src/kernels/2.6.18-92.el5-x86_64/ /usr/src/linux有效了)
继续配置keepalived
# cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ # cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ #mkdir /etc/keepalived/ # cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ # cp /usr/local/sbin/keepalived /usr/sbin/
4-5. 配置/etc/keepalived/keepalived.conf文件
#guration File for keepalived #global define global_defs { router_id HaMySQL_1 } vrrp_sync_group VGM { group { VI_MYSQL } } vrrp_instance VI_MYSQL { state MASTER #副的设置为BACKUP interface eth0 lvs_sync_daemon_inteface eth0 virtual_router_id 55 priority 100 advert_int 5 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.58/24 dev eth0 } ################LVS MySQL Start####################### virtual_server 192.168.1.58 3306 { delay_loop 6 lb_algo rr lb_kind DR nat_mask 255.255.255.0 #persistence_timeout 6 protocol TCP real_server 192.168.1.53 3306 { weight 100 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } real_server 192.168.1.54 3306 { weight 100 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } } #####################LVS MySQL END##########################
4-6. 配置lvs节点(Mysql Cluster的sql节点):
#vi /etc/init.d/lvsrsdr 内容如下: #!/bin/bash #description:start realserver VIP=192.168.1.58 ./etc/rc.d/init.d/functions case "$1" in start) /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:0 echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore echo "2">/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p >/dev/null 2>&1 echo "start LVS of RealServer DR" ;; stop) /sbin/ifconfig lo:0 down route del $VIP>/dev/null 2>&1 echo "0">/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0">/proc/sys/net/ipv4/conf/lo/arp_announce echo "0">/proc/sys/net/ipv4/conf/all/arp_ignore echo "0">/proc/sys/net/ipv4/conf/all/arp_announce echo "close LVS of RealServer DR" ;; *) echo "Usage:$0 {start|stop}" exit 1 esac 给文件增加可执行权限 #chmod +x /etc/init.d/lvsrsdr
4-7. 启动lvs节点(Mysql Cluster的sql节点)
# service lvsrsdr start
4-8. 启动调度器
#service keepalived start
可以在打开窗口上clone个新窗口,输入:
#tail –f /var/log/messages
查看日志: Feb 23 02:26:49 server1 last message repeated 4 times Feb 23 02:27:58 server1 Keepalived: Starting Keepalived v1.1.17 (02/23,2012) Feb 23 02:27:58 server1 Keepalived_healthcheckers: Using MII-BMSR NIC polling thread... Feb 23 02:27:58 server1 Keepalived_healthcheckers: Registering Kernel netlink reflector Feb 23 02:27:58 server1 Keepalived_healthcheckers: Registering Kernel netlink command channel Feb 23 02:27:58 server1 Keepalived_healthcheckers: Opening file '/etc/keepalived/keepalived.conf'. Feb 23 02:27:58 server1 Keepalived_healthcheckers: Configuration is using : 11807 Bytes Feb 23 02:27:58 server1 Keepalived: Starting Healthcheck child process, pid=10289 Feb 23 02:27:58 server1 Keepalived_vrrp: Using MII-BMSR NIC polling thread... Feb 23 02:27:58 server1 Keepalived_vrrp: Registering Kernel netlink reflector Feb 23 02:27:58 server1 Keepalived_vrrp: Registering Kernel netlink command channel Feb 23 02:27:58 server1 Keepalived_vrrp: Registering gratutious ARP shared channel Feb 23 02:27:58 server1 Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'. Feb 23 02:27:59 server1 Keepalived_vrrp: Configuration is using : 63643 Bytes Feb 23 02:27:59 server1 Keepalived_vrrp: VRRP sockpool: [ifindex(2), proto(112), fd(9,10)] Feb 23 02:27:58 server1 Keepalived: Starting VRRP child process, pid=10292 Feb 23 02:27:59 server1 kernel: IPVS: [rr] scheduler registered. Feb 23 02:27:59 server1 Keepalived_healthcheckers: Activating healtchecker for service [192.168.1.53:3306] Feb 23 02:27:59 server1 Keepalived_healthcheckers: Activating healtchecker for service [192.168.1.54:3306] Feb 23 02:28:04 server1 Keepalived_vrrp: VRRP_Instance(VI_MYSQL) Transition to MASTER STATE Feb 23 02:28:09 server1 Keepalived_vrrp: VRRP_Instance(VI_MYSQL) Entering MASTER STATE Feb 23 02:28:09 server1 Keepalived_vrrp: VRRP_Instance(VI_MYSQL) setting protocol VIPs. Feb 23 02:28:09 server1 Keepalived_vrrp: VRRP_Instance(VI_MYSQL) Sending gratuitous ARPs on eth0 for 192.168.1.58 Feb 23 02:28:09 server1 Keepalived_vrrp: VRRP_Group(VGM) Syncing instances to MASTER state Feb 23 02:28:09 server1 avahi-daemon[5673]: Registering new address record for 192.168.1.58 on eth0. Feb 23 02:28:14 server1 Keepalived_vrrp: VRRP_Instance(VI_MYSQL) Sending gratuitous ARPs on eth0 for 192.168.1.58 如果出现以上红色部分的内容,基本配置成功了
红色字体内容是:
Feb23 02:27:59 server1 Keepalived_healthcheckers: Activating healtchecker for service [192.168.1.53:3306]
Feb 23 02:27:59 server1 Keepalived_healthcheckers: Activating healtchecker forservice [192.168.1.54:3306]
Feb 23 02:28:09 server1 Keepalived_vrrp: VRRP_Instance(VI_MYSQL) Entering MASTER STATE
Feb 23 02:28:09 server1 Keepalived_vrrp: VRRP_Instance(VI_MYSQL) setting protocol VIPs.
4.9 在调度节点输入#ipvsadm,如果出现如下的内容,则配置Ok
# ipvsadm
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.1.58:mysql rr -> 192.168.1.54:mysql Route 100 0 0 -> 192.168.1.53:mysql Route 100 0 0
5. 要远程应用程序访问mysql数据库,还需要一个远程访问的账号和密码,在mysql刚创建后,mysql是没有远程访问账号的,现在建立:
在sql节点上增加远程认证客户
Mysql>:select user,host,password frommysql.user; Mysql>:grant all privileges on *.* toadmin@”%” identified by ‘123123’ with grant option;
6、 测试省略。
编辑中...