版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
系統(tǒng)架構(gòu)文檔1、系統(tǒng)網(wǎng)絡(luò)架構(gòu)010203040506NGINX負(fù)載均衡010203040506WEB服務(wù)器(主)---做分布式部署已經(jīng)移植WEB服務(wù)器(從)---做分布式部署已經(jīng)移植Redis緩存服務(wù)器Mysql(主)Mysql(從)rpm-ivhhttp://mirrors.yun-idc.Com/epel/6/x86_64/epel-release-6-8.noarch.rpm2、搭建Nginx服務(wù)安裝make:yum-yinstallgccautomakeautoconflibtoolmake安裝g++:yuminstallgccgcc-c++一般我們都需要先裝pcre,zlib,前者為了重寫rewrite,后者為了gzip壓縮。選定源碼目錄可以是任何目錄,本文選定的是/usr/local/srccd/usr/local/src安裝PCRE庫(kù)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庫(kù)/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默認(rèn)沒(méi)裝ssl)cd/usr/local/srcwgethttp://www.openssl.Org/source/openssl-1.0.1c.tar.gztar-zxvfopenssl-1.0.1c.tar.gz安裝nginxNginx-般有兩個(gè)版本,分別是穩(wěn)定版和開發(fā)版,您可以根據(jù)您的目的來(lái)選擇這兩個(gè)版本的其中一個(gè),下面是把Nginx安裝到/usr/local/ngiiX錄下的詳細(xì)步驟: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啟動(dòng)確保系統(tǒng)的80端口沒(méi)被其他程序占用,運(yùn)行/usr/local/nginx/ng命n令來(lái)啟動(dòng)Nginx,netstat-ano|grep80到這里nginx就安裝完成了!下面安裝排錯(cuò)附:可能遇到的錯(cuò)誤和一些幫助信息1.1編譯pcre錯(cuò)誤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出錯(cuò)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編譯選項(xiàng)make是用來(lái)編譯的,它從Makefile中讀取指令,然后編譯。makeinstall是用來(lái)安裝的,它也從Makefile中讀取指令,安裝到指定的位置。configure命令是用來(lái)檢測(cè)你的安裝平臺(tái)的目標(biāo)特征的。它定義了系統(tǒng)的各個(gè)方面,包括nginx的被允許使用的連接處理的方法,比如它會(huì)檢測(cè)你是不是有CC或GCC,并不是需要CC或GCC,它是個(gè)shell腳本,執(zhí)行結(jié)束時(shí),它會(huì)創(chuàng)建一個(gè)Makefile文件。nginx的configure命令支持以下參數(shù):--prefix=path 定義一個(gè)目錄,存放服務(wù)器上的文件,也就是nginx的安裝目錄。默認(rèn)使用/usr/local/nginx。--sbin-path=path設(shè)置nginx的可執(zhí)行文件的路徑,默認(rèn)為prefix/sbin/nginx.--conf-path=path設(shè)置在nginx.conf配置文件的路徑。nginx允許使用不同的配置文件啟動(dòng),通過(guò)命令行中的-c選項(xiàng)。默認(rèn)為prefix/conf/nginx.conf.--pid-path=path設(shè)置nginx.pid文件,將存儲(chǔ)的主進(jìn)程的進(jìn)程號(hào)。安裝完成后,可以隨時(shí)改變的文件名,在nginx.conf配置文件中使用PID指令。默認(rèn)情況下,文件名為prefix/logs/nginx.pid.--error-log-path=path設(shè)置主錯(cuò)誤,警告,和診斷文件的名稱。安裝完成后,可以隨時(shí)改變的文件名,在nginx.conf配置文件中使用的error_log指令。默認(rèn)情況下,文件名為prefix/logs/error.log.--http-log-path=path設(shè)置主請(qǐng)求的HTTP服務(wù)器的日志文件的名稱。安裝完成后,可以隨時(shí)改變的文件名,在nginx.conf配置文件中使用的access_log指令。默認(rèn)情況下,文件名為prefix/logs/access.log.--user=name設(shè)置nginx工作進(jìn)程的用戶。安裝完成后,可以隨時(shí)更改的名稱在nginx.conf配置文件中使用的user指令。默認(rèn)的用戶名是nobody。--group=name設(shè)置nginx工作進(jìn)程的用戶組。安裝完成后,可以隨時(shí)更改的名稱在nginx.conf配置文件中使用的user指令。默認(rèn)的為非特權(quán)用戶。--with-select_module--without-select_module啟用或禁用構(gòu)建一個(gè)模塊來(lái)允許服務(wù)器使用select()方法。該模塊將自動(dòng)建立,如果平臺(tái)不支持的kqueue,epoll,rtsig或/dev/poll。--with-poll_module--without-poll_module啟用或禁用構(gòu)建一個(gè)模塊來(lái)允許服務(wù)器使用poll()方法。該模塊將自動(dòng)建立,如果平臺(tái)不支持的kqueue,epoll,rtsig或/dev/poll。--without-http_gzip_module一不編譯壓縮的HTTP服務(wù)器的響應(yīng)模塊。編譯并運(yùn)行此模塊需要zlib庫(kù)。--without-http_rewrite_module不編譯重寫模塊。編譯并運(yùn)行此模塊需要PCRE庫(kù)支持。--without-http_proxy_module一不編譯http_proxy模塊。--with-http_ssl_module一使用https協(xié)議模塊。默認(rèn)情況下,該模塊沒(méi)有被構(gòu)建。建立并運(yùn)行此模塊的OpenSSL庫(kù)是必需的。--with-pcre=path—設(shè)置PCRE庫(kù)的源碼路徑。PCRE庫(kù)的源碼(版本4.4-8.30)需要從PCRE網(wǎng)站下載并解壓。其余的工作是Nginx的./configure和make來(lái)完成。正則表達(dá)式使用在location指令和ngx_http_rewrite_module模塊中。--with-pcre-jit—編譯PCRE包含"just-in-timecompilation”(1.1.12中,pcre_jit指令)。--with-zlib=path—設(shè)置的zlib庫(kù)的源碼路徑。要下載從zlib(版本1.1.3-1.2.5)的并解壓。其余的工作是Nginx的./configure和make完成。ngx_http_gzip_module模塊需要使用zlib。--with-cc-opt=parameters—設(shè)置額外的參數(shù)將被添加到CFLAGS變量。例如當(dāng)你在FreeBSD上使用PCRE庫(kù)時(shí)需要使用:--with-cc-opt="-I/usr/local/include。.如需要需要增加select()支持的文件數(shù)量:--with-cc-opt="-DFD_SETSIZE=2048".--with-ld-opt=parameters—設(shè)置附加的參數(shù),將用于在鏈接期間。例如,當(dāng)在FreeBSD下使用該系統(tǒng)的PCRE庫(kù),應(yīng)指定:--with-ld-opt="-L/usr/local/lib".典型實(shí)例(下面為了展示需要寫在多行,執(zhí)行時(shí)內(nèi)容需要在同一行)./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服務(wù)安裝及管理$wgethttp://download.redis.io/releases/redis-2.8.2.tar.gz$tarxzfredis-2.8.2.tar.gz$cdredis-2.8.2$make編譯后的可執(zhí)行文件在src目錄中,可以使用下面的命令運(yùn)行Redis:$src/redis-server你可以使用內(nèi)置的客戶端連接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管理:#是否以后臺(tái)進(jìn)程運(yùn)行,默認(rèn)為no,如果需要以后臺(tái)進(jìn)程運(yùn)行則改為yesdaemonizeno#如果以后臺(tái)進(jìn)程運(yùn)行的話,就需要指定pid,你可以在此自定義redis.pid文件的位置。pidfile/var/run/redis.pid#接受連接的端口號(hào),如果端口是0則redis將不會(huì)監(jiān)聽(tīng)TCPsocket連接port6379#連接超時(shí)時(shí)間,單位秒。(0todisable)?timeout300000000#日志級(jí)別,默認(rèn)是verbose(詳細(xì)),各種日志級(jí)別:#debug:很詳細(xì)的信息,適合開發(fā)和測(cè)試#verbose:包含許多不太有用的信息,但比debug要清爽一些(manyrarelyusefulinfo,butnotamesslike#thedebuglevel)#notice:比較適合生產(chǎn)環(huán)境#warning:警告信息loglevelverbose#指定log文件的名字,默認(rèn)是stdoutostdout會(huì)讓redis把日志輸出到標(biāo)準(zhǔn)輸出。但是如果使用stdout而又以后臺(tái)進(jìn)#程的方式運(yùn)行redis,則日志會(huì)輸出到/dev/nulllogfilestdout#'syslog-enabled'設(shè)置為yes會(huì)把日志輸出到系統(tǒng)日志,默認(rèn)是nosyslog-enabledno#指定syslog的標(biāo)示符,如果'syslog-enabled'是no,則這個(gè)選項(xiàng)無(wú)效。syslog-identredis#指定syslog設(shè)備(facility),必須是USER或者LOCAL0到LOCAL7.syslog-facilitylocal0#設(shè)置數(shù)據(jù)庫(kù)數(shù)目。默認(rèn)的數(shù)據(jù)庫(kù)是DB0??梢酝ㄟ^(guò)SELECT<dbid>來(lái)選擇一個(gè)數(shù)據(jù)庫(kù),dbid是[0,'databases'-1]的數(shù)字databases16##################快照###################################硬盤上保存數(shù)據(jù):#save<seconds><changes>#<seconds>和<changes>都滿足時(shí)就會(huì)觸發(fā)數(shù)據(jù)保存動(dòng)作。#以下面的例子來(lái)說(shuō)明:過(guò)了900秒并且有1個(gè)key發(fā)生了改變就會(huì)觸發(fā)save動(dòng)作過(guò)了300秒并且有10個(gè)key發(fā)生了改變就會(huì)觸發(fā)save動(dòng)作過(guò)了60秒并且至少有10000個(gè)key發(fā)生了改變也會(huì)觸發(fā)save動(dòng)作#注意:如果你不想讓redis自動(dòng)保存數(shù)據(jù),那就把下面的配置注釋掉!save9001save30010save6010000#存儲(chǔ)數(shù)據(jù)時(shí)是否壓縮數(shù)據(jù)。默認(rèn)是yes。rdbcompressionyes#保存dump數(shù)據(jù)的文件名dbfilenamedump.rdb#工作目錄.##數(shù)據(jù)會(huì)被持久化到這個(gè)目錄下的‘dbfilename’指定的文件中。###注意,這里指定的必須是目錄而不能是文件。dir./########REPLICATION(復(fù)制,冗余)#################################Master-Slavereplication.使用slaveof把一個(gè)Redis實(shí)例設(shè)置成為另一個(gè)Redisserver的從庫(kù)(熱備).注意:#配置只對(duì)當(dāng)前slave有效。#因此可以把某個(gè)slave配置成使用不同的時(shí)間間隔來(lái)保存數(shù)據(jù)或者監(jiān)聽(tīng)其他端口等等。#命令格式:slaveof<masterip><masterport>#如果master有密碼保護(hù),則在slave與master進(jìn)行數(shù)據(jù)同步之前需要進(jìn)行密碼校驗(yàn),否則master會(huì)拒絕slave的請(qǐng)#求。##masterauth<master-password>#當(dāng)slave丟失與master的連接時(shí),或者slave仍然在于master進(jìn)行數(shù)據(jù)同步時(shí)(還沒(méi)有與master保持一致),#slave可以有兩種方式來(lái)響應(yīng)客戶端請(qǐng)求:#1)如果slave-serve-stale-data設(shè)置成'yes'(thedefault)slave會(huì)仍然響應(yīng)客戶端請(qǐng)求,此時(shí)可能會(huì)有問(wèn)題。#2)如果slave-serve-staledata設(shè)置成'no'slave會(huì)返回"SYNCwithmasterinprogress"這樣的錯(cuò)誤信息。但I(xiàn)NFO和SLAVEOF命令除外。#slave-serve-stale-datayes###############安全####################################需要客戶端在執(zhí)行任何命令之前指定AUTH<PASSWORD>#requirepassfoobared#命令重命名.###例如:#rename-commandCONFIGb840fc02d524045429941cc15f59e41cb7be6c52##同樣可以通過(guò)把一個(gè)命令重命名為空串來(lái)徹底kill掉這個(gè)命令,比如:#rename-commandCONFIG""####################限制#####################################設(shè)置最大連接數(shù).默認(rèn)沒(méi)有限制,'0'意味著不限制.#maxclients128#最大可使用內(nèi)存。如果超過(guò),Redis會(huì)試圖刪除EXPIRE集合中的keys,具體做法是:Redis會(huì)試圖釋放即將過(guò)期的#keys,而保護(hù)還有很長(zhǎng)生命周期的keys。##如果這樣還不行,Redis就會(huì)報(bào)錯(cuò),但像GET之類的查詢請(qǐng)求還是會(huì)得到響應(yīng)。##警告:如果你想把Redis視為一個(gè)真正的DB的話,那不要設(shè)置<maxmemory>,只有你只想把Redis作為cache或者#有狀態(tài)的server('state'server)時(shí)才需要設(shè)置。#maxmemory<bytes>#內(nèi)存清理策略:如果達(dá)到了maxmemory,你可以采取如下動(dòng)作:#volatile-lru->使用LRU算法來(lái)刪除過(guò)期的setallkeys-lru->刪除任何遵循LRU算法的keyvolatile-random->隨機(jī)地刪除過(guò)期set中的keyallkeys->random->隨機(jī)地刪除一個(gè)keyvolatile-ttl->刪除最近即將過(guò)期的key(thenearestexpiretime(minorTTL))noeviction->根本不過(guò)期,寫操作直接報(bào)錯(cuò)#默認(rèn)策略:maxmemory-policyvolatile-lru#對(duì)于處理redis內(nèi)存來(lái)說(shuō),LRU和minorTTL算法不是精確的,而是近似的(估計(jì)的)算法。所以我們會(huì)檢查某些樣本#來(lái)達(dá)到內(nèi)存檢查的目的。默認(rèn)的樣本數(shù)是3,你可以修改它。#maxmemory-samples3#################APPENDONLYMODE################################默認(rèn)情況下,Redis會(huì)異步的把數(shù)據(jù)保存到硬盤。如果你的應(yīng)用場(chǎng)景允許因?yàn)橄到y(tǒng)崩潰等極端情況而導(dǎo)致最新數(shù)據(jù)丟失#的話,那這種做法已經(jīng)很ok了。否則你應(yīng)該打開‘a(chǎn)ppendonly’模式,開啟這種模式后,Redis會(huì)在#appendonly.aof文件中添加每一個(gè)寫操作,這個(gè)文件會(huì)在Redis啟動(dòng)時(shí)被讀取來(lái)在內(nèi)存中重新構(gòu)建數(shù)據(jù)集。##注意:如果你需要,你可以同時(shí)開啟‘a(chǎn)ppendonly’模式和異步dumps模式(你需要注釋掉上面的‘save’表達(dá)式來(lái)禁#止dumps),這種情況下,Redis重建數(shù)據(jù)集時(shí)會(huì)優(yōu)先使用appendonly.aof而忽略dump.rdb#appendonlynoappendonly文件名(默認(rèn):"appendonly.aof")appendfilenameappendonly.aof#調(diào)用fsync()函數(shù)通知操作系統(tǒng)立刻向硬盤寫數(shù)據(jù)#Redis支持3中模式:#no:不fsync,只是通知OS可以flush數(shù)據(jù)了,具體是否flush取決于OS.性能更好.always:每次寫入appendonly日志文件后都會(huì)fsync.性能差,但很安全.everysec:沒(méi)間隔1秒進(jìn)行一次fsync.折中.#默認(rèn)是"everysec"appendfsyncalwaysappendfsynceverysecappendfsyncno#當(dāng)AOFfsync策略被設(shè)置為always或者everysec并且后臺(tái)保存進(jìn)程(savingprocess)正在執(zhí)行大量I/O操作時(shí)Redis可能會(huì)在fsync()調(diào)用上阻塞過(guò)長(zhǎng)時(shí)間#no-appendfsync-on-rewritenoappendonly文件的自動(dòng)重寫#當(dāng)AOF日志文件即將增長(zhǎng)到指定百分比時(shí),Redis可以通過(guò)調(diào)用BGREWRITEAOF來(lái)自動(dòng)重寫appendonly文件。##它是這么干的:Redis會(huì)記住最近一次重寫后的AOF文件size。然后它會(huì)把這個(gè)size與當(dāng)前size進(jìn)行比較,如果當(dāng)前#size比指定的百分比大,就會(huì)觸發(fā)重寫。同樣,你需要指定AOF文件被重寫的最小size,這對(duì)避免雖然百分比達(dá)到了#但是實(shí)際上文件size還是很小(這種情況沒(méi)有必要重寫)卻導(dǎo)致AOF文件重寫的情況很有用。auto-aof-rewrite-percentage設(shè)置為0可以關(guān)閉AOF重寫功能auto-aof-rewrite-percentage100auto-aof-rewrite-min-size64mb##################SLOWLOG###################################Redisslowlog用來(lái)記錄超過(guò)指定執(zhí)行時(shí)間的查詢。##你可以指定兩個(gè)參數(shù):一個(gè)是慢查詢的閥值,單位是毫秒;另外一個(gè)是slowlog的長(zhǎng)度,相當(dāng)于一個(gè)隊(duì)列。#負(fù)數(shù)則關(guān)閉slowlog,0則會(huì)導(dǎo)致每個(gè)命令都被記錄slowlog-log-slower-than10000#不設(shè)置會(huì)消耗過(guò)多內(nèi)存,所以還是要設(shè)置一下??梢允褂肧LOWLOGRESET命令來(lái)回收slowlog使用的內(nèi)存slowlog-max-len10244、MYSQL主從負(fù)載,讀寫分離1.1、 復(fù)制解決的問(wèn)題數(shù)據(jù)復(fù)制技術(shù)有以下一些特點(diǎn):⑴數(shù)據(jù)分布⑵負(fù)載平衡(loadbalancing)⑶備份(4) 高可用性(highavailability)和容錯(cuò)1.2、 復(fù)制如何工作從高層來(lái)看,復(fù)制分成三步:⑴ master將改變記錄到二進(jìn)制日志(binarylog)中(這些記錄叫做二進(jìn)制日志事件,binarylogevents);(2)slave將master的binarylogevents拷貝到它的中繼日志(relaylog);⑶slave重做中繼日志中的事件,將改變反映它自己的數(shù)據(jù)。下圖描述了這一過(guò)程:囪 Slavs該過(guò)程的第一部分就是master記錄二進(jìn)制日志。在每個(gè)事務(wù)更新數(shù)據(jù)完成之前,master在二日志記錄這些改變。MySQL將事務(wù)串行的寫入二進(jìn)制日志,即使事務(wù)中的語(yǔ)句都是交叉執(zhí)行的。在事件寫入二進(jìn)制日志完成后,master通知存儲(chǔ)引擎提交事務(wù)。下一步就是slave將master的binarylog拷貝到它自己的中繼日志。首先,slave開始一個(gè)工作線程I/O線程。I/O線程在master上打開一個(gè)普通的連接,然后開始binlogdumpprocessoBinlogdumpprocess從master的二進(jìn)制日志中讀取事件,如果已經(jīng)跟上master,它會(huì)睡眠并等待master產(chǎn)生新的事件。I/O線程將這些事件寫入中繼日志。SQLslavethread處理該過(guò)程的最后一步。SQL線程從中繼日志讀取事件,更新slave的數(shù)據(jù),使其與master中的數(shù)據(jù)一致。只要該線程與I/O線程保持一致,中繼日志通常會(huì)位于OS的緩存中,所以中繼日志的開銷很小。此外,在master中也有一個(gè)工作線程:和其它MySQL的連接一樣,slave在master中打開一個(gè)連接也會(huì)使得master開始一個(gè)線程。復(fù)制過(guò)程有一個(gè)很重要的限制一一復(fù)制在slave上是串行化的,也就是說(shuō)master上的并行更新操作不能在slave上并行操作。2、體驗(yàn)MySQL復(fù)制MySQL開始復(fù)制是很簡(jiǎn)單的過(guò)程,不過(guò),根據(jù)特定的應(yīng)用場(chǎng)景,都會(huì)在基本的步驟上有一些變化。最簡(jiǎn)單的場(chǎng)景就是一個(gè)新安裝的master和slave,從高層來(lái)看,整個(gè)過(guò)程如下:⑴在每個(gè)服務(wù)器上創(chuàng)建一個(gè)復(fù)制帳號(hào);⑵配置master和slave;(3)Slave連接master開始復(fù)制。2.1、 創(chuàng)建復(fù)制帳號(hào)每個(gè)slave使用標(biāo)準(zhǔn)的MySQL用戶名和密碼連接master。進(jìn)行復(fù)制操作的用戶會(huì)授予REPLICATIONSLAVE權(quán)限。用戶名的密碼都會(huì)存儲(chǔ)在文本文件中。假如,你想創(chuàng)建repl用戶,如下:mysql>GRANTREPLICATIONSLAVE,REPLICATIONCLIENTON*.*->TOrepl@'192.168.0.%'IDENTIFIEDBY'p4ssword';2.2、 配置master接下來(lái)對(duì)master進(jìn)行配置,包括打開二進(jìn)制日志,指定唯一的servrID。例如,在配置文件加入如下值:[mysqld]log-bin=mysql-binserver-id=10重啟master,運(yùn)行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沒(méi)有必要開啟二進(jìn)制日志,但是在一些情況下,必須設(shè)置,例如,如果slave為其它slave的master,必須設(shè)置bin_log。在這里,我們開啟了二進(jìn)制日志,而且顯示的命名(默認(rèn)名稱為hostname,但是,如果hostname改變則會(huì)出現(xiàn)問(wèn)題)。relay_log配置中繼日志,log_slave_updates表示slave將復(fù)制事件寫進(jìn)自己的二進(jìn)制日志(后面會(huì)看到它的用處)。有些人開啟了slave的二進(jìn)制日志,卻沒(méi)有設(shè)置log_slave_updates,然后查看slave的數(shù)據(jù)是否改變,這是一種錯(cuò)誤的配置。所以,盡量使用read_only,它防止改變數(shù)據(jù)(除了特殊的線程)。但是,read_only并是很實(shí)用,特別是那些需要在slave上創(chuàng)建表的應(yīng)用。2.4、啟動(dòng)slave接下來(lái)就是讓slave連接master,并開始重做master二進(jìn)制日志中的事件。你不應(yīng)該用配置文件進(jìn)行該操作,而應(yīng)該使用CHANGEMASTERTO語(yǔ)句,該語(yǔ)句可以完全取代對(duì)配置文件的修改,而且它可以為slave指定不同的master,而不需要停止服務(wù)器。如下:mysql>CHANGEMASTERTOMASTER_HOST='server1',->MASTER_USER='repl',->MASTER_PASSWORD='p4ssword',->MASTER_LOG_FILE='mysql-bin.000001',->MASTER_LOG_POS=0;MASTER_LOG_POS的值為0,因?yàn)樗侨罩镜拈_始位置。然后,你可以用SHOWSLAVESTATUS語(yǔ)句查看slave的設(shè)置是否正確: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還沒(méi)有開始復(fù)制過(guò)程。日志的位置為4而不是0,這是因?yàn)?只是日志文件的開始位置,并不是日志位置。實(shí)際上,MySQL知道的第一個(gè)事件的位置是4。為了開始復(fù)制,你可以運(yùn)行:
mysql>STARTSLAVE;運(yùn)行SHOWSLAVESTATUS查看輸出結(jié)果: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線程都已經(jīng)開始運(yùn)行,而且Seconds_Behind_Master不再是NULL。日志的位置增加了,意味著一些事件被獲取并執(zhí)行了。如果你在master上進(jìn)行修改,你可以在slave上看到各種日志文件的位置的變化,同樣,你也可以看到數(shù)據(jù)庫(kù)中數(shù)據(jù)的變化。你可查看master和slave上線程的狀態(tài)。在master上,你可以看到slave的I/O線程創(chuàng)建的連接: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上運(yùn)行該語(yǔ)句:
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線程狀態(tài),行2為SQL線程狀態(tài)。2.5、從另一個(gè)master初始化slave前面討論的假設(shè)你是新安裝的master和slave,所以,slave與master有相同的數(shù)據(jù)。但是,大多數(shù)情況卻不是這樣的,例如,你的master可能已經(jīng)運(yùn)行很久了,而你想對(duì)新安裝的slave進(jìn)行數(shù)據(jù)同步,甚至它沒(méi)有master的數(shù)據(jù)。此時(shí),有幾種方法可以使slave從另一個(gè)服務(wù)開始,例如,從master拷貝數(shù)據(jù),從另一個(gè)slave克隆,從最近的備份開始一個(gè)slave。Slave與master同步時(shí),需要三樣?xùn)|西:master的某個(gè)時(shí)刻的數(shù)據(jù)快照;master當(dāng)前的日志文件、以及生成快照時(shí)的字節(jié)偏移。這兩個(gè)值可以叫做日志文件坐標(biāo) (logfilecoordinate),因?yàn)樗鼈兇_定了一個(gè)二進(jìn)制日志的位置,你可以用SHOWMASTERSTATUS命令找到日志文件的坐標(biāo);master的二進(jìn)制日志文件。
可以通過(guò)以下幾中方法來(lái)克隆一個(gè)slave:冷拷貝(coldcopy)停止master,將master的文件拷貝到slave;然后重啟master。缺點(diǎn)很明顯。⑵熱拷貝(warmcopy)如果你僅使用MylSAM表,你可以使用mysqlhotcopy拷貝,即使服務(wù)器正在運(yùn)行。(3)使用mysqldump使用mysqldump來(lái)得到一個(gè)數(shù)據(jù)快照可分為以下幾步:<1>鎖表:如果你還沒(méi)有鎖表,你應(yīng)該對(duì)表加鎖,防止其它連接修改數(shù)據(jù)庫(kù),否則,你得到的數(shù)據(jù)可以是不一致的。如下:mysql>FLUSHTABLESWITHREADLOCK;<2>在另一個(gè)連接用mysqldump創(chuàng)建一個(gè)你想進(jìn)行復(fù)制的數(shù)據(jù)庫(kù)的轉(zhuǎn)儲(chǔ):shell>mysqldump--all-databases--lock-all-tables>dbdump.db<3>對(duì)表釋放鎖。mysql>UNLOCKTABLES;3、深入復(fù)制已經(jīng)討論了關(guān)于復(fù)制的一些基本東西,下面深入討論一下復(fù)制。3.1、 基于語(yǔ)句的復(fù)制(Statement-BasedReplication)MySQL5.0及之前的版本僅支持基于語(yǔ)句的復(fù)制(也叫做邏輯復(fù)制,logicalreplication),這在數(shù)據(jù)庫(kù)并不常見(jiàn)。master記錄下改變數(shù)據(jù)的查詢,然后,slave從中繼日志中讀取事件,并執(zhí)行它,這些SQL語(yǔ)句與master執(zhí)行的語(yǔ)句一樣。這種方式的優(yōu)點(diǎn)就是實(shí)現(xiàn)簡(jiǎn)單。此外,基于語(yǔ)句的復(fù)制的二進(jìn)制日志可以很好的進(jìn)行壓縮,而且日志的數(shù)據(jù)量也較小,占用帶寬少一一例如,一個(gè)更新GB的數(shù)據(jù)的查詢僅需要幾十個(gè)字節(jié)的二進(jìn)制日志。而mysqlbinlog對(duì)于基于語(yǔ)句的日志處理十分方便。但是,基于語(yǔ)句的復(fù)制并不是像它看起來(lái)那么簡(jiǎn)單,因?yàn)橐恍┎樵冋Z(yǔ)句依賴于master的特定條件,例如,master與slave可能有不同的時(shí)間。所以,MySQL的二進(jìn)制日志的格式不僅僅是查詢語(yǔ)句,還包括一些元數(shù)據(jù)信息,例如,當(dāng)前的時(shí)間戳。即使如此,還是有一些語(yǔ)句,比如,CURRENTUSER函數(shù),不能正確的進(jìn)行復(fù)制。此外,存儲(chǔ)過(guò)程和觸發(fā)器也是一個(gè)問(wèn)題。另外一個(gè)問(wèn)題就是基于語(yǔ)句的復(fù)制必須是串行化的。這要求大量特殊的代碼,配置,例如InnoDB的next-key鎖等。并不是所有的存儲(chǔ)引擎都支持基于語(yǔ)句的復(fù)制。3.2、 基于記錄的復(fù)制(Row-BasedReplication)MySQL增加基于記錄的復(fù)制,在二進(jìn)制日志中記錄下實(shí)際數(shù)據(jù)的改變,這與其它一些DBMS的實(shí)現(xiàn)方式類似。這種方式有優(yōu)點(diǎn),也有缺點(diǎn)。優(yōu)點(diǎn)就是可以對(duì)任何語(yǔ)句都能正確工作,一些語(yǔ)句的效率更高。主要的缺點(diǎn)就是二進(jìn)制日志可能會(huì)很大,而且不直觀,所以,你不能使用mysqlbinlog來(lái)查看二進(jìn)制日志。對(duì)于一些語(yǔ)句,基于記錄的復(fù)制能夠更有效的工作,如:mysql>INSERTINTOsummary_table(col1,col2,sum_col3)->SELECTcol1,col2,sum(col3)->FROMenormous_table->GROUPBYcol1,col2;假設(shè),只有三種唯一的col1和col2的組合,但是,該查詢會(huì)掃描原表的許多行,卻僅返回三條記錄。此時(shí),基于記錄的復(fù)制效率更高。另一方面,下面的語(yǔ)句,基于語(yǔ)句的復(fù)制更有效:mysql>UPDATEenormous_tableSETcoll=0;此時(shí)使用基于記錄的復(fù)制代價(jià)會(huì)非常高。由于兩種方式不能對(duì)所有情況都能很好的處理,所以,MySQL5.1支持在基于語(yǔ)句的復(fù)制和基于記錄的復(fù)制之前動(dòng)態(tài)交換。你可以通過(guò)設(shè)置session變量binlog_format來(lái)進(jìn)行控制。3.3、復(fù)制相關(guān)的文件除了二進(jìn)制日志和中繼日志文件外,還有其它一些與復(fù)制相關(guān)的文件。如下:(1)mysql-bin.index服務(wù)器一旦開啟二進(jìn)制日志,會(huì)產(chǎn)生一個(gè)與二日志文件同名,但是以.index結(jié)尾的文件。它用于跟蹤磁盤上存在哪些二進(jìn)制日志文件。MySQL用它來(lái)定位二進(jìn)制日志文件。它的內(nèi)容如下(我的機(jī)器上):.\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類似,但是它是針對(duì)中繼日志,而不是二進(jìn)制日志。內(nèi)容如下:.\mysql-02-relay-bin.000017.\保存master的相關(guān)信息。不要?jiǎng)h除它,否則,slave重啟后不能連接master。內(nèi)容如下(我的機(jī)器上):j=J弱O備令號(hào)匚日5巳x 『|"|||」||1』 115Zmysq
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高中音樂(lè)的教學(xué)計(jì)劃高中音樂(lè)鑒賞教學(xué)計(jì)劃
- 售后201年工作計(jì)劃
- 學(xué)生會(huì)工作總結(jié)與計(jì)劃怎么寫
- 2025年初中化學(xué)教師下半年工作計(jì)劃范文
- 2025學(xué)校教研室工作計(jì)劃范文
- 2025年秋季二年級(jí)上冊(cè)班主任工作計(jì)劃報(bào)告
- 英語(yǔ)課標(biāo)教師教學(xué)計(jì)劃
- 2025年高一英語(yǔ)教學(xué)計(jì)劃例文
- 《地質(zhì)工程畢業(yè)設(shè)計(jì)》課件
- 《高血壓規(guī)范化管理》課件
- 大概念教學(xué):素養(yǎng)導(dǎo)向的單元整體設(shè)計(jì)
- 初中學(xué)段勞動(dòng)任務(wù)清單(七到九年級(jí))
- 支氣管鏡吸痰操作標(biāo)準(zhǔn)
- 山東2023泰安銀行春季校園招聘25人上岸提分題庫(kù)3套【500題帶答案含詳解】
- 山東省政府采購(gòu)專家復(fù)審考試題庫(kù)
- 《“歪腦袋”木頭樁》閱讀測(cè)試
- GB/T 3246.2-2000變形鋁及鋁合金制品低倍組織檢驗(yàn)方法
- 主要農(nóng)作物(糧食作物)課件
- 百詞斬-定語(yǔ)從句課件-(;)
- 新舊公司法對(duì)照表
- 三年級(jí)上冊(cè)英語(yǔ)課件-Unit3 Look at me-人教(PEP) (6)(共30張PPT)
評(píng)論
0/150
提交評(píng)論