1. 程式人生 > >Mysql 8.0--MGR多主--Proxysql實現讀寫分離與負載均衡

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