Keepalived+Mysql-Cluster 架构概述
Mysql-cluster本身实现了高可用,但是其sql节点并没有实现负载均衡,单独使用会出现单点故障,因此用Keepalived为mysqld节点提供负载均衡与高可用性,防止单点故障,此外性能也能得到很大的提升!
Mysql-Cluster简介
简单的说,MySQL Cluster 实际上是在无共享存储设备的情况下实现的一种完全分布式
数据库系统,其主要通过NDB Cluster(简称NDB)存储引擎来实现。MySQL Cluster 刚刚
诞生的时候可以说是一个可以对数据进行持久化的内存数据库,所有数据和索引都必须装载
在内存中才能够正常运行,但是最新的MySQL Cluster 版本已经可以做到仅仅将所有索引和索引数据装载在内存中即可,实际的数据可以不用全部装载到内存中,架构如下图所示:
由上图可知MySQL Cluster 由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB Cluster 的数据节点,管理服务器,三个节点的功能如下:
1、 管理(MGM)节点:这类节点的作用是管理MySQL Cluster内的其他节点,如提供配 置数据、启动并停止节点、运行备份等。由于这类节点负责管理其他节点的配置, 应在启动其他节点之前首先启 动这类节点。MGM节 点是用命令“ndb_mgmd”启动的。
2、 数据节点:这类节点用于保存 Cluster的数据。数据节点的数目与 副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点。不过没有必要设置多个副本。数据节点是用命令“ndbd”启动的。
3、 SQL节点:这是用来访问 Cluster数据的节点。对于MySQL Cluster,客户端节点是使用NDB Cluster存储引擎的传统MySQL服务器。通常,SQL节点是使用命令“mysqld –ndbcluster”启动的,或将“ndbcluster”添加到“my.cnf”后使用“mysqld”启动
Mysql-cluster的优缺点
优点:
a) 99.999 %的高可用性
b) 快速的自动失效切换
c) 灵活的分布式体系结构,没有单点故障
d) 高吞吐量和低延迟
e) 可扩展性强,支持在线扩容
缺点:
a) 存在很多限制,比如:不支持外键,数据行不能超过8K(不包括BLOB和text中的数据)
b) 部署、管理、配置很复杂
c) 占用磁盘空间大,内存大
d) 备份和恢复不方便
e) 重启的时候,数据节点将数据load到内存需要很长时间
Keepalived+LVS+Mysql-Cluster(7.1.10)的安装配置
NDB Cluster的硬件需求:
管理节点:对硬件没什么要求,差 一点的机器完全能够胜任
数据节点:可以选择大内存,cpu也相对来讲不错 的,尤其是以后ndbmtd对多核Cpu的支持
Mysql节 点:对cpu要求较高,选择多核,高频CPU较好
环境:
Role IP OS Cpu Mem
管理节点(LVS) 192.168.100.223 CentOS 5.5 64bit E5405 @ 2.00GHz 3GNdb节点1 192.168.100.231 CentOS 5.5 64bit E5506 @ 2.13GHz 16GNdb节点2 192.168.100.232 CentOS 5.5 64bit E5506 @ 2.13GHz 16GMysql节点1 192.168.100.225 CentOS 5.5 64bit E5506 @ 2.13GHz 16GMysql节点2 192.168.100.226 CentOS 5.5 64bit E5506 @ 2.13GHz 16GMysql版本:mysql-5.1.51
NDB版本:ndb-7.1.10 架构图:Mysql-Cluster 7.1.10的安装配置数据节点的安装:tar xzvf mysql-cluster-gpl-7.1.10-linux-i686-glibc23.tar.gzmv mysql-cluster-gpl-7.1.10-linux-i686-glibc23 /usr/local/mysql#编辑/etc/my.cnf,添加如下内容: [mysql_cluster]ndb-connectstring="nodeid=21, 192.168.100.223"#修改环境变量,增加mysql命令路径vi /root/.bash_profile#修改如下PATH=$PATH:$HOME/bin:/usr/local/mysql/bin然后执行source /root/.bash_profile命令使更改生效!另一个数据节点的安装类似。Mysql节点的安装/usr/sbin/groupadd mysql/usr/sbin/useradd -g mysql mysqltar xzvf mysql-cluster-gpl-7.1.10-linux-i686-glibc23.tar.gzmv mysql-cluster-gpl-7.1.10-linux-i686-glibc23 /usr/local/mysqlchown -R root.mysql /usr/local/mysqlchown -R mysql.mysql /usr/local/mysql/datacd /usr/local/mysql./scripts/mysql_install_db --user=mysqlcp /usr/local/mysql/support-files/my-huge.cnf /etc/my.cnf添加如下内容:[mysql_cluster]ndb-connectstring="nodeid=12,192.168.100.223"在[mysqld]下添加如下内容ndbclusterndb-connectstring="nodeid=12,192.168.100.223"ndb-force-send=1ndb-use-exact-count=0ndb-autoincrement-prefetch-sz=256engine-condition-pushdown=1ndb-cluster-connection-pool=4default-storage-engine = ndbcluster#编辑 /root/.bash_profile#修改如下PATH=$PATH:$HOME/bin:/usr/local/mysql/bin然后执行source /root/.bash_profile命令使更改生效!cp support-files/mysql.server /etc/rc.d/init.d/mysqld#设置成服务启动chkconfig --add mysqldchkconfig --level 2345 mysqld on另一个mysql节点的安装类似。管理节点的安装tar xzvf mysql-cluster-gpl-7.1.10-linux-i686-glibc23.tar.gzcp mysql-cluster-gpl-7.1.10-linux-i686-glibc23/cp mysql-cluster-gpl-7.1.10-linux-i686-glibc23/bin/ndb_mgm* /usr/bin/chmod +x /usr/bin/ ndb_mgm*新建/etc/my.cnf,添加如下内容:[mysqld]ndbclusterndb-connectstring=192.168.100.223[mysql_cluster]ndb-connectstring=192.168.100.223#新建config.ini文件,添加如下内容:
[tcp default]SendBufferMemory=2MReceiveBufferMemory=2M[NDB_MGMD]HostName=192.168.100.223[NDBD DEFAULT]TotalSendBufferMemory = 256MNoOfReplicas=2DataMemory=10240MIndexMemory=1024MDataDir=/data/dbdata#DataDir=/usr/local/mysql/mysql-cluster#FileSystemPath=/data/dbdataFragmentLogFileSize=256MNoOfFragmentLogFiles=16LockPagesInMainMemory=1MaxNoOfTables=4096MaxNoOfOrderedIndexes=2048MaxNoOfUniqueHashIndexes=2048MaxNoOfAttributes=20480MaxNoOfTriggers=10240ODirect=1MaxNoOfConcurrentTransactions=50000MaxNoOfConcurrentOperations=100000TimeBetweenGlobalCheckpoints=1000TimeBetweenEpochs=200TransactionBufferMemory=10MDiskCheckpointSpeed=10MDiskCheckpointSpeedInRestart=100MRedoBuffer=64MSchedulerSpinTimer=400SchedulerExecutionTimer=100RealTimeScheduler=1BackupMaxWriteSize=1MBackupDataBufferSize=16MBackupLogBufferSize=4MBackupMemory=20MMaxNoOfExecutionThreads=4TransactionDeadLockDetectionTimeOut=10000BatchSizePerLocalScan=512#diskSharedGlobalMemory=256MDiskPageBufferMemory=512MB[NDBD]id=11HostName=192.168.100.231#LockExecuteThreadToCpu=1,2,3#LockMaintThreadsToCPU=0[NDBD]id=12HostName=192.168.100.232#LockExecuteThreadToCpu=1,2,3#LockMaintThreadsToCPU=0[MYSQLD]id=13HostName=192.168.100.225[MYSQLD]id=14HostName=192.168.100.226[MYSQLD][MYSQLD][MYSQLD][MYSQLD][MYSQLD][MYSQLD][MYSQLD][MYSQLD][MYSQLD] keepalived的安装配置Lvs的安装wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gzln -s /usr/src/kernels/2.6.18-164.el5-i686/ /usr/src/linuxtar zxvf ipvsadm-1.24.tar.gzcd ipvsadm-1.24make && make installKeepalived的安装wget http://www.keepalived.org/software/keepalived-1.1.19.tar.gztar zxvf keepalived-1.1.19.tar.gzcd keepalived-1.1.19./configure --prefix=/usr/local/keepalivedmake make installcp /usr/local/keepalived/sbin/keepalived /usr/sbin/cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/mkdir /etc/keepalivedkeepalived的配置server端的配置vi /etc/keepalived/keepalived.conf添加如下内容:global_defs {
notification_email {
zhangxy@zhang.com
}
notification_email_from zhangxy@zhang.com
smtp_server 192.168.1.250
smtp_connect_timeout 30
router_id LVS_DEV
}
vrrp_instance VI_9 {
state MASTER
interface eth0
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 2209
}
virtual_ipaddress {
192.168.100.229/24 dev eth0 label eth0:1
}
}
virtual_server 192.168.100.229 3306 {
delay_loop 2
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
# persistence_timeout 60
protocol TCP
real_server 192.168.100.225 3306 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
real_server 192.168.100.226 3306 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
Client端的配置vi /etc/rc.d/init.d/realserver.sh 添加如下配置:#!/bin/bash
# description: Config realserver lo and apply noarp
SNS_VIP=192.168.100.229
/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.shkeepalived的服务器端启动/etc/rc.d/init.d/keepalived startkeepalived的客户端启动/etc/rc.d/init.d/realserver.sh startndb各节点的关闭和启动节点的启动和关闭是有顺序的,启动的时候应该先启动管理节点,然后是数据节点,最后是mysql节点。关闭节点的时候应该先关闭mysql节点,然后再通过管理节点关闭所有的管理节点和数据节点。启动:/usr/bin/ndb_mgmd -f /usr/local/mysql/mysql-cluster/config.ini(启动管理节点)/usr/bin/ndbd --initial(启动数据节点,只有第一次启动或者有的配置变更后才需要--initial参数)/etc/rc.d/init.d/mysqld start(启动mysql节点)停止:/etc/rc.d/init.d/mysqld stopndb_mgm -e shutdown