Drupal與高性能網站架構 » nathan http://www.tbdskt.live 基于Drupal平臺的高性能網站架構與研究實驗室 Tue, 08 Aug 2017 11:42:13 +0000 zh-CN hourly 1 http://wordpress.org/?v=3.8 Percona Xtrabackup備份mysql (完整備份與增量備份) http://www.tbdskt.live/2014/02/percona-xtrabackup-mysql/ http://www.tbdskt.live/2014/02/percona-xtrabackup-mysql/#comments Thu, 20 Feb 2014 08:10:52 +0000 http://www.tbdskt.live/?p=1012 Xtrabackup簡介

Percona XtraBackup是開源免費的MySQL數據庫熱備份軟件,它能對InnoDB和XtraDB存儲引擎的數據庫非阻塞地備份(對于MyISAM的備份同樣需要加表鎖)。XtraBackup支持所有的Percona Server、MySQL、MariaDB和Drizzle。

XtraBackup優勢 :

1、無需停止數據庫進行InnoDB熱備

2、增量備份MySQL

3、流壓縮到傳輸到其它服務器

4、能比較容易地創建主從同步

5、備份MySQL時不會增大服務器負載

Xtrabackup的特性是針對大數據進行備份恢復使用,數據庫大小一般在G以上或10G以上,對于數據量小的Mysql庫完全可以使用mysqldump來解決,備份和恢復速度快而且操作簡便快捷,這里對mysqldump命令就不做介紹了。

Xtrabackup安裝

這里只介紹Ubuntu-12.04下的安裝方法,其它系統的安裝方法請參考 http://www.percona.com/doc/percona-xtrabackup/2.1/installation.html

apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A

在/etc/apt/sources.list加入:

2
3
deb http://repo.percona.com/apt precise main
deb-src http://repo.percona.com/apt precise main

執行update及安裝操作

2
3
apt-get update
apt-get install percona-xtrabackup

注:precise是Ubuntu-12.04的版本代號,如果是其它系統版本,需要更換。

Xtrabackup工具介紹

安裝XtraBackup后,其實會有幾個工具:

innobackupex:這個是其實是下面三個工具的一個perl腳本封裝,可以備份MyISAM, InnoDB, XtraDB表。但在處理Myisam時需要加一個讀鎖。

xtrabackup:一個由C編譯而來的二進制文件,只能備份InnoDB和XtraDB數據。

xbcrypt:用來加密或解密備份的數據。

xbstream:用來解壓或壓縮xbstream格式的壓縮文件。

建議使用perl封裝的innobackupex來作數據庫備份,因為比較容易使用。所以下面只介紹innobackupex的使用。其它的使用參考: http://www.percona.com/doc/percona-xtrabackup/2.1/manual.html

innobackupex使用方法

完整的選項使用請執行innobackupex –help,這里只介紹使用常用的選項進行完整備份及增量備份和還原。

innobackupex Options 這里只對常用參數進行描述

–defaults-file 數據庫的配置文件路徑,感覺本地備份不寫也可以,遠程沒測試過。

–apply-log 準備在一個備份上啟動mysql服務。

–copy-back 從備份目錄拷貝數據,索引,日志到my.cnf文件里規定的初始位置。

–no-timestamp 創建備份時不自動生成時間目錄,可以自定義備份目錄名例如: /backups/mysql/base

–databases 用于指定要備份的數據庫, 多個庫文件使用方法: “database1 database2″

–incremental 在全備份的基礎上進行增量備份,后跟增量備份存貯目錄路徑

–incremental-basedir=DIRECTORY 增量備份所需要的全備份路徑目錄或上次做增量備份的目錄路徑

–incremental-dir=DIRECTORY 增量備份存貯的目錄路徑

–redo-only 用于準備增量備份內容把數據合并到全備份目錄,配合–incremental-dir 增量備份目錄使用。

–force-non-empty-directories 如果是特定庫備份還原,不需要刪掉整個mysql目錄,只是特定庫的及相關文件就可以,還原時加上此參數就不會報錯。

其他具體參數可以參考:http://www.percona.com/doc/percona-xtrabackup/2.1/innobackupex/innobackupex_option_reference.html

完整備份及還原

一、全部數據庫

備份:

innobackupex --user=root --password=root --defaults-file=/etc/mysql/my.cnf /data/mysql_backup/full_backup

還原:

7
8
9
10
11
12
13
14
15
16
17
18
19
service mysql stop
 
rm -rf /var/lib/mysql
 
mkdir /var/lib/mysql
 
innobackupex --apply-log /data/mysql_backup/full_backup --use-memory=1G --user=root --password=root
 
innobackupex --copy-back /data/mysql_backup/full_backup
 
chown mysql:mysql -R /var/lib/mysql
 
service mysql start

查看恢復的數據庫

二、指定數據庫

備份:

假如我們要備份centos和aabb數據庫。

innobackupex --user=root --password=root --defaults-file=/etc/mysql/my.cnf --databases="centos aabb" /data/mysql_backup/

這樣就會在/data/mysql_backup生成一個帶時間的目錄,如果不需要帶時間,可以使用選項–no-timestamp。

如果想備份成壓縮文件,可以使用如下語句:

innobackupex --user=root --password=root --defaults-file=/etc/mysql/my.cnf --databases="centos aabb" --no-timestamp --stream=tar ./ | gzip - > centos-aabb.bz.tar.gz

還原:

假如完整備份的路徑為/data/mysql_backup/full_backup,如果完整備份是壓縮文件,需要先解壓再還原。

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
service mysql stop
 
rm -rf /var/lib/mysql/ibdata*
 
rm -rf /var/lib/mysql/ib_logfile*
 
rm -rf /var/lib/mysql/centos
 
rm -rf /var/lib/mysql/aabb
 
innobackupex --apply-log /data/mysql_backup/centos_aabb_full_backup
 
innobackupex --copy-back --defaults-file=/etc/mysql/my.cnf /data/mysql_backup/centos_aabb_full_backup
 
chown -R mysql:mysql /var/lib/mysql
 
service mysql start

增量備份及還原

在這里全庫的增量備份方法就不多講了,只是針對特定數據庫進行講解,其實是同理的就是把下面參數中的–databases 選項去掉就可以,感興趣的可以自己試下。

增量備份是建立在完整備份的基礎上的,所以首先確保已經完整備份了一次。

完整備份:

innobackupex --user=root --password=root --databases="centos" --no-timestamp /data/mysql_backup/centos_full_backup

現在完整備份的目錄為/data/mysql_backup/centos_full_backup。

增量備份:

第一次增量備份:

innobackupex --incremental /data/mysql_backup/inc1 --no-timestamp --incremental-basedir=/data/mysql_backup/centos_full_backup --user=root --password=root --defaults-file=/etc/mysql/my.cnf

第二次增量備份:需要把–incremental-basedir指定到上次做增量備份的目錄,這里應該知道/data/mysql_backup/inc1

innobackupex --incremental /data/mysql_backup/inc2 --no-timestamp --incremental-basedir=/data/mysql_backup/inc1 --user=root --password=root --defaults-file=/etc/mysql/my.cnf

選項–incremental是指定作增量備份 –incremental-basedir選項是指定上一次增量備份的目錄(如果是第一次作增量備份,則為完整備份的目錄)。

還原:

增量備份的還原操作跟完整的還原有點不一樣,首先必須使用–apply-log –redo-only對完整備份的目錄及所有增量備份目錄進行操作,然后就可以像還原完整備份時的操作了。

對每個備份目錄作apply-log redo-only操作(包括完整備份)

3
4
5
6
7
innobackupex --apply-log --redo-only /data/mysql_backup/centos_full_backup --user=root --password=root
 
innobackupex --apply-log --redo-only /data/mysql_backup/centos_full_backup --incremental-dir=/data/mysql_backup/inc1 --user=root --password=root
 
innobackupex --apply-log --redo-only /data/mysql_backup/centos_full_backup --incremental-dir=/data/mysql_backup/inc2 --user=root --password=root

看到有文章在恢復增量備份的時候提到在做最后一個讀取增量記錄的時候不使用–redo-only 參數, 經過測試,使用了此參數后恢復的數據庫也都運行正確,我使用的是2.17版本xtrabackup, 至于以前版本就沒測試過。有知道的可以在這里分享下。

下面就跟還原完整備份時一樣了:

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
service mysql stop
 
rm -rf /var/lib/mysql/ibdata*
 
rm -rf /var/lib/mysql/ib_logfile*
 
rm -rf /var/lib/mysql/centos
 
innobackupex --apply-log /data/mysql_backup/centos_full_backup --use-memory=1G --user=root --password=root
 
##--use-memory 能夠定義讀取備份時的內存大小,以便快速的完成還原準備工作。
 
innobackupex --copy-back --defaults-file=/etc/mysql/my.cnf /data/mysql_backup/centos_full_backup
 
chown mysql:mysql -R /var/lib/mysql
 
service mysql start

現在全部增量恢復就完成了,可以登錄數據庫查看下恢復的數據了
稍后再介紹給大家xtrabackup備份InnoDB的方法。

]]>
http://www.tbdskt.live/2014/02/percona-xtrabackup-mysql/feed/ 1
Nginx下開啟php-fpm的錯誤提示 http://www.tbdskt.live/2013/07/nginx-php-fpm-error-report/ http://www.tbdskt.live/2013/07/nginx-php-fpm-error-report/#comments Fri, 12 Jul 2013 05:37:21 +0000 http://www.tbdskt.live/?p=836 在使用nginx的過程中總是會碰到nginx提示500錯誤,可是具體錯誤在哪里出的就需要跑到后臺去查看error-log, 很是不方便。
介紹個小方法給大家,很實用子啊調試php的時候,但不建議在線服務器開啟此功能。

首先打開php的錯誤信息提示功能,在其已ubuntu為測試環境

vim /etc/php5/fpm/php.ini

打開錯誤提示

display_errors = On

因為用到的四fpm與nginx配合,所以還需要修改php-fpm.conf文件

vim /etc/php5/fpm/php-fpm.conf

再最后添加

php_flag[display_errors] = on

有人問了,這個php-fpm里面沒有這個參數啊,是的里面你是找不到的

需要在另外一個路徑下找到次配置參數,感興趣的可以參考這里php-fpm configuration

vim /etc/php5/fpm/pool.d/www.conf

其實不找也沒關系,直接粘貼就可以啦,讓后從新讀取nginx配置

sudo service nginx reload

隨便修改個php錯誤,刷新頁面就能看到熟悉的錯誤提示信息啦。

]]>
http://www.tbdskt.live/2013/07/nginx-php-fpm-error-report/feed/ 0
Nginx: Too Many Open Files 錯誤和解決方案 http://www.tbdskt.live/2013/07/nginx-open-files-error/ http://www.tbdskt.live/2013/07/nginx-open-files-error/#comments Fri, 12 Jul 2013 05:19:32 +0000 http://www.tbdskt.live/?p=822 Nginx 的服務器使用越來越普遍,主要因為他的性能大大優于Apache2。但在使用過程中往往遇到一些問題,下面這個就是其中之一:

24: Too many open files

詳細錯誤代碼如下:

2011/05/01 23:00:49 [alert] 7387#0: *6259768 socket() failed (24: Too many open files) while connecting to upstream


次錯誤容易讓人摸不著頭緒,不知道是哪里出了問題,配置檢查過沒問題。程序代碼的錯誤也不應該是這個錯誤信息啊。
其原因是Linux / Unix 設置了軟硬文件句柄和打開文件的數目,解決方法如下:
簡單修改方法:
使用如下命令可以把打開文件數設置足夠大

ulimit -n 30000

同時修改nginx.conf添加

worker_rlimit_nofile 30000;

這樣就可以解決Nginx連接過多的問題,Nginx就可以支持高并發。
注意: 用ulimit -n 30000 修改只對當前的shell有效,退出后失效。

感覺還是通過下面的房改修改比較穩定
一、通過修改硬件配置來實現更改
你可以使用’ulimit’命令來查看系統文件限制。

ulimit -Hn
ulimit -Sn

在nginx服務器可以打開的文件數量受你操作系統的限制,編輯/etc/sysctl.conf 添加如下內容:

fs.file-max = 70000

保存退出,從新讀取系統配置

sysctl -p

再編輯 /etc/security/limits.conf 添加內容:

* soft nofile 10000
* hard nofile 30000

此修改內容需要reboot系統才能生效,所以務必從新啟動下服務器。
二、修改Nginx系統的文件限制,使用nginx worker_rlimit_nofile Option
打開你相應的配置文件位置,我用的ubutnu12.04 所以路徑如下

vim /etc/nginx/nginx.conf

添加內容

# set open fd limit to 30000
 worker_rlimit_nofile 30000;

保存退出從新讀取nginx配置

sudo service nginx reload

再次查看系統輸出

ulimit -Hn
ulimit -Sn

結果如下:

30000
10000

到此結束。希望對大家有用.

]]>
http://www.tbdskt.live/2013/07/nginx-open-files-error/feed/ 0
Drupal6中FCkeditor模塊與Firefox瀏覽器(17版本以后)沖突問題 http://www.tbdskt.live/2013/03/fckeditor-firefox/ http://www.tbdskt.live/2013/03/fckeditor-firefox/#comments Wed, 20 Mar 2013 02:09:31 +0000 http://www.tbdskt.live/?p=781 今天分享一個親身經歷,折騰了大半天的時間才解決,寫出來以供大家參考,以防遇到和我遇到同樣的問題而無處下手。

目前基于drupal的網站,相當一部分網站還在使用drupal6以及FCKEditor編輯窗口功能。FCKEditor在使用上和CKeditor差不多,因此我一直使用FCKEditor,在使用中,忽然碰到問題如下:

一貫使用火狐瀏覽器方便啊,而且火狐的更新速度也在與時俱進,都到19版本了更新后。在本地測試環境下發現FCKEditor里發出的內容及圖片保存后為空,全都不見了。

起初以為是FCKEditor出現了問題,更換了新版本的FCKEditor后,依舊出現發布的內容丟失了。。。。。 更換safari瀏覽器嘗試,可以發表文章一切正常,于是確定是火狐瀏覽器的問題,開始搜索解決辦法。

百度等等,國內是沒找到啊~~溜溜轉了1個多小時。最后,翻墻吧還是,果然找到了一些可用的實際辦法分享給大家。

在fckeditor模塊里找到/fckeditor/fckeditor_php5.php文件(第58行)

return ($iVersion >= 20030210);

更換為一下代碼

return TRUE;

改完以后嘗試火狐瀏覽器,果然可以正常使用了,呵呵。雖然不是什么大問題,但還是習慣用火狐。希望對大家有幫助~~~

]]>
http://www.tbdskt.live/2013/03/fckeditor-firefox/feed/ 0
Linux中Locale及shell編碼問題 http://www.tbdskt.live/2012/04/shell-utf8/ http://www.tbdskt.live/2012/04/shell-utf8/#comments Mon, 09 Apr 2012 02:02:44 +0000 http://www.tbdskt.live/?p=470 在Linux系統中,我們經常遇到如下錯誤:

warning: setlocale: LC_CTYPE: cannot change locale (UTF-8)

本文主要針對這個問題做一下簡單介紹。

Locale是linux系統中多語言環境的設置接口,Locale根據計算機用戶所使用的語言,所在國家或者地區,以及當地的文化傳統所定義的一個軟件運行時的語言環境。
locale把按照所涉及到的文化傳統的各個方面分成12個大類,這12個大類分別是:

1、語言符號及其分類(LC_CTYPE)
2、數字(LC_NUMERIC)
3、比較和排序習慣(LC_COLLATE)
4、時間顯示格式(LC_TIME)
5、貨幣單位(LC_MONETARY)
6、信息主要是提示信息,錯誤信息,狀態信息,標題,標簽,按鈕和菜單等(LC_MESSAGES)
7、姓名書寫方式(LC_NAME)
8、地址書寫方式(LC_ADDRESS)
9、電話號碼書寫方式(LC_TELEPHONE)
10、度量衡表達方式 (LC_MEASUREMENT)
11、默認紙張尺寸大小(LC_PAPER)
12、對locale自身包含信息的概述(LC_IDENTIFICATION)。

Locale的詳細參數如下:

[oracle@game ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

設定Locale
設定locale就是設定12大類的locale分類屬性,即12個LC_*。除了這12個變量可以設定以外,為了簡便起見,還有兩個變量:LC_ALL和LANG。它們之間有一個優先級的關系:LC_ALL > LC_* >LANG。可以這么說,LC_ALL是最上級設定或者強制設定,而LANG是默認設定值。

遇到的問題
但是我們經常會遇到如下錯誤:
warning: setlocale: LC_CTYPE: cannot change locale (UTF-8) 解決辦法

tab索引錯誤:
./bas-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8)

其他錯誤:
erl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = “UTF-8″,
LANG = “en_US.UTF-8″
are supported and installed on your system.
perl: warning: Falling back to the standard locale (“C”).

解決辦法
echo $SHELL
sudo chsh -s your_shellpath your_username
source .bashrc

這樣就完全正常工作了,弄起來也舒服多了,

]]>
http://www.tbdskt.live/2012/04/shell-utf8/feed/ 3
MySQL主從同步機制及同步中的問題處理 http://www.tbdskt.live/2012/03/mysql-master-slave-troubles/ http://www.tbdskt.live/2012/03/mysql-master-slave-troubles/#comments Wed, 21 Mar 2012 02:09:19 +0000 http://www.tbdskt.live/?p=424 大型網站架構中,MySQL主從配置是必不可少的,尤其對于Drupal這樣數據庫訪問頻繁的框架極為重要。基本的MySQL主從配置大家都比較熟悉,但是在主從配置的結構中,由于多種原因,主從配置經常出現無法同步,以及MySQL由于主從配置的原因而崩潰或者Down機,這里就本人的經驗做一些簡單介紹。


MySQL主從配置的搭建
具體步驟:
1. 安裝MySQL。首先要在兩臺服務器上安裝MySQL,完成之后應該確認能否兩臺服務器能否互相訪問。 這是因為缺省的my.cnf設置有
bind-address = 127.0.0.1,這條語句應該被注釋掉。
2. 創建賬號。數據庫中缺省的帳戶的host值是localhost,所以應該創建一個可以遠端訪問的帳號。比如:root@’%’ or root@10.x.x.x
3. 配置主Server。
在主服務器(數據庫源)上的my.cnf配置[mysqld]之后加入如下條目:

log_bin = /var/log/mysql/mysql-bin.log
server-id = 1 //1代表主數據庫(源) 2代表輔數據庫(目的)
binlog_do_db = testmirror //要做同步的數據庫名字,可以是多個數據庫,之間用分號分割。

4. 配置從Server。
在輔服務器上的my.cnf中加入如下內容

server-id = 2 //2代表輔
master-host = xx.xx.xx.xx //主服務器的IP地址
master-user = //主服務器的用戶名
master-password = //數據庫密碼
master-port = 3306
master-connect-retry = 10 //每個10秒鐘同步一次
replicate-do-db = testmirror //需要同步的庫名字

5. 賬號權限設置。
輔服務器將使用主服務器上的root@%帳戶登陸主服務器與其發生通信,除了這個賬戶應該在主上真實存在,
這個賬戶應該有兩個屬性:REPLICATION SLAVE 和 READ。

GRANT REPLICATION SLAVE ON *.* TO root@'%' IDENTIFIED BY 'password';

6.主服務器上運新mysql命令

mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000015 | 106 | testmirror | ? ?|
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

記住這些參數。

7. 在輔服務器上運新如下命令

mysql> show slave status;
----------------------------------------------------------------------------------------------------------+
Slave_IO_State | Master_Host | Master_User | Master_Port | Connect_Retry | Master_Log_File | Read_Master_Log_Pos |
Relay_Log_File | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB |
Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table |
Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space |
Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed| Master_SSL_CA_File | Master_SSL_CA_Path |
Master_SSL_Cert |Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master | Master_SSL_Verify_Server_Cert |
Last_IO_Errno | Last_IO_Error | Last_SQL_Errno | Last_SQL_Error |
---------------------------------------------------------------------------------------------------------+
| Waiting for master to send event | xx.xx.xx.xx | root | 3306 | 10 | mysql-bin.000015 | 384 | ubuntudev-relay-bin.000002 | 529 |
mysql-bin.000015 |Yes | Yes | testmirror | | | | | | 0 | | 0 | 384 | 688 | None | | 0 | No | | | | | | 0 | No | 0 | | 0 | |
--------------------------------------------------------------------------------------------------------+
mysql> show processlist;
+-----+-------------+-----------+------+---------+------+---------------------------------------------+
| Id | User | Host | db | Command | Time | State |Info
+-----+-------------+-----------+------+---------+------+----------------------------------------------+
| 405 | root | localhost | NULL | Query | 0 | NULL |show processlist |
| 423 | system user | | NULL | Connect | 332 | Waiting for master to send event | NULL
| 424 | system user | | NULL | Connect | 72 | Has read all relay log; waiting for the slave I/O thread to update it | NULL
+-----+-------------+-----------+------+---------+------+--------------------------------------------------+

3 rows in set (0.00 sec)

重要的是查看 Slave_IO_Running | Slave_SQL_Running兩個值,必須都是YES才可以, 但是通常不是YES。

MySQL主從不同步問題解決

1.首先停掉Slave服務:

mysql> slave stop

2.到主服務器上查看主機狀態:
記錄File和Position對應的值。

mysql> show master status;
+------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.000020 | 135617781 | | |
+------------------+-----------+--------------+------------------+
1 row in set (0.00 sec)

3.到slave服務器上執行手動同步:

mysql> change master to
> master_host='master_ip',
> master_user='user',
> master_password='pwd',
> master_port=3307,
> master_log_file='mysql-bin.000020',
> master_log_pos=135617781;
1 row in set (0.00 sec)
mysql> slave start;
1 row in set (0.00 sec)

再次查看slave狀態發現:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
Seconds_Behind_Master: 0

我們知道,因為DATA REPLICATION機制完全是基于在主上執行的增量SQL要被傳播到輔服務器上,并且被成功運行。這就勢必要求:在運行此機制前,主輔數據庫中數據是一致的;以及在運行此機制中,輔數據庫禁止來自其他的SQL(非主上傳播過來SQL)的寫操作。但是在運行中仍然可能遇到不一致的產生,這會導致通信無法正常繼續下去。因此一旦主從出現問題,首先應該解決同步位置的問題,修復丟失的數據。

MySQL主從配置的其他相關問題,后續文章中陸續跟大家再談。

]]>
http://www.tbdskt.live/2012/03/mysql-master-slave-troubles/feed/ 3
四川时时彩投注平台