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

时间:2023-01-07 03:18:05

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中这些组件的关系图如下:

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

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

图一

名词解释: 

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


编辑中...