1.mysql-route介紹
MySQL Router是MySQL官方提供的一個輕量級中間件,可以在應用程序與MySQL服務器之間提供透明的路由方式。主要用以解決MySQL主從庫集群的高可用、負載均衡、易擴展等問題。Router可以與MySQL Fabric無縫連接,允許Fabric存儲和管理用于路由的高可用數據庫服務器組,使管理MySQL服務器組更加簡單。
MySQL Router是一個可執行文件,可以與應用程序在同一平臺上運行,也可以單獨部署。雖然MySQL Router是InnoDB Cluster(MySQL 7.X)的一部分,MySQL 5.6 等版本數據庫仍然可以使用Router作為其中間代理層。MySQL Router的配置文件中包含有關如何執行路由的信息。它與MySQL服務器的配置文件類似,也是由多個段組成,每個段中包含相關配置選項。
Router實現讀寫分離,程序不是直接連接數據庫IP,而是固定連接到mysql router。MySQL Router對前端應用是透明的。應用程序把MySQL Router當作是普通的mysql實例,把查詢發給MySQL Router,而MySQL Router會把查詢結果返回給前端的應用程序。
從數據庫服務器故障,業務可以正常運行。由MySQL Router來進行自動下線不可用服務器。程序配置不需要任何修改。
主數據庫故障,由MySQL Router來決定主從自動切換,業務可以正常訪問。程序配置不需要做任何修改。
MySQL Router是MySQL Proxy的替代方案,MySQL官方不建議將MySQL Proxy用于生產環境,并且已經不提供MySQL Proxy的下載。
正如前面提到的,在目前形式中,MySQL Router最好與應用程序一起使用。也就是說,應該在運行應用程序的相同機器上安裝Router。雖然這不是強制要求,但建議采用這種做法。可以編寫程序來監控mysqlrouter的執行,并在需要時重新啟動它。例如,如果目標選項中的服務器列表已用盡,則可以使用新目標列表重新啟動Router,或重新啟動Router以重試列表中的服務器。
MySQL Router非常輕量級,與直連Servers相比,其性能損耗低于1%。擺在Router面前的問題,是其對鏈接數的支撐能力,原則上我們一個Router節點限定在500個TCP鏈接。Router本身CPU、內存、磁盤消耗都極低,但是要求Router節點對網絡IO的支撐能力應該較強。考慮到Router底層為“異步IO”,如果條件允許,應該構建在較高版本的Linux平臺下,且給予合理的CPU資源。MySQL Router在2.1.4版本以下,內核基于select() IO模型,存在連接數500上限、較大SQL請求導致CPU過高,以及并發連接過高時Router假死等問題,建議升級到2.1.6+。
Router對連接的管理是基于“粘性”方式,即應用與Router的一個TCP連接,將對應一個Router與MySQL Server的連接,當應用與Router的連接失效時,Router也將斷開其與MySQL Server的連接。只要Router上下游網絡聯通性正常,那么Router將不會主動斷開與應用的連接,也不會切換其與Server的連接。即當應用與Router創建一個新連接時,Router將根據負載均衡算法,選擇一個Server并與其建立連接,此后將唯一綁定,直到此Server失效時觸發重新選擇其他Server。這就引入一個問題,如果某個連接上發生了“繁重”的SQL操作,那么將會導致下游Server伴隨高負載而無法“負載均衡”。
Router對應用是透明的,開發與Router一起使用的應用程序不需要任何特殊的庫或接口,所增加的工作只是維護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,內容如下:
# .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
修改內容如下:
# 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
# 主節點故障轉移配置
[routing:basic_failover]
# To be more transparent, use MySQL Server port 3306
bind_address = 0.0.0.0
bind_port = 23306
mode = read-write
# 主節點地址:默認情況下第一臺主數據庫為寫主庫,當第一臺主數據庫DOWN機后,第二臺數據庫被提升為主庫
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
# 用于負載均衡的只讀模式
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