利用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 转发了。
接下来就是加载 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 就可以开始工作了。
然后就是在 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 进程:
最后,修改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、测试
3.1 mysqlslap测试结果
纵坐标是总共运行时间。
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完整执行参数类似下面:
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来说不是太好,不过比以往版本也已经提升了很多,用于正式生产环境的时候真是指日可待了。
本文出自 “MySQL中文网”博客
http://www.imysql.cn/
本文出自 “老叶茶馆” 博客,转载请与作者联系!
转载于:https://my.oschina.net/yejr/blog/878600
相关推荐
MySQL Cluster 7.0 和 LVS 的组合是构建高可用性数据库环境的一种解决方案。MySQL Cluster 提供了数据的分布式存储和复制,增强了系统的容错能力,而LVS(Linux Virtual Server)则负责流量管理和负载均衡,确保服务...
本篇文档为Mysql双主热备+LVS+Keepalived高可用操作记录,可作为线上实操手册,有需要的朋友可以拿走,希望能帮助到有用到的人~
本篇文章详细记录了Mysql双主热备+LVS+Keepalived高可用操作过程,可作为线上长期的实操手册.特此分享,希望能帮助到有用到的朋友.
linux学习文档之-keepalive+lvs搭建高可用服务器
MySQL数据库在许多业务环境中是核心组件,为了保证其服务的连续性和稳定性,通常需要构建高可用...本教程的压缩包文件"MySQL+LVS+Keepalived+MHA-高可用群集"中应包含了详细的配置文件和指导,供读者深入学习和实践。
MySQL集群+LVS+KEEPALIVED环境搭建
随着你的网站业务量的增长你网站的服务器压力越来越大?需要负载均衡方案!商业的硬件如F5又太贵,你们又是创业型互联公司...我们利用LVS+Keepalived基于完整开源软件的架构可以为你提供一个负载均衡及高可用的服务器。
利用MySQL Cluster 7_0 + LVS 搭建高可用环境
HAProxy+Keepalived+LVS实现负载平衡高可用集群最佳实践
### MySQL LVS+Keepalived+MHA 高可用群集应用部署操作手册知识点解析 #### MHA 架构介绍与工作原理 - **MHA(Master High Availability)概述** - MHA 是一套用于MySQL高可用环境下的故障切换和主从提升方案,由...
### L4+L7 负载均衡 Keepalived+LVS+nginx搭建nginx高可用集群 #### 一、概述 随着互联网应用的不断发展,如何高效地处理大规模并发请求成为了现代Web架构设计的重要议题之一。在众多解决方案中,构建一个高可用、...
MySQL+lvs+keepalived+mha架构是一种高可用性、负载均衡的数据库集群解决方案,用于构建强大且可靠的数据库服务。这种架构充分利用了各组件的优势,确保数据的安全性和系统的稳定性。 MySQL是世界上最流行的开源...
通过LVS+Keepalived搭建高可用的负载均衡集群系统
linux集群应用实战 通过LVS+Keepalived搭建高可用的负载均衡集群系统 第二讲
搭建多台lvs使用keepalived的优先级实现lvs的高可用性,并通过lvs自带的算法与权重来决定由哪台web处理该网页请求
MySQL主从复制是数据库高可用性的一种常见策略,它允许数据在多个服务器之间实时或近实时地同步。这种配置使得当主服务器发生故障时,从服务器可以接管服务,确保业务连续性。在这个场景中,主机A(192.168.5.171)...
MySQL群集+LVS负载均衡安装配置实施