华拓科技网
您的当前位置:首页MySQL集群+LVS+KEEPALIVED环境搭建

MySQL集群+LVS+KEEPALIVED环境搭建

来源:华拓科技网


MySQL+lvs+keepalived集群环境搭建

1 MySQL集群简介

1.1 什么是MySQL集群

MySQL集群是一个无共享的(shared-nothing)、分布式节点架构的存储方案,其目的是提供容错性和高性能。

数据更新使用读已提交隔离级别(read-committedisolation)来保证所有节点数据的一致性,使用两阶段提交机制(two-phasedcommit)保证所有节点都有相同的数据(如果任何一个写操作失败,则更新失败)。

无共享的对等节点使得某台服务器上的更新操作在其他服务器上立即可见。传播更新使用一种复杂的通信机制,这一机制专用来提供跨网络的高吞吐量。

通过多个MySQL服务器分配负载,从而最大程序地达到高性能,通过在不同位置存储数据保证高可用性和冗余。

了解更多:

http://www.mysql.com/why-mysql/white-papers/guide-to-optimizing-performance-of-the-mysql-cluster/

1.2 集群 MySQL中名称概念

1) Sql 结点(SQL node—下图对应为 mysqld):分布式数据库。包括自身数据和查询中心结点数据

2) 数据结点(Data node – ndbd):集群共享数据(内存中)

3) 管理服务器(Management Server – ndb_mgmd):集群管理 SQL node,Data node

详情见下图:

1.3 环境配置

1) 至少2台Linux服务器,后面的例子是3台Linux服务器

A:192.168.1.179 Management Server

B:192.168.1.136 Data node、SQL node

C:192.168.1.10 Data node、SQL node

如果只有2台的话,那么其中一台机器就要多一个角色:Management Server

2) MySQL集群版本安装程序,分32位和位版本,最新版本请在http://www.mysql.com/downloads/里面下载

2 安装

不管是Management Server,还是Data node、SQL node,都需要先安装MySQL集群版本,然后根据不用的配置来决定当前服务器有哪几个角色。

安装之前准备好mysql用户和mysql用户组,相关命令:

groupadd mysql

useradd mysql -g mysql

确定相关机器的防火墙已关闭(或者设置防火墙这几台机器之间的网络连接是畅通无阻的),相关命令:

chkconfig iptables off

service iptables stop

2.1 安装MySQL集群版本

1) 把mysql-cluster-advanced-7.3.2-linux-glibc2.5-i686.tar.gz(这是32位安装版,位安装版:mysql-cluster-advanced-7.3.2-linux-glibc2.5-x86_.tar.gz)上传到/usr/local

2) 解压:tar zxvf mysql-cluster-advanced-7.3.2-linux-glibc2.5-i686.tar.gz

3) 重命名:mv mysql-cluster-advanced-7.3.2-linux-glibc2.5-i686 mysql

4) 授权:chown -R mysql:mysql mysql

5) 切换到mysql用户:su – mysql

6) 切换目录到mysql:/usr/local/mysql

7) 安装mysql:scripts/mysql_install_db --user=mysql

2.2 配置Management Server

1) 使用root账号创建目录:mkdir /var/lib/mysql-cluster

2) 新建文件config.ini然后上传到mysql-cluster里面:

[ndbd default] NoOfReplicas=2 DataMemory=80M IndexMemory=18M [ndb_mgmd]

Hostname=192.168.2.128 datadir=/var/lib/mysql-cluster [ndbd] Hostname=192.168.2.129 datadir=/usr/local/mysql/data/ [ndbd] Hostname=192.168.2.24 datadir=/usr/local/mysql/data/ [MYSQLD] Hostname=192.168.2.24 [MYSQLD] Hostname=192.168.2.129 [MYSQLD]

3) 授权:chown -R mysql:mysql /var/lib/mysql-cluster

4) 切换到mysql用户:su – mysql

5) 启动管理服务:/usr/local/mysql/bin/ndb_mgmd -f

/var/lib/mysql-cluster/config.ini

6) 查看服务是否正常启动:netstat –lntpu

打印:

tcp 0 0 0.0.0.0:1186 0.0.0.0:* LISTEN 2437/ndb_mgmd

看到1186端口开放了说明启动是正常的

2.3 配置Data Node

1) 新建文件my.cnf然后上传到/etc里面:

[mysqld] sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #basedir = /usr/local/mysql/ datadir = /usr/local/mysql/data

#user = mysql #port = 3306 #socket = /tmp/mysql.sock ndbcluster ndb-connectstring=192.168.2.128 [mysql_cluster] ndb-connectstring=192.168.2.128 (*网上有些资料是直接改/usr/local/mysql/my.cnf,我试了一下,无法启动,估计程序默认是读取/etc/my.cnf)

2) 切换到mysql用户:su – mysql

3) 启动数据节点服务:/usr/local/mysql/bin/ndbd –initial

第一次启动需要加参数:–initial,以后就不用加了,直接运行:/usr/local/mysql/bin/ndbd

4) 查看服务是否正常启动:netstat –lntpu

打印:

tcp 0 0 192.168.2.24:56806 0.0.0.0:* LISTEN 4949/ndbd

tcp 0 0 192.168.2.24:444 0.0.0.0:* LISTEN 4949/ndbd

tcp 0 0 192.168.2.24:50531 0.0.0.0:* LISTEN 4949/ndbd

看到ndbd了说明启动是正常的

2.4 配置SQL Node

1) 新建文件my.cnf然后上传到/etc里面,和上面的Data Node里面的配置一样,如果上面的步骤已经做了,略去此步骤。

2) 切换到mysql用户:su – mysql

3) 设置管理员密码:

/usr/local/mysql/bin/mysqladmin -u root password '123' /usr/local/mysql/bin/mysqladmin -u root -h LINUX129 password '123' 上面的命令行里面的123是新密码,LINUX129是机器名,这2条命令来自于安装mysql执行:scripts/mysql_install_db --user=mysql 后的打印日志

4) 复制mysqld到系统服务里面去:

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

如果权限不够,可以先使用root用户授权:

chown -R mysql:mysql /etc/init.d/mysqld

5) 启动SQL节点服务:service mysqld start

或者/etc/init.d/mysqld start

或者/usr/local/mysql/bin/mysqld_safe --user=mysql &

6) 查看服务是否正常启动:netstat –lntpu

打印:

tcp 0 0 :::3306 :::* LISTEN 2590/mysqld

看到3306端口开放了说明启动是正常的

3 常用命令或问题

1) ndb_mgmd管理命令:/usr/local/mysql/bin/ndb_mgm

执行之后就是管理控制台了,里面可以继续输入命令。

查看集群里面的全部节点的状态:show

2) 停止集群服务器的命令:/usr/local/mysql/bin/ndb_mgm -e shutdown

或者在 ndb_mgm 下查看服务ID show 看到相应的ID号 使用 ID STOP停止服务

如果集群配置有更新了:rm /usr/local/mysql/mysql-cluster/ndb_1_config.bin.1

3) 停止SQL节点的命令:/usr/local/mysql/bin/mysqladmin -uroot shutdown

4) SQL Node上连接MySQL:/usr/local/mysql/bin/mysql -u root –p

执行之后就是MySQL控制台了,里面可以继续输入命令。

测试集群环境:

mysql> show databases;

打印:

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| ndb_2_fs |

| test |

+--------------------+

mysql> create database aa;

mysql> use aa

mysql> CREATE TABLE ctest2 (i INT primary key) ENGINE=NDB; //1.每个MySQL集群表都需要主键.如果没有定义主键,则 NDB 存储引擎会自动创建一个,并且不是指定 USING HASH 的方式;2.这里必须指定数据库表的引擎为NDB(或者NDBCLUSTER),否则同步失败

mysql> INSERT INTO ctest2 () VALUES (1);

mysql> SELECT * FROM ctest2;

打印:

+------+

| i |

+------+

| 1 |

+------+

同样方式在另外一台SQL Node上连接MySQL,查看数据库、表、记录是否已同步过去。

5) 解决MySQL客户端工具连接SQL Node出现1130的异常,在MySQL控制台下执行:

 如果你想myuser使用mypassword从任何主机连接到mysql服务器的话。

GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

FLUSH PRIVILEGES;

 如果你想允许用户myuser从ip为192.168.1.6的主机连接到mysql服务器,并使用mypassword作为密码

GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

FLUSH PRIVILEGES;

 如果你想允许用户myuser从ip为192.168.1.6的主机连接到mysql服务器的dk数据库,并使用mypassword作为密码

GRANT ALL PRIVILEGES ON dk.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

FLUSH PRIVILEGES;

6) 使用MySQL客户端工具创建表时选择引擎:NDBCLUSTER,如下图:

LVS配置

lvs是在linux操作系统基础上建立虚拟服务器,实现服务节点之间的负载均衡。它是基于linux内核实现的。2.6.X内核默认集成了lvs模块。

lvs常用负载均衡的实现是基于ip协议的,所以一般称为ipvs。ipvs有三种实现方式,

最常用、性能最好的是Direct routing(简称DR)。

Ubuntu9.10已经用了2.6的内核,所以不需要再编译内核了,为了检测一下,可以在命令行执行:modprobe -l | grep ipvs

会出现:

kernel/net/netfilter/ipvs/ip_vs.ko

kernel/net/netfilter/ipvs/ip_vs_rr.ko

kernel/net/netfilter/ipvs/ip_vs_wrr.ko

kernel/net/netfilter/ipvs/ip_vs_lc.ko

kernel/net/netfilter/ipvs/ip_vs_wlc.ko

kernel/net/netfilter/ipvs/ip_vs_lblc.ko

kernel/net/netfilter/ipvs/ip_vs_lblcr.ko

kernel/net/netfilter/ipvs/ip_vs_dh.ko

kernel/net/netfilter/ipvs/ip_vs_sh.ko

kernel/net/netfilter/ipvs/ip_vs_sed.ko

kernel/net/netfilter/ipvs/ip_vs_nq.ko

kernel/net/netfilter/ipvs/ip_vs_ftp.ko

说明内核已经集成了ipvs模块

我的机器三台机器分别是192.168.1.10,192.168.1.9,192.168.1.136。虚拟IP为192.168.1.222其中192.168.1.9作为负载均衡器使用,首先需要安装ipvsadm。

执行:apt-get install ipvsadm

安装完成后执行:ipvsadm

会看到提示:

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

说明已经安装成功。

接下来就是配置lvs,其实很简单,就是在负载均衡器建一个虚拟ip,然后用ipvsadm建立转发规则

配置虚拟IP:

ifconfig eth0:0 192.168.1.222 netmask 255.255.255.0 broadcast 192.168.1.222

echo \"1\">/proc/sys/net/ipv4/ip_forward (此指令暂没发现有啥用处)

使用ipvsadm安装LVS服务:

ipvsadm -A -t 192.168.1.222:3306 -s wrr ##注意3306为MYSQL服务端口,如果是其它服务可修改端口号

增加真实服务器:

ipvsadm -a -t 192.168.1.222:3306 -r 192.168.1.10 -g -w 1 ###最后面是数字“一”不是“L”

ipvsadm -a -t 192.168.1.222:3306 -r 192.168.1.136 -g -w 1

sudo ipvsadm -a -t 192.168.1.222:3306 -r 192.168.1.121 -g -w 3

真实服务器的配置:

ifconfig lo:0 192.168.1.222 netmask 255.255.255.255 broadcast 192.168.1.222

route add -host 192.168.1.222 dev lo:0 (此指令暂没发现有啥用处)

echo \"1\">/proc/sys/net/ipv4/ip_forward (此指令暂没发现有啥用处)

我自己还尝试成功的指令:

LBServer:

ifconfig eth0:0 192.168.1.222 netmask 255.255.252.0 broadcast 192.168.1.222

真实服务器:

ifconfig eth0:0 192.168.1.222 netmask 255.255.252.0 broadcast 192.168.1.222

我只需要建立一个eth0:0就可以了。。。。。。与实际不同的在于子网掩码的第三段(255 vs 252)

在负载均衡服务器用ipvsadm --list查看:

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.1.222:3306 wrr

-> 192.168.1.10:3306 Route 1 0 0

-> 192.168.1.136:3306 Route 1 0 0

接着是做ARP Hidden,不同的linux系统指令有所区别,Ubuntu系统的指令为:

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

这时就可以访问虚拟IP(192.168.1.222)端口还是3306,访问MYSQLCLUSTER,注意 ,使用的用户必需要在所有MYSQL节点建立并且密码一至,否则无法登陆。

最后可以在负载均衡服务器上用ipvsadm --list查看:

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.1.222:3306 wrr

-> 192.168.1.10:3306 Route 1 2 0

-> 192.168.1.136:3306 Route 1 2 0

确实大功告成。不过如果机器重启的话,这些配置就没了,需要重新设置哦,另外还有个ipvsadm -C的指令是用于清除ipvsadm配置的,可能会有用处。

Ubuntu下部署Keepalived

Ubuntu下部署Keepalived

Keepalived是一种防止单点故障的高可用解决方案。

首先下载:

cd /usr

wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz

解压:

tar zxvf keepalived-1.2.7.tar.gz

编译之前需要安装几个程序库

[plain]

apt-get install libssl-dev

apt-get install openssl

apt-get install libpopt-dev

然后运行

./configure --prefix=/usr

得到如下结果:

Keepalived configuration

------------------------

Keepalived version : 1.2.7

Compiler : gcc

Compiler flags : -g -O2

Extra Lib : -lpopt -lssl -lcrypto

Use IPVS Framework : Yes

IPVS sync daemon support : Yes

IPVS use libnl : No

Use VRRP Framework : Yes

Use VRRP VMAC : Yes

SNMP support : No

Use Debug flags : No

编译吧:

make

make install

程序安装到下面几个目录:

/usr/sbin中包含可执行程序keepalived

/usr/etc/keepalived/ 中包含了配置文件和例子

/usr/etc/rc.d/init.d/keepalived 是可以作为service的脚本文件,复制到/etc/init.d目录下

修改三处:

[plain]

#. /etc/rc.d/init.d/functions

. /lib/lsb/init-functions

[plain]

#. /etc/sysconfig/keepalived

. /usr/etc/sysconfig/keepalived

因为redhat之外的Linux没有上面两处目录。

下面也要修改,将${..} 直接用start替换。

[plain]

start() {

echo -n $\"Starting $prog: \"

#daemon keepalived ${KEEPALIVED_OPTIONS}

daemon keepalived start

RETVAL=$?

echo

[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog

}

还要创建目录

[plain]

mkdir -p /var/lock/subsys

现在设置为系统服务

[plain]

update-rc.d keepalived default

安装daemon服务。

apt-get install daemon

配置keepalived.conf

vi /etc/keepalived/keepalived.conf

添加如下内容:

global_defs {

router_id HaMySQL_1

}

vrrp_sync_group VGM {

group {

VI_MYSQL

}

}

vrrp_instance VI_MYSQL {

state MASTER

interface eth0

virtual_router_id 100

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.1.222/24 dev etho label eth0:1

}

}

virtual_server 192.168.1.222 3306 {

delay_loop 6

lb_algo rr

lb_kind DR

# nat_mask 255.255.0.0

#persistence_timeout 50

protocol TCP

real_server 192.168.1.10 3306 {

weight 3

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 3306

}

}

real_server 192.168.1.136 3306 {

weight 3

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 3306

}

}

}

4.sql服务节点的配置

vi /etc/rc.d/init.d/realserver.sh 添加如下配置:

#!/bin/bash

# description: Config realserver lo and apply noarp

SNS_VIP=192.168.1.222

/etc/rc.d/init.d/functions

case \"$1\" in

start)

ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP

/sbin/route add -host $SNS_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 \"RealServer Start OK\"

;;

stop)

ifconfig lo:0 down

route del $SNS_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 \"RealServer Stoped\"

;;

*)

echo \"Usage: $0 {start|stop}\"

exit 1

esac

exit 0

添加加可执行的权限

chmod +x /etc/rc.d/init.d/realserver.sh

注:四台sql节点都要进行此步操作

五、启动LVS节点(mysql cluster中的sql节点)

/etc/rc.d/init.d/realserver.sh start

六、启动调度器(keepalived的服务器端启动)

/etc/rc.d/init.d/keepalived start

启动后可以用命令 tail -f /var/log/messages 进行查看

若看到如下提示,则表示配置成功。

1. [root@sg204 mysql-cluster]# tail -f /var/log/messages

2. May 29 17:21:01 sg204 Keepalived_vrrp: Opening file '/etc/keepalived/keepalived.conf'.

3. May 29 17:21:01 sg204 Keepalived_vrrp: Configuration is using : 63921 Bytes

4. May 29 17:21:01 sg204 Keepalived_healthcheckers: Using LinkWatch kernel netlink reflector...

5. May 29 17:21:01 sg204 Keepalived_vrrp: Using LinkWatch kernel netlink reflector...

6. May 29 17:21:01 sg204 Keepalived_healthcheckers: Activating healtchecker for service [172.16.48.206:3306]

7. May 29 17:21:01 sg204 Keepalived_healthcheckers: Activating healtchecker for service [172.16.48.207:3306]

8. May 29 17:21:01 sg204 Keepalived_healthcheckers: Activating healtchecker for service [172.16.48.208:3306]

9. May 29 17:21:01 sg204 Keepalived_healthcheckers: Activating healtchecker for service [172.16.48.211:3306]

10. May 29 17:21:01 sg204 Keepalived_vrrp: VRRP sockpool: [ifindex(3), proto(112), fd(10,11)]

11. May 29 17:21:02 sg204 Keepalived_vrrp: VRRP_Instance(VI_MYSQL) Transition to MASTER STATE

12. May 29 17:21:03 sg204 Keepalived_vrrp: VRRP_Instance(VI_MYSQL) Entering MASTER STATE

13. May 29 17:21:03 sg204 Keepalived_vrrp: VRRP_Instance(VI_MYSQL) setting protocol VIPs.

14. May 29 17:21:03 sg204 Keepalived_healthcheckers: Netlink reflector reports IP 172.100.100.251 added

15. May 29 17:21:03 sg204 Keepalived_vrrp: VRRP_Instance(VI_MYSQL) Sending gratuitous ARPs on eth1 for 172.100.100.251

16. May 29 17:21:03 sg204 Keepalived_vrrp: VRRP_Group(VGM) Syncing instances to MASTER state

17. May 29 17:21:03 sg204 avahi-daemon[4768]: Registering new address record for 172.100.100.251 on eth1.

18. May 29 17:21:03 sg204 Keepalived_vrrp: Netlink reflector reports IP 172.100.100.251 added

19. May 29 17:21:08 sg204 Keepalived_vrrp: VRRP_Instance(VI_MYSQL) Sending gratuitous ARPs on eth1 for 172.100.100.251

好了,终于可以正常启动了。

service keepalived start

关闭用

service keepalived stop

架构图

这里调度器只用了一个节点,没有设置Backup

双管理节点修改配置文件步骤:

1 修改节点一配置文件, 并在配置文件中注释掉管理节点二的相关信息;

2 在MGM管理程序中停止管理节点一的管理服务;删除

下面的两个文件;并且使用命令: –f

/var/lib/mysql-cluster/config.ini

/usr/local/mysql/mysql-cluster

/usr/local/mysql/bin/ndb_mgmd --reload命令重启管理服务;

3 按照步骤1 2修改管理节点二的配置文件,并重启管理节点二的管理服务;

4 停止管理节点一的管理服务,并修改其配置文件,将节点二的注释取消,并重启管理节点一的管理服务;管理节点二重复管理节点一的步骤;些时查看服务正常,并且修改信息已经更新。

注:如果直接修改配置文件,不注销掉其它管理节点信息,将会报错:ERROR Message: The cluster configuration is not yet confirmed by all defined management servers. This management server is still waiting for node 1 to connect.

Could not get configuration

* 4012: Failed to get configuration

* The cluster configuration is not yet confirmed by all defined

management servers. This management server is still waiting for node 1 to connect.

--------------------------------------------------添加新的SQL节点

注意:所有配置文件修改完成之后,SQL节点启动,需要在NDB_MGM中重启NDB数据节点,否则无法识别新的SQL节点。

另外:需要把其它SQL节点 /usr/local/mysql/data目录下的文件复制到新添加的节点本地目录下,并将来的数据删除。

添加数据节点:

在配置文件中添加新的数据节点信息;数据节点安装相关插件并修改参数文件 /etc/my.cnf文件之后,启动NDBD服务加参数—initial;注意,本地的DATA目录的文件删除,并且不需要复制其它节点的数据文件,DATA目录一定保持干净,当然加入集群之后自动同步的数据文件不算。在数据节点启动NDBD服务之后,管理节点是无法识别新的数据节点,必需分别重启数据节点及SQL节点,注意:为保证服务的高可用,节点重启时,必要一个节点一个节点的重启。

因篇幅问题不能全部显示,请点此查看更多更全内容