您的位置:首页 > 运维架构 > 网站架构

RedHat5下实现Mysql集群+Lvs+Keepalived实现高可用HA负载均衡

2012-02-27 11:33 821 查看

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.57

3-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.58

4-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、 测试省略。

编辑中...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: