Mysql 8.0--MGR多主--Proxysql實現讀寫分離與負載均衡
proxysql 作為 PXC 叢集的代理實現讀寫分離
參考資料:http://blog.itpub.net/21582653/viewspace-2141126/
對了,有個問題提前請教一下大家,為什麼我的Proxysql代理只能在本機登入不能在其他機器上使用IP登入啊?具體如下:
在別的機器上:
mysql -utest -ptest -h 192.168.1.99 -P6033
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): ProxySQL Error: Access denied for user 'test'@'192.168.1.80' (using password: NO).
這種登入方式只能在192.168.1.99的機器上登入,在別的機器上比如192.168.1.80就不能登入。
MGR多主搭建參考另一篇文章,本文直接記錄Proxysql的配置,出差回來再繼續測試。
以前的Proxysql都要建一個檢視sys.gr_member_routing_candidate_status,也有直接叫做addition_xxxxx什麼的;
本文未使用。
一、安裝
yum -y install http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm
yum -y install Percona-XtraDB-Cluster-client-57 (此步注意提示與mariadb衝突,注意要yum -y remove mysql)
yum -y install proxysql
service proxysql start (或者: /etc/init.d/proxysql start)
如需刪除proxysql:
yum -y remove proxysql;
刪除以下路徑:
rm -rf /usr/share/proxysql
rm -rf /var/lib/proxysql
二、 MYSQL(MGR多主)新增 proxysql 需要用到的使用者
MGR多主:
192.168.1.78:3306
192.168.1.79:3306
192.168.1.80:3306
1、新增監控使用者
mysql>
CREATE USER 'monitor'@'192.168.1.%' IDENTIFIED BY 'monitor';
GRANT USAGE ON *.* TO 'monitor'@'192.168.1.%';
2、新增客戶端使用者
CREATE USER 'test'@'192.168.1.%' IDENTIFIED BY 'test';
GRANT all ON sbtest.* TO 'test'@'192.168.1.%';
3、建測試庫:
create database sbtest;
三、proxysql配置
需要配置非mariadb的mysql客戶端;
mysql -uadmin -padmin -h 127.0.0.1 -P 6032 (admin使用者只能在本地登入)
1、全域性變數配置
mysql> \R Admin>
PROMPT set to 'Admin>'
Admin>
-- 配置提供MSYQL代理的執行緒數
update global_variables set variable_value=32 where variable_name='mysql-threads';
-- 配置返回資訊給客戶端的MYSQL伺服器版本,不論實際MYSQL伺服器是什麼版本都用這裡配置的版本來應答客戶端
update global_variables set variable_value='8.0.11' where variable_name='mysql-server_version';
--修改 proxysql 管理使用者名稱和密碼(可以不修改)
update global_variables set variable_value='admin:admin' where variable_name='admin-stats_credentials';
--修改 proxysql 監控使用者名稱和密碼
update global_variables set variable_value='stats:stats' where variable_name='admin-admin_credentials';
此後使用mysql -ustats -pstats -h 127.0.0.1 -P 6032登入;
2、配置伺服器
mysql -u admin -padmin -h 127.0.0.1 -P6032
mysql> \R Admin>
Admin>
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight) VALUES (1,'192.168.1.78',3306,1000000);
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight) VALUES (1,'192.168.1.79',3306,1);
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight) VALUES (2,'192.168.1.78',3306,1);
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight) VALUES (2,'192.168.1.79',3306,1000000);
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight) VALUES (2,'192.168.1.80',3306,1000000);
分兩個組,1組代表主備,2組代表讀負載均衡;在各節點都沒有故障的情況下,
1組:192.168.1.78為主,192.168.1.79為備,權重代表在主上寫100萬次才會去備上寫1次;
2組:代表192.168.1.79和192.168.1.80各讀100萬次才會去192.168.1.78上讀一次;
3、配置監控
Admin> UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
Admin> UPDATE global_variables SET variable_value='monitor' 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');
4、配置使用者
INSERT INTO mysql_users(username,password,default_hostgroup,transaction_persistent) VALUES ('test','test',1,1);
transaction_persistent 設定為1,確保同一個事務的SQL路由到同一個MSYQL例項,確保開啟事務的SQL路由到主庫。
5、配置路由
兩條路由規則:
Admin>
INSERT INTO mysql_query_rules (rule_id,active,username,match_digest,destination_hostgroup,apply) VALUES (1,1,'test','^SELECT',2,0);
下一條:(暫時沒有執行)
INSERT INTO mysql_query_rules (rule_id,active,username,match_digest,destination_hostgroup,apply) VALUES (1,1,'test','^SELECT. * for update $',2,0);
6、Adding Galera Support
Admin>
INSERT INTO scheduler(id,interval_ms,filename,arg1,arg2,arg3,arg4)
VALUES
(1,'10000','/usr/bin/proxysql_galera_checker','127.0.0.1','6032','0',
'/var/lib/proxysql/proxysql_galera_checker.log');
Admin> LOAD SCHEDULER TO RUNTIME;
Admin>SELECT * FROM runtime_scheduler\G
*************************** 1. row ***************************
id: 1
interval_ms: 10000
filename: /usr/bin/proxysql/proxysql_galera_checker
arg1: 127.0.0.1
arg2: 6032
arg3: 0
arg4: /var/lib/proxysql/proxysql_galera_checker.log
arg5: NULL
1 row in set (0.00 sec)
7、應用配置和把配置儲存到磁碟
Admin>
LOAD MYSQL USERS TO RUNTIME;
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;
LOAD MYSQL VARIABLES TO RUNTIME;
LOAD ADMIN VARIABLES TO RUNTIME
Admin>
SAVE ADMIN VARIABLES TO DISK ;
SAVE MYSQL VARIABLES TO DISK ;
SAVE MYSQL QUERY RULES TO DISK;
SAVE MYSQL SERVERS TO DISK ;
SAVE MYSQL USERS TO DISK ;
8、使用 sysbentch 測試
192.168.1.99上安裝sysbench:
yum -y install sysbench
(1)使用sysbench進行只寫測試
/usr/bin/sysbench --time=600 --threads=30 --mysql-user=test --mysql-password=test /usr/share/sysbench/oltp_write_only.lua --mysql-host=192.168.1.99 \
--mysql-port=6033 --db-driver=mysql --tables=30 --table_size=1000 --mysql_storage_engine=innodb --report-interval=10 --db-ps-mode=disable prepare
/usr/bin/sysbench --time=600 --threads=30 --mysql-user=test --mysql-password=test /usr/share/sysbench/oltp_write_only.lua --mysql-host=192.168.1.99 \
--mysql-port=6033 --db-driver=mysql --tables=30 --table_size=1000 --mysql_storage_engine=innodb --report-interval=10 --db-ps-mode=disable run
檢視測試結果的方法:
登入:mysql -ustats -pstats -h 127.0.0.1 -P 6032
然後查看下錶:
select * from stats.stats_mysql_query_digest;
select hostgroup,digest_text from stats.stats_mysql_query_digest;
可以看到,所有的DELETE INSERT UPDATE CREATE等語句,均在hostgroup=1完成,也就是說都在1組裡完成,跟上面設定的一致。
簡單的測試寫入方法可以直接通過代理連線資料庫:
mysql -utest -ptest -h 192.168.1.99 -P 6033
然後進行各種寫操作:CREATE INSERT DELETE DROP UPDATE等操作,然後到上述的表裡檢視hostgroup是否為1;
或者使用stats賬戶密碼執行:(DELETE可以替換成任何其他關鍵字,也可以加limit關鍵字來限制行數)
select hostgroup,digest_text from stats.stats_mysql_query_digest where digest_text like "DELETE%" order by hostgroup\G;
(2)OLTP 使用sysbench進行只讀測試(檢驗尚未成功)
首先去資料庫裡刪除並重建sbtest庫,因為需要清除裡面的表;
然後執行下列:(可自行調整table_size,太多了容易掉節點,還不知道為啥)
/usr/bin/sysbench --time=300 --threads=100 --mysql-user=test --mysql-password=test /usr/share/sysbench/oltp_read_only.lua --mysql-host=127.0.0.1 --mysql-port=6033 --db-driver=mysql --tables=30 --table_size=3000 --mysql_storage_engine=innodb --report-interval=10 --db-ps-mode=disable --skip_trx=on prepare
/usr/bin/sysbench --time=300 --threads=100 --mysql-user=test --mysql-password=test /usr/share/sysbench/oltp_read_only.lua --mysql-host=127.0.0.1 --mysql-port=6033 --db-driver=mysql --tables=30 --table_size=3000 --mysql_storage_engine=innodb --report-interval=10 --db-ps-mode=disable --skip_trx=on run
同樣登入代理檢視狀態:
select hostgroup,digest_text from stats.stats_mysql_query_digest where digest_text like "SELECT%" order by hostgroup\G;
可以看到hostgroup都是2,但是2組裡有兩個機器,怎麼知道他們之間是否有實現負載均衡呢?待定
(3)OLTP 使用sysbench進行讀寫測試(供參考,未測試)
/usr/bin/sysbench --time=600 --threads=30 --mysql-user=test --mysql-password=test /usr/share/sysbench/oltp_read_only.lua --mysql-host=127.0.0.1 --mysql-port=6033 --db-driver=mysql --tables=30 --skip_trx=on --table_size=3000000 --mysql_storage_engine=innodb --report-interval=10 --db-ps-mode=disable run