1.mysql-route介紹

MySQL Router是MySQL官方提供的一個輕量級中間件,可以在應(yīng)用程序與MySQL服務(wù)器之間提供透明的路由方式。主要用以解決MySQL主從庫集群的高可用、負(fù)載均衡、易擴展等問題。Router可以與MySQL Fabric無縫連接,允許Fabric存儲和管理用于路由的高可用數(shù)據(jù)庫服務(wù)器組,使管理MySQL服務(wù)器組更加簡單。
MySQL Router是一個可執(zhí)行文件,可以與應(yīng)用程序在同一平臺上運行,也可以單獨部署。雖然MySQL Router是InnoDB Cluster(MySQL 7.X)的一部分,MySQL 5.6 等版本數(shù)據(jù)庫仍然可以使用Router作為其中間代理層。MySQL Router的配置文件中包含有關(guān)如何執(zhí)行路由的信息。它與MySQL服務(wù)器的配置文件類似,也是由多個段組成,每個段中包含相關(guān)配置選項。
Router實現(xiàn)讀寫分離,程序不是直接連接數(shù)據(jù)庫IP,而是固定連接到mysql router。MySQL Router對前端應(yīng)用是透明的。應(yīng)用程序把MySQL Router當(dāng)作是普通的mysql實例,把查詢發(fā)給MySQL Router,而MySQL Router會把查詢結(jié)果返回給前端的應(yīng)用程序。
從數(shù)據(jù)庫服務(wù)器故障,業(yè)務(wù)可以正常運行。由MySQL Router來進(jìn)行自動下線不可用服務(wù)器。程序配置不需要任何修改。
主數(shù)據(jù)庫故障,由MySQL Router來決定主從自動切換,業(yè)務(wù)可以正常訪問。程序配置不需要做任何修改。
MySQL Router是MySQL Proxy的替代方案,MySQL官方不建議將MySQL Proxy用于生產(chǎn)環(huán)境,并且已經(jīng)不提供MySQL Proxy的下載。
正如前面提到的,在目前形式中,MySQL Router最好與應(yīng)用程序一起使用。也就是說,應(yīng)該在運行應(yīng)用程序的相同機器上安裝Router。雖然這不是強制要求,但建議采用這種做法??梢跃帉懗绦騺肀O(jiān)控mysqlrouter的執(zhí)行,并在需要時重新啟動它。例如,如果目標(biāo)選項中的服務(wù)器列表已用盡,則可以使用新目標(biāo)列表重新啟動Router,或重新啟動Router以重試列表中的服務(wù)器。
MySQL Router非常輕量級,與直連Servers相比,其性能損耗低于1%。擺在Router面前的問題,是其對鏈接數(shù)的支撐能力,原則上我們一個Router節(jié)點限定在500個TCP鏈接。Router本身CPU、內(nèi)存、磁盤消耗都極低,但是要求Router節(jié)點對網(wǎng)絡(luò)IO的支撐能力應(yīng)該較強??紤]到Router底層為“異步IO”,如果條件允許,應(yīng)該構(gòu)建在較高版本的Linux平臺下,且給予合理的CPU資源。MySQL Router在2.1.4版本以下,內(nèi)核基于select() IO模型,存在連接數(shù)500上限、較大SQL請求導(dǎo)致CPU過高,以及并發(fā)連接過高時Router假死等問題,建議升級到2.1.6+。
Router對連接的管理是基于“粘性”方式,即應(yīng)用與Router的一個TCP連接,將對應(yīng)一個Router與MySQL Server的連接,當(dāng)應(yīng)用與Router的連接失效時,Router也將斷開其與MySQL Server的連接。只要Router上下游網(wǎng)絡(luò)聯(lián)通性正常,那么Router將不會主動斷開與應(yīng)用的連接,也不會切換其與Server的連接。即當(dāng)應(yīng)用與Router創(chuàng)建一個新連接時,Router將根據(jù)負(fù)載均衡算法,選擇一個Server并與其建立連接,此后將唯一綁定,直到此Server失效時觸發(fā)重新選擇其他Server。這就引入一個問題,如果某個連接上發(fā)生了“繁重”的SQL操作,那么將會導(dǎo)致下游Server伴隨高負(fù)載而無法“負(fù)載均衡”。
Router對應(yīng)用是透明的,開發(fā)與Router一起使用的應(yīng)用程序不需要任何特殊的庫或接口,所增加的工作只是維護(hù)MySQL Router實例。
- 安裝配置
# 解壓
tar -xzvf mysql-router-2.1.6-linux-glibc2.12-x86-64bit.tar.gz
mv mysql-router-2.1.6-linux-glibc2.12-x86-64bit mysql-router-2.1.6
修改用戶配置文件vi .bash_profile,內(nèi)容如下:
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH
export PATH=$PATH:/home/cluster/mysql-router-2.1.6
#更新資源
source ~/.bashrc
#驗證是否成功,如果正常輸出安裝成功
mysqlrouter --help
- 配置MySQL router
在mysql-router-2.1.6目錄下新建mysqlrouter.conf文件
或者拷貝mysql-router-2.1.6/share/doc/mysqlrouter/sample_mysqlrouter.conf
#
cp mysql-router-2.1.6/share/doc/mysqlrouter/sample_mysqlrouter.conf mysqlrouter.conf
vi mysqlrouter.conf
修改內(nèi)容如下:
# MySQL Router sample configuration
#
# The following is a sample configuration file which shows
# most of the plugins available and most of their options.
#
# The paths used are defaults and should be adapted based
# on how MySQL Router was installed, for example, using the
# CMake option CMAKE_INSTALL_PREFIX
#
# The logging_folder is kept empty so message go to the
# console.
#
[DEFAULT]
logging_folder = /home/cluster/mysql-router-2.1.6/logs
plugin_folder = /home/cluster/mysql-router-2.1.6/lib/mysqlrouter
config_folder = /home/cluster/mysql-router-2.1.6
runtime_folder = /home/cluster/mysql-router-2.1.6/run
#data_folder = /var/lib
#keyring_path = /var/lib/keyring-data
#master_key_path = /var/lib/keyring-key
[logger]
level = INFO
# 主節(jié)點故障轉(zhuǎn)移配置
[routing:basic_failover]
# To be more transparent, use MySQL Server port 3306
bind_address = 0.0.0.0
bind_port = 23306
mode = read-write
# 主節(jié)點地址:默認(rèn)情況下第一臺主數(shù)據(jù)庫為寫主庫,當(dāng)?shù)谝慌_主數(shù)據(jù)庫DOWN機后,第二臺數(shù)據(jù)庫被提升為主庫
destinations = 192.168.62.37:3306,192.168.62.15:3306
[routing:balancing]
bind_address = 0.0.0.0
bind_port = 23307
max_connections = 1024
# 用于負(fù)載均衡的只讀模式
mode = read-only
# 這里的兩個socket是輪詢用的
destinations = 192.168.62.15:3306,192.168.62.37:3306
# If no plugin is configured which starts a service, keepalive
# will make sure MySQL Router will not immediately exit. It is
# safe to remove once Router is configured.
[keepalive]
interval = 60
- MySQL router啟停
#啟動
mysqlrouter --config mysqlrouter.cnf &
#查看端口是否啟動
netstat -nlt
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:23306 0.0.0.0:* LISTEN
#停止mysqlrouter
ps -ef | grep mysqlrouter
cluster 9614 1 0 09:51 ? 00:00:00 bin/mysqlrouter --config mysqlrouter.conf
cluster 13348 11508 0 10:30 pts/0 00:00:00 grep --color=auto mysqlrouter
kill -9 9614