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

news/2024/5/10 4:35:25/文章来源:https://blog.csdn.net/weixin_30938149/article/details/94999819

随笔- 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_805875.aspx

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

相关文章

ASP.NET网站实现中英文转换(本地化资源)

主要内容&#xff1a; 1. 简单例子 2. 进一步认识Localization 3. 语言转换 4. 解决方案 一. 简单例子 下面通过一个简单的例子来说明利用Localization来实现本地化是那么的简单&#xff0c;首先我们打开Visual Studio 2005&#xff0c;新建一个名叫Localization的工程&#xf…

大型网站框架的演变

大型网站框架的演变 之前也有一些介绍大型网站架构演变的文章&#xff0c;例如LiveJournal的、ebay的&#xff0c;都是非常值得参考的&#xff0c;不过感觉他们讲的更多的是每次演变的结果&#xff0c;而没有很详细的讲为什么需要做这样的演变&#xff0c;再加上近来感觉有不少…

10个提供免费PHP脚本下载的网站

1.PHP Junkyard 这里提供免费的PHP脚本下载。包括PHP资源&#xff0c;教程&#xff0c;文章等等。 2.Free-Php.net Free-Php.net 为你提供分类列表&#xff0c;包括免费的PHP脚本&#xff0c;商业PHP脚本&#xff0c;PHP资源&#xff0c;PHP教程&#xff0c;网页资源&#xff0…

Https网站搭建——通过https://localhost:8443访问tomcat首页

图片大致介绍了Https浏览器与服务器握手的过程&#xff0c;涉及到的名词&#xff1a;证书、Hash算法、随机数密码、公钥加密、私钥解密、握手消息、hash验证、摘要 tomcat服务器配置可以实现https双向认证&#xff0c;简单起见&#xff0c;我们只实现单向认证&#xff0c;过程&…

网站流量分析及网络营销方法-小经验

做了一段网站&#xff0c;经常上站长网。也学习到了不少东西&#xff0c;但是本人还是和大家一样始终是一个技术出身的programmer. 所以有小经验的话&#xff0c;还是应该写在博客园&#xff0c;给自家人看。管理大师德鲁克教导我们&#xff1a;没有测量就没有管理&#xff08;…

Linux下Web服务器应用之网站安全-https

Linux下Web服务器应用之网站安全(https)解决方案 HTTPS&#xff08;全称&#xff1a;Hypertext Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;是以安全为目标的HTTP通道&#xff0c;简单讲是HTTP的安全版。即HTTP下加入SSL层&#xff0c;HTTPS的安全基础…

网站访问统计系统 piwik

piwik官网地址:http://piwik.org/ Piwik是一套基于PhpMySQL技术构建的开源网站访问统计系统&#xff0c;前身是phpMyVisites。Piwik可以给你详细的统计信息&#xff0c;比如网页 浏览人数, 访问最多的页面, 搜索引擎关键词等等&#xff0c;并且采用了大量的AJAX/Flash技术&…

网站前端性能优化总结【转】

一、服务器侧优化 1. 添加 Expires 或 Cache-Control 信息头 某些经常使用到、并且不会经常做改动的图片&#xff08;banner、logo等等&#xff09;、静态文件&#xff08;登录首页、说明文档等&#xff09;可以设置较长的有效期&#xff08;expiration date&#xff09;&…

网站性能工具Yslow的使用方法

Yslow是雅虎开发的基于网页性能分析浏览器插件&#xff0c;从年初我使用了YSlow后&#xff0c;改变了博客模板大量冗余代码&#xff0c;不仅提升了网页的打开速度&#xff0c;这款插件还帮助我分析了不少其他网站的代码&#xff0c;之前我还特意写了提高网站速度的秘籍&#xf…

10款方便的在线文件格式转换工具网站。

1.online-convert online-convert是一个十分优秀的在线格式转换应用&#xff0c;支持格式覆盖文档、图片、音频、视频、电子书、Flash以及一些 不常见的格式。使用非常简单&#xff0c;你只需根据在你想转换成的格式的分类&#xff08;如文档的在document converter&#xff09…

获得alexa网站下面美国排名前二十的网址

为什么80%的码农都做不了架构师&#xff1f;>>> #!/usr/bin/python #encoding:utf8 #author:cosmeimport re import urllibdef getTop25ReginalSties():GETTOP25 re.compile(r^\<a\shref\\"/siteinfo/(?P<gettop>\S)\"\>\S\</a\>.*)…

最新70佳单页网站设计案例欣赏(中篇)

单页网站是指只有一个页面的网站&#xff0c;这种形式的网站曾经非常流行&#xff0c;现在依然有很多人喜欢。不过&#xff0c;并不是每个网站都适合做成单页&#xff0c;一般都是内容比较少而且将来内容也不怎么增加的情况才适合这样做。如果你打算做一个这样的网站&#xff0…

(转载)让网站变灰的CSS代码(支持IE、FIREFOX和CHROME)

2019独角兽企业重金招聘Python工程师标准>>> <p style"margin: 20px 0px; font-size: 1.2em; line-height: 1.8; font-family: Tahoma, Verdana, 宋体; color: #525252;">原文&#xff1a;<a href"http://www.uisdc.com/gray-css-code"…

从两个服务器访问相同网站

目标: 从两台服务器访问同一个网站. 模型: 服务器A , 服务器B 上运行apache 安装php 服务器C 上保存网页文件, 及运行Mysql数据库 大致流程: 服务器C 建立网页存放目录和Mysql数据目录 启用 nfs 服务 并共享网页存放…

从杨致远辞去雅虎说起,那些衰落的网站巨头给我们的启示

盘点一下近些年衰落的互联网巨头 雅虎---无可置疑排名第一位&#xff0c;昔日的互联网霸主99年市值超过1200亿美金&#xff0c;记得小时候看过一个动画片&#xff0c;里面经常有个大猩猩叫“yahoo”哈哈&#xff0c;从哪个时候雅虎成为我第一知道的互联网品牌&#xff0c;但是今…

我的.Net电子商务网站第一步 - UI

决定要做一个电子商务网站&#xff0c;一直以来都觉得自己美工很烂&#xff0c;那先从美工入手吧&#xff01; 折腾了2天之后&#xff0c;有了最初的效果&#xff0c;在线demo请点击&#xff1a;http://byyee.com/software/shoppingmall/ 网站用的是国外空间&#xff0c;如果访…

自主服务器详细发布网站教程,能上网即可以做网站服务

很多人只知道固定公网IP发布网站&#xff0c;动态IP时甚至无公网IP时&#xff0c;如何发布网站呢&#xff1f;根据不同的网络环境分析不同的发布网站方式。一&#xff0c;固定公网IP时。通过dnspod或nat123域名解析&#xff0c;将域名解析到网站主机IP即可。二&#xff0c;动态…

IIS发布asp.net网站出现的错误

1、 【转】配置错误 不能在此路径中使用此配置节 配置错误 不能在此路径中使用此配置节(转)2011年12月29日 11:22 配 置错误 不能在此路径中使用此配置节。如果在父级别上锁定了该节&#xff0c;便会出现这种情况。锁定是默认设置的 (overrideModeDefault"Deny")&…

joomla的几个不错的网站

http://www.joomlagate.com/download/free-joomla-templates Joomla之门 ::下载 RSS Joomla! 免费模板 RSS 各种免费 Joomla! 模板 Free Joomla Templates. 不仅有前台模板&#xff0c;还包括后台模板&#xff1b;不仅有网站模板&#xff0c;还包括论坛模板、留言本模板等。 …

微软网站打不开_终于等到你,微软正式发布 Windows Terminal 预览版

前一段时间&#xff0c;一直在知乎、技术社区收到技术小伙伴们的终极拷问&#xff1a;微软Build 大会上提到的「6月中旬」要上Windows store 的 Windows Terminal 到底啥时候可以用到呀&#xff1f;有一次&#xff0c;我跑去我给 Windows Terminal 提的某个 issue 里问 Windows…