`

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

阅读更多
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.2 ndb mgm node 
192.168.0.3 data node1, sql node 1, LVS DR Server 
192.168.0.4 data node2, sql node 2 
192.168.0.5 data node3, sql node 3 
192.168.0.6 data node4, sql node 4 
192.168.0.7 sql node 5 
192.168.0.8 sql node 6 
192.168.0.9 sql node 7 
192.168.0.10 sql 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]# ls
ipvsadm.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_vs
ip_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 -L
IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  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_vs
ip_vs_rr                3649  1
ip_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
2.2 MySQL Cluster安装

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

[yejr@imysql.cn ~]# cat /home/mysql/config.ini
[TCP DEFAULT]
SendBufferMemory=2M
ReceiveBufferMemory=2M
[NDB_MGMD DEFAULT]
PortNumber=1186
Datadir=/home/mysql/
[NDB_MGMD]
id=1
Datadir=/home/mysql/
Hostname=192.168.221.2
[NDBD DEFAULT]
NoOfReplicas=2
Datadir=/home/mysql/
DataMemory=2048M
IndexMemory=1024M
LockPagesInMainMemory=1
MaxNoOfConcurrentOperations=100000
StringMemory=25
MaxNoOfTables=4096
MaxNoOfOrderedIndexes=2048
MaxNoOfUniqueHashIndexes=512
MaxNoOfAttributes=24576
DiskCheckpointSpeedInRestart=100M
FragmentLogFileSize=256M
InitFragmentLogFiles=FULL
NoOfFragmentLogFiles=6
RedoBuffer=32M
TimeBetweenLocalCheckpoints=20
TimeBetweenGlobalCheckpoints=1000
TimeBetweenEpochs=100
MemReportFrequency=30
BackupReportFrequency=10
### Params for setting logging
LogLevelStartup=15
LogLevelShutdown=15
LogLevelCheckpoint=8
LogLevelNodeRestart=15
### Params for increasing Disk throughput
BackupMaxWriteSize=1M
BackupDataBufferSize=16M
BackupLogBufferSize=4M
BackupMemory=20M
#Reports indicates that odirect=1 can cause io errors (os err code 5) on some systems. You must test.
#ODirect=1
### Watchdog
TimeBetweenWatchdogCheckInitial=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
### Multithreading
MaxNoOfExecutionThreads=8
[NDBD]
id=2
Datadir=/home/mysql/
Hostname=192.168.221.3
#LockExecuteThreadToCPU=X
#LockMaintThreadsToCPU=Y
[NDBD]
id=3
Datadir=/home/mysql/
Hostname=192.168.221.4
#LockExecuteThreadToCPU=X
#LockMaintThreadsToCPU=Y
[NDBD]
id=4
Datadir=/home/mysql/
Hostname=192.168.221.5
#LockExecuteThreadToCPU=X
#LockMaintThreadsToCPU=Y
[NDBD]
id=5
Datadir=/home/mysql/
Hostname=192.168.221.6
#LockExecuteThreadToCPU=X
#LockMaintThreadsToCPU=Y
[MYSQLD]
id=6
Hostname=192.168.221.3
[MYSQLD]
id=7
Hostname=192.168.221.4
[MYSQLD]
id=8
Hostname=192.168.221.5
[MYSQLD]
id=9
Hostname=192.168.221.6
[MYSQLD]
id=10
Hostname=192.168.221.7
[MYSQLD]
id=11
Hostname=192.168.221.8
[MYSQLD]
id=12
Hostname=192.168.221.9
[MYSQLD]
id=13
Hostname=192.168.221.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.221.2:1186"
[MYSQLD]
......
ndb-cluster-connection-pool=1
ndbcluster
ndb-connectstring="192.168.221.2:1186"
ndb-force-send=1
ndb-use-exact-count=0
ndb-extra-logging=1
ndb-autoincrement-prefetch-sz=256
engine-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> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     4 node(s)
id=2    @192.168.221.3  (mysql-5.1.32 ndb-7.0.5, Nodegroup: 0, Master)
id=3    @192.168.221.4  (mysql-5.1.32 ndb-7.0.5, Nodegroup: 0)
id=4    @192.168.221.5  (mysql-5.1.32 ndb-7.0.5, Nodegroup: 1)
id=5    @192.168.221.6  (mysql-5.1.32 ndb-7.0.5, Nodegroup: 1)
[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.221.2  (mysql-5.1.32 ndb-7.0.5)
[mysqld(API)]   10 node(s)
id=6    @192.168.221.3  (mysql-5.1.32 ndb-7.0.5)
id=7    @192.168.221.4  (mysql-5.1.32 ndb-7.0.5)
id=8    @192.168.221.5  (mysql-5.1.32 ndb-7.0.5)
id=9    @192.168.221.6  (mysql-5.1.32 ndb-7.0.5)
id=10   @192.168.221.7  (mysql-5.1.32 ndb-7.0.5)
id=13   @192.168.221.8  (mysql-5.1.32 ndb-7.0.5)
id=14   @192.168.221.9  (mysql-5.1.32 ndb-7.0.5)
id=15   @192.168.221.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来说不是太好,不过比以往版本也已经提升了很多,用于正式生产环境的时候真是指日可待了。

分享到:
评论
1 楼 ljl961890233bear 2014-07-28  

相关推荐

    99-智慧园区数据平台方案.pptx

    99-智慧园区数据平台方案.pptx

    node-v12.11.1-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于Springboot+Vue华强北商城二手手机管理系统-毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    Excel模版:工资条模板

    Excel工资条模板是一种预先设计好的电子表格文件,主要用于生成和打印员工的工资单,让员工清楚了解自己的工资组成和扣款详情。模板通常包含了以下几个关键部分: 1. **员工信息区**: - 姓名 - 员工编号/工号 - 部门 - 职位 2. **工资构成区**: - 基本工资 - 岗位工资 - 绩效奖金 - 加班工资 - 其他补贴(如交通补贴、餐补、全勤奖等) - 各项津贴(如高温补贴、取暖费等) - 其他应发收入(如年终奖、提成、福利等) 3. **扣款项目区**: - 社保扣款(养老保险、医疗保险、失业保险、工伤保险、生育保险) - 住房公积金 - 个人所得税 - 其他扣款(如迟到、旷工、违规罚款等) - 预借还款(如有) 4. **工资结算区**: - 应发工资总额 - 扣款总额 - 实发工资 5. **备注栏**: - 用于标注本月工资的特殊情况说明,如请假、调休、加班等情况。 6. **签名栏**: - 供员工确认工资数额无误后签名,也可以

    29-【智慧城市与政府治理分会场】10亿大数据助推都市治理-30页.pdf

    29-【智慧城市与政府治理分会场】10亿大数据助推都市治理-30页.pdf

    基于Springboot+Vue的租房管理系统-毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    线路工区光缆中断抢险预案.docx

    5G通信行业、网络优化、通信工程建设资料。

    299-教育数据资产管理平台及配套解决方案.pptx

    299-教育数据资产管理平台及配套解决方案.pptx

    太戈编程第345题答案

    abababababababab

    基于STM32F103C8单片机设计-旋转编码器数码管显示程序KEIL工程源码.zip

    STM32学习软件编程资料,STM32F103C8单片机经典外设应用设计实例软件源代码,KEIL工程文件,可供学习参考。

    5GKPI指标定义.pptx

    5G通信行业、网络优化、通信工程建设资料。

    全业务端到端-L2题库.xlsx

    5G通信行业、网络优化、通信工程建设资料

    3M 轨道砂光机精英系列说明书

    3M 轨道砂光机精英系列说明书

    基于Springboot+Vue教师工作量管理系统-毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    2023年亚太杯A题附件一,苹果图像数据集

    2023年亚太杯A题附件一,苹果图像数据集

    移动代维发电系统考试L2.xlsx

    5G通信、网络优化与通信建设

    59-《煤矿测量规程(1989版)》150.pdf

    59-《煤矿测量规程(1989版)》150.pdf

    施工现场安全技术交底模板.doc

    5G通信行业、网络优化、通信工程建设资料。

    基于YOLOv7的植物虫害识别&防治系统

    由于当今全球气候变化异常,农作物病虫害频发,而且农作物病种类多,成因复杂,其预防和识别难度较大,且传统病虫害识别方法大多靠人目视手查,需要一定的专家经验,具有主观性强、识别准确率低等缺点.而信息技术作为解决农作物病虫害智能、快速识别的新技术、新方法,我们计划利用农业信息大数据智能决策分析系统,建立完善一体化的智能农业信息监测系统等.本文便是基于深度学习将计算机视觉、图像识别等技术运用于农作物病虫害检测中,开发智能病虫害检测系统,以提高病虫害检测准确率,减少病虫害对农业生产的危害

Global site tag (gtag.js) - Google Analytics