系统架构文档_第1页
系统架构文档_第2页
系统架构文档_第3页
系统架构文档_第4页
系统架构文档_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

系统架构文档1、系统网络架构010203040506NGINX负载均衡010203040506WEB服务器(主)---做分布式部署已经移植WEB服务器(从)---做分布式部署已经移植Redis缓存服务器Mysql(主)Mysql(从)rpm-ivhhttp://mirrors.yun-idc.Com/epel/6/x86_64/epel-release-6-8.noarch.rpm2、搭建Nginx服务安装make:yum-yinstallgccautomakeautoconflibtoolmake安装g++:yuminstallgccgcc-c++一般我们都需要先装pcre,zlib,前者为了重写rewrite,后者为了gzip压缩。选定源码目录可以是任何目录,本文选定的是/usr/local/srccd/usr/local/src安装PCRE库ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/下载最新的PCRE源码包,使用下面命令下载编译和安装PCRE包:cd/usr/local/srcwgetftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.tar.gztar-zxvfpcre-8.21.tar.gzcdpcre-8.21./configuremakemakeinstall安装zlib库/zlib-128.tar.gz下载最新的zlib源码包,使用下面命令下载编译和安装zlib包:cd/usr/local/srcwget/zlib-128.tar.gztar-zxvfzlib-1.2.8.tar.gzcdzlib-1.2.8./configuremakemakeinstall安装ssl(某些vps默认没装ssl)cd/usr/local/srcwgethttp://www.openssl.Org/source/openssl-1.0.1c.tar.gztar-zxvfopenssl-1.0.1c.tar.gz安装nginxNginx-般有两个版本,分别是稳定版和开发版,您可以根据您的目的来选择这两个版本的其中一个,下面是把Nginx安装到/usr/local/ngiiX录下的详细步骤:cd/usr/local/srcwget/download/nginx-1.4.2.tar.gztar-zxvfnginx-1.4.2.tar.gzcdnginx-1.4.2./configure一sbin-path=/usr/local/nginx/nginx\一conf-path=/usr/local/nginx/nginx.conf\一pid-path=/usr/local/nginx/nginx.pid\--with-http_ssl_module\--with-pcre=/usr/local/src/pcre-8.33\--with-zlib=/usr/local/src/zlib-1.2.8\--with-openssl=/usr/local/src/openssl-1.0.1cmakemakeinstall--with-pcre=/usr/src/pcre-指33是pcre-8.21的源码路径。--with-zlib=/usr/src/zlib指1的是zlib-1.2.的源码路径。安装成功后/usr/local/ngi目录下如下fastcgi.conf koi-win nginx.conf.defaultfastcgi.conf.defaultlogs scgi_paramsfastcgi_paramsmime.typesscgi_params.defaultfastcgi_params.defaultmime.types.defaultuwsgi_paramshtml nginxuwsgi_params.defaultkoi-utfnginx.conf win-utf启动确保系统的80端口没被其他程序占用,运行/usr/local/nginx/ng命n令来启动Nginx,netstat-ano|grep80到这里nginx就安装完成了!下面安装排错附:可能遇到的错误和一些帮助信息1.1编译pcre错误libtool:compile:unrecognizedoption'-DHAVE_CONFIG_H'libtool:compile:Try'libtool--help'formoreinformation.make[1]:***[pcrecpp.lo]Error1make[1]:Leavingdirectory'/usr/local/src/pcre-8.21'make:***[all]Error2解决办法:安装g++,别忘了重新configureapt-getinstallg++apt-getinstallbuild-essentialmakeclean./configuremake1.2make出错make:***Noruletomaketarget'build',neededby'default'.Stop../configure:error:SSLmodulesrequiretheOpenSSLlibrary.Youcaneitherdonotenablethemodules,orinstalltheOpenSSLlibraryintothesystem,orbuildtheOpenSSLlibrarystaticallyfromthesourcewithnginxbyusing--with-openssl=<path>option.按照第4步的安装方法或ubuntu下apt-getinstallopensslapt-getinstalllibssl-devcentos下yum-yinstallopensslopenssl-devel2.nginx编译选项make是用来编译的,它从Makefile中读取指令,然后编译。makeinstall是用来安装的,它也从Makefile中读取指令,安装到指定的位置。configure命令是用来检测你的安装平台的目标特征的。它定义了系统的各个方面,包括nginx的被允许使用的连接处理的方法,比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本,执行结束时,它会创建一个Makefile文件。nginx的configure命令支持以下参数:--prefix=path 定义一个目录,存放服务器上的文件,也就是nginx的安装目录。默认使用/usr/local/nginx。--sbin-path=path设置nginx的可执行文件的路径,默认为prefix/sbin/nginx.--conf-path=path设置在nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf.--pid-path=path设置nginx.pid文件,将存储的主进程的进程号。安装完成后,可以随时改变的文件名,在nginx.conf配置文件中使用PID指令。默认情况下,文件名为prefix/logs/nginx.pid.--error-log-path=path设置主错误,警告,和诊断文件的名称。安装完成后,可以随时改变的文件名,在nginx.conf配置文件中使用的error_log指令。默认情况下,文件名为prefix/logs/error.log.--http-log-path=path设置主请求的HTTP服务器的日志文件的名称。安装完成后,可以随时改变的文件名,在nginx.conf配置文件中使用的access_log指令。默认情况下,文件名为prefix/logs/access.log.--user=name设置nginx工作进程的用户。安装完成后,可以随时更改的名称在nginx.conf配置文件中使用的user指令。默认的用户名是nobody。--group=name设置nginx工作进程的用户组。安装完成后,可以随时更改的名称在nginx.conf配置文件中使用的user指令。默认的为非特权用户。--with-select_module--without-select_module启用或禁用构建一个模块来允许服务器使用select()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。--with-poll_module--without-poll_module启用或禁用构建一个模块来允许服务器使用poll()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。--without-http_gzip_module一不编译压缩的HTTP服务器的响应模块。编译并运行此模块需要zlib库。--without-http_rewrite_module不编译重写模块。编译并运行此模块需要PCRE库支持。--without-http_proxy_module一不编译http_proxy模块。--with-http_ssl_module一使用https协议模块。默认情况下,该模块没有被构建。建立并运行此模块的OpenSSL库是必需的。--with-pcre=path—设置PCRE库的源码路径。PCRE库的源码(版本4.4-8.30)需要从PCRE网站下载并解压。其余的工作是Nginx的./configure和make来完成。正则表达式使用在location指令和ngx_http_rewrite_module模块中。--with-pcre-jit—编译PCRE包含"just-in-timecompilation”(1.1.12中,pcre_jit指令)。--with-zlib=path—设置的zlib库的源码路径。要下载从zlib(版本1.1.3-1.2.5)的并解压。其余的工作是Nginx的./configure和make完成。ngx_http_gzip_module模块需要使用zlib。--with-cc-opt=parameters—设置额外的参数将被添加到CFLAGS变量。例如当你在FreeBSD上使用PCRE库时需要使用:--with-cc-opt="-I/usr/local/include。.如需要需要增加select()支持的文件数量:--with-cc-opt="-DFD_SETSIZE=2048".--with-ld-opt=parameters—设置附加的参数,将用于在链接期间。例如,当在FreeBSD下使用该系统的PCRE库,应指定:--with-ld-opt="-L/usr/local/lib".典型实例(下面为了展示需要写在多行,执行时内容需要在同一行)./configure--sbin-path=/usr/local/nginx/nginx--conf-path=/usr/local/nginx/nginx.conf--pid-path=/usr/local/nginx/nginx.pid--with-http_ssl_module--with-pcre=../pcre-4.4--with-zlib=../zlib-1.1.33、redis服务安装及管理$wgethttp://download.redis.io/releases/redis-2.8.2.tar.gz$tarxzfredis-2.8.2.tar.gz$cdredis-2.8.2$make编译后的可执行文件在src目录中,可以使用下面的命令运行Redis:$src/redis-server你可以使用内置的客户端连接Redis:$src/redis-cliredis>setfoobarOKredis>getfoo"bar"REDIS_HOME=/usr/local/src/redis-2.8.2REDIS_BIN=$REDIS_HOME/srcPATH=$PATH:$HOME/bin:$REDIS_BINaliasredis-cli='rlwrapredis-cli'exportPATHREDIS_HOMEREDIS_BIN管理:#是否以后台进程运行,默认为no,如果需要以后台进程运行则改为yesdaemonizeno#如果以后台进程运行的话,就需要指定pid,你可以在此自定义redis.pid文件的位置。pidfile/var/run/redis.pid#接受连接的端口号,如果端口是0则redis将不会监听TCPsocket连接port6379#连接超时时间,单位秒。(0todisable)?timeout300000000#日志级别,默认是verbose(详细),各种日志级别:#debug:很详细的信息,适合开发和测试#verbose:包含许多不太有用的信息,但比debug要清爽一些(manyrarelyusefulinfo,butnotamesslike#thedebuglevel)#notice:比较适合生产环境#warning:警告信息loglevelverbose#指定log文件的名字,默认是stdoutostdout会让redis把日志输出到标准输出。但是如果使用stdout而又以后台进#程的方式运行redis,则日志会输出到/dev/nulllogfilestdout#'syslog-enabled'设置为yes会把日志输出到系统日志,默认是nosyslog-enabledno#指定syslog的标示符,如果'syslog-enabled'是no,则这个选项无效。syslog-identredis#指定syslog设备(facility),必须是USER或者LOCAL0到LOCAL7.syslog-facilitylocal0#设置数据库数目。默认的数据库是DB0。可以通过SELECT<dbid>来选择一个数据库,dbid是[0,'databases'-1]的数字databases16##################快照###################################硬盘上保存数据:#save<seconds><changes>#<seconds>和<changes>都满足时就会触发数据保存动作。#以下面的例子来说明:过了900秒并且有1个key发生了改变就会触发save动作过了300秒并且有10个key发生了改变就会触发save动作过了60秒并且至少有10000个key发生了改变也会触发save动作#注意:如果你不想让redis自动保存数据,那就把下面的配置注释掉!save9001save30010save6010000#存储数据时是否压缩数据。默认是yes。rdbcompressionyes#保存dump数据的文件名dbfilenamedump.rdb#工作目录.##数据会被持久化到这个目录下的‘dbfilename’指定的文件中。###注意,这里指定的必须是目录而不能是文件。dir./########REPLICATION(复制,冗余)#################################Master-Slavereplication.使用slaveof把一个Redis实例设置成为另一个Redisserver的从库(热备).注意:#配置只对当前slave有效。#因此可以把某个slave配置成使用不同的时间间隔来保存数据或者监听其他端口等等。#命令格式:slaveof<masterip><masterport>#如果master有密码保护,则在slave与master进行数据同步之前需要进行密码校验,否则master会拒绝slave的请#求。##masterauth<master-password>#当slave丢失与master的连接时,或者slave仍然在于master进行数据同步时(还没有与master保持一致),#slave可以有两种方式来响应客户端请求:#1)如果slave-serve-stale-data设置成'yes'(thedefault)slave会仍然响应客户端请求,此时可能会有问题。#2)如果slave-serve-staledata设置成'no'slave会返回"SYNCwithmasterinprogress"这样的错误信息。但INFO和SLAVEOF命令除外。#slave-serve-stale-datayes###############安全####################################需要客户端在执行任何命令之前指定AUTH<PASSWORD>#requirepassfoobared#命令重命名.###例如:#rename-commandCONFIGb840fc02d524045429941cc15f59e41cb7be6c52##同样可以通过把一个命令重命名为空串来彻底kill掉这个命令,比如:#rename-commandCONFIG""####################限制#####################################设置最大连接数.默认没有限制,'0'意味着不限制.#maxclients128#最大可使用内存。如果超过,Redis会试图删除EXPIRE集合中的keys,具体做法是:Redis会试图释放即将过期的#keys,而保护还有很长生命周期的keys。##如果这样还不行,Redis就会报错,但像GET之类的查询请求还是会得到响应。##警告:如果你想把Redis视为一个真正的DB的话,那不要设置<maxmemory>,只有你只想把Redis作为cache或者#有状态的server('state'server)时才需要设置。#maxmemory<bytes>#内存清理策略:如果达到了maxmemory,你可以采取如下动作:#volatile-lru->使用LRU算法来删除过期的setallkeys-lru->删除任何遵循LRU算法的keyvolatile-random->随机地删除过期set中的keyallkeys->random->随机地删除一个keyvolatile-ttl->删除最近即将过期的key(thenearestexpiretime(minorTTL))noeviction->根本不过期,写操作直接报错#默认策略:maxmemory-policyvolatile-lru#对于处理redis内存来说,LRU和minorTTL算法不是精确的,而是近似的(估计的)算法。所以我们会检查某些样本#来达到内存检查的目的。默认的样本数是3,你可以修改它。#maxmemory-samples3#################APPENDONLYMODE################################默认情况下,Redis会异步的把数据保存到硬盘。如果你的应用场景允许因为系统崩溃等极端情况而导致最新数据丢失#的话,那这种做法已经很ok了。否则你应该打开‘appendonly’模式,开启这种模式后,Redis会在#appendonly.aof文件中添加每一个写操作,这个文件会在Redis启动时被读取来在内存中重新构建数据集。##注意:如果你需要,你可以同时开启‘appendonly’模式和异步dumps模式(你需要注释掉上面的‘save’表达式来禁#止dumps),这种情况下,Redis重建数据集时会优先使用appendonly.aof而忽略dump.rdb#appendonlynoappendonly文件名(默认:"appendonly.aof")appendfilenameappendonly.aof#调用fsync()函数通知操作系统立刻向硬盘写数据#Redis支持3中模式:#no:不fsync,只是通知OS可以flush数据了,具体是否flush取决于OS.性能更好.always:每次写入appendonly日志文件后都会fsync.性能差,但很安全.everysec:没间隔1秒进行一次fsync.折中.#默认是"everysec"appendfsyncalwaysappendfsynceverysecappendfsyncno#当AOFfsync策略被设置为always或者everysec并且后台保存进程(savingprocess)正在执行大量I/O操作时Redis可能会在fsync()调用上阻塞过长时间#no-appendfsync-on-rewritenoappendonly文件的自动重写#当AOF日志文件即将增长到指定百分比时,Redis可以通过调用BGREWRITEAOF来自动重写appendonly文件。##它是这么干的:Redis会记住最近一次重写后的AOF文件size。然后它会把这个size与当前size进行比较,如果当前#size比指定的百分比大,就会触发重写。同样,你需要指定AOF文件被重写的最小size,这对避免虽然百分比达到了#但是实际上文件size还是很小(这种情况没有必要重写)却导致AOF文件重写的情况很有用。auto-aof-rewrite-percentage设置为0可以关闭AOF重写功能auto-aof-rewrite-percentage100auto-aof-rewrite-min-size64mb##################SLOWLOG###################################Redisslowlog用来记录超过指定执行时间的查询。##你可以指定两个参数:一个是慢查询的阀值,单位是毫秒;另外一个是slowlog的长度,相当于一个队列。#负数则关闭slowlog,0则会导致每个命令都被记录slowlog-log-slower-than10000#不设置会消耗过多内存,所以还是要设置一下。可以使用SLOWLOGRESET命令来回收slowlog使用的内存slowlog-max-len10244、MYSQL主从负载,读写分离1.1、 复制解决的问题数据复制技术有以下一些特点:⑴数据分布⑵负载平衡(loadbalancing)⑶备份(4) 高可用性(highavailability)和容错1.2、 复制如何工作从高层来看,复制分成三步:⑴ master将改变记录到二进制日志(binarylog)中(这些记录叫做二进制日志事件,binarylogevents);(2)slave将master的binarylogevents拷贝到它的中继日志(relaylog);⑶slave重做中继日志中的事件,将改变反映它自己的数据。下图描述了这一过程:囱 Slavs该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。下一步就是slave将master的binarylog拷贝到它自己的中继日志。首先,slave开始一个工作线程I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlogdumpprocessoBinlogdumpprocess从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。SQLslavethread处理该过程的最后一步。SQL线程从中继日志读取事件,更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制一一复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。2、体验MySQL复制MySQL开始复制是很简单的过程,不过,根据特定的应用场景,都会在基本的步骤上有一些变化。最简单的场景就是一个新安装的master和slave,从高层来看,整个过程如下:⑴在每个服务器上创建一个复制帐号;⑵配置master和slave;(3)Slave连接master开始复制。2.1、 创建复制帐号每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATIONSLAVE权限。用户名的密码都会存储在文本文件中。假如,你想创建repl用户,如下:mysql>GRANTREPLICATIONSLAVE,REPLICATIONCLIENTON*.*->TOrepl@'192.168.0.%'IDENTIFIEDBY'p4ssword';2.2、 配置master接下来对master进行配置,包括打开二进制日志,指定唯一的servrID。例如,在配置文件加入如下值:[mysqld]log-bin=mysql-binserver-id=10重启master,运行SHOWMASTERSTATUS,输出如下:nrysql?SHOWMASTERSTATUS^'File |PositionBinlog_Do_DB|Binlog_ignDie_DB+ + + + +|inysql-bin.000001| 93| | |2.3、 配置slaveSlave的配置与master类似,你同样需要重启slave的MySQL。如下:log_bin=mysql-binserverid =2relay_log=mysql-relay-binlog_slave_updates=1read_only=1server_id是必须的,而且唯一。slave没有必要开启二进制日志,但是在一些情况下,必须设置,例如,如果slave为其它slave的master,必须设置bin_log。在这里,我们开启了二进制日志,而且显示的命名(默认名称为hostname,但是,如果hostname改变则会出现问题)。relay_log配置中继日志,log_slave_updates表示slave将复制事件写进自己的二进制日志(后面会看到它的用处)。有些人开启了slave的二进制日志,却没有设置log_slave_updates,然后查看slave的数据是否改变,这是一种错误的配置。所以,尽量使用read_only,它防止改变数据(除了特殊的线程)。但是,read_only并是很实用,特别是那些需要在slave上创建表的应用。2.4、启动slave接下来就是让slave连接master,并开始重做master二进制日志中的事件。你不应该用配置文件进行该操作,而应该使用CHANGEMASTERTO语句,该语句可以完全取代对配置文件的修改,而且它可以为slave指定不同的master,而不需要停止服务器。如下:mysql>CHANGEMASTERTOMASTER_HOST='server1',->MASTER_USER='repl',->MASTER_PASSWORD='p4ssword',->MASTER_LOG_FILE='mysql-bin.000001',->MASTER_LOG_POS=0;MASTER_LOG_POS的值为0,因为它是日志的开始位置。然后,你可以用SHOWSLAVESTATUS语句查看slave的设置是否正确:mysql>SHOWSLAVESTATUS\G1.row***************************Slave_IO_State:Master_Host:server1Master_User:replMaster_Port:3306Connect_Retry:60Master_Log_File:mysql-bin.000001Read_Master_Log_Pos:4Relay_Log_File:mysql-relay-bin.000001Relay_Log_Pos:4Relay_Master_Log_File:mysql-bin.000001Slave_IO_Running:NoSlave_SQL_Running:No...omitted...Seconds_Behind_Master:NULLSlave_IO_State,Slave_IO_Running,和Slave_SQL_Running表明slave还没有开始复制过程。日志的位置为4而不是0,这是因为0只是日志文件的开始位置,并不是日志位置。实际上,MySQL知道的第一个事件的位置是4。为了开始复制,你可以运行:

mysql>STARTSLAVE;运行SHOWSLAVESTATUS查看输出结果:mysql>SHOWSLAVESTATUS\G1.row***************************Slave_IO_State:WaitingformastertosendeventMaster_Host:server1Master_User:replMaster_Port:3306Connect_Retry:60Master_Log_File:mysql-bin.000001Read_Master_Log_Pos:164Relay_Log_File:mysql-relay-bin.000001Relay_Log_Pos:164Relay_Master_Log_File:mysql-bin.000001Slave_IO_Running:YesSlave_SQL_Running:Yes...omitted...Seconds_Behind_Master:0注意,slave的I/O和SQL线程都已经开始运行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味着一些事件被获取并执行了。如果你在master上进行修改,你可以在slave上看到各种日志文件的位置的变化,同样,你也可以看到数据库中数据的变化。你可查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接:mysql>showprocesslist\G1.row***************************Id:1User:rootHost:localhost:2096db:testCommand:QueryTime:0State:NULLInfo:showprocesslist2.rowId:2User:replHost:localhost:2144db:NULLCommand:BinlogDumpTime:1838State:Hassentallbinlogtoslave;waitingforbinlogtobeupdatedInfo:NULL2rowsinset(0.00sec)行2为处理slave的I/O线程的连接。在slave上运行该语句:

mysql>showprocesslist\G***************************i.row***************************Id:1User:systemuserHost:db:NULLCommand:ConnectTime:2291State:WaitingformastertosendeventInfo:NULL***************************2.row***************************Id:2User:systemuserHost:db:NULLCommand:ConnectTime:1852State:Hasreadallrelaylog;waitingfortheslaveI/OthreadtoupdateitInfo:NULL***************************3.row***************************Id:5User:rootHost:localhost:2152db:testCommand:QueryTime:0State:NULLInfo:showprocesslist3rowsinset(0.00sec)行1为I/O线程状态,行2为SQL线程状态。2.5、从另一个master初始化slave前面讨论的假设你是新安装的master和slave,所以,slave与master有相同的数据。但是,大多数情况却不是这样的,例如,你的master可能已经运行很久了,而你想对新安装的slave进行数据同步,甚至它没有master的数据。此时,有几种方法可以使slave从另一个服务开始,例如,从master拷贝数据,从另一个slave克隆,从最近的备份开始一个slave。Slave与master同步时,需要三样东西:master的某个时刻的数据快照;master当前的日志文件、以及生成快照时的字节偏移。这两个值可以叫做日志文件坐标 (logfilecoordinate),因为它们确定了一个二进制日志的位置,你可以用SHOWMASTERSTATUS命令找到日志文件的坐标;master的二进制日志文件。

可以通过以下几中方法来克隆一个slave:冷拷贝(coldcopy)停止master,将master的文件拷贝到slave;然后重启master。缺点很明显。⑵热拷贝(warmcopy)如果你仅使用MylSAM表,你可以使用mysqlhotcopy拷贝,即使服务器正在运行。(3)使用mysqldump使用mysqldump来得到一个数据快照可分为以下几步:<1>锁表:如果你还没有锁表,你应该对表加锁,防止其它连接修改数据库,否则,你得到的数据可以是不一致的。如下:mysql>FLUSHTABLESWITHREADLOCK;<2>在另一个连接用mysqldump创建一个你想进行复制的数据库的转储:shell>mysqldump--all-databases--lock-all-tables>dbdump.db<3>对表释放锁。mysql>UNLOCKTABLES;3、深入复制已经讨论了关于复制的一些基本东西,下面深入讨论一下复制。3.1、 基于语句的复制(Statement-BasedReplication)MySQL5.0及之前的版本仅支持基于语句的复制(也叫做逻辑复制,logicalreplication),这在数据库并不常见。master记录下改变数据的查询,然后,slave从中继日志中读取事件,并执行它,这些SQL语句与master执行的语句一样。这种方式的优点就是实现简单。此外,基于语句的复制的二进制日志可以很好的进行压缩,而且日志的数据量也较小,占用带宽少一一例如,一个更新GB的数据的查询仅需要几十个字节的二进制日志。而mysqlbinlog对于基于语句的日志处理十分方便。但是,基于语句的复制并不是像它看起来那么简单,因为一些查询语句依赖于master的特定条件,例如,master与slave可能有不同的时间。所以,MySQL的二进制日志的格式不仅仅是查询语句,还包括一些元数据信息,例如,当前的时间戳。即使如此,还是有一些语句,比如,CURRENTUSER函数,不能正确的进行复制。此外,存储过程和触发器也是一个问题。另外一个问题就是基于语句的复制必须是串行化的。这要求大量特殊的代码,配置,例如InnoDB的next-key锁等。并不是所有的存储引擎都支持基于语句的复制。3.2、 基于记录的复制(Row-BasedReplication)MySQL增加基于记录的复制,在二进制日志中记录下实际数据的改变,这与其它一些DBMS的实现方式类似。这种方式有优点,也有缺点。优点就是可以对任何语句都能正确工作,一些语句的效率更高。主要的缺点就是二进制日志可能会很大,而且不直观,所以,你不能使用mysqlbinlog来查看二进制日志。对于一些语句,基于记录的复制能够更有效的工作,如:mysql>INSERTINTOsummary_table(col1,col2,sum_col3)->SELECTcol1,col2,sum(col3)->FROMenormous_table->GROUPBYcol1,col2;假设,只有三种唯一的col1和col2的组合,但是,该查询会扫描原表的许多行,却仅返回三条记录。此时,基于记录的复制效率更高。另一方面,下面的语句,基于语句的复制更有效:mysql>UPDATEenormous_tableSETcoll=0;此时使用基于记录的复制代价会非常高。由于两种方式不能对所有情况都能很好的处理,所以,MySQL5.1支持在基于语句的复制和基于记录的复制之前动态交换。你可以通过设置session变量binlog_format来进行控制。3.3、复制相关的文件除了二进制日志和中继日志文件外,还有其它一些与复制相关的文件。如下:(1)mysql-bin.index服务器一旦开启二进制日志,会产生一个与二日志文件同名,但是以.index结尾的文件。它用于跟踪磁盘上存在哪些二进制日志文件。MySQL用它来定位二进制日志文件。它的内容如下(我的机器上):.\mysql-01-Toin.□□□□□1.\mysq1-□1-Toin.□□□□0,^.\mysq1-01-Toin.0000.\mysql-01-33in.口口口口口丹.\mysql-01-13in.000005.\mysql-0l-liin.□□□□□6.\mysql-0l-liin.000007.\mysql-01-]3in.000008.\mysql-01-13in.000009.\mysql-01-13in.0□0□10|11mysql-relay-bin.index该文件的功能与mysql-bin.index类似,但是它是针对中继日志,而不是二进制日志。内容如下:.\mysql-02-relay-bin.000017.\保存master的相关信息。不要删除它,否则,slave重启后不能连接master。内容如下(我的机器上):j=J弱O备令号匚日5巳x 『|"|||」||1』 115Zmysq

温馨提示

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

评论

0/150

提交评论