【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构

news/2024/5/14 15:34:59/文章来源:https://blog.csdn.net/weixin_33691700/article/details/94042852

随笔- 80  文章- 1  评论- 531 

【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构

一、业务发展驱动数据发展

  随着网站业务的不断发展,用户量的不断增加,数据量成倍地增长,数据库的访问量也呈线性地增长。特别是在用户访问高峰期间,并发访问量突然增 大,数据库的负载压力也会增大,如果架构方案不够健壮,那么数据库服务器很有可能在高并发访问负载压力下宕机,造成数据访问服务的失效,从而导致网站的业 务中断,给公司和用户造成双重损失。那么,有木有一种方案能够解决此问题,使得数据库不再因为负载压力过高而成为网站的瓶颈呢?答案肯定是有的。

  目前,大部分的主流关系型数据库都提供了主从热备功能,通过配置两台(或多台)数据库的主从关系,可以将一台数据库服务器的数据更新同步到另一台服务器上。网站可以利用数据库的这一功能,实现数据库的读写分离,从而改善数据库的负载压力

master-slave

  利用数据库的读写分离,Web服务器在写数据的时候,访问主数据库(Master),主数据库通过主从复制机制将数据更新同步到从数据库(Slave),这样当Web服务器读数据的时候,就可以通过从数据库获得数据。这一方案使得在大量读操作的Web应用可以轻松地读取数据,而主数据库也只会承受少量的写入操作,还可以实现数据热备份,可谓是一举两得的方案。

二、MySQL数据复制原理

  刚刚我们了解了关系型数据库的读写分离能够实现数据库的主从架构,那么主从架构中最重要的数据复制又是怎么一回事呢?MySQL作为最流行的关系型数据库之一,通过了解MySQL的数据复制流程,会使得我们对主从复制的认知会有一定的帮助。

mysql

  从上图来看,整体上有如下三个步凑:

  (1)Master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);

  (2)Slave将Master的二进制日志事件(binary log events)拷贝到它的中继日志(relay log);

PS:从图中可以看出,Slave服务器中有一个I/O线程(I/O Thread)在不停地监听Master的二进制日志(Binary Log)是否有更新:如果没有它会睡眠等待Master产生新的日志事件;如果有新的日志事件(Log Events),则会将其拷贝至Slave服务器中的中继日志(Relay Log)。

  (3)Slave重做中继日志(Relay Log)中的事件,将Master上的改变反映到它自己的数据库中。

PS:从图中可以看出,Slave服务器中有一个SQL线程(SQL Thread)从中继日志读取事件,并重做其中的事件从而更新Slave的数据,使其与Master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

三、MySQL主从复制实战

3.1 实验环境总览与准备工作

  (1)实验环境

  ①服务器环境:本次我们主要借助VMware Workstation搭建一个三台Windows Server 2003组成的MySQL服务器集群,其中一台作为Master服务器(IP:192.168.80.10),其余两台均作为Slave服务器 (IP:192.168.80.11,192.168.80.12)。

  ②客户机环境:本次我们在Windows 7宿主机(IP:192.168.80.1)编写一个C#控制台程序,对MySQL服务器进行基本的CRUD访问测试。

  (2)准备工作

    下载MySQL文件:http://dev.mysql.com/downloads/mysql/5.5.html#downloads

    这里我们选择5.5版本,为了节省时间,直接选择了Archive免安装版本。又由于虚拟机中的Windows Server 2003是32位,所以选择了32-bit的Archive版本进行使用。

    下载完成后,将三个压缩包分别拷贝至Master(IP:192.168.80.10)、Slave1(IP:192.168.80.11)及Slave2(IP:192.168.80.12)中。

3.2 配置MySQL主服务器

  (1)将MySQL文件拷贝到Master服务器,并解压到一个指定文件夹。这里我放在了:C:\MySQLServer\mysql-5.5.40-win32

  (2)新建一个配置文件,取名为:my-master.ini,添加以下内容:

复制代码
 1 [client]
 2 port=3306
 3 default-character-set=utf8  4  5 [mysqld]  6 port=3306  7  8 #character_set_server=utf8 一定要这样写;  9 character_set_server=utf8 10 11 #解压目录 12 basedir=C:\MySQLServer\mysql-5.5.40-win32 13 14 #解压目录下data目录,必须为data目录 15 datadir=C:\MySQLServer\mysql-5.5.40-win32\data 16 17 #sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 这个有问题,在创建完新用户登录时报错 18 sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 19 20 #主服务器的配置 21 #01.开启二进制日志 22 log-bin=master-bin 23 #02.使用二进制日志的索引文件 24 log-bin-index=master.bin.index 25 #03.为服务器添加唯一的编号 26 server-id=1
复制代码

  (3)将my-master.ini传送到Master服务器中mysql所在的文件夹中,并在命令行中将其注册为Windows服务:(这里要转到mysql的bin文件夹中进行操作,因为没有设置环境变量)

  (4)启动mysql服务,并设为自启动类型;

  (5)使用root账号登陆mysql,创建一个具有复制权限的用户;(此时root是没有密码的,直接回车即可)

  (6)在Slave1或Slave2上通过远程登录Master上的mysql测试新建用户是否可以登录;

3.3 配置MySQL从服务器

  (1)同Master服务器,将MySQL文件拷贝解压到指定文件夹下;

  (2)新建一个配置文件,取名为:my-slave.ini,添加以下内容:

复制代码
[client]
port=3306
default-character-set=utf8 [mysqld] port=3306 #character_set_server=utf8 一定要这样写; character_set_server=utf8 #解压目录 basedir=C:\MySQLServer\mysql-5.5.40-win32 #解压目录下data目录,必须为data目录 datadir=C:\MySQLServer\mysql-5.5.40-win32\data #sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 这个有问题,在创建完新用户登录时报错 sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION #从服务器的配置 #01.为服务器添加唯一的编号 server-id=2 #02.开启中继日志 relay-log=slave-relay-log-bin #03.使用中继日志的索引文件 relay-log-index=slave-relay-log-bin.index
复制代码

PS:这里server-id要确保唯一,我们这里Master(192.168.80.10)的 server-id=1,那么Slave1(192.168.80.11)就设置其server-id=2,Slave2(192.168.80.12) 则设置其server-id=3。

  (3)将my-slave.ini传送到Slave1和Slave2服务器中mysql所在的文件夹中,并在命令行中将其注册为Windows服务:(这里要转到mysql的bin文件夹中进行操作,因为没有设置环境变量)

  (4)分别启动两台Slave的mysql服务,步凑同master所述;当然,也可以在cmd中输入命令:net start MySQL

  (5)分别使用两台Slave的root账号登陆mysql,通过指定的语句配置主从关系设置;

  (6) 为了方便后面的测试,这里我们在Master上通过root进入mysql,创建一个测试用的数据库和数据表;

  (7)还要创建一个用户,这个用户具有对所有数据库的增删查改的权限,以便用来进行测试;

3.4 编写C#程序测试主从复制结构

  (1)下载mysql for .net开发包,添加对mysql.data.dll的引用

  (2)在控制台程序中写代码访问Master服务器,并查看程序运行结果;

  ①数据库连接部分:

复制代码
<?xml version="1.0" encoding="utf-8" ?>
<configuration> <connectionStrings> <add name="mysqlmaster" connectionString="server=192.168.80.10;database=dbtest;uid=sa;password=123456"/> </connectionStrings> </configuration>
复制代码

  ②程序代码部分:在程序中首先显示user表内容(这时表是空的),然后会添加5条user信息,其中会修改第3条user信息的name为Edison Chou,最后会删除第5条user信息;

View Code

  ③程序运行结果:

  (3)在Slave1(192.168.80.11)和Slave2(192.168.80.12)上查看user表是否自动进行了数据同步;

  ①首先在Master上查看user表还剩哪些信息?

  ②其次在Slave1上查看user表是否进行了同步:

  ③最后在Slave2上查看user表是否进行了同步:

  (4)初步尝试读写分离:一主一从模式的一个最简单的实现方式

  ①在Slave1上新建一个只具有读(select)权限的用户,这里取名为reader:

    create user reader;

    grant select on *.* to reader identified by '123456';

  ②新增一个mysqlslave的数据库连接字符串:

    <connectionStrings><add name="mysqlmaster" connectionString="server=192.168.80.10;database=dbtest;uid=sa;password=123456"/> <add name="mysqlslave" connectionString="server=192.168.80.11;database=dbtest;uid=reader;password=123456"/> </connectionStrings>

  ③新增一个枚举DbCommandType来记录读操作和写操作:

    public enum DbCommandType{Read,Write}

  ④修改读取数据表的代码判断是读操作还是写操作:

View Code

PS:关于MySQL的读写分离实现,主要有以下几种方式:

一种是基于MySQL-Proxy做调度服务器模式,另一种是借助阿里巴巴开源项目Amoeba(变形虫)项目实现(这种方式貌似用的比较多),另外呢就是自己写一个类似于哈希算法的程序库来选择目标数据库;

学习小结

  此次我们主要简单地学习了主从复制的一些相关概念,了解了MySQL在Windows下搭建主从复制架构的过程,最后通过改变程序方式使得一主 一从模式下实现读写分离(虽然是很简单很粗陋的实现)。后续有空时,我会尝试在Linux下借助阿里巴巴开源项目Amoeba搭建真正的MySQL读写分 离模式,到时也会将搭建的过程分享出来。虽然,我没有相关的真实实践经验,也有很多人跟我说“你这是在纸上谈兵”,我也知道“纸上得来终觉浅,绝知此事要 躬行”,但在没毕业之前,我还是会做一些相关的初步了解性质的实践学习,也许以后到了公司,就会有真正的战场在等着我了。当然,如果你觉得我写这篇博客花 了点心思,那就麻烦点个赞,谢谢啦!

参考资料

  (1)李智慧,《大型网站技术架构-核心原理与案例分析》:http://item.jd.com/11322972.html

  (2)guisu,《高性能Mysql主从架构的复制原理及配置详解》:http://blog.csdn.net/hguisu/article/details/7325124

  (3)Ghost,《高性能的MySQL主从复制架构》:http://www.uml.org.cn/sjjm/201211061.asp

  (4)飞鸿无痕,《Amoeba搞定MySQL读写分离》:http://blog.chinaunix.net/uid-20639775-id-154600.html (此文讲解了如何借助Amoeba构建MySQL主从复制读写分离,值得阅读

附件下载

  (1)mysql-5.5.40(Archive版本):http://pan.baidu.com/s/1c0u6X80

  (2)相关配置文件(master与slave):http://pan.baidu.com/s/1dDENI73

  (3)C#测试程序DEMO:http://pan.baidu.com/s/1kT42gAz

转载于:https://www.cnblogs.com/TF12138/p/4134408.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_769804.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle Erp常用网站

2014-01-01 Created By BaoXinjian 英文站 Oracle EBS R12 官方参考手册(User Guide, Implementation Guide)Oracle Integration Repository关于各类API、接口等信息。Oracle White Paper LibraryOracle白皮书&#xff0c;涉及数据库、应用、解决方案等多个领域。Oracle E-Deli…

开发网站接触到的软件---自我总结

1.Dreamweaver&#xff08;DW&#xff09; 可视化工具&#xff0c;DW的内存占用大概平常80M左右&#xff0c;刚开始写网页就是用的DW&#xff0c;后面发现webStorm的功能更加强大&#xff0c;DW后期使用感觉很卡 优点&#xff1a;图片热区的设置&#xff0c;用DW很方便。 2.web…

百度SEO:最新搜索引擎排名因素有哪些?

搜索引擎排名规则&#xff0c;一直以来都是一个争论的焦点&#xff0c;随着百度算法的不断调整&#xff0c;实际上它是一个动态因素&#xff0c;自从熊掌号上线以来&#xff0c;可谓搜索排序大洗牌&#xff0c;毫无疑问内容是基石&#xff0c;它几乎更古不变&#xff0c;而链接…

结合bootstrap与后端CI框架的网站开发(一)

2019独角兽企业重金招聘Python工程师标准>>> CI框架是一套基于MVC的后端框架&#xff0c;历史比较就远了&#xff0c;非常轻量级&#xff0c;对于一些小网站的开发已经绰绰有余。不过我仅对VIEW层&#xff0c;也就是前端部分进行记录。如有错误&#xff0c;希望得到…

Nginx+Keepalived实现网站高可用方案

转载:http://openskill.cn/article/166 公司内部 OA 系统要做线上高可用&#xff0c;避免单点故障&#xff0c;所以计划使用2台虚拟机通过 Keepalived 工具来实现 nginx 的高可用&#xff08;High Avaiability&#xff09;&#xff0c;达到一台nginx入口服务器宕机&#xff0c…

网站爬取工具_介绍一些比较方便好用的爬虫工具和服务

在之前介绍过很多爬虫库的使用&#xff0c;其中大多数也是 Python 相关的&#xff0c;当然这些库很多都是给开发者来用的。但这对一个对爬虫没有什么开发经验的小白来说&#xff0c;还是有一定的上手难度的。现在市面上其实也出现了非常多的爬虫服务&#xff0c;如果你仅仅是想…

index加载显示servlet数据_可视化动态网站柱状图加载

准备一个动态网站工程将已经完成的静态页面及资源拷贝到WebContent目录下启动Tomcat,访问页面&#xff0c;成功后代表静态页面访问成功准备一个Servlet&#xff0c;作为左边柱状图的入口类配置Web.xml&#xff0c;将Servlet准备好将引入的包拷贝或者引入到项目里引入的包&#…

python访问网站添加请求头_python request.urlretrieve的使用 如何添加请求头

python3 request.urlretrieve 添加请求头下载图片import urllib.requestopener urllib.request.build_opener()opener.addheaders [("User-agent", "Mozilla/5.0")]urllib.request.install_opener(opener)urllib.request.urlretrieve("type URL her…

wordpress站点 HTML,如何将WordPress生成HTML静态化网站

对于将wordpress生成HTML静态化网站&#xff0c;很多人会使用cos-html-cache的插件实现。这个插件非常简洁小巧&#xff0c;直接在原网站上生成首页和文章页的html文件&#xff0c;不过&#xff0c;这个插件只支持文章静态化&#xff0c;不支持页面、标签和分类的静态化&#x…

网站每天1万ip需要多大服务器,每天10000ip需要什么配置的服务器

每天10000ip需要什么配置的服务器 内容精选换一换Agent服务证书&#xff0c;即鲲鹏性能分析工具的服务端和Agent端之间通讯的证书。已成功登录系统性能分析。管理员用户(tunadmin)可以执行生成证书、更换证书和更换工作密钥的操作&#xff0c;普通用户只能查看Agent服务证书信息…

微服务电商qps_亿级流量电商网站微服务架构

亿级流量电商网站微服务架构缓存设计缓存穿透缓存穿透是指查询一个根本不存在的数据&#xff0c; 缓存层和存储层都不会命中&#xff0c;通常出于容错的考虑&#xff0c; 如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xf…

java初级项目 小说_webmagic项目实战(爬小说网站)

正常发货正版包邮java从入门到软件68.9元包邮(需用券)去购买 >项目背景小说网站优书网(http://yousuu.com/bookstore/)提供的小说查询功能不是很强大&#xff0c;很多高级查询功能都没有&#xff0c;比如想要查询出评分在8.0以上并且标签包含‘仙侠’、字数超过100万字的小说…

网站服务器空间域名绑定,服务器空间怎么绑定域名

服务器空间怎么绑定域名 内容精选换一换一个网卡只能绑定一个EIP。您需要多个EIP时&#xff0c;可以将EIP绑定到扩展网卡&#xff0c;但扩展网卡绑定EIP以后&#xff0c;需要在裸金属服务器内根据实际网络情况做相应的操作&#xff0c;例如&#xff1a;增加策略路由或者命名空间…

数万网站仍在使用有已知漏洞的老旧 JavaScript 库

美国东北大学研究人员在对超过 133000 个网站分析时发现&#xff0c;有超过 37% 的站点仍在使用至少包含一个已知公开漏洞的 JavaScript 库。研究人员早在 2014年进行研究时就曾提醒&#xff0c;应当注意由于在浏览器中加载老旧版本的 JavaScript 库&#xff08;如 jQuery、Ang…

Firefox 55不会将用户位置提供给非https网站

在2017年8月&#xff0c;Mozilla将发布Firefox 55。一个值得注意的变化是那些不安全的网站将无法获取用户的地理位置数据&#xff0c;这些信息将只发送到HTTPS和加密的WebSocket连接&#xff0c;这一举动是浏览器制造商推动网站采用更安全协议的另一个步骤。 根据Mozilla在五个…

资深程序员总结了9个java学习需要收藏的网站!

第一个&#xff1a;JavaSED这是1个很大的资源类型的网站&#xff0c;涉及了很多Java代码案例。这个网站也可以查看很多Java API类源代码&#xff0c;值得收藏&#xff01;第二个&#xff1a;Code Project这篇文章分享之前我还是要推荐下我自己的JAVA群&#xff1a;452180294 &a…

seo说_百度指数看世间沉浮_如何快速排名-互点快速排名_揭秘!如何快速提高网站权重...

一看标题相信可能很多人就会说标题档、忽悠人的&#xff0c;因为网站优化没有捷径。的确&#xff0c;小麦也说过做推广优化没有快速的方法&#xff0c;想要排名就得脚踏实地。不过最近小麦公司不少客户都会问到我们能快速提高网站权重么&#xff0c;小麦今天来给大家好好解释下…

一个完整网站的代码_网站无法访问的链接要怎样处理才符合SEO优化规章

如何编写一个完整的SEO解决方案?首先,我们需要知道SEO解决方案对于优化的速度影响非常重要,如果网站是用优秀的SEO解决方案建立的&#xff0c;之后&#xff0c;按照这个方案一步一步地实行&#xff0c;必要时加以修正&#xff0c;通常会在预料之内达到效果&#xff0c;远远超出…

SEO实战干货:利用老域名打造新站快速收录排名!

当SEO变成人云亦云的时候&#xff0c;那么你对SEO永远只会趋之若鹜。在卢松松平台投稿过数篇关于SEO的文章&#xff0c;不少朋友都说写的都是软文&#xff0c;关于这个话题我只想说一句&#xff0c;因为你没有做过&#xff0c;所以你认为是软文&#xff0c;如果每一篇文章都能够…

阿里云域名+老薛主机 搭建个人博客网站 小结

本人将之前写在自己网站的搭建网站过程的文章&#xff0c;搬过来了&#xff0c;要问为啥&#xff0c;因为精力有限&#xff0c;没有时间在自己的网站上折腾^...^ 虽然之前截的图片不能看了&#xff0c;但是不影响你照着本人的博客&#xff0c;自己独立搭建网站。 【声明】 欢迎…