澳门美高梅手机网站亿级Web系统搭建——单机到分布式集群

当一个Web系统自日访问量10万逐年加强及1000万,甚至超过1亿的长河被,Web系统受之压力会更不行,在这历程遭到,我们见面遇见重重的题材。为了解决这些性压力带来问题,我们得以Web系统架构层面搭建多单层次的缓存机制。在不同之压力等,我们见面碰到不同的题材,通过搭建不同之劳动及搭来化解。

 一直以来为线上系统盘中风控计算过于消耗资源,导致服务器负荷太强,时常影响盘中交易的康乐,最近决定了拿风控拆分到独门的堆栈开展计算,并进行填操作。

Web负载均衡 

Web负载均衡(Load
Balancing),简单地游说不怕是受咱们的服务器集群分配“工作职责”,而使用恰当的分红方式,对于保障处在后端的Web服务器来说,非常重要。

澳门美高梅手机网站 1 

负载均衡的国策有那么些,我们于简单的称起哈。

1. HTTP重定向

当用户发来要的时段,Web服务器通过修改HTTP响应头中的Location标记来回到一个初的url,然后浏览器还累呼吁是新url,实际上即便是页面重定向。通过重复定向,来齐“负载均衡”的对象。例如,我们在下载PHP源码包之上,点击下充斥链接时,为了缓解不同国家及地区下载速度的题材,它会回到一个去我们靠近的下载地址。重定向的HTTP返回码是302,如下图:

澳门美高梅手机网站 2 

一经下PHP代码来促成者作用,方式如下:

澳门美高梅手机网站 3 

此重定向非常容易实现,并且可以从定义各种政策。但是,它于泛访问量下,性能不优秀。而且,给用户之体验也坏,实际请求发生更定向,增加了网络延时。

2. 倒朝代理负载均衡

反向代理服务的中坚工作任重而道远是转账HTTP请求,扮演了浏览器端和后台Web服务器中转的角色。因为她工作以HTTP层(应用层),也即是网络七层结构被之第七交汇,因此为叫喻为“七层负载均衡”。可以做反而朝代理的软件很多,比较宽泛的平等种是Nginx。

澳门美高梅手机网站 4 

Nginx是相同种植非常灵活的反向代理软件,可以肆意定制化转发策略,分配服务器流量的权重等。反向代理中,常见的一个题目,就是Web服务器存储的session数据,因为一般负载均衡的国策都是即兴分配要的。同一个签到用户的伸手,无法保证得分配至平等的Web机器上,会招力不从心找到session的问题。

解决方案主要发生一定量种:

 

  1. 布局反向代理的转账规则,让与一个用户之求一定得至同台机器上(通过分析cookie),复杂的中转规则以见面耗费又多的CPU,也加了代理服务器的负责。
  2. 将session这仿佛的音信,专门用有独立服务来囤,例如redis/memchache,这个方案是较推荐的。

 

反向代理服务,也是好打开缓存的,如果开了,会加反向代理的负,需要小心翼翼运用。这种负荷均衡策略实现与安排非常简单,而且性能表现为于好。但是,它发出“单点故障”的问题,如果挂了,会带动许多的辛苦。而且,到了后期Web服务器继续追加,它本身可能变成系统的瓶颈。

3. IP负载均衡

IP负载均衡服务是工作于网络层(修改IP)和传输层(修改端口,第四层),比从工作在应用层(第七重合)性能要大有很多。原理是,他是针对IP层的数据包的IP地址和端口信息进行改动,达到负载均衡的目的。这种艺术,也为誉为“四层负载均衡”。常见的载荷均衡方式,是LVS(Linux
Virtual Server,Linux虚拟服务),通过IPVS(IP Virtual
Server,IP虚拟服务)来贯彻。

澳门美高梅手机网站 5 

于负载均衡服务器收到客户端的IP包的上,会修改IP包的对象IP地址或端口,然后原封不动地送到其中网络被,数据包会流入到实在Web服务器。实际服务器处理完成后,又见面将数据包投递回被负载均衡服务器,它重修改目标IP地址也用户IP地址,最终回客户端。 

澳门美高梅手机网站 6 

上述的方式叫LVS-NAT,除此之外,还有LVS-RD(直接路由),LVS-TUN(IP隧道),三者之间都属LVS的法子,但是有肯定的分别,篇幅问题,不赘叙。

IP负载均衡的性质要大有Nginx的反向代理很多,它不过处理到招输层为止的数据包,并无举行越的组包,然后直接倒车让实际服务器。不过,它的安排和搭建比较复杂。

4. DNS负载均衡

DNS(Domain Name
System)负责域名解析的劳务,域名url实际上是服务器的别名,实际映射是一个IP地址,解析过程,就是DNS完成域名到IP的照。而一个域名是足以安排成对诺多单IP的。因此,DNS也不怕好看成负载均衡服务。

澳门美高梅手机网站 7 

这种负荷均衡策略,配置简单,性能最漂亮。但是,不克随随便便定义规则,而且,变更为射的IP或者机器故障时特别烦,还在DNS生效延迟的问题。 

5. DNS/GSLB负载均衡

咱们常常因此底CDN(Content Delivery
Network,内容分发网络)实现方式,其实就是是当与一个域名映射为多IP的基础及还进一步,通过GSLB(Global
Server Load
Balance,全局负载均衡)按照指定规则映射域名的IP。一般情况下都是据地理位置,将离用户近的IP返回给用户,减少网络传输中的路程由于节点内的跳跃消耗。 

澳门美高梅手机网站 8 

贪图中的“向达找”,实际过程是LDNS(Local DNS)先向根域名服务(Root Name
Server)获取到五星级根的Name
Server(例如.com的),然后取指定域名之授权DNS,然后再次取实际服务器IP。

澳门美高梅手机网站 9 

CDN在Web系统受,一般景象下是因此来解决大小比较生之静态资源(html/Js/Css/图片等)的加载问题,让这些比较靠网络下载的内容,尽可能离开用户还贴近,提升用户体验。

例如,我看了一致摆设imgcache.gtimg.cn上的图样(腾讯的自建CDN,不采用qq.com域名之由来是提防http请求的当儿,带上了剩余的cookie信息),我获得的IP是183.60.217.90。 

澳门美高梅手机网站 10 

这种方法,和前边的DNS负载均衡一样,不仅性能最好美好,而且支持配置多种策。但是,搭建筑与维护资金大大。互联网一线公司,会自盖CDN服务,中小型企业一般用第三在提供的CDN。

整体来说,是拿一部分风控计算有关的表同步到备库,但是共同的表需要从db_act->db_rsk;db_rsk->db_rsk;db_sys->db_rsk。

Web系统的缓存机制的起及优化

恰我们叙了了Web系统的外表网络环境,现在咱们开关注我们Web系统自的特性问题。我们的Web站点随着访问量的起,会遇上多之挑战,解决这些问题不仅仅是扩容机器这么简单,建立和下相当的缓存机制才是一向。

尽开始,我们的Web系统架构可能是这样的,每个环节,都可能仅仅来1令机器。 

澳门美高梅手机网站 11 

咱俩于不过根本之数据存储开始看哈。

一致、 MySQL数据库中缓存使用

MySQL的缓存机制,就起先打MySQL内部开始,下面的内容以因为无比广泛的InnoDB存储引擎为主。

  1. 起适宜的目录

无限简易的是确立目录,索引在表明数据比较大之时光,起及快搜索数据的作用,但是资金为是有些。首先,占用了自然的磁盘空间,其中组合索引最突出,使用需要小心,它有的目录甚至会见比源数据更甚。其次,建立目录之后的多寡insert/update/delete等操作,因为用创新原来的目,耗时会多。当然,实际上我们的系统自完整来说,是因select查询操作多,因此,索引的运用还是对网性能有大幅提升的意图。

  1. 数据库连接线程池缓存

倘,每一个数据库操作请求都得创造和销毁连接的话,对数据库来说,无疑也是如出一辙种植伟大的付出。为了削减这型的开发,可以在MySQL中布置thread_cache_size来表示保留多少线程用于复用。线程不够的时段,再创,空闲了多的时候,则销毁。 

澳门美高梅手机网站 12 

实际上,还有更加激进一点底做法,使用pconnect(数据库长连接),线程一旦创立于雅丰富时外都维持在。但是,在访问量比较异常,机器比较多之情况下,这种用法很可能会见招致“数据库连接数耗尽”,因为起连接并无回收,最终达成数据库的max_connections(最大连接数)。因此,长连接的用法通常需要在CGI和MySQL之间实现一个“连接池”服务,控制CGI机器“盲目”创建连接数。 

澳门美高梅手机网站 13 

建数据库连接池服务,有不少兑现之章程,PHP的话语,我推荐用swoole(PHP的一个网络通讯拓展)来落实。

  1. Innodb缓存设置(innodb_buffer_pool_size)

innodb_buffer_pool_size这是个用来保存索引和多少的内存缓存区,如果机器是MySQL独占的机械,一般推荐呢机物理内存的80%。在取表数据的气象中,它可减去磁盘IO。一般的话,这个价设置更充分,cache命中率会更为强。

  1. 分库/分表/分区。

MySQL数据库表一般受数据量在百万级别,再于上提高,各项性能将会见现出极大回落,因此,当我们预见数据量会超过这量级的早晚,建议进行分库/分表/分区等操作。最好之做法,是劳动在搭建的新就筹划也罢分库分表的蕴藏模式,从根本上杜绝中后期的风险。不过,会牺牲局部便利性,例如列表式的询问,同时,也大增了保障的复杂度。不过,到了数据量千万级别或以上的时刻,我们见面意识,它们都是值得的。 

第二、 MySQL数据库多台服务搭建

1高MySQL机器,实际上是高风险的一味点,因为如果它悬了,我们Web服务就非可用了。而且,随着Web系统访问量继续加,终于有同样龙,我们发现1雅MySQL服务器无法支撑下,我们初步用利用更多的MySQL机器。当引入多华MySQL机器的上,很多新的问题同时用时有发生。

  1. 起MySQL主从,从仓库用作备份

这种做法纯粹为了化解“单点故障”的问题,在主库出故障的时光,切换至从库。不过,这种做法实在有点浪费资源,因为从库实际上被闲在了。

澳门美高梅手机网站 14 

  1. MySQL读写分离,主库写,从库读。

星星宝数据库做读写分离,主库负责写入类的操作,从仓库负责读的操作。并且,如果主库发生故障,仍然未影响读之操作,同时为足以拿周朗诵写都临时切换至打库中(需要注意流量,可能会见盖流量过死,把从库也拖垮)。 

澳门美高梅手机网站 15 

  1. 主主互备。

区区宝MySQL之间相为彼此的从库,同时以是主库。这种方案,既做到了访问量的下压力分流,同时为解决了“单点故障”问题。任何一样雅故障,都还有另外一拟可供使用的劳动。 

澳门美高梅手机网站 16 

然,这种方案,只能用当少数大机器的场面。如果事情拓展还是很快的话,可以择将事情分别,建立多只主主互备。

其三、
MySQL数据库机器内的数码并

在我们解决一个题目,新的题目自然诞生于原始的缓解方案及。当我们出差不多令MySQL,在事情高峰期,很可能出现零星只仓库中的多少产生延期的景。并且,网络及机械负载等,也会潜移默化多少并的推移。我们曾碰到了,在日访问量接近1亿的非常现象下,出现,从仓库数据要多多天才会同追上主库的数额。这种状况下,从仓库基本失去作用了。

乃,解决并问题,就是咱下一样步要关爱之接触。

  1. MySQL自带多线程同步

MySQL5.6始支持主库和从库数据并,走多线程。但是,限制为是比明显的,只能以库为单位。MySQL数据并是经过binlog日志,主库写副到binlog日志的操作,是颇具顺序的,尤其当SQL操作着涵盖对表结构的修改等操作,对于继续之SQL语句操作是产生震慑的。因此,从仓库同步数据,必须移动就进程。

  1. 投机实现解析binlog,多线程写入。

为数据库的表为单位,解析binlog多张表同时做多少并。这样做的话,的确会加速数据并的效率,但是,如果表和表之间有结构涉及还是数额据之说话,则一律存在写入顺序的问题。这种方法,可用于一些比较稳定并且相对独立的数据表。 

澳门美高梅手机网站 17 

国内一线互联网公司,大部分且是通过这种方法,来加快数据并效率。还有更加激进的做法,是一直解析binlog,忽小以说明也单位,直接写入。但是这种做法,实现复杂,使用范围就重新遭遇限制,只能用于一些情景特殊之数据库中(没有说明结构改变,表和发明中从未多少据等特殊表)。 

季、
在Web服务器和数据库里成立缓存

其实,解决大访问量的问题,不可知就着眼于数据库层面。根据“二八定律”,80%之呼吁单关心在20%底红数据及。因此,我们当建立Web服务器和数据库中的缓存机制。这种机制,可以就此磁盘作为缓存,也可以用外存缓存的方。通过她,将大部分之紧俏数据查询,阻挡在数据库之前。 

澳门美高梅手机网站 18 

  1. 页面静态化

用户访问网站的某页面,页面上的大部情在深丰富一段时间内,可能都是从未有过成形的。例如一篇新闻报道,一旦公布几乎是匪见面修改内容的。这样的话,通过CGI生成的静态html页面缓存到Web服务器的磁盘本地。除了第一次于,是经过动态CGI查询数据库获取之外,之后还直接以本地磁盘文件返回给用户。

澳门美高梅手机网站 19 

当Web系统规模比粗的下,这种做法看似完美。但是,一旦Web系统规模变充分,例如当自己发生100雅之Web服务器的时节。那样这些磁盘文件,将会生100卖,这个是资源浪费,也坏维护。这个上有人会怀念,可以集中一致大服务器存起来,呵呵,不如看看下面一种植缓存方式吧,它就是这样做的。

  1. 单台内存缓存

经过页面静态化的事例中,我们得解将“缓存”搭建在Web机器本机是不好维护的,会带来更多问题(实际上,通过PHP的apc拓展,可经过Key/value操作Web服务器的本机内存)。因此,我们捎搭建的内存缓存服务,也必须是一个单独的服务。

外存缓存的精选,主要有redis/memcache。从性质上说,两者反差不坏,从功能丰富程度达到说,Redis更胜一筹。 

澳门美高梅手机网站 20 

  1. 内存缓存集群

当我们搭建单台内存缓存了,我们还要会面临单点故障的题材,因此,我们务必用它们化一个集群。简单的做法,是于他长一个slave作为备份机器。但是,如果请求量真的多,我们发现cache命中率不愈,需要再行多之机械内存为?因此,我们还建议用她配置成一个集群。例如,类似redis
cluster。

Redis
cluster集群内的Redis互为多组基本,同时每个节点都足以领请求,在拓展集群的时光可比便宜。客户端好于自由一个节点发送请求,如果是它们的“负责”的内容,则直接返回内容。否则,查找实际负责Redis节点,然后拿地方告知客户端,客户端重新请。 

澳门美高梅手机网站 21 

对于用缓存服务的客户端的话,这一体是晶莹剔透的。

澳门美高梅手机网站 22 

外存缓存服务以切换的下,是起得风险的。从A集群切换至B集群的长河被,必须保证B集群提前做好“预热”(B集群的内存中之看好数据,应该尽量与A集群相同,否则,切换的一刹那气势恢宏请内容,在B集群的内存缓存中搜寻无交,流量直接打后端的数据库服务,很可能造成数据库宕机)。

  1. 削减数据库“写”

地方的机制,都实现减少数据库的“读”的操作,但是,写的操作为是一个百般的下压力。写的操作,虽然无法回落,但是足以经过联请求,来起及减轻压力之作用。这个时候,我们虽待以内存缓存集群和数据库集群中,建立一个修改共机制。

优先将改要生效在cache中,让外界查询显示正常,然后用这些sql修改放入到一个队中存储起来,队列满或者各级隔一段时间,合并为一个请求到数据库被创新数据库。 

澳门美高梅手机网站 23 

除开上述通过转系统架构的法子提升写的特性外,MySQL本身也足以透过部署参数innodb_flush_log_at_trx_commit来调整写副磁盘的政策。如果机器成本允许,从硬件层面解决问题,可以选老一点底RAID(Redundant
Arrays of independent Disks,磁盘列阵)或者比新的SSD(Solid State
Drives,固态硬盘)。

  1. NoSQL存储

不论数据库的读或写,当流量再进一步上涨,终会达到“人力来穷时”的景。继续加机器的工本较大,并且不必然可以真正解决问题之时段。这个时节,部分骨干数据,就可以设想以NoSQL的数据库。NoSQL存储,大部分还是以key-value的方,这里比推荐以方面介绍过Redis,Redis本身是一个内存cache,同时为可以当一个储存来运,让它们直接以数据落地到磁盘。

这样的话,我们虽将数据库被一些被一再读写的数,分离出来,放在我们新搭建的Redis存储集众多被,又更减轻原来MySQL数据库的下压力,同时因为Redis本身是单内存级别之Cache,读写的性都见面大提升。 

澳门美高梅手机网站 24 

国内一线互联网公司,架构上使的解决方案很多凡接近于上述方案,不过,使用的cache服务也无必然是Redis,他们见面发出重复丰富的别选项,甚至根据我工作特色开发有好之NoSQL服务。

  1. 空节点查询问题

当我们搭建了前面所说的任何服务,认为Web系统现已好强之早晚。我们还是那么句话,新的题目或者会来之。空节点查询,是借助那些数据库被一向不有的数码要。例如,我要查询一个勿存人口信息,系统会于各级缓存逐级查找,最后查及到数据库本身,然后才得出查找无交的下结论,返回给前端。因为各cache对她不行,这个要是死耗系统资源的,而如大气底空节点查询,是足以拍到系统服务之。

澳门美高梅手机网站 25 

每当本人一度的劳作经验中,曾受其害。因此,为了掩护Web系统的稳定,设计适合的空节点过滤机制,非常有必要。

咱及时运的办法,就是统筹相同张简略的记录映射表。将设有的笔录存储起来,放入到同一大内存cache中,这样的话,如果还有空节点查询,则以缓存这无异层即叫堵住了。 

澳门美高梅手机网站 26

 

由于各种缘由,我们得以相同雅服务器上搭建开发暨测试环境。好久没单机搭建了,为了下次找方便,特记录如下(为了省事,采用停机拷贝data文件夹的方法):

外边部署(地理分布式)

完成了上述架构建设后,我们的网是否就曾足足强劲了为?答案当然是否认的哈,优化是管极端的。Web系统虽然表面上看,似乎较强了,但是给用户的体会也未自然是最最好之。因为东北的同桌,访问深圳底一个网站服务,他尚是会倍感有些网络距离达到之徐。这个时段,我们就得举行异地部署,让Web系统去用户还近。

一律、 核心集中和节点分散

产生戏了大型网游的同室还见面了解,网游是起成千上万单区的,一般都是按地区来划分,例如广东专区,北京专区。如果一个于广东之玩家,去都专区玩,那么他会晤感觉明显比较在广东专区卡。实际上,这些大区的称即使既认证了,它的服务器所在地,所以,广东的玩家去老是处北京底服务器,网络自会比缓慢。

当一个系统与劳动足够好的下,就亟须从头考虑外地部署的题材了。让您的劳务,尽可能离开用户还近乎。我们前早已提到了Web的静态资源,可以存放于CDN上,然后经过DNS/GSLB的法,让静态资源的分流“全国各地”。但是,CDN只解决之静态资源的题材,没有缓解后端平庞大的体系服务还特集中在某个固定城市之问题。

以此时节,异地部署就起来了。异地部署一般照:核心集中,节点分散。

  • 主导集中:实际安排过程被,总起有之数据和劳务存在不足部署多仿照,或者配备多仿成本巨大。而对于这些劳动同数码,就还保持一效,而部署地点选一个地域比较基本的地方,通过网里专线来与一一节点通讯。
  • 节点分散:将一些劳务配置为多效,分布在依次都节点,让用户请求尽可能选择贴近之节点访问服务。

像,我们挑选当上海部署为着力节点,北京,深圳,武汉,上海吧疏散节点(上海团结自吗是一个散节点)。我们的服务架构使图: 

澳门美高梅手机网站 27 

需要补充一下之是,上图备受上海节点和中心节点是跟处一个机房的,其他分散节点各自独立机房。 
境内有那么些大型网游,都是约遵循上述架构。它们会管数据量不慌之用户基本账号等在核心节点,而多数之网游数据,例如装备、任务相当数据及劳务在地面节点里。当然,核心节点和地方节点内,也发生缓存机制。 

第二、 节点容灾和过载保护

节点容灾是据,某个节点如果有故障时,我们要树立一个编制去管服务还可用。毫无疑问,这里比较泛的容灾方式,是切换到隔壁都节点。假如系统的天津节点发生故障,那么我们尽管将网络流量切换至邻县的都节点上。考虑到负载均衡,可能用而用流量切换到邻近的几个地方节点。另一方面,核心节点自身为是待好做好容灾和备份的,核心节点一旦故障,就见面潜移默化全国劳动。

过载保护,指的凡一个节点都上最充分容量,无法继续接接受又多要了,系统要来一个保护的体制。一个劳动都满负载,还连续领新的要,结果充分可能就是宕机,影响总体节点的服务,为了至少保持大部分用户之例行下,过载保护是必要的。

缓解过载保护,一般2单样子:

  • 拒绝服务,检测到满负载之后,就不再受新的总是要。例如网游登入中的排队。
  • 分流到另外节点。这种的话,系统贯彻更加复杂,又涉及到负载均衡的问题。

1、假要主库已经当健康运行,mysql_home:/usr/local/mysql,datadir:/usr/local/mysql/data;

小结

Web系统会就访问规模之滋长,渐渐地从1贵服务器可以满足要求,一直成长为“庞然大物”的非常集群。而之Web系统易充分的进程,实际上就是是咱们缓解问题之经过。在不同的等,解决不同之题目,而初的题目同时出生在原本的解决方案之上。

网的优化是不曾极限的,软件与系架构也一直当快速发展,新的方案解决了老的题目,同时为带来新的挑战。

2、主库mysqladmin shutdown;

3、cd /usr/local/mysql

     cp -R data data2

4、编辑/etc/my.cnf,修改为如下:

[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
log = /usr/local/mysql/mysqld_multi.log

[mysqld1]

log_bin_trust_function_creators = true
query_cache_size = 0
query_cache_wlock_invalidate=OFF
query_cache_type=0
innodb_thread_concurrency=4
innodb_strict_mode=true
tmpdir=/tmp
autocommit=1
binlog_rows_query_log_events=on
log_slave_updates=ON
sync_relay_log=1
innodb_buffer_pool_size=1024M
innodb_flush_log_at_trx_commit=0
transaction-isolation=READ-COMMITTED
innodb_autoinc_lock_mode = 2
skip-name-resolve
lower_case_table_names=1
back-log=500
default-storage-engine=InnoDB
sync_binlog=1
log-bin=mysql-bin
binlog_format=row
binlog_checksum=NONE
binlog_row_image=full
binlog_cache_size = 8M 
max_binlog_size = 500M 
max_binlog_cache_size = 16M
expire_logs_days = 3
innodb_log_file_size=512m
innodb-log-buffer-size=8M
innodb-log-files-in-group=3
innodb_data_home_dir=/usr/local/mysql/data
pid-file = /usr/local/mysql/data/mysqld.pid
datadir = /usr/local/mysql/data
socket = /usr/local/mysql/data/mysqld.sock
innodb_lock_wait_timeout=15
lock_wait_timeout=60
default-tmp-storage-engine=MEMORY
innodb-autoextend-increment=16M
innodb-buffer-pool-instances=1
# innodb_read_io_threads=2
# innodb_write_io_threads=2
innodb-file-per-table=true
innodb_rollback_on_timeout=true
# innodb_flush_method=ALL_O_DIRECT
open-files-limit=32767
innodb_open_files=32767
slow-query-log=true
long_query_time=0.02
server-id=1
port=3306
thread_handling=pool-of-threads
thread_pool_size=4
thread_cache_size=5
max-connections=200
max_allowed_packet=10485760
event_scheduler=ON
userstat=ON
innodb_use_global_flush_log_at_trx_commit=0
sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

[mysqld2]
log_bin_trust_function_creators = true
query_cache_size = 0
query_cache_wlock_invalidate=OFF
query_cache_type=0
innodb_thread_concurrency=4
innodb_strict_mode=true
tmpdir=/tmp
autocommit=1
binlog_rows_query_log_events=on
log_slave_updates=ON
sync_relay_log=1
innodb_buffer_pool_size=1024M
innodb_flush_log_at_trx_commit=0
transaction-isolation=READ-COMMITTED
innodb_autoinc_lock_mode = 2
skip-name-resolve
lower_case_table_names=1
back-log=500
default-storage-engine=InnoDB
sync_binlog=1
log-bin=mysql-bin
binlog_format=row
binlog_checksum=NONE
binlog_row_image=full
binlog_cache_size = 8M 
max_binlog_size = 500M 
max_binlog_cache_size = 16M
expire_logs_days = 3
innodb_log_file_size=512m
innodb-log-buffer-size=8M
innodb-log-files-in-group=3
innodb_data_home_dir=/usr/local/mysql/data2
pid-file = /usr/local/mysql/data2/mysqld.pid
datadir = /usr/local/mysql/data2
socket = /usr/local/mysql/data2/mysqld.sock

innodb_lock_wait_timeout=15
lock_wait_timeout=60
default-tmp-storage-engine=MEMORY
innodb-autoextend-increment=16M
innodb-buffer-pool-instances=1
# innodb_read_io_threads=2
# innodb_write_io_threads=2
innodb-file-per-table=true
innodb_rollback_on_timeout=true
# innodb_flush_method=ALL_O_DIRECT
open-files-limit=32767
innodb_open_files=32767
slow-query-log=true
long_query_time=0.02
server-id=2
port=3307
thread_handling=pool-of-threads
thread_pool_size=4
thread_cache_size=5
max-connections=200
max_allowed_packet=10485760

event_scheduler=ON
userstat=ON
innodb_use_global_flush_log_at_trx_commit=0
sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

5、因为data2是拷贝data的,而mysql
5.6开始,有个server_uuid的定义,它是启动时mysqld自动生成的,保存在datadir的auto.cnf文件被,所以待更改data2下auto.cnf底server_uuid,否则在slave复制的下就会为“Fatal
error: The slave I/O thread stops because master and slave have equal
MySQL server UUIDs; these UUIDs must be different for replication to
work.”而止。

[root@iZ23nn1p4mjZ data2]# cat auto.cnf
[auto]
server-uuid=96b464e1-b68f-11e6-8321-00163f003609
 #甭管更改呀都可,长度以及格式一样就是哼了

6、使用mysqld_multi启动mysql进程,如下:

mysqld_multi –defaults-file=/etc/mysql.cnf start 1,2

查看已经启动之mysql进程:

[root@iZ23nn1p4mjZ ~]# mysqld_multi –defaults-file=/etc/my.cnf
report
Reporting MySQL (Percona Server) servers
MySQL (Percona Server) from group: mysqld1 is running
MySQL (Percona Server) from group: mysqld2 is running

7、查看主库当前binlog位置

mysql> show master status;
+——————+———-+————–+——————+——————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
Executed_Gtid_Set |
+——————+———-+————–+——————+——————-+
| mysql-bin.000006 | 6857082 | | | |
+——————+———-+————–+——————+——————-+
1 row in set (0.00 sec)

8、设置复制、库名重写、过滤特定表(备库执行,mysqld2)

流淌:CHANGE REPLICATION
FILTER是5.7初引入的特色,支持运行时修改要任由需再次起动mysql进程,在5.6及之前的本子则更改初始化参数而还开。

mysql> CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB =
((db_sys,db_rsk),(db_act,db_rsk));

mysql> CHANGE REPLICATION FILTER Replicate_Wild_Do_Table =
(‘db_rsk.tb_act_operationconfig’,’db_rsk.tb_act_stock_quotation’,’db_rsk.tb_sys_stock_info’,’db_rsk.tb_act_unitequitiesposition’,’db_rsk.tb_act_unitaccount’,’db_rsk.tb_act_productunitasset’,’db_rsk.tb_act_productaccount’,’db_rsk.tb_act_productposition’,’db_rsk.tb_rsk%’,’db_rsk.tbjour_rsk%’);

mysql> CHANGE MASTER TO
MASTER_HOST=’127.0.0.7′,
MASTER_USER=’root’,

MASTER_PASSWORD=’mysql’,
MASTER_PORT=3306,
MASTER_LOG_FILE=’mysql-bin.000006′,
MASTER_LOG_POS=6857082;

9、启动slave;

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Queueing master event to the relay log
                  Master_Host: 127.0.0.1
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000018
          Read_Master_Log_Pos: 16175239
               Relay_Log_File: iZ23nn1p4mjZ-relay-bin.000007
                Relay_Log_Pos: 84333
        Relay_Master_Log_File: mysql-bin.000018
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: db_rsk.tb_act_operationconfig,db_rsk.tb_act_stock_quotation,db_rsk.tb_sys_stock_info,db_rsk.tb_act_unitequitiesposition,db_rsk.tb_act_unitaccount,db_rsk.tb_act_productunitasset,db_rsk.tb_act_productaccount,db_rsk.tb_act_productposition,db_rsk.tb_rsk%,db_rsk.tbjour_rsk%
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 16144064
              Relay_Log_Space: 287132
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 36
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 96b464e1-b68f-11e6-8321-00163f00368a
             Master_Info_File: /usr/local/Percona-Server-5.7.16-10-Linux.x86_64.ssl101/data2/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Reading event from the relay log
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: (db_sys,db_rsk),(db_act,db_rsk)
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.01 sec)

ERROR: 
No query specified

测试,主库插入

mysql> insert into tb_rsk_rowid values(954256,954256);
Query OK, 1 row affected (0.01 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

备库查询

mysql> select * from tb_rsk_rowid f where
f.table_enname=’954256′;
+————–+————+
| table_enname | curr_rowid |
+————–+————+
| 954256 | 954256 |
+————–+————+
1 row in set (0.00 sec)

布置过滤用注意的是:

如若以以Replicate_[Wild_]Do_[Table|Db]和Replicate_Rewrite_DB,则会优先以Replicate_Rewrite_DB,后执行Replicate_[Wild_]Do_[Table|Db]。

其他:

如果Replicate_Rewrite_DB或Replicate_Wild_Do_Table配置错了,需要重新配置,可以推行如下操作:

stop slave;

mysql> CHANGE REPLICATION FILTER Replicate_Wild_Do_Table =
(‘db_rsk.tb_act_operationconfig’,’db_rsk.tb_act_stock_quotation’,’db_rsk.tb_sys_stock_info’,’db_rsk.tb_act_unitequitiesposition’,’db_rsk.tb_act_unitaccount’,’db_rsk.tb_act_productunitasset’,’db_rsk.tb_act_productaccount’,’db_rsk.tb_act_productposition’);
Query OK, 0 rows affected (0.00 sec)

start slave;

假设如失去丢设置,则可CHANGE REPLICATION FILTER
Replicate_Wild_Do_Table =();

其它部分重写db和过滤特定db的规则具体细节而参看http://dev.mysql.com/doc/refman/5.7/en/replication-rules.html。

和另外HA机制同,HA机制相对于单机来说,一定要是出自动化的预警触发机制,尤其是重要的线达系统。

PS:发现一个奇怪的观,第二上再失去show slave
status查看状态的时,发现Replicate_Wild_Do_Table被清空了,如下:

mysql> show slave status\G;
*************************** 1. row
***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 127.0.0.1
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000020
Read_Master_Log_Pos: 79613721
Relay_Log_File: iZ23nn1p4mjZ-relay-bin.000016
Relay_Log_Pos: 79613926
Relay_Master_Log_File: mysql-bin.000020
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: db_sys,db_act
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 79613721
Relay_Log_Space: 79614175
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 96b464e1-b68f-11e6-8321-00163f00368a
Master_Info_File:
/usr/local/Percona-Server-5.7.16-10-Linux.x86_64.ssl101/data2/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for
more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB: (db_sys,db_rsk),(db_act,db_rsk)
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)

ERROR:
No query specified

然后Replicate_Do_DB不也空了,奇怪了。。。因为刚已调整了,明天重检查下本着结果来无产生震慑。

设若非盼用replication
filter,可当my.cnf中布置上述过滤条件,如下所示:

澳门美高梅手机网站 28

每个都急需单列,这个规划真是比较奇葩。。。。

于rewrite-db中,存储过程/函数同样会复制到slave(包括create
procedure),并且自动rewrite所属db。但是table create
ddl则一心依据wild-do_table的规则进行。这同样点而尤其令人瞩目,不然会促成看起格外意外之场景。

相关典型错误与处理办法可见http://www.360doc.com/content/14/1128/13/12904276\_428730593.shtml。

发表评论

电子邮件地址不会被公开。 必填项已用*标注