Mysql-router 8.0+Mysql8.0的MGR(單主模式)的配置與測試
本文僅供參考,亦有參考其他作者的文件及官方文件,在此一併致謝。
一、環境及軟體:VMware,CenOS7.3,mysql 8.0,mysql-router 8.0
測試組合:
mysql-router 8.0+MGR單主叢集
-------------------------------------
寫在前面的總結:
1、MGR單主模式,不太合適,因為MGR單主模式下主庫failover之後,下一個主庫是投票出來的,不知道漂去哪裡,VIP+keepalived的方式沒用;
2、mysql-router配置檔案裡寫的read-write的主機,只要前一個能用,後一個就不會被用(“首個可用”演算法);
3、MGR單主模式下,主以外其他的機器都是read-only,一旦主機發生failover,其他的庫無法通過代理寫入;
4、mysql-router需要分別給寫端(read-write)和讀端(read-only)繫結不同的埠(本文是7001和7002),這可能,可能需要應用端來做讀寫分離,相比之下Atlas代理則無需繫結埠;
所以,Mysql-router適合的模式應該是:普通的主從叢集,多個主庫互為主從且互相之間有VIP,或者傳統的MHA叢集等。
--------------------------------------
二、對mysql-router的一些說明:
讀寫分離:read-write模式:採用“首個可用”演算法,優先使用第一個server,當第一個server不可達時,將會Failover到第二個server,依次進行。如果都不可達,那麼請求將會被中斷,且此時Router將不可用。
負載均衡:read-only模式
Mysql-router可以實現對不同的後端資料進行資料負載均衡,read-only模式將採用“輪詢”演算法,依次選擇server新建連線,如果某個Server不可達,將會重試下一個Server,如果所有的Server都不可達,那麼此埠上的請求將中斷,即READ操作將不可用。同時Router將會持續與每個Server保持心跳探測,當恢復後重新加入Active列表,此後那些新建的連線請求可以分發給此Server。
三、配置與測試過程
各伺服器的主機名、IP、角色分配:
mysql-router:192.168.1.99
mgr1:192.168.1.88:3308 Primary
mgr2:192.168.1.89:3308 Secondary
mgr3:192.168.1.90:3308 Secondary
1、下載安裝:
cd /soft
wget https://dev.mysql.com/get/Downloads/MySQL-Router/mysql-router-8.0.11-linux-glibc2.12-x86-64bit.tar.gz
tar -zxvf mysql-router-8.0.11-linux-glibc2.12-x86-64bit.tar.gz
cp -rf mysql-router-2.1.4-linux-glibc2.12-x86-64bit /usr/local/mysql-router
mkdir /usr/local/mysql-router/conf/
2、編輯配置檔案:
vim /usr/local/mysql-router/conf/mysqlrouter.ini
---------
[DEFAULT]
logging_folder=/usr/local/mysql-router/log
runtime_folder=/usr/local/mysql-router/run
data_folder=/usr/local/mysql-router/data
connect_timeout=30
read_timeout=30
[logger]
level = INFO
[routing:failover]
bind_address = 0.0.0.0
bind_port = 7001 #埠7001
max_connections = 1024
mode = read-write
destinations = 192.168.1.88:3308,192.168.1.89:3308 #可用的支援寫操作的主庫,或者主庫共用的VIP
[routing:balancing]
bind_address = 0.0.0.0
bind_port = 7002 #埠7002
max_connections = 1024
mode = read-only
destinations = 192.168.1.89:3308,192.168.1.90:3308 #參與讀負載均衡的從庫們
---------
改一下環境變數:
echo "export PATH=$PATH:/usr/local/mysql-router/bin/" >> /etc/profile
source /etc/profile
驗證安裝配置是否成功:
mysqlrouter -V
MySQL Router v8.0.11 on Linux (64-bit) (GPL community edition)
chown -R mysql: /usr/local/mysql-router
3、啟動
systemctl start mysqlrouter.service或者直接使用下面語句:
/usr/local/mysql-router/bin/mysqlrouter -c /usr/local/mysql-router/conf/mysqlrouter.ini &
netstat -ntpl|grep mysqlrouter可以看到7001和7002埠已經被使用;
4、登入測試及負載均衡測試:
資料庫裡建立賬號並授權允許遠端登入,此處使用aaa使用者
先測試寫埠7001:
mysql -uaaa -paaa-h 192.168.1.99 -P 7001 -e "select @@hostname"
mgr1,因為寫的話read-write裡面的兩個主機,首先訪問第一個,只有第一個故障才會訪問第二個;
再測試讀:
mysql -umonitor -pmonitor -h 192.168.1.99 -P 7002 -e "select @@hostname"
輪詢顯示mgr1和mgr2。
5、fail-over測試,
(1)、從庫failover:重新拉起後可以自動加入輪詢;
mgr2上執行pkill mysql
mysql -umonitor -pmonitor -h 192.168.1.99 -P 7002 -e "select @@hostname"
只得到mgr3
重啟mgr2上的mysql再次執行
mysql -umonitor -pmonitor -h 192.168.1.99 -P 7002 -e "select @@hostname"
可輪詢。
(2)、主庫failover
mgr1上pkill mysql
mysql -umonitor -pmonitor -h 192.168.1.99 -P 7001 -e "select @@hostname"
得到mgr2,但是如果執行:
mysql -umonitor -pmonitor -h 192.168.1.99 -P 7001 -e "create database xxxx"
就會報錯:The MySQL server is running with the --super-read-only option so it cannot execute this statement
說明備份主庫不能是read-only,否則主庫切換之後會報錯,MGR單主模式不行。
四、官方配置檔案如下供參考
# File automatically generated during MySQL Router bootstrap
[DEFAULT]
logging_folder=/opt/routers/myrouter/log
runtime_folder=/opt/routers/myrouter/run
data_folder=/opt/routers/myrouter/data
keyring_path=/opt/routers/router/data/keyring
master_key_path=/opt/routers/myrouter/mysqlrouter.key
connect_timeout=30
read_timeout=30
[logger]
level = INFO
[metadata_cache:mycluster]
router_id=5
bootstrap_server_addresses=mysql://localhost:3310,mysql://localhost:3320,mysql://localhost:3330
user=mysql_router5_6owf3spq1c6n
metadata_cluster=mycluster
ttl=5
[routing:mycluster_default_rw]
bind_address=0.0.0.0
bind_port=6446
destinations=metadata-cache://mycluster/default?role=PRIMARY
routing_strategy=round-robin
protocol=classic
[routing:mycluster_default_ro]
bind_address=0.0.0.0
bind_port=6447
destinations=metadata-cache://mycluster/default?role=SECONDARY
routing_strategy=round-robin
protocol=classic
[routing:mycluster_default_x_rw]
bind_address=0.0.0.0
bind_port=64460
destinations=metadata-cache://mycluster/default?role=PRIMARY
routing_strategy=round-robin
protocol=x
[routing:mycluster_default_x_ro]
bind_address=0.0.0.0
bind_port=64470
destinations=metadata-cache://mycluster/default?role=SECONDARY
routing_strategy=round-robin
protocol=x