ProxySQL MySQL MGR8配置
上一篇博文記錄了如何使用MySQL8.0.12部署mgr集群(單主模式或者多主模式都可以),那么在實際環境中應用如何去連接mgr集群呢?再比如單主模式如何實現讀寫分離呢?用代理軟件需要配合各種腳本太麻煩,修改程序對開發是個考驗,維護方面不是很方便。正好聽說ProxySQL新版本1.4在最新的功能性增強,包含了對MGR的原生支持,不在需要使用第三方腳本進行配合使用。那么這一點對運維人員也是最大的福音。網上查了很多文檔,包括官方文檔等等,看的云里霧里的。說還得用什么sql存儲過程。感覺都是坑。個人覺得沒有一篇文檔能有完全的參考價值。這里意思是說不能完全照著一篇文章做下來,綜合了多個文檔一天半才搞定。說多了全是眼淚~~~希望看到我這篇博客的小伙伴你們不會有此想法。
前期準備工作:
1)mysql8.0.12 mgr集群(一主兩從)配置完成,172.17.0.5是主節點。不會配置的請參考上一篇文章。
2)再準備一臺服務器,需要能通互聯網。另外和mgr集群一個網段。
3)關閉所有服務器的防火墻。
開始工作:
1、proxysql的安裝(使用最新穩定版本1.4.11)
既然mgr集群是基于docker環境上部署,那么再用docker創建一個proxysql容器
docker run -d -it --privileged --name=proxysql centos /usr/sbin/init
docker exec -it proxysql bash
rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
yum-config-manager --disable mysql80-community
yum-config-manager --enable mysql57-community
yum install perl perl-DBD-mysql mysql -y
wget https://github.com/sysown/proxysql/releases/download/v1.4.11/proxysql-1.4.11-1-centos7.x86_64.rpm
rpm -ivh proxysql-1.4.11-1-centos7.x86_64.rpm
systemctl start proxysql
2、proxysql需要和mgr集群通信,那么肯定是通過用戶,這里在mgr主節點上創建兩個用戶,一個監控用戶用于取數據來判斷mgr組里面mysql的讀寫狀態,另外一個業務用戶用于最后測試讀寫分離效果。
mysql> create user monitor@'%' identified by 'Monitor@123';
mysql> grant select on sys.* to monitor@'%';
mysql> create user test@'%' identified by 'Test@123';
mysql> grant all on *.* to test@'%';
mysql> FLUSH PRIVILEGES;
本來應該到這可以了。但是proxysql內置的mysql是8之前的版本,而mgr集群中的mysql是8.0.12版本。采用的是默認認證方式是caching_sha2_password,兩者的身份認證不同。所以為了讓mysql8能兼容新老版本的認證方式需要為上述創建的兩個用戶執行以下命令。這個問題卡了我很長時間,至少我看過的文檔里面沒有一個人提到這個問題。不然后續proxysql連接mgr會報錯:
error 2059: Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
mysql> ALTER USER 'monitor'@'%' IDENTIFIED BY 'Monitor@123' PASSWORD EXPIRE NEVER;
mysql> alter user 'monitor'@'%' IDENTIFIED WITH mysql_native_password BY 'Monitor@123';
mysql> ALTER USER 'test'@'%' IDENTIFIED BY 'Test@123' PASSWORD EXPIRE NEVER;
mysql> alter user 'test'@'%' IDENTIFIED WITH mysql_native_password BY 'Test@123';
mysql> FLUSH PRIVILEGES;
到此mgr集群就不需要再做什么配置了。
3、配置proxysql,其實有兩種方法,第一種是動態配置,也就是sql語句的這種。第二種是通過proxysql.cnf文件配置(個人覺得配置文件簡單,不用敲那么多命令,但是不嘗試第一種動態配置,或許你用配置文件可能不是那么很好理解proxysql的實現過程)。所以還是先看第一種吧!proxysql有兩個端口,一個是管理端口6032,一個是業務連接端口6033。
mysql -u admin -padmin -h 127.0.0.1 -P6032
MySQL > \R Admin> 進入管理員模式
插入mgr集群的三個節點信息,組id都設置一樣。
Admin>INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (1,'172.17.0.5',3306);
Admin>INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (1,'172.17.0.6',3306);
Admin>INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (1,'172.17.0.7',3306);
Admin>select * from mysql_servers;
更新proxysql的監控用戶和密碼及各種時間
Admin>UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
Admin>UPDATE global_variables SET variable_value='Monitor@123' WHERE variable_name='mysql-monitor_password';
Admin>UPDATE global_variables SET variable_value='2000' WHERE variable_name IN ('mysql-monitor_connect_interval','mysql-monitor_ping_interval','mysql-monitor_read_only_interval');
進行驗證
Admin>SELECT * FROM global_variables WHERE variable_name LIKE 'mysql-monitor_%';
將配置寫入運行中,然后再保存到磁盤
Admin>LOAD MYSQL VARIABLES TO RUNTIME;
Admin>SAVE MYSQL VARIABLES TO DISK;
驗證是否可以檢測到后端mgr集群并獲取數據
Admin>SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 10;
Admin>SELECT * FROM monitor.mysql_server_ping_log ORDER BY time_start_us DESC LIMIT 10;
Admin>LOAD MYSQL SERVERS TO RUNTIME;
再查看一下第一步插入的后端mgr集群數據,似乎沒什么變化
Admin>SELECT * FROM mysql_servers;
現在對后端的mgr集群進行分組,1為寫,2為讀,名稱為cluster1
Admin>INSERT INTO mysql_replication_hostgroups VALUES (1,2,'cluster1');
Admin>LOAD MYSQL SERVERS TO RUNTIME;
從proxysql驗證讀寫狀態,已經區分很明顯了
Admin>SELECT * FROM monitor.mysql_server_read_only_log ORDER BY time_start_us DESC LIMIT 10;
再查一下狀態,貌似發生了改變,proxysql 已經將172.17.0.5劃到了寫組,172.17.0.6和172.17.0.7劃到了讀組
Admin>SELECT * FROM mysql_servers;
Admin>SAVE MYSQL SERVERS TO DISK;
Admin>SAVE MYSQL VARIABLES TO DISK;
這樣就基本完成了proxysql配置。接下來我們去驗證讀寫分離效果
插入用戶名、密碼、組
Admin>insert into mysql_users(username,password,default_hostgroup) values('test','Test@123',1);
插入讀寫分離規則,1是寫,2是讀,千萬別弄混了。以select開頭的請求到2組,但是還有一種請求是查詢后更新的語句,這種要配置請求到1組
Admin>insert into mysql_query_rules(rule_id,active,username,match_digest,destination_hostgroup,apply) values(1,1,'test','^SELECT.*FRO UPDATE$',1,1),(2,1,'test','^SELECT',2,1);
Admin>load mysql users to runtime;
Admin>save mysql users to disk;
Admin>load mysql query rules to runtime;
Admin>save mysql query rules to disk;
退出管理員模式,在proxysql上測試讀寫分離
mysql -utest -pTest@123 -h 127.0.0.1 -P6033 -e 'create database test;'
mysql -utest -pTest@123 -h 127.0.0.1 -P6033 -e 'show databases;'
mysql -utest -pTest@123 -h 127.0.0.1 -P6033 -e 'select user,host from mysql.user;'
進入proxysql查看讀寫分離效果,不需要進管理模式即可
mysql -u admin -padmin -h 127.0.0.1 -P6032
mysql> SELECT * from stats_mysql_query_digest;
從上圖看到create和show語句請求的是寫,select請求的從,這樣就完成了讀寫分離測試。
還有另外一個問題我們需要進行測試,當mgr主節點故障,新選舉的主節點會不會被proxysql識別到?
手動停止mgr當前的主庫
systemctl stop mysqld
隨便進入剩下兩個節點中的一個查看當前的主
mysql> select * from performance_schema.replication_group_members;
從圖中我們沒法看到IP,只能看到主機名,肯定是發生了切換,當前主是172.17.0.6
再進入proxysql查看讀到的mgr狀態
mysql> select hostgroup_id,hostname,port,status from runtime_mysql_servers;
已經看到172.1.0.5狀態是SHUNNED,當前hostgroup_id為1的主是172.17.0.6
再次寫入數據測試
mysql -utest -pTest@123 -h 127.0.0.1 -P6033 -e 'create database test1;'
在proxysql上進行查看是否創建成功
mysql -utest -pTest@123 -h 127.0.0.1 -P6033 -e 'show databases;'
test1庫正常創建。到此第一種動態配置方法完成。
下面開始通過配置文件讀取,然后也方便做到docker容器里面。配置文件內容如下:
cat /etc/proxysql.cnf
datadir="/var/lib/proxysql"
admin_variables=
{
}
mysql_variables=
{
}
mysql_servers =
(
)
mysql_users=
(
)
mysql_query_rules=
(
)
mysql_replication_hostgroups=
(
)`
其實就是把第一種方法里面配置的內容都寫到proxysql.cnf文件里面。第二種靜態配置文件測試方法很簡單,刪掉/var/lib/proxysql目錄下db結尾的文件,然后重啟proxysql服務。最后進入proxysql查看數據是否都存在即可!這里就不再進行測試!
總結
以上是生活随笔為你收集整理的ProxySQL MySQL MGR8配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构-王道-绪论
- 下一篇: go defer性能测试