日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

十年老站吐血迁移实录

發(fā)布時(shí)間:2023/12/6 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 十年老站吐血迁移实录 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

因?yàn)橐恍﹥?nèi)容審查方面的原因,一個(gè)運(yùn)行了很久的論壇被要求限期遷移出現(xiàn)有機(jī)房。管制很嚴(yán),要求在1-2天內(nèi)完成。論壇的文件(主要是圖片及附件)100多G,數(shù)據(jù)庫有80G。我評(píng)估了一下,導(dǎo)出數(shù)據(jù),部署新環(huán)境,導(dǎo)入數(shù)據(jù),調(diào)試到能正常訪問,1-2天可能有點(diǎn)緊張,萬一遷移不順利,還得花費(fèi)更多的時(shí)間。但沒辦法拒絕,先答應(yīng)下來再說。


如果不想看文字,猛戳此處看視頻,臨場(chǎng)感更強(qiáng)。


跟其它技術(shù)人員討論了一下,先臨時(shí)采取投機(jī)取巧方式,應(yīng)付檢查,其措施如下:

1、在其它不受內(nèi)容審核的地區(qū),部署一個(gè)代理,用nginx就行。

2、修改現(xiàn)論壇web的監(jiān)聽端口(由80改成8989),暫時(shí)先不改,配好nginx反向代理以后,綁定本地hosts,域名指向新部署服務(wù)器的ip地址,訪問確認(rèn)沒問題,再修改到8989端口。同時(shí)代理nginx轉(zhuǎn)發(fā)端口也對(duì)應(yīng)改成8989。

3、修改dns,把域名解析到代理web服務(wù)器的ip。

這樣處理,避開了審查,為遷移贏得了時(shí)間。



安排異地機(jī)房的技術(shù)給我們部署系統(tǒng),因?yàn)榻?jīng)驗(yàn)以及其它方面的原因,花了將近一天的時(shí)間才交付過來(幸虧采取了前邊的臨時(shí)措施)。為了加快進(jìn)度,我們自己做了分工,一人負(fù)責(zé)新系統(tǒng)部署php、nginx和mysql運(yùn)行環(huán)境,而我負(fù)責(zé)導(dǎo)出數(shù)據(jù)。導(dǎo)出數(shù)據(jù)分兩部分:論壇數(shù)據(jù)本身壓縮打包、數(shù)據(jù)庫數(shù)據(jù)導(dǎo)出再壓縮打包。


開始,我習(xí)慣性的用mysqldump --all-databases 全庫導(dǎo)出,過程很順利,導(dǎo)出后打包再復(fù)制到別的地方,大概2個(gè)小時(shí)。新系統(tǒng)那邊,環(huán)境已經(jīng)部署好了,我試著進(jìn)行導(dǎo)入,進(jìn)行了幾十分鐘,報(bào)錯(cuò),因?yàn)橹形淖址膯栴},嘗試了幾種方式,還是一樣,只得放棄。重新回源服務(wù)器,換成innobackup導(dǎo)出。悲催的是,這個(gè)服務(wù)器的系統(tǒng)太老了,為centos 5.8,安裝xtrabackup有依賴問題,需要使用yum來處理一些依賴,但系統(tǒng)自帶的yum源沒有了,只好重新構(gòu)造了一個(gè)Centos-Base.repo,其內(nèi)容如下:

[base]

name=CentOS-$releasever - Base

#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os

#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/

baseurl=http://vault.centos.org/5.11/os/$basearch/

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5


#released updates

[updates]

name=CentOS-$releasever - Updates

#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates

#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/

baseurl=http://vault.centos.org/5.11/updates/$basearch/

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5


#additional packages that may be useful

[extras]

name=CentOS-$releasever - Extras

#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras

#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/

baseurl=http://vault.centos.org/5.11/extras/$basearch/

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5


#additional packages that extend functionality of existing packages

[centosplus]

name=CentOS-$releasever - Plus

#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus

#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/

baseurl=http://vault.centos.org/5.11/centosplus/$basearch/

gpgcheck=1

enabled=0

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5


#contrib - packages by Centos Users

[contrib]

name=CentOS-$releasever - Contrib

#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib

#baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/

baseurl=http://vault.centos.org/5.11/contrib/$basearch/

gpgcheck=1

enabled=0

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

再測(cè)試 yum install lrzsz 正常。


從網(wǎng)上下載備份的安裝包percona-xtrabackup-2.3.10.tar.gz,用yum 安裝libaio-devel、gcc,vim-comm等幾個(gè)依賴包。另外,在編譯該軟件是,會(huì)提示cmake的版本過低,需要替換一下。

下載cmake-3.9.6.tar.gz,tar開以后,執(zhí)行 ./configure --prefix=/usr/local/cmake ;make ;make install 把新版本限定到目錄/usr/local/cmake,這樣就不用處理舊版本,也不會(huì)與其產(chǎn)生沖突。編譯安裝時(shí),帶上cmake的全路徑:

/usr/local/cmake/bin/cmake -DBUILD_CONFIG=xtrabackup_release && make -j4?

如果出現(xiàn)“CMake Error at cmake/libev.cmake:23 (MESSAGE)”報(bào)錯(cuò)信息,手動(dòng)安裝包libev-3.7.tar.gz(yum不到的),步驟為:

tar zxvf libev-3.7.tar.gz

cd libev-3.7

./configure

make;make install

這個(gè)不需要指定安裝路徑,方便cmake執(zhí)行的時(shí)候找得到。

費(fèi)了好大一通時(shí)間,才把這個(gè)備份軟件安裝好,雖然描述得有些啰嗦,但可能對(duì)其它人排錯(cuò)會(huì)有幫助。


現(xiàn)在,開始切入正題.

執(zhí)行備份

1、確保源數(shù)據(jù)庫處于啟動(dòng)狀態(tài)

2、執(zhí)行指令

innobackupex --user=root --password=MaGiCdB1 --defaults-file=/etc/my.cnf /data1/dumpdir

備份目錄是任意足夠大的分區(qū)

3、檢查備份目錄,是否產(chǎn)生數(shù)據(jù)

4、執(zhí)行?innobackupex --apply-log ?/data1/dumpdir/2018-03-30_11-10-53


壓縮和傳輸文件(論壇數(shù)據(jù)文件與此步驟相同,不再說明)


tar czvf 2018-03-30_11-10-53.tgz ?2018-03-30_11-10-53

rsync -avz -e "ssh -p 2222 " 2018-03-30_11-10-53.tgz ?120.189.55.109:/data1/

特別值得注意的是,由于數(shù)據(jù)量比較大,避免shell中斷導(dǎo)致任務(wù)終止,盡量在screen下進(jìn)行操作,就算shell退出,也不會(huì)受到影響。

到此為止,源服務(wù)器的操作暫告一段落。


數(shù)據(jù)量相對(duì)來說比較大,因此傳輸過程花了好長一段時(shí)間。在這同時(shí),在目的服務(wù)器,把安裝好的環(huán)境配置成與源站基本一致(操作系統(tǒng)版本、php、ngnix、mysql做了升級(jí)):相同的目錄結(jié)構(gòu)、相同的內(nèi)網(wǎng)ip、相同的用戶帳號(hào)。這樣就可以直接把源站nginx配置、mysql配置、php原樣同步過來。目前因?yàn)闆]有數(shù)據(jù)庫數(shù)據(jù)導(dǎo)入及論壇文件,我先試著在nginx配置的站點(diǎn)根文檔寫一個(gè)php測(cè)試腳本test.php,內(nèi)容為:<? phpinfo(); ?>.把nginx及php服務(wù)都啟動(dòng)起來,瀏覽器訪問該url,檢查一下php都有哪些模塊被加載,與源站是不是差不多的情形。測(cè)試完記得刪掉它,這個(gè)是安全隱患喲!


nginx的主配置文件nginx.conf如下(節(jié)錄):

user ?www www;

worker_processes ?8;


#dso {

# ? ? load ngx_http_cache_purge_module.so;

#}


worker_rlimit_nofile 51200;


events {

?use epoll;

?#use kqueue; ? #FreeBSD system

?worker_connections 51200;

}


http {

?include ? ? ? mime.types;

....................此處省略.............................

map $request_method $limit {

? ? ? ? default ? ? ? ? "";

? ? ? ? POST ? ? ? ? ? ?$binary_remote_addr;

? ? }

limit_conn_zone $binary_remote_addr zone=one_limit:10m;

limit_req_zone $limit zone=zone_limit_post:10m rate=10r/m;

log_format post ? ? '$remote_addr - $remote_user [$time_local] ?'

? ? ? ? ? ? ? ? ? ? ? ? '"$request" $status $body_bytes_sent '

? ? ? ? ? ? ? ? ? ? ? ? '"$http_referer" "$http_user_agent" '

? ? ? ? ? ? ? ? ? ? ? ? '$host $request_time $proxy_add_x_forwarded_for?

$request_body';


access_log /data/logs/http.a.log;

error_log ?/data/logs/http.e.log;


#include vhosts/test.conf;

include vhosts/default.conf;

include vhosts/bbs.formyz.net.conf;

include vhosts/file.formyz.net.conf;

}

某個(gè)站點(diǎn)的配置文件 bbs.formyz.net.conf

server ?{

? ? listen ? ? ? 80;

? ? server_name ? ? bbs.formyz.net;

? ? error_page ?404 http://bbs.formyz.net;

? ? ? ?

? ? access_log /data/logs/bbs.formyz.net-access;

? ? error_log ?/data/logs/bbs.formyz.net-error;

? ? limit_conn one_limit 5;

? ??

? ? root ?/data/html/bbs.formyz.net;

? ? index index.html index.htm ?forum.php index.php;

? ? if ($host != 'bbs.formyz.net' ) {

? ? ? ? rewrite ^/(.*)$ http://bbs.formyz.net/$1 permanent;

? ? }


? ? if (-d $request_filename) {

? ? ? ? rewrite ^/(.*)([^/])$ http://$host:$server_port/$1$2/ permanent;

? ? }


? ? location ^~ /config {

? ? ? ? deny all;

? ? }


? ? location ^~ /.git

? ? ?{

? ? ? ? deny all;

? ? ? }


? ? location ~ /(data|static|template|images|uc_server/data)/.*\.(php|php5|html)?$ {

? ? deny all;

? ? location ~ .*\.(php|php5)$ {

? ? ? ? limit_req zone=zone_limit_post burst=5;

? ? ? ? if ($request_method = "POST") {

? ? ? ? ? ? access_log /data/logs/bbs.formyz.net-post post;

? ? ? ? }


? ? ? ? root ? ?/data/html/bbs.formyz.net;

? ? ? ? ? ? ? ?fastcgi_pass ?127.0.0.1:9000;

? ? ? ? ? ? ? ?fastcgi_index index.php;

? ? ? ? ? ? ? ?include fastcgi_params;

? ? }


? ? location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {

? ? ? ? ?expires ? ? ?30d;

? ? }


? ? location ~ .*\.(js|css)?$ {

? ? ? ? expires ? ? ?1h;

? ? }


? ? location / {

? ? ? ? limit_conn one_limit 5;

? ? ? ? rewrite ^(.*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2?last;

? ? ? ? rewrite ^(.*)/article-([0-9]+)\.html$ $1/portal.php?mod=article&articleid=$2 last;

? ? ? ? rewrite ^(.*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forum?display&fid=$2&page=$3 last;

? ? ? ? rewrite ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;

? ? ? ? rewrite ^(.*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;

? ? ? ? rewrite ^(.*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;

? ? ? ? rewrite ^(.*)/([a-z]+)-(.+)\.html$ $1/$2.php?rewrite=$3 last;

? ? ? ? break;

? ? }

}

這里是每一個(gè)站點(diǎn),用一行include 顯示的包含。偏偏有不少人,至少我碰到不少,喜歡用 include *.conf把所有的站點(diǎn)都包含進(jìn)去,我不太贊同這種做法,配置的時(shí)候你是方便了,可是到了要維護(hù)的時(shí)候,就不是那么方便了。為什么這樣說?假設(shè)現(xiàn)在做維護(hù),我打開nginx.conf大概就可以看到有哪些站點(diǎn)(當(dāng)然文件命名也要規(guī)劃好,能望文生義);特別是在一個(gè)nginx下站點(diǎn)多的場(chǎng)景,對(duì)某個(gè)站點(diǎn)進(jìn)行臨時(shí)維護(hù),只要在主配置文件nginx.conf注釋掉與它關(guān)聯(lián)的include行,重載nginx即可。


接下來給出php-fpm.conf文件的部分內(nèi)容:

[global]

error_log = log/php-fpm.log

process.max = 5000

rlimit_files = 10240


[www]

user = www

group = www

listen = 127.0.0.1:9000


pm = dynamic

pm.max_children = 5000

pm.start_servers = 50

pm.min_spare_servers = 20

pm.max_spare_servers = 80

pm.max_requests = 5000


access.log = log/php.access.log

slowlog = log/php.log.slow

request_slowlog_timeout = 3

與nginx相對(duì)應(yīng),php也以普通用戶www來運(yùn)行,同時(shí)所有站點(diǎn)目錄,都授權(quán)屬主、屬組為www,保證正確與合理的權(quán)限。一些經(jīng)驗(yàn)不足的人,不注意程序權(quán)限與目錄權(quán)限的對(duì)應(yīng)關(guān)系,運(yùn)行服務(wù),只要提示權(quán)限不夠,就立馬執(zhí)行 chmod -R 777 dir ,你這是在方便別人進(jìn)入系統(tǒng)呢!另外,php開啟了慢查詢?nèi)罩?#xff0c;在運(yùn)行中排錯(cuò)或者排查性能問題會(huì)很有幫助,不過我自己不懂php,一般都是讓開發(fā)人員自己看這個(gè)日志了,他懂的。


把論壇源站復(fù)制來的數(shù)據(jù)文件,tar解包后,放置在nginx指定的目錄,然后用chown ?-R www:www /data/html 及chmod -R 755 賦權(quán),這個(gè)過程比較容易完成,不再贅述。


前邊用mysqldump出來的文件,導(dǎo)入失敗,這次換成innobackup,根據(jù)以往的經(jīng)驗(yàn),不應(yīng)該有問題。注意,用此工具導(dǎo)入時(shí),mysql不要初始化,也不要啟動(dòng)(這個(gè)是廢話了,沒初始化當(dāng)然不能啟動(dòng))。為方便大家了解全過程,順便把mysql的選項(xiàng)文件my.cnf(不叫配置文件喲)貼出來,供大家參考:

[client]

port=3306

socket=/tmp/mysql.sock

[mysqld]

character-set-server=utf8

collation-server=utf8_general_ci


skip-external-locking

skip-name-resolve


user=mysql

port=3306

datadir=/data/mysql_db


open_files_limit=10240

back_log=600

max_connections=500

max_connect_errors=6000

wait_timeout=605800

#open_tables=600

#table_cache = 650

#opened_tables = 630


max_allowed_packet=32M

sort_buffer_size=4M

join_buffer_size=4M

thread_cache_size=300

query_cache_type=1

query_cache_size=256M

query_cache_limit=2M

query_cache_min_res_unit=16k


tmp_table_size=256M

max_heap_table_size=256M


key_buffer_size=256M

read_buffer_size=1M

read_rnd_buffer_size=16M

bulk_insert_buffer_size=64M


lower_case_table_names=1

default-storage-engine=INNODB


innodb_buffer_pool_size=2G

innodb_log_buffer_size=32M

innodb_log_file_size=128M

innodb_flush_method=O_DIRECT


thread_concurrency=32

long_query_time=2

slow-query-log=on

slow-query-log-file=/data/mysql_db/mysql-slow.log


[mysqldump]

quick

max_allowed_packet=32M


按my.cnf指定的"datadir=/data/mysql_db",創(chuàng)建好目錄/data/mysql_db,并執(zhí)行chown -R mysql:mysql /data/mysql 授權(quán)。這時(shí),/data/mysql_db目錄是空的。如果擔(dān)心出錯(cuò),坐好姿勢(shì),深呼吸,莊重地敲入screen,然后再執(zhí)行如下命令行(2018-03-30_11-10-53為源數(shù)據(jù)庫文件解包后的目錄):

innobackupex ?--defaults-file=/etc/my.cnf --copy-back /data/2018-03-30_11-10-53

這個(gè)過程同樣比較耗時(shí),沒事的話,可以另外再開一個(gè)終端,進(jìn)入目錄/data/mysql_db,可以看到不斷有目錄和文件自動(dòng)生成。執(zhí)行完畢且沒有報(bào)錯(cuò),基本上就大功告成了。由于安全的原因,mysql對(duì)連接帳戶有訪問限制,遷移到新系統(tǒng)以后,也一樣要遵循這個(gè)規(guī)則。前邊已經(jīng)啟動(dòng)了nginx 和php服務(wù),這里把mysql服務(wù)也啟動(dòng)起來。在個(gè)人的電腦,綁定windows的hosts文件,把域名與服務(wù)器的ip地址臨時(shí)關(guān)聯(lián)起來,再在瀏覽器輸入域名,提示網(wǎng)頁無法訪問。已經(jīng)檢查php等配置正確,那么問題就在連接數(shù)據(jù)庫這個(gè)上邊了。進(jìn)入論壇根文檔(nginx.conf里邊root指定的那個(gè)),查看連數(shù)據(jù)庫相關(guān)的腳本,有好幾個(gè)呢,其中一個(gè)?config_global.php 部分內(nèi)容為:

.............部分省略....................

$_config = array();


// ---------------------------- ?CONFIG DB ?----------------------------

- //

$_config['db']['1']['dbhost'] = '172.16.28.94';

$_config['db']['1']['dbuser'] = 'bbs_formyz_net';

$_config['db']['1']['dbpw'] = '5O333EvbY';

$_config['db']['1']['dbcharset'] = 'gbk';

$_config['db']['1']['pconnect'] = '0';

$_config['db']['1']['dbname'] = 'bbs_formyz_net';

$_config['db']['1']['tablepre'] = 'pre_';

$_config['db']['common']['slave_except_table'] = '';

$_config['db']['slave'] = '';

..................................余下省略........................

要解決問題,有兩個(gè)辦法:

(1)跟程序員協(xié)作,重新對(duì)每一個(gè)帳號(hào)授權(quán)(grant all ...);

(2)在系統(tǒng)上再配置一個(gè) 172.16.28.94的ip地址。

搞幾天時(shí)間了,大家都很累,因此為了省事,我自己做主,在系統(tǒng)的另一個(gè)空閑網(wǎng)卡配置了上述私有ip地址。陪完重啟網(wǎng)絡(luò)服務(wù),論壇可以打開,可以登錄了。


經(jīng)過多人多測(cè)測(cè)試,確認(rèn)沒問題以后,正式做域名解析到新的服務(wù)器ip。


還有些工作需要繼續(xù)完善,包括同步這幾天的新數(shù)據(jù)、開啟新的數(shù)據(jù)備份等。論壇數(shù)據(jù)用rysnc -e 'ssh -p 20002' -avz src dist同步;數(shù)據(jù)庫稍微麻煩一點(diǎn),需要臨時(shí)把論壇停一會(huì),啟用主從同步功能。由于源站用innobackup導(dǎo)出數(shù)據(jù)時(shí),已經(jīng)記錄了主從同步需要的信息(xtrabackup_info),因此同步過程就不需要再執(zhí)行費(fèi)時(shí)的導(dǎo)出操作,只需按偏移量執(zhí)行同步就行。

more xtrabackup_info?

uuid = 188600e0-33cc-11e8-986b-90b11c180978

name =?

tool_name = innobackupex

tool_command = --defaults-file=/etc/my.cnf --user=root --password=... /data/databk/db_back

tool_version = 2.3.10

ibbackup_version = 2.3.10

server_version = 5.5.29-log

start_time = 2018-03-30 11:10:53

end_time = 2018-03-30 11:40:31

lock_time = 0

binlog_pos = filename 'mysql-bin.001258', position '571444300'

innodb_from_lsn = 0

innodb_to_lsn = 79320170996

partial = N

incremental = N

format = file

compact = N

compressed = N

encrypted = N

數(shù)據(jù)庫主從同步完成以后,把slave提升為主。似乎寫得太長了,數(shù)據(jù)庫備份部分,就不再寫了。


如果不想看文字,猛戳此處看視頻,臨場(chǎng)感更強(qiáng)。

總結(jié)

以上是生活随笔為你收集整理的十年老站吐血迁移实录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。