MySQL+负载均衡群集_第1页
MySQL+负载均衡群集_第2页
MySQL+负载均衡群集_第3页
MySQL+负载均衡群集_第4页
MySQL+负载均衡群集_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

[练习]MySQL负载均衡群集本文将告诉你如何配置一个三个节点的MySQL5数据库服务器群集:两个存储节点和一个管理节点。这个群集是由用提供“heartbeat心跳”(用来检查另外一个节点是否活动)和“ldirectord”(将请求分发到MySQL群集的节点)的UltraMonkey安装包的两个节点组成的一个高可用性负载均衡器。本文我们的每个节点使用DebianSargeLinux系统。其它Linux发行版本的安装可能一点点区别。MySQL的版本我们使用5.0.19。如果你不想使用MySQL5,你也可以使用MySQL4.1,尽管我还没有测试过。本文是一篇实践应用指导;它没有涉及太多的理论。关于群集的理论你可以在网上找到很多。一服务器我使用下面的Debian服务器,它们都在同一个网段(本例如:192.168.0.x)::01MySQL群集节点1:02MySQL群集节点2:03负载均衡1/MySQL群集管理服务器:04负载均衡2另外我们需要一个虚拟IP地址:05。它会安排给这个MySQL群集的以便于负载均衡,应用程序通过统一单独的IP地址来访问群集。尽管我们想在MySQL群集中使用两个节点,但是我们仍然需要第三个节点,MySQL群集管理服务器,主要的一个原因是:如果其中一个MySQL群集节点坏了,而MySQL群集管理服务器没有运行,那么两个群集节点上的数据将会不一致(“splitbrain”)。我们需要它来配置MySQL群集.因此我们的安装一般需要五台机器:2个MySQL群集节点+1个群集管理服务器+2个负载均衡二5因为群集管理服务器没有使用多少资源,系统将会空着什么都不做,所以我们可以把我们的第一个负载均衡和它一起放在同一台机器上,这样可以节约我们一台服务器,所以最好我们只需要四台机器。二配置MySQL群集管理服务器首先我们要下载MySQL5.0.19,并安装群集管理服务器(ndb_mgmd)和群集管理客户端(ndb_mgm-它可以用来监控群集的运行情况).下面的步骤是在(03)上进行的::mkdir/usr/src/mysql-mgmcd/usr/src/mysql-mgmwget\ites/glibc23.tar.gz/from/cdmysql-max-5.0.19-linux-i686-glibc23mvbin/ndb_mgm/usr/binmvbin/ndb_mgmd/usr/binchmod755/usr/bin/ndb_mg*cd/usr/srcrm-rf/usr/src/mysql-mgm下一步,我们必须创建群集的配置文件,/var/lib/mysql-cluster/config.ini::mkdir/var/lib/mysql-clustercd/var/lib/mysql-clusterviconfig.ini—[NDBDDEFAULT]NoOfReplicas=2[MYSQLDDEFAULT][NDB_MGMDDEFAULT][TCPDEFAULT]Sectionfortheclustermanagementnode[NDB_MGMD]IPaddressofthemanagementnode(thissystem)HostName=03Sectionforthestoragenodes[NDBD]IPaddressofthefirststoragenodeHostName=01DataDir=/var/lib/mysql-cluster[NDBD]IPaddressofthesecondstoragenodeHostName=02DataDir=/var/lib/mysql-clusterone[MYSQLD]perstoragenode[MYSQLD][MYSQLD]实际应用中请将文件中的IP地址换成你相应的IP。然后我们启动群集管理服务器::ndb_mgmd-f/var/lib/mysql-cluster/config.ini我们应该也需要在服务器启动时能够自动启动管理服务器,所以我们创建了一个非常简单的初始化脚本和相应的启动连接::echo‘ndb_mgmd-f/var/lib/mysql-cluster/config.ini’>/etc/init.d/ndb_mgmdchmod755/etc/init.d/ndb_mgmdupdate-rc.dndb_mgmddefaults三配置MySQL群集节点(存储节点)现在我们将分别在和上安装mysql-max-5.0.19:/:groupaddmysqluseradd-gmysqlmysqlcd/usr/local/wget686-\glibc23.tar.gz/from/tarxvfzmysql-max-5.0.19-linux-i686-glibc23.tar.gzIn-smysql-max-5.0.19-linux-i686-glibc23mysqlcdmysqlscripts/mysql_install_db-user=mysqlchown-Rroot:mysql.chown-Rmysqldatacpsupport-files/mysql.server/etc/init.d/chmod755/etc/init.d/mysql.serverupdate-rc.dmysql.serverdefaultscd/usr/local/mysql/binmv*/usr/bincd../rm-fr/usr/local/mysql/binln-s/usr/bin/usr/local/mysql/bin然后我们在每个节点上创建MySQL配置文件/etc/f:vi/etc/f-[mysqld]ndbclusterIPaddressoftheclustermanagementnodendb-connectstring=03[mysql_cluster]IPaddressoftheclustermanagementnodendb-connectstring=03-确认你在群集管理服务器中输入的是正确的IP地址。下一步我们分别在每个群集节点上创建数据目录和启动MySQL服务器:/:mkdir/var/lib/mysql-clustercd/var/lib/mysql-clusterndbd-initial/etc/init.d/mysql.serverstart(请记住:我们只是在第一次启动MySQL时或上面的/var/lib/mysql-cluster/config.ini发生改变时,才使用ndbd-initial)现在,是时候给MySQLroot帐号设置密码了:/:mysqladmin-urootpasswordyourrootsqlpassword我们需要在服务器启动时,启动群集节点,所以我们创建一个ndbd初始化脚本和相应的系统启动连接:/:echo‘ndbd’>/etc/init.d/ndbdchmod755/etc/init.d/ndbdupdate-rc.dndbddefaults四测试MySQL群集我们的MySQL群集配置工作已经完成,现在是测试它的时间了。在群集管理服务器()上,运行群集管理客户端ndb_mgm来检查群集节点是否连接::ndb_mgm你将会看到这些:-NDBCluster一ManagementClient-ndb_mgm>在命令行输入show;show;输出的信息应该是这样的:ndb_mgm>show;ConnectedtoManagementServerat:localhost:1186ClusterConfiguration[ndbd(NDB)]2node(s)id=2@01(Version:5.0.19,Nodegroup:0,Master)id=3@02(Version:5.0.19,Nodegroup:0)[ndb_mgmd(MGM)]1node(s)id=1@03(Version:5.0.19)[mysqld(API)]2node(s)id=4@01(Version:5.0.19)id=5@02(Version:5.0.19)ndb_mgm>如果你看到你的节点都已经连接上了。那么一切都很顺利〜输入quit;退出ndb_mgm客户端控制台。现在我们在节点上创建一个测试数据库,并创建一个测试表,填入一些测试数据:mysql-uroot-pCREATEDATABASEmysqlclustertest;USEmysqlclustertest;CREATETABLEtesttable(iINT)ENGINE=NDBCLUSTER;INSERTINTOtesttable()VALUES(1);SELECT*FROMtesttable;quit;(看看上面这个CREATE语句:我们想群集起来的所有数据库的表,必须使用ENGINE二NDBCLUSTER〜如果你使用其它的ENGINE,那么群集将不会工作〜)SELECT出的结果应该是:mysql>SELECT*FROMtesttable;+ +IiI ++I1I1rowinset(0.03sec)现在我们在节点上创建相同的数据库(是,我们仍然要创建它,但是在testtable创建之后数据将会被复制到,因为testtable是使用ENGINE=NDBCLUSTER)::mysql-uroot-pCREATEDATABASEmysqlclustertest;USEmysqlclustertest;SELECT*FROMtesttable;SELECT出的结果应该是和上面的的结果相同:mysql>SELECT*FROMtesttable;+ +IiI1rowinset(0.04sec)我们看到数据已经从节点复制到节点了。现在我们向testtable中插入另外一行::INSERTINTOtesttable()VALUES(2);quit;现在让我们回到节点上,检查是否能够看见新插入的那一行::mysql-uroot-pUSEmysqlclustertest;SELECT*FROMtesttable;quit;你应该看到像这样的输出:mysql>SELECT*FROMtesttable;+——+|i| ++|1||2|2rowsinset(0.05sec)所以每个群集节点都有着相同的数据〜现在让我们看看如果我们停止节点1():运彳亍:killallndbd并检查psaux|grepndbd|grep-ivgrep看看所有的ndbd进程已经结束了。如果你仍然看见ndbd进程,再运行killallndbd直到所有的ndbd进程都结束。现在让在我们的管理服务器上,检查群集的状态()::ndb_mgm在ndb_mgm控制台上输入show;你应该看到这些:ndb_mgm>show;ConnectedtoManagementServerat:localhost:1186ClusterConfiguration[ndbd(NDB)]2node(s)id=2(notconnected,acceptingconnectfrom01)id=3@02(Version:5.0.19,Nodegroup:0,Master)[ndb_mgmd(MGM)]1node(s)id=1@03(Version:5.0.19)[mysqld(API)]2node(s)id=4@01(Version:5.0.19)id=5@02(Version:5.0.19)ndb_mgm>你看见,节点没有连接上了。输入:quit;退出ndb_mgm控制台。让我们检查节点::mysql-uroot-pUSEmysqlclustertest;SELECT*FROMtesttable;quit;SELECT查询出的结果应该依然是:mysql>SELECT*FROMtesttable;2rowsinset(0.17sec)Ok,所有的测试都正常,现在让我们再次启动节点::ndbd五如何重新启动群集现在让我们设想你由于修改了节点上的/var/lib/mysql-cluster/config.ini或者其它原因,需要重新启动MySQL群集。为了这样做,你要使用节点上的ndb_mgm群集管理客户端::ndb_mgm在ndb_mgm控制台上,你输入shutdown;你将看到像这样的信息:ndb_mgm>shutdown;Node3:ClustershutdowninitiatedNode2:Nodeshutdowncompleted.2NDBClusternode(s)haveshutdown.NDBClustermanagementservershutdown.ndb_mgm>这意味着群集节点和,已经群集管理服务器都已经关闭。运行quit;退出ndb_mgm控制台。为启动群集管理服务器,在上这样做::ndb_mgmd-f/var/lib/mysql-cluster/config.ini并在和上运行:/:ndbd或者,你刚修改过上的/var/lib/mysql-cluster/config.ini文件:ndbd-initial在这之后,你可以在上检查看看群集是否已经重启::ndb_mgm在ndb_mgm控制台,输入show;来查看当前群集的状态。所有节点重启后可能需要一点点时间来报告已经连接上。输入:quit;退出ndb_mgm控制台。六配置负载均衡我们的MySQL群集已经现在完成了,你现在可以开始使用它了。然而,我们没有一个访问群集的单独的IP地址,这意味着你必须配置应用程序一部分使用MySQL群集节点1(),另外的部分使用节点2().当然,所有的应用程序只是需要使用一个节点,但如果你不想在群集节点之间分流负载,那你拥有一个群集的目的是什么?另外一个问题是,如果一个群集节点坏掉了怎么办,那么使用这个群集节点的应用程序将根本不能够工作了。这里的解决方案是在MySQL群集前端配置一个负载均衡器来在每个MySQL群集节点之间平衡负载。负载均衡器在群集节点之间配置一个共享的虚拟IP地址,所有你的应用程序使用这个虚拟IP地址来访问群集。如果其中一个节点坏掉,那么你的应用程序将仍然可以工作,因为负载均衡器将请求转移到了工作正常的另外一个节点。现在在这个例子中负载均衡器成为了瓶颈。如果这个负载均衡器坏掉了怎么办呢,因此我们将以(active/passive)主动/被动安装方式来配置两个负载均衡器。这意味着我们有一个负载均衡器是主动的,另外一个是热备的,当主动的那个坏掉了,它将会变为主动。每个负载均衡器都使用heartbeat(心跳)来检查另外一个负载均衡器的活动情况,同时负载均衡器也使用ldirectord,它负责将流量分配到群集节点。heartbeat和ldirectord都在我们将要安装的UltraMonkey安装包中。和节点的系统内核支持IPVS(IP虚拟服务器)非常重要。IPVS是在Linux内核的传输层执行负载均衡的。6.1安装UltraMonkey好,现在让我们开始:首先我们启用和节点上IPVS:/:modprobeip_vs_dhmodprobeip_vs_ftpmodprobeip_vsmodprobeip_vs_lblcmodprobeip_vs_lblcrmodprobeip_vs_lcmodprobeip_vs_nqmodprobeip_vs_rrmodprobeip_vs_sedmodprobeip_vs_shmodprobeip_vs_wlcmodprobeip_vs_wrr为了在启动时IPVS模块,我们在/etc/modules列举了模块:/:vi/etc/modulesip_vs_dhip_vs_ftpip_vsip_vs_lblcip_vs_lblcrip_vs_lcip_vs_nqip_vs_rrip_vs_sedip_vs_ship_vs_wlcip_vs_wrr现在我们编辑/etc/apt/sources.list,添加UltraMonkey的下载点,然后我们安装UltraMonkey:/:vi/etc/apt/sources.listdeb:///download/3sargemainapt-getupdateapt-getinstallultramonkeylibdbi-perllibdbd-mysql-perl-devlibmysqlclient14现在UltraMonkey已经安装了,如果你看到下面这样的警告:|libsensors3notfunctional||Itappearsthatyourkernelisnotcompiledwithsensorssupport.Asa|result,libsensors3willnotbefunctionalonyoursystem.||Ifyouwanttoenableit,havealookat“I2CHardwareSensorsChip|support”inyourkernelconfiguration.你可以忽略它。回答下面的问题:DoyouwanttoautomaticallyloadIPVSrulesonboot?<--NoSelectadaemonmethod.<--none我刚安装的libdbd-mysql-perl安装包不能够在MySQL5(我们在MySQL群集上使用MySQL5),因此我们安装最新的DBD::mysqlPerl安装包:/:cd/tmpwget.tar.gztarxvfzDBD-mysql-3.0002.tar.gzcdDBD-mysql-3.0002perlMakefile.PLmakemakeinstall我们必须先启用packetforwarding:/:vi/etc/sysctl.conf#Enablespacketforwardingnet.ipv4.ip_forward=16.2配置heartbeat(心跳)我们通过创建三个文件(和的文件必须完全一样)来配置heartbeat:/:vi/etc/ha.d/ha.cflogfacilitylocal0bcasteth0mcasteth069410auto_failbackoffnodeloadb1nodeloadb2respawnhacluster/usr/lib/heartbeat/ipfailapiauthipfailgid=haclientuid=hacluster请记住:你必须列出节点名称(本例中是loadb1和loadb2)uname-n除了这些,我们不需要对这个文件做任何修改。vi/etc/ha.d/haresourcesloadb1\ldirectord::ldirectord.cf\LVSSyncDaemonSwap::master\IPaddr2::05/24/eth0/55你必须列举其中一个负载均衡节点名称(这里是:loadb1),并且列出虚拟IP地址(05)和广播地址(55).vi/etc/ha.d/authkeysauth33md5somerandomstringsomerandomstring是loadbl和loadb2用来相互认证的两个heartbeat守护进程的密码。这里设置成你自己的密码。你可以选择3种加密方式。我一般使用md5来加密。/etc/ha.d/authkeys应该是root帐号只读,这里我们这样做:/:chmod600/etc/ha.d/authkeys6.3配置ldirectord现在我们为ldirectord创建配置文件,负载均衡器:/:vi/etc/ha.d/ldirectord.cf#GlobalDirectiveschecktimeout=10checkinterval=2autoreload=nologfile=〃local0〃quiescent=yesvirtual=05:3306service=mysqlreal=01:3306gatereal=02:3306gatechecktype=negotiatelogin="ldirector"passwd="ldirectorpassword"database="ldirectordb"request=SELECT*FROMconnectioncheckscheduler=wrr请填入正确的虚拟IP地址(05)和正确的MySQL群集节点的IP地址(01和02)。3306是MySQL运行时默认的端口。我们也指定了一个MySQL用户(ldirector)和密码(ldirectorpassword),一个数据库(ldirectordb)和一条SQL查询。ldirectord使用这些信息来测试MySQL群集节点,以此来检查它们的是否一直可用。下一步我们将用ldirector用户来创建ldirectordb数据库。现在我们为heartbeat创建系统必需的启动连接,并移除ldirectord(因为ldirectord将由heartbeat来启动):/:update-rc.d-fheartbeatremoveupdate-rc.dheartbeatstart752345.stop05016.update-rc.d-fldirectordremove6.4创建数据库ldirector下面我们在MySQL群集节点和上创建ldirector数据库。这个数据库将会用于我们的负载均衡器来检查MySQL群集节点的可用性。:mysql-uroot-pGRANTALLONldirectordb.*TOTdirector'@'%'IDENTIFIEDBY,ldirectorpassword';FLUSHPRIVILEGES;CREATEDATABASEIdirectordb;USEIdirectordb;CREATETABLEconnectioncheck(iINT)ENGINE=NDBCLUSTER;INSERTINTOconnectioncheck()VALUES(1);quit;:mysql-uroot-pGRANTALLONldirectordb.*TOTdirector'@'%'IDENTIFIEDBY'ldirectorpassword';FLUSHPRIVILEGES;CREATEDATABASEldirectordb;quit;6.5为负载均衡准备MySQL群集节点最后我们必须配置MySQL群集节点和来接受虚拟IP地址05。/:apt-getinstalliproute在/etc/sysctl.conf里面添加下面的内容:vi/etc/sysctl.confEnableconfigurationofarp_ignoreoptionnet.ipv4.conf.all.arp_ignore=1Whenanarprequestisreceivedoneth0,onlyrespondifthataddressisconfiguredoneth0.Inparticular,donotrespondiftheaddressis#configuredonlonet.ipv4.conf.eth0.arp_ignore=1#Dittoforethl,addforallARPinginterfaces#net.ipv4.conf.eth1.arp_ignore=1Enableconfigurationofarp_announceoptionnet.ipv4.conf.all.arp_announce=2WhenmakinganARPrequestsentthrougheth0Alwaysuseanaddressthat#isconfiguredoneth0asthesourceaddressoftheARPrequest.Ifthis#isnotset,andpacketsarebeingsentouteth0foranaddressthatisonlo,andanarprequestisrequired,thentheaddressonlowillbeused.#AsthesourceIPaddressofarprequestsisenteredintotheARPcacheonthedestination,ithastheeffectofannouncingthisaddress.Thisis#notdesirableinthiscaseasadressesonloonthereal-serversshould#beannouncedonlybythe.ipv4.conf.eth0.arp_announce=2Dittoforeth1,addforallARPinginterfaces#net.ipv4.conf.eth1.arp_announce=2sysctl-p将下面这段加入到/etc/network/interfaces:/:vi/etc/network/interfacesautolo:0ifacelo:0inetstaticaddress05netmask55pre-upsysctl-p>/dev/nullifuplo:0七.启动负载均衡器并测试现在我们启动两个负载均衡管理器:/:/etc/init.d/ldirectordstop/etc/init.d/heartbeatstart如果你没有看见错误,你需要现在重启每个负载均衡器:/:shutdown-rnow重启之后我们可以检查是否两个负载均衡器象期望一样工作:/:ipaddrsheth0主动的负载均衡器应该列出了虚拟IP地址(05):2:eth0:mtu1500qdiscpfifo_fastqlen1000link/ether00:16:3e:45:fc:f8brdff:ff:ff:ff:ff:ffinet03/24brd55scopeglobaleth0inet05/24brd55scopeglobalsecondaryet

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论