利用MySQL Cluster 7.0 + LVS 搭建高可用环境

来源:互联网 发布:防水建材网络推广方案 编辑:程序博客网 时间:2024/06/06 02:45
 

1、前言


随着数据量规模的扩大,企业对 MySQL 的要求就不仅仅是能用了,也在寻求各种高可用方案。以前我们的大部分高可用方案其实还存在一定缺陷,例如MySQL Replication 方案,Master 是否存活检测需要一定时间,而和 Slave 的切换也需要时间,因此其高可用程度较大依赖监控软件或自动化管理工具。而早先的 MySQL Cluster 实在不能令人满意,性能差的不行,也让我们的期待一次次落空。本次MySQL Cluster 7.0 的推出,终于实现了质的飞跃,性能上得到了很大提高。MySQL Cluster 7.0 新特性主要体现在以下几个方面:

  • 数据节点多线程
  • 可以在线增加节点
  • 大记录存取改进
  • 支持windows平台

本身MySQL Cluster已经实现了高可用,不过由于SQL节点无法对外部负载均衡,因此我们采用 LVS 来实现这一需求。

2、安装


环境描述:

内核:2.6.9-78.0.17.ELsmp硬件:DELL 2950, 146G 15K RPM SAS * 6(raid 1+0), 8G Ram

各个节点描述:

IP描述192.168.0.2ndb mgm node192.168.0.3data node1, sql node 1, LVS DR Server192.168.0.4data node2, sql node 2192.168.0.5data node3, sql node 3192.168.0.6data node4, sql node 4192.168.0.7sql node 5192.168.0.8sql node 6192.168.0.9sql node 7192.168.0.10sql node 8

是这样安排这些服务器的,192.168.0.2 作为 MySQL Cluster 的管理节点,2 ~ 6 既做数据节点(DATA node),也做SQL节点(SQL node),7 ~ 10 也做SQL节点。LVS采用VS/DR 的模式,因此把 192.168.0.2 也同时作为 LVS 的 DR Server
分配好机器,接下来就是安装响应的软件包了。

2.1 LVS 安装、配置


老实说,我对LVS并不十分在行,以前折腾过一次,差点快崩溃了,后来才发现是我下载的版本太高了,没想到这次也是这样 :(,白折腾了1天。其实过程比较简单,只要下载的版本能对的上就快了。
在这里,我下载的是源码rpm包,因此需要用rpmbuild编译一次。

[yejr@imysql.cn ~]# rpm -ivhU ~/kernel-2.6.9-78.0.17.EL.src.rpm[yejr@imysql.cn ~]# cd /usr/src/redhat/SPECS[yejr@imysql.cn ~]# rpmbuild -bp kernel-2.6.spec #解开源码包,打上各种pache[yejr@imysql.cn ~]# rpm -ivhU ~/ipvsadm-1.24-5.src.rpm #安装ipvsadm的源码包[yejr@imysql.cn SPECS]# lsipvsadm.spec  kernel-2.6.spec#需要做一下链接,编译ipvsadm时用得着[yejr@imysql.cn SPECS]# ln -s /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9 /usr/src/linux[yejr@imysql.cn SPECS]# rpm -bb ipvsadm.spec #编译出ipvsadm的rpm包[yejr@imysql.cn SPECS]# ls -l /usr/src/redhat/RPMS/x86_64/total 36-rw-r--r--  1 root root 30941 May  4 18:06 ipvsadm-1.24-5.x86_64.rpm-rw-r--r--  1 root root  2968 May  4 18:06 ipvsadm-debuginfo-1.24-5.x86_64.rpm[yejr@imysql.cn ~]# rpm -ivhU /usr/src/redhat/RPMS/x86_64/ipvsadm-1.24-5.x86_64.rpm

看到了吧,其实很简单。网上的有些资料说要把 ipvsadm.spec 中的 Copyright 这个 Tag 改成 License,可能是因为版本较老,我用的这个版本就不需要这样。
接下来就是加载 ip_vs 模块,然后开始做 LVS DR 转发了。

[yejr@imysql.cn ~]# /sbin/modprobe ip_vs[yejr@imysql.cn ~]# lsmod | grep ip_vsip_vs                 103169  3 ip_vs_rr

直接编辑 /etc/sysconfig/ipvsadm 文件:

[yejr@imysql.cn ~]# cat /etc/sysconfig/ipvsadm-C-A -t lvs_vip:mysql -s rr-a -t lvs_vip:mysql -r ndb_data_node_1:mysql -g -w 1-a -t lvs_vip:mysql -r ndb_data_node_2:mysql -g -w 1-a -t lvs_vip:mysql -r ndb_data_node_3:mysql -g -w 1-a -t lvs_vip:mysql -r ndb_data_node_4:mysql -g -w 1-a -t lvs_vip:mysql -r ndb_sql_node_1:mysql -g -w 1-a -t lvs_vip:mysql -r ndb_sql_node_2:mysql -g -w 1-a -t lvs_vip:mysql -r ndb_sql_node_3:mysql -g -w 1-a -t lvs_vip:mysql -r ndb_sql_node_4:mysql -g -w 1

保存退出。上面显示的是 hostname 的格式,因为我都在 /etc/hosts 里设置各自对应的 hostname 了。
然后就是在 DR Server 上绑定 vip,然后打开 ip_forward,启动 ipvsadm,LVS 就可以开始工作了。

[yejr@imysql.cn ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #修改内核,打开转发[yejr@imysql.cn ~]# /sbin/ifconfig eth0:0 192.168.0.11 netmask 255.255.255.0 #绑定vip[yejr@imysql.cn ~]# /etc/init.d/ipvsadm start #启动ipvsadm[yejr@imysql.cn ~]# ipvsadm -L #查看列表ipvsadm -LIP Virtual Server version 1.2.0 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConnTCP  lvs_vip:mysql rr-> gs_ndb_sql_node_1:mysql      Route   1      0          0-> gs_ndb_sql_node_2:mysql      Route   1      0          0-> gs_ndb_sql_node_3:mysql      Route   1      0          0-> gs_ndb_sql_node_4:mysql      Route   1      0          0-> gs_ndb_data_node_1:mysql     Route   1      0          0-> gs_ndb_data_node_2:mysql     Route   1      0          0-> gs_ndb_data_node_3:mysql     Route   1      0          0-> gs_ndb_data_node_4:mysql     Route   1      0          0[yejr@imysql.cn ~]# lsmod | ip_vs #查看已加载模块lsmod | grep ip_vsip_vs_rr                3649  1ip_vs                 103169  3 ip_vs_rr

DR Server 上设置完后,再在 Real Server 上绑定vip,然后测 试,没问题的话,就可以用了。

[yejr@imysql.cn ~]# /sbin/ifconfig lo:0 192.168.0.11 netmask 255.255.255.255 broadcast 192.168.0.11#设定noarp[yejr@imysql.cn ~]# echo '2' > /proc/sys/net/ipv4/conf/lo/arp_announce;echo '1' > /proc/sys/net/ipv4/conf/lo/arp_ignore;echo '2' > /proc/sys/net/ipv4/conf/all/arp_announce;echo '1' > /proc/sys/net/ipv4/conf/all/arp_ignore

2.2 MySQL Cluster安装


MySQL Cluster的安装重点在于管理节点的配置文件,只要把配置文件设置好了,其他的就很快了。我在这里是直接用 rpm 包安装的,因为下载整个预编译好的 tar.gz 文件实在太大了,这点上 MySQL 是越来越臃肿了 :(

[yejr@imysql.cn ~]# cat /home/mysql/config.ini[TCP DEFAULT]SendBufferMemory=2MReceiveBufferMemory=2M[NDB_MGMD DEFAULT]PortNumber=1186Datadir=/home/mysql/[NDB_MGMD]id=1Datadir=/home/mysql/Hostname=192.168.0.2[NDBD DEFAULT]NoOfReplicas=2Datadir=/home/mysql/DataMemory=2048MIndexMemory=1024MLockPagesInMainMemory=1MaxNoOfConcurrentOperations=100000StringMemory=25MaxNoOfTables=4096MaxNoOfOrderedIndexes=2048MaxNoOfUniqueHashIndexes=512MaxNoOfAttributes=24576DiskCheckpointSpeedInRestart=100MFragmentLogFileSize=256MInitFragmentLogFiles=FULLNoOfFragmentLogFiles=6RedoBuffer=32MTimeBetweenLocalCheckpoints=20TimeBetweenGlobalCheckpoints=1000TimeBetweenEpochs=100MemReportFrequency=30BackupReportFrequency=10### Params for setting loggingLogLevelStartup=15LogLevelShutdown=15LogLevelCheckpoint=8LogLevelNodeRestart=15### Params for increasing Disk throughputBackupMaxWriteSize=1MBackupDataBufferSize=16MBackupLogBufferSize=4MBackupMemory=20M#Reports indicates that odirect=1 can cause io errors (os err code 5) on some systems. You must test.#ODirect=1### WatchdogTimeBetweenWatchdogCheckInitial=30000### TransactionInactiveTimeout  - should be enabled in Production#TransactionInactiveTimeout=30000### CGE 6.3 - REALTIME EXTENSIONS#RealTimeScheduler=1#SchedulerExecutionTimer=80#SchedulerSpinTimer=40### DISK DATA#SharedGlobalMemory=384M#read my blog how to set this:#DiskPageBufferMemory=3072M### MultithreadingMaxNoOfExecutionThreads=8[NDBD]id=2Datadir=/home/mysql/Hostname=192.168.221.3#LockExecuteThreadToCPU=X#LockMaintThreadsToCPU=Y[NDBD]id=3Datadir=/home/mysql/Hostname=192.168.0.4#LockExecuteThreadToCPU=X#LockMaintThreadsToCPU=Y[NDBD]id=4Datadir=/home/mysql/Hostname=192.168.0.5#LockExecuteThreadToCPU=X#LockMaintThreadsToCPU=Y[NDBD]id=5Datadir=/home/mysql/Hostname=192.168.0.6#LockExecuteThreadToCPU=X#LockMaintThreadsToCPU=Y[MYSQLD]id=6Hostname=192.168.0.3[MYSQLD]id=7Hostname=192.168.0.4[MYSQLD]id=8Hostname=192.168.0.5[MYSQLD]id=9Hostname=192.168.0.6[MYSQLD]id=10Hostname=192.168.0.7[MYSQLD]id=11Hostname=192.168.0.8[MYSQLD]id=12Hostname=192.168.0.9[MYSQLD]id=13Hostname=192.168.0.10

然后启动 ndb_mgmd 进程:

[yejr@imysql.cn ~]# /usr/sbin/ndb_mgmd -f /home/mysql/config.ini --configdir=/home/mysql/

如果是修改了配置文件里的某些参数,则需要先关闭 ndb_mgmd 进程,然后重新启动,不过必须加上--reload 选项,因为 7.0 版本中,会把配置文件放在 cache 里,如果不注意到这点,可能会被搞得莫名其妙的。

[yejr@imysql.cn ~]# /usr/sbin/ndb_mgmd -f /home/mysql/config.ini --configdir=/home/mysql/ --reload

然后在数据节点上启动 ndbd 进程:

[yejr@imysql.cn ~]# /usr/sbin/ndbd --initial

首次启动,需要加上 --initial 选项,其后的启动后就不需要了。
最后,修改SQL节点上的配置文件 my.cnf,然后启动 mysqld 进程:

[yejr@imysql.cn ~]# cat /etc/my.cnf#my.cnf[mysql_cluster]ndb-connectstring="192.168.0.2:1186"[MYSQLD]......ndb-cluster-connection-pool=1ndbclusterndb-connectstring="192.168.0.2:1186"ndb-force-send=1ndb-use-exact-count=0ndb-extra-logging=1ndb-autoincrement-prefetch-sz=256engine-condition-pushdown=1......[yejr@imysql.cn ~]# /etc/init.d/mysql start[yejr@imysql.cn ~]# mysqladmin pr+------+-------------+-----------+----+---------+------+-----------------------------------+------------------+| Id   | User        | Host      | db | Command | Time | State                             | Info             |+------+-------------+-----------+----+---------+------+-----------------------------------+------------------+| 1    | system user |           |    | Daemon  | 0    | Waiting for event from ndbcluster |                  || 1579 | root        | localhost |    | Query   | 0    |                                   | show processlist |+------+-------------+-----------+----+---------+------+-----------------------------------+------------------+

在管理节点上看下 cluster 的状态:

[yejr@imysql.cn ~]# ndb_mgm-- NDB Cluster -- Management Client --ndb_mgm> showConnected to Management Server at: localhost:1186Cluster Configuration---------------------[ndbd(NDB)]     4 node(s)id=2    @192.168.0.3  (mysql-5.1.32 ndb-7.0.5, Nodegroup: 0, Master)id=3    @192.168.0.4  (mysql-5.1.32 ndb-7.0.5, Nodegroup: 0)id=4    @192.168.0.5  (mysql-5.1.32 ndb-7.0.5, Nodegroup: 1)id=5    @192.168.0.6  (mysql-5.1.32 ndb-7.0.5, Nodegroup: 1)[ndb_mgmd(MGM)] 1 node(s)id=1    @192.168.0.2  (mysql-5.1.32 ndb-7.0.5)[mysqld(API)]   10 node(s)id=6    @192.168.0.3  (mysql-5.1.32 ndb-7.0.5)id=7    @192.168.0.4  (mysql-5.1.32 ndb-7.0.5)id=8    @192.168.0.5  (mysql-5.1.32 ndb-7.0.5)id=9    @192.168.0.6  (mysql-5.1.32 ndb-7.0.5)id=10   @192.168.0.7  (mysql-5.1.32 ndb-7.0.5)id=13   @192.168.0.8  (mysql-5.1.32 ndb-7.0.5)id=14   @192.168.0.9  (mysql-5.1.32 ndb-7.0.5)id=15   @192.168.0.10  (mysql-5.1.32 ndb-7.0.5)ndb_mgm> exit

可以看到,一切正常。

3、测试


我们主要进行一下对比测试,看看新版本的 ndbcluster 引擎相对 MyISAM 和 InnoDB 到底区别多大。

3.1 mysqlslap测试结果



纵坐标是总共运行时间。
mysqlslap完整执行参数类似下面:

mysqlslap -hlocalhost -uroot --engine=myisam --auto-generate-sql-write-number=100000 --auto-generate-sql-guid-primary \--concurrency=50,100,200 --number-of-queries=500000 --iterations=2 --number-char-cols=10 --number-int-cols=10 \--auto-generate-sql --create-schema=ndb --auto-generate-sql-load-type=mixed

3.2 sysbench测试结果



纵坐标是每秒运行的事务数。
sysbench完整执行参数类似下面:

sysbench --mysql-user=root --test=oltp --mysql-host=localhost --oltp-test-mode=complex \--mysql-table-engine=ndbcluster --oltp-table-size=10000000 --mysql-db=ndb --oltp-table-name=mdb_1kw \--num-threads=200 --max-requests=500000 run

从上面的测试结果我们也可以看到,单独的mysqld实例下,MyISAM适合并发很小的业务,InnoDB适合类似连接池模式下的高 并发业务,不适合非常大并发的情景,而采用了LVS后的ndbcluster则是真正的适合高并发环境,尽管其性能相对InnoDB来说不是太好,不过比 以往版本也已经提升了很多,用于正式生产环境的时候真是指日可待了。

原创粉丝点击