可擴充套件分散式資料庫叢集的搭建
我們所設計的每個微服務應用都能適應高併發的呼叫,所以它所連線的資料庫也必須具有這種特性,才能組成一個高效能的有機整體。不管是自己安裝的資料庫,還是使用雲服務供應商提供的資料庫,可擴充套件是前提條件。例如,MySQL、MongoDB和Redis都能夠進行分散式的叢集設計。下面介紹MySQL的叢集設計和安裝,希望讀者能夠舉- -反三。
在MySQL的叢集設計中,首先使用主從同步設計構建資料庫叢集,然後將這種叢集以分組的形式透過主主同步實現高可用設計。而對資料庫的訪問,將使用OneProxy 資料庫代理中介軟體實現讀寫分離設計。最後,對OneProxy的呼叫,還將使用LVS(LinuxVirtualServer,
Linux虛擬伺服器)技術構建一個雙機熱備的訪問機制。LVS將提供-一個虛擬的廣播IP地址,即以VIP地址的形式對外提供服務。這個高可用的資料庫叢集的架構設計如圖13-1所示。
其中,最主要的組成部分就是資料庫的叢集分組設計。這種叢集分組可以根據應用平臺的發展情況進行持續擴充套件。在安裝和實施的過程中,我們將建立兩個叢集分組,每個分組都由一個主機和兩個從機組成。
需要指出的是,不管資料庫的叢集由多少分組組成,這種讀寫分離的高可用架構設計對於一個微服務應用來說是完全透明的。微服務呼叫資料庫的方式還是像以前一樣配置-一個數據源進行訪問,不同的是,只需將相應的連線地址改成這種高可用架構提供的VIP地址即可。
下面我們就從資料庫的安裝開始,按步驟講解如何在分散式環境中實現高可用架構設計。
MySQL叢集主機分配我們使用六臺主機建立兩個MySQL叢集分組,其中,叢集分組1的伺服器資源分配如表13-1所示。
叢集分組2的伺服器資源分配如表13-2所示。
這六臺主機都必須安裝MySQL。建議使用官方的yum安裝源安裝MySQL的最新穩定版。
主從同步設定MySQL的主從同步設定是將主機設定為可讀寫伺服器,將從機設定為只讀伺服器,從機的
資料是從主機中同步過來的。
下面以設定“10.10.10.35” (master) 與“10.10.10.36”(slave) 的主從同步為例進行說明。
1.主機設定
使用如下命令修改伺服器名稱:
vi /etc/hostname
將檔案內容修改為“mysq1-35” 。
使用如下命令修改資料庫伺服器的配置:
vi /etc/my. cnf
在[mysqld]下面增加以下配置項: [mysqld]#伺服器的ID,必須唯一server id=35井複製過濾:不需要備份的資料庫binlog- ignore-db=mysql#二進位制日誌名稱log-bin=demo-mysql-bin#為每個session分配的記憶體,在事務過程中用來儲存二進位制日誌的快取binlog_ cache_ size=1M#主從複製格式(mixed, statement,row, 預設格式是statement)binlog_ format=mixed#二進位制日誌自動刪除/過期的天數。預設值為0,表示不自動刪除expire_ logs_ days=7##跳過主從複製中遇到的所有錯誤或指定型別的錯誤,避免從機複製中斷##如1062錯誤是指一些主鍵重複,1032錯誤是指主從資料庫資料不一致slave_ skip_ errors=1032#作為從機時的中繼日誌relay_ 1og=demo-mysq1-relay-bin # log_ slave updates=1表示作為從機時也將複製事件寫進自己的二進位制日誌中log_ slave_ updates=1#主鍵自增規則,避免主主同步導致ID重複牛自增因子(每次加2 )auto increment_ increment=2#自增偏移(從1開始),單數auto_ increment offset=1
設定完成後,儲存配置,使用如下命令重啟資料庫伺服器:
service mysqld restart
然後用root使用者登入伺服器,使用如下命令建立一個同步使用者並授權:
mysql> grant replication slave, replication client on *.* to'user36'@'10.10.10.36' identified by 'user123456';
其中,user36 為使用者名稱,user123456 為密碼。
使用如下命令更新許可權,讓前面的設定立即生效:
mysq1> flush privileges;
使用如下命令檢視主機狀態:
mysql> show master status;
結果如下所示:
IFilePositionI Binlog Do_ DBBinlog_ Ignore_ DBIExecuted Gtid_ Setdemo-mysql-bin.000001 |mysql1 row in set (0.00 sec)
其中,File 為二進位制日誌檔名稱,Position 為日誌儲存位置的偏移量。在後面的從機設定中將用到這兩個引數。
2.從機設定
下面以“10.10.10.36"這臺伺服器的從機設定為例進行說明。
使用如下命令,修改伺服器名稱:
vi /etc/hostname
將內容修改為“mysql-36" 。
使用如下命令,修改資料庫配置:
vi /etc/my.cnf
在[mysqld]下面增加以下配置項: .
[mysq1d]server_ id=36binlog- ignore-db=mysq1log-bin=demo-mysql-bin
儲存配置,重啟資料庫伺服器。然後,用root使用者登入資料庫,使用如下所示的同步配置:
mysql>change master to master_ host='10.10.10.35',master user='user36',master password=' user123456', master_ port=3306,master log file='demo-mysql-bin. 000001', master_ log_ _pos=123,master_ connect_ retry=30;
其中,透過master_ log_ file 設定了主機的日誌檔案,透過master_ log. pos 設定了主機的日誌儲存位置偏移量。這兩個引數必須根據當前主機的狀態進行配置。
使用如下命令啟動從機,即可開始進行資料同步:
mysql>start slave;
使用如下命令檢視從機的同步狀態:
mysql>show slave status\G;
結果如下所示:
1. rowSlave_ IO_ State: Waiting for master to send eventMaster_ Host: 10.10.10.35Master User: user36Master Port: 3306Connect Retry: 30Master_ Log_ File: demo-mysql -bin.000001Read Master_ Log_ Pos: 123Relay_ Log_ File: demo-mysq1 - relay-bin.000002Relay_ Log_ Pos: 287Relay Master_ Log_ File: demo-mysql-bin. 000001Slave IO Running: YesSlave_ SQL Running: Yes
在上面的結果中,如果Slave_ IO_ Running和Slave_ SQL_ _Running 都顯示為“Yes" ,則表示同步成功。
伺服器“10.10.10.37”的從機設定可以參照上面的方法實現。
主主同步設定將兩個叢集分組的主機互相進行主從同步設定,就可以實現主主同步。
參照13.2節的方法,在叢集分組2中實現主從同步設定。
其中,叢集分組2的主機“10.10.10.25”的資料庫配置與叢集分組1的資料庫配置相似,只是主鍵的配置為了避免衝突略有不同,即使用雙數作為主鍵,程式碼如下所示:
[mysqld]server id=25binlog- ignore-db=mysqllog-bin=demo-mysql -binbinlog_ cache_ size=1Mbinlog_ format=mixedexpire_ logs_ days=7slave_ skip errors=1032relay_ log=demo-mysql-relay-bin1og slave_ updates=1auto increment increment=2#自增偏移(從2開始),雙數auto increment offset=2
當叢集分組2的主從設定完成之後,即可對兩個分組的主機實現主主同步設定。首先實現叢集分組1的主機“10.10.10.35”與叢集分組2的主機“10.10.10.25”的主從設定。
1.叢集分組1的主機配置
在“10.10.10.35”主機上建立同步使用者並授權:
mysql> grant replication slave, replication client on *.* to'user25'@'10. 10.10.25' identified by 'user123456';
更新許可權:
mysql> flush privileges;
檢視主機狀態:
mysql> show master status;
記下檢視結果中的日誌檔名稱和儲存位置偏移量。
2.叢集分組2的從機配置
使用如下所示的同步配置:
mysql>change master to master_ host=' 10.10.10.35 ,master user='user25',master_ password= ' user123456',master_ port=3306,master log_ file=' demo-mysql-bin.000001', master_ 1og_ pos=123,master_ connect_ retry=30;
其中,日誌檔名稱和儲存位置偏移量按上面主機查詢的結果填寫。
啟動從機並進行同步:
mysql>start slave;
檢視同步狀態:
mysql>show slave status\G;
如果查詢結果中包含如下所示的兩行資訊則表示同步設定成功:
Slave_ I0 Running: YesSlave_ SQL Running: Yes
上面配置完成之後,再反過來以“10.10.10.25”為主機,以“10.10.10.35”為從機,進行主從同步設定。具體可參照上面的方法實現。互為主從設定完成之後,就實現了主主同步設定。
如果出現同步失敗的情況,則可以先停止失敗的從機,視情況更改日誌檔名稱和偏移量,然後再啟動從機繼續進行同步。
停止從機可以使用如下命令:
mysql>stop slave;
需要說明的是,在生產環境中,推薦使用UUID作為資料庫的主鍵,這樣可避免主鍵衝突的情況發生,而且也便於在叢集中建立更多的分組。
資料庫代理中介軟體選擇在實現了資料庫叢集之後,就已經解決了資料庫的單機伺服器的效能瓶頸問題,並且也建立了高可用的分散式架構,對於應用程式和資料庫客戶端,應該如何使用資料庫才能更好地使用這種高可用、高效能的分散式集群系統呢?這就要藉助於資料庫代理中介軟體來實現了。
MySQL的資料庫代理中介軟體有很多,而且大多數是開源的,如MyCat、Proxy、 Amoeba、OneProxy等,其中比較優秀的是MyCat和OneProxy。
MyCat在大流量訪問中有極佳的效能表現,它是用Java 語言開發的,配置檔案使用XML的形式,稍顯複雜,特別是它的分割槽表的配置有點累贅。另外,一些使用者對它的穩定性也頗有微詞,所以這裡推薦使用OneProxy。
OneProxy是一款基 於MySQL官方的Proxy中介軟體的設計思想開發的,執行穩定性好,配置也較為簡單,分割槽表的概念與MySQL分割槽表的設定在根本.上是一致的。 雖然是一個收費的商業軟體,但也提供了免費的社群版可供使用。
使用OneProxy實現讀寫分離設計OneProxy可以非常方便地使用MySQL的叢集體系架構,既可以按資料庫的叢集分組實現高可用設計,也可以按主從同步實現讀寫分離設計。使用兩個叢集分組的OneProxy呼叫設定的網路結構如圖13-2所示。
安裝OneProxy
下面以安裝“6.0.0”的版本為例進行說明,我們將OneProxy安裝在IP地址為“10.10.10.24”的機器上。
下載安裝包後,解壓縮:
tar xf oneproxy-rhel5-linux64-v6.0.0-ga. tar.gz
將程式檔案移到/usr/local/目錄中:
mv oneproxy /usr/ local/oneproxy
切換到oneproxy目錄:
cd /usr/ local/oneproxy
建立啟動程式:
CP oneproxy .service /etc/ init.d/oneproxy
修改啟動程式配置:
vi /etc/ init.d/oneproxy
將其中的工作目錄修改成如下所示:
ONEPROXY_ HOME=/usr/loca1/ oneproxy
儲存修改後,設定啟動程式的執行許可權:
chmod a+x /etc/init. d/oneproxy
使用如下命令啟動OneProxy:
service oneproxy start
使用如下命令設定開機啟動OneProxy:
chkconfig --add oneproxychkconfig oneproxy on
高可用讀寫分離配置
在使用OneProxy時,必須為每個資料庫都建立--個具有完全許可權的獨立使用者。在建立使用者時,必須在資料庫叢集的主機中進行。
例如,對於訂單服務資料庫“orderdb”,可以使用如下命令建立使用者並授權:
mysql> grant all privileges on orderdb.* to 'orderuser'@'8' identified by'12345678' with grant option;
即建立一個具 有完全許可權的使用者,其使用者名稱為orderuser,密碼為12345678, 並設定在任何地方都可以訪問,這裡指在安全的區域網中。
需要注意的是,上面授權的使用者 將儲存在資料庫mysql的user表中,雖然我們已經在主從設定中忽略了資料庫mysql的同步,但是在建立使用者時,並沒有使用use 指令切換過資料庫,所以上面建立的使用者還會在各個從機上進行同步。如果要禁止這種同步,則可以在主從設定中對主機的資料庫配置增加一個忽略對user表進行同步的配置。這樣操作之後,給資料庫授權的命令就必須在每個伺服器上都執行一遍。
在OneProxy伺服器中,假設還在目錄“ust/local/oneproxy”中,使用如下命令為密碼生成加密字串:
. /bin/mysqlpwd 12345678
執行後將生成如下所示的已經加密的密碼字串:
40739ED24B5DC118DC16397AB1 4E64C680637C0D
使用如下命令編輯OneProxy配置:
vi . / conf/porxy .conf
如下所示是使用兩個叢集分組的讀寫分離配置:[oneproxy]keepaliveevent-threads = 4log-file = 1og/oneproxy.1ogpid-file = log/oneproxy.pidlck-file = log/oneproxy.lckmysql-version = 5.7.19proxy-address = :3306proxy-master-addresses.1 = 10. 10.10.35: [email protected] = 10.10. 10.25:[email protected] = 10.10.10. 36: [email protected] = 10.10.10.37:[email protected] = 10.10.10.26:[email protected] = 10.10. 10.27:[email protected] =orderuser/40739ED24B5DC118DC1 [email protected] =merchantuser/ 40739ED24B5DC118DC16397AB14E64C680637C0D@merchantdbproxy-part-tables.1 = /usr/ local/oneproxy/conf/part1. txtproxy-charset = utf8_ binproxy-group-policy.1 = groupl:read balanceproxy-group-policy.2 = group2: read balanceproxy-group-security.1 = group1:0proxy-group-security.2 = group2:0proxy-security-level = 0proxy-sequence.1 = default#監控埠proxy-httpserver = :8080#自動剔除節點proxy-repl ication-check=1proxy-httptitle = OneProxy Monitor
其中,只配置了訂單服務的資料庫“orderdb” 的訪問使用者orderuser, 和商家服務的資料庫‘merchantdb" 的訪問使用者merchantuser, 其他資料庫中的訪問使用者可以參照上面的方法增加進來。
在儲存配置後,必須使用如下命令設定配置檔案的讀取許可權:
chmod 660 conf/proxy. conf
然後,重啟OneProxy,讓前面的配置生效。
前面各項配置引數的含義如表13-3所示。
OneProxy還有一個管理後臺,在OneProxy啟動之後,可以透過MySQL客戶端進行登入。管理後臺的預設埠是4041,使用者名稱為admin,密碼為OneProxy。
例如,可以在安裝了MySQL的機器上使用如下命令登入:
mysql -u admin -h 10.10.10.24 -P4041 -pOneProxy
登入管理後臺之後,即可執行如表13-4 所示的一些命令。
注意:在使用斜體部分命令之前,需要了解命令對系統的含義,否則可能導致資料不一致或者系統不可用。
另外,還可以透過監控埠,在瀏覽器上檢視各個資料庫伺服器的連線情況,使用如下所示的連結可以開啟監控的控制檯:
http://10.10.10.24:8080
其他有關OneProxy配置的詳細說明還可以參考友哥(OneProxy 的開發者)的部落格,讀者可自行上網查詢。