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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介:

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
#设定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=2M
ReceiveBufferMemory=2M
[NDB_MGMD DEFAULT]
PortNumber=1186
Datadir=/home/mysql/
[NDB_MGMD]
id=1
Datadir=/home/mysql/
Hostname=192.168.0.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.0.4
#LockExecuteThreadToCPU=X
#LockMaintThreadsToCPU=Y
[NDBD]
id=4
Datadir=/home/mysql/
Hostname=192.168.0.5
#LockExecuteThreadToCPU=X
#LockMaintThreadsToCPU=Y
[NDBD]
id=5
Datadir=/home/mysql/
Hostname=192.168.0.6
#LockExecuteThreadToCPU=X
#LockMaintThreadsToCPU=Y
[MYSQLD]
id=6
Hostname=192.168.0.3
[MYSQLD]
id=7
Hostname=192.168.0.4
[MYSQLD]
id=8
Hostname=192.168.0.5
[MYSQLD]
id=9
Hostname=192.168.0.6
[MYSQLD]
id=10
Hostname=192.168.0.7
[MYSQLD]
id=11
Hostname=192.168.0.8
[MYSQLD]
id=12
Hostname=192.168.0.9
[MYSQLD]
id=13
Hostname=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=1
ndbcluster
ndb-connectstring="192.168.0.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.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来说不是太好,不过比以往版本也已经提升了很多,用于正式生产环境的时候真是指日可待了。


本文转自叶金荣51CTO博客,原文链接:http://blog.51cto.com/imysql/308932,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
3月前
|
运维 监控 关系型数据库
MySQL高可用方案:MHA与Galera Cluster对比
本文深入对比了MySQL高可用方案MHA与Galera Cluster的架构原理及适用场景。MHA适用于读写分离、集中写入的场景,具备高效写性能与简单运维优势;而Galera Cluster提供强一致性与多主写入能力,适合对数据一致性要求严格的业务。通过架构对比、性能分析及运维复杂度评估,帮助读者根据自身业务需求选择最合适的高可用方案。
|
3月前
|
SQL 监控 关系型数据库
MySQL主从复制:构建高可用架构
本文深入解析MySQL主从复制原理与实战配置,涵盖复制架构、监控管理、高可用设计及性能优化,助你构建企业级数据库高可用方案。
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
901 3
Mysql高可用架构方案
|
7月前
|
关系型数据库 MySQL Java
安装和配置JDK、Tomcat、MySQL环境,以及如何在Linux下更改后端端口。
遵循这些步骤,你可以顺利完成JDK、Tomcat、MySQL环境的安装和配置,并在Linux下更改后端端口。祝你顺利!
462 11
|
8月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
364 28
|
10月前
|
监控 关系型数据库 MySQL
云数据库:从零到一,构建高可用MySQL集群
在互联网时代,数据成为企业核心资产,传统单机数据库难以满足高并发、高可用需求。云数据库通过弹性扩展、分布式架构等优势解决了这些问题,但也面临数据安全和性能优化挑战。本文介绍了如何从零开始构建高可用MySQL集群,涵盖选择云服务提供商、创建实例、配置高可用架构、数据备份恢复及性能优化等内容,并通过电商平台案例展示了具体应用。
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
722 3
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
353 3
|
3月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
135 3
|
3月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。

推荐镜像

更多