高性能 PHP7 * 提升數據庫性能

數據庫在動態網站中扮演着一個關鍵的角色,所有流入流出的數據都會和數據庫進行交互。因此,如果PHP應用的數據庫沒有進行較好的設計或優化,其性能將會受到非常大的影響。

MySQL數據庫

MySQL安裝完成後的默認設置所提供的性能並不是最優的,我們總有辦法對其進行進一步優化,提升 性能。切記,數據庫設計是影響性能的關鍵因素,設計很糟糕的數據庫會對整個性能造成嚴重影響。

查詢緩存(Query Caching)

查詢緩存是MySQL的一個重要性能特性,它緩存了SELECT查詢及其結果數據集。當一個同樣的 SELECT查詢發生時,MySQL從內存中直接取出結果,這樣就加快了查詢的執行速度,同時減小了數據庫 的壓力。

若要查看MySQL服務器上的查詢緩存是否已經打開,要在MySQL命令行界面執行以下命令。

SHOW VARIABLES LIKE 'have_query_cache';

若要開啓查詢緩存,可以打開my.cnf文件,並輸入以下內容。如果已經有這些內容但是包含註釋,則 去除註釋即可。

query_cache_type = 1 
query_cache_size = 128MB 
query_cache_limit = 1MB 

保存my.conf文件,重啓MySQL服務器。

存儲引擎(表類型)

MySQL提供9個存儲引擎,使用最廣泛的是MyISAM和InnoDB。

MyISAM

爲速度而設計,和Select搭配起來使用更好,如果表的數據偏向於靜態,使用MyISAM最好。

  • MyISAM支持表級鎖。
  • MyISAM支持全文搜索。
  • MyISAM數據壓縮、自我複製、查詢緩存、數據加密。
  • MyISAM不支持外鍵。
  • MyISAM不支持事務。
  • MyISAM支持集羣數據庫。

InnoDB(默認存儲引擎)

爲高可靠性和高性能而設計的,適合處理大量數據。

  • InnoDB支持行級鎖。
  • InnoDB支持外鍵。
  • InnoDB支持事務。
  • InnoDB數據壓縮、自我複製、查詢緩存、數據加密。
  • InnoDB可以用在集羣環境下,但是並沒有完全支持,不過InnoDB表可以完全轉換爲NDB存儲引擎,這樣既可用於集羣環境。

Percona 數據庫和 Percona XtraDB 存儲引擎

Percona 是免費、開源的數據庫,對於MySQL完全兼容且提供加強功能,可完全代替MySQL並能提供更好的文檔、性能、擴展性。
Percona 由 MySQL 衍生,支持MySQL的所有特性,並在此基礎上提供更多、更好的性能。Percona使用一種改進的存儲引擎——XtraDB,它是InnoDB的加強版,有更多的特性和更快的速度,在現代硬件上有有着更好的擴展性,Percona XtraDB在高負載環境下使用內存的效率更高。
Percona只能在Linux系統上使用,目前不能在Windows系統上使用。具體安裝可參考Percona安裝手冊

MySQL性能監控工具

phpMyAdmin 提供有視圖工具查看 MySQL 性能狀態;

Percona XtraDB集羣(PXC)

Percona XtraDB集羣提供了高性能的集羣環境,能輕鬆配置和管理多臺數據庫服務器,使得數據庫之 間能使用二進制日誌來互相通信。集羣環境能將負載分散到不同的數據庫服務器中,並提供災備,以防止服務器死機。

爲了配置集羣環境,我們需要以下服務器。

  • 第一臺服務器IP 10.211.55.1,稱爲Node1。
  • 第二臺服務器IP 10.211.55.2,稱爲Node2。
  • 第三臺服務器IP 10.211.55.3,稱爲Node3。

1.在終端中執行如下命令,在 Node1 上安裝Percona XtraDB集羣。

apt-get install percona-xtradb-cluster-56 

安裝將會啓動,安裝過程與普通的 Percona 服務器安裝類似。安裝過程中將會要求輸入root用戶的密碼。

2.當安裝完成後,我們需要創建一個擁有複製權限的新用戶。登錄進去,在 MySQL 終端執行以下命令。

# 創建了一個用戶,用戶名是sstpackt,密碼是sstuserpassw
CREATE USER 'sstpackt'@'localhost' IDENTIFIED BY 'sstuserpassword'; 
# 設置並刷新權限
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstpackt'@' localhost';
FLUSH PRIVILEGES;

 3.打開 MySQL 配置文件 /etc/mysql/my.cnf,在mysqld區塊下輸入以下配置。

# 添加 galera 庫
wsrep_provider=/usr/lib/libgalera_smm.so
# 添加集羣節點地址
wsrep_cluster_address=gcomm://10.211.55.1,10.211.55.2,10.211.55.3
# binlog 格式爲 ROW
binlog_format=ROW
# 默認存儲引擎是 InnoDB
default_storage_engine=InnoDB
# InnoDB auto_increment 鎖定模式設置爲2,這是 galera 需要的
innodb_autoinc_lock_mode=2
# Node 1的地址
wsrep_node_address=10.211.55.1
# SST 模式
wsrep_sst_method=xtrabackup
# SST模式的驗證,設置賬號密碼
wsrep_sst_auth="sstpackt:sstuserpassword"
# 爲集羣命名
wsrep_cluster_name=packt_cluster

 4.執行下面的命令,啓動第一個節點。

/etc/init.d/mysql bootstrap-pxc 

該命令將啓動第一個節點,也就意味着將初始的集羣啓動和運行起來,並決定哪一個節點帶有正確的信息,以及哪一個節點將會同步給所有其他節點。因爲 Node1 是集羣的初始節點,並且創建了一個新用戶,因此我們將只啓動 Node1。

5.檢查 Node1 啓動狀態。

SHOW STATUS LIKE '%wsrep%';

這將輸出一個非常長的列表,其中一部分如下圖所示。

6.現在,對所有節點重複步驟1和3。

需要爲每個節點變更的唯一配置是 wsrep_ node_address,其值應該爲節點的 IP 地址。對於每個節點來說,編輯 my.cnf 配置文件,在 wsrep_node_address 上設置節點的 IP 地址即可。

7.在終端中執行如下命令,開啓兩個新建的節點。

/etc/init.d/mysql start 

此時每個節點都可以通過重複步驟 7 來驗證是否正常。

爲了驗證集羣是否能正常工作,在某個節點上創建一個數據庫並添加幾張表,再向表中添加一些數 據。之後,在其他節點上檢查新創建的數據庫、表以及保存在每張表中的數據。如果正常,則所有這些數 據將會被同步到每個節點中。

Redis

Redis是開源的內存型鍵值存儲系統,廣泛用於數據庫緩存。根據Redis網站(www.Redis.io)的介紹, Redis支持字符串、哈希表、隊列、集合和有序集合,同時也支持主從複製和事務。

Memcached

Memcached是一個免費、開源、高性能、分佈式的內存對象緩存系 統。Memcached屬於內存型的鍵值存儲,可以保存從數據庫或者API調用獲取的數據。

類似於Redis,Memcached也能用於加速網站。Memcached將數據(字符串和對象)保存到內存中,這 樣可以減少和外部資源的交互,例如與數據庫或API交互。

參考:《高性能PHP7,Learning PHP7 High Performance》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章