由於一些內容審查方面的緣由,一個運行了好久的論壇被要求限期遷移出現有機房。管制很嚴,要求在1-2天內完成。論壇的文件(主要是圖片及附件)100多G,數據庫有80G。我評估了一下,導出數據,部署新環境,導入數據,調試到能正常訪問,1-2天可能有點緊張,萬一遷移不順利,還得花費更多的時間。但沒辦法拒絕,先答應下來再說。php
跟其它技術人員討論了一下,先臨時採起投機取巧方式,應付檢查,其措施以下:html
一、在其它不受內容審覈的地區,部署一個代理,用nginx就行。
mysql
二、修改現論壇web的監聽端口(由80改爲8989),暫時先不改,配好nginx反向代理之後,綁定本地hosts,域名指向新部署服務器的ip地址,訪問確認沒問題,再修改到8989端口。同時代理nginx轉發端口也對應改爲8989。nginx
三、修改dns,把域名解析到代理web服務器的ip。git
這樣處理,避開了審查,爲遷移贏得了時間。程序員
安排異地機房的技術給咱們部署系統,由於經驗以及其它方面的緣由,花了將近一天的時間才交付過來(幸好採起了前邊的臨時措施)。爲了加快進度,咱們本身作了分工,一人負責新系統部署php、nginx和mysql運行環境,而我負責導出數據。導出數據分兩部分:論壇數據自己壓縮打包、數據庫數據導出再壓縮打包。web
開始,我習慣性的用mysqldump --all-databases 全庫導出,過程很順利,導出後打包再複製到別的地方,大概2個小時。新系統那邊,環境已經部署好了,我試着進行導入,進行了幾十分鐘,報錯,由於中文字符的問題,嘗試了幾種方式,仍是同樣,只得放棄。從新回源服務器,換成innobackup導出。悲催的是,這個服務器的系統太老了,爲centos 5.8,安裝xtrabackup有依賴問題,須要使用yum來處理一些依賴,但系統自帶的yum源沒有了,只好從新構造了一個Centos-Base.repo,其內容以下:sql
[base]shell 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 |
再測試 yum install lrzsz 正常。
從網上下載備份的安裝包percona-xtrabackup-2.3.10.tar.gz,用yum 安裝libaio-devel、gcc,vim-comm等幾個依賴包。另外,在編譯該軟件是,會提示cmake的版本太低,須要替換一下。
下載cmake-3.9.6.tar.gz,tar開之後,執行 ./configure --prefix=/usr/local/cmake ;make ;make install 把新版本限定到目錄/usr/local/cmake,這樣就不用處理舊版本,也不會與其產生衝突。編譯安裝時,帶上cmake的全路徑:
/usr/local/cmake/bin/cmake -DBUILD_CONFIG=xtrabackup_release && make -j4 |
若是出現「CMake Error at cmake/libev.cmake:23 (MESSAGE)」報錯信息,手動安裝包libev-3.7.tar.gz(yum不到的),步驟爲:
tar zxvf libev-3.7.tar.gz cd libev-3.7 ./configure make;make install |
這個不須要指定安裝路徑,方便cmake執行的時候找獲得。
費了好大一通時間,才把這個備份軟件安裝好,雖然描述得有些囉嗦,但可能對其它人排錯會有幫助。
如今,開始切入正題.
執行備份
一、確保源數據庫處於啓動狀態
二、執行指令
innobackupex --user=root --password=MaGiCdB1 --defaults-file=/etc/my.cnf /data1/dumpdir
備份目錄是任意足夠大的分區
三、檢查備份目錄,是否產生數據
四、執行 innobackupex --apply-log /data1/dumpdir/2018-03-30_11-10-53
壓縮和傳輸文件(論壇數據文件與此步驟相同,再也不說明)
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/ |
特別值得注意的是,因爲數據量比較大,避免shell中斷致使任務終止,儘可能在screen下進行操做,就算shell退出,也不會受到影響。
到此爲止,源服務器的操做暫告一段落。
數據量相對來講比較大,所以傳輸過程花了好長一段時間。在這同時,在目的服務器,把安裝好的環境配置成與源站基本一致(操做系統版本、php、ngnix、mysql作了升級):相同的目錄結構、相同的內網ip、相同的用戶賬號。這樣就能夠直接把源站nginx配置、mysql配置、php原樣同步過來。目前由於沒有數據庫數據導入及論壇文件,我先試着在nginx配置的站點根文檔寫一個php測試腳本test.php,內容爲:<? phpinfo(); ?>.把nginx及php服務都啓動起來,瀏覽器訪問該url,檢查一下php都有哪些模塊被加載,與源站是否是差很少的情形。測試完記得刪掉它,這個是安全隱患喲!
nginx的主配置文件nginx.conf以下(節錄):
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; } |
某個站點的配置文件 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; } } |
這裏是每個站點,用一行include 顯示的包含。恰恰有很多人,至少我碰到很多,喜歡用 include *.conf把全部的站點都包含進去,我不太贊同這種作法,配置的時候你是方便了,但是到了要維護的時候,就不是那麼方便了。爲何這樣說?假設如今作維護,我打開nginx.conf大概就能夠看到有哪些站點(固然文件命名也要規劃好,能望文生義);特別是在一個nginx下站點多的場景,對某個站點進行臨時維護,只要在主配置文件nginx.conf註釋掉與它關聯的include行,重載nginx便可。
接下來給出php-fpm.conf文件的部份內容:
[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相對應,php也以普通用戶www來運行,同時全部站點目錄,都受權屬主、屬組爲www,保證正確與合理的權限。一些經驗不足的人,不注意程序權限與目錄權限的對應關係,運行服務,只要提示權限不夠,就立馬執行 chmod -R 777 dir ,你這是在方便別人進入系統呢!另外,php開啓了慢查詢日誌,在運行中排錯或者排查性能問題會頗有幫助,不過我本身不懂php,通常都是讓開發人員本身看這個日誌了,他懂的。
把論壇源站複製來的數據文件,tar解包後,放置在nginx指定的目錄,而後用chown -R www:www /data/html 及chmod -R 755 賦權,這個過程比較容易完成,再也不贅述。
前邊用mysqldump出來的文件,導入失敗,此次換成innobackup,根據以往的經驗,不該該有問題。注意,用此工具導入時,mysql不要初始化,也不要啓動(這個是廢話了,沒初始化固然不能啓動)。爲方便你們瞭解全過程,順便把mysql的選項文件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",建立好目錄/data/mysql_db,並執行chown -R mysql:mysql /data/mysql 受權。這時,/data/mysql_db目錄是空的。若是擔憂出錯,坐好姿式,深呼吸,莊重地敲入screen,而後再執行以下命令行(2018-03-30_11-10-53爲源數據庫文件解包後的目錄):
innobackupex --defaults-file=/etc/my.cnf --copy-back /data/2018-03-30_11-10-53 |
這個過程一樣比較耗時,沒事的話,能夠另外再開一個終端,進入目錄/data/mysql_db,能夠看到不斷有目錄和文件自動生成。執行完畢且沒有報錯,基本上就大功告成了。因爲安全的緣由,mysql對鏈接賬戶有訪問限制,遷移到新系統之後,也同樣要遵循這個規則。前邊已經啓動了nginx 和php服務,這裏把mysql服務也啓動起來。在我的的電腦,綁定windows的hosts文件,把域名與服務器的ip地址臨時關聯起來,再在瀏覽器輸入域名,提示網頁沒法訪問。已經檢查php等配置正確,那麼問題就在鏈接數據庫這個上邊了。進入論壇根文檔(nginx.conf裏邊root指定的那個),查看連數據庫相關的腳本,有好幾個呢,其中一個 config_global.php 部份內容爲:
.............部分省略.................... $_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'] = ''; ..................................餘下省略........................ |
要解決問題,有兩個辦法:
(1)跟程序員協做,從新對每個賬號受權(grant all ...);
(2)在系統上再配置一個 172.16.28.94的ip地址。
搞幾天時間了,你們都很累,所以爲了省事,我本身作主,在系統的另外一個空閒網卡配置了上述私有ip地址。陪完重啓網絡服務,論壇能夠打開,能夠登陸了。
通過多人多測測試,確認沒問題之後,正式作域名解析到新的服務器ip。
還有些工做須要繼續完善,包括同步這幾天的新數據、開啓新的數據備份等。論壇數據用rysnc -e 'ssh -p 20002' -avz src dist同步;數據庫稍微麻煩一點,須要臨時把論壇停一會,啓用主從同步功能。因爲源站用innobackup導出數據時,已經記錄了主從同步須要的信息(xtrabackup_info),所以同步過程就不須要再執行費時的導出操做,只需按偏移量執行同步就行。
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 |
數據庫主從同步完成之後,把slave提高爲主。彷佛寫得太長了,數據庫備份部分,就再也不寫了。