ProxySql是MySQL的一款中間件產品,是靈活強大的mysql代理層,可以實現讀寫分離,支持query路由功能,支持動態指定某個sql進行緩存,支持動態加載配置。故障切換和一些sql過濾功能。
實戰演練
環境
centos7.5 mysql5.7
ip:10.106.145.181(從) 10.106.145.182(主) 10.106.145.183(從)
注意:另個從庫設置為read_only=on
我們可以將proxysql單獨安裝在一臺機器上,這里因為機器不夠我們就先將它安裝在10.106.145.183上,下面我們開始操作
1. 安裝并配置好mysq主從
從庫的配置文件中要加入read_only=1,不然在啟動之后查詢mysql_servers表會出現從庫也會被自動加入寫入的組中。proxysql區別主從的唯一方式就是read_only狀態值。 如果是測試則先將從庫臨時設置為只讀
vi /etc/my.cnf
添加 read_only=1
臨時設置:
set global read_only=on
2. 安裝ProxySql
vim /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-2.0.x/centos/$releasever
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
3.安裝ProxySQL和mariadb客戶端(如果有該機器上有mysql客戶端則不需要安裝mariadb)
ProxySQL內置了一個輕量級的數據庫,所以需要有MySQL客戶端連上去對其進行配置
yum install proxysql mariadb -y
這里因為該機器上有mysql客戶端了,所有我使用指令如下
yum install proxysql -y
4.啟動ProxySQL服務
systemctl start proxysql
systemctl status proxysql
設置開機啟動
system enable proxysql
netstat -anlp| grep proxysql
proxysql --version
5.連接管理端口
6032是proxysql的管理端口號6033是對外服務的端口,用戶名密碼都是admin
登錄命令
/usr/local/mysql/bin/mysql -uadmin -padmin -h 127.0.0.1 -P 6032
show databases;
6.四個庫的說明
main:內存配置數據庫,即memory,表里存放后端db實例 用戶驗證 路由規則等信息,該庫信息如 下
其中主要表
mysql_servers:后端可以連接mysql的服務器列表
mysql_users:后端數據庫賬戶和監控賬戶
mysql_query_rules: query路由到后端不同服務器的規則列表
disk庫:持久化磁盤的配置
stats庫:統計信息的匯總
monitor庫:一些監控收集的信息,包括數據庫的健康狀態等
7.在主庫上配置監控賬戶和對外訪問賬戶
create user monitor@'10.106.145.%' identified by 'monitor';
grant all privileges on *.* to monitor@'10.106.145.%' with grant option;
create user zsprox@'10.106.145.%' identified by 'zsprox';
grant all privileges on *.* to zsprox@'10.106.145.%' with grant option;
主庫的賬戶會被同步到另外兩個從庫上,如果屏蔽了則需要分別到從庫上創建上面兩個賬戶
8.Proxysql的多層配置系統
proxysql有一套完整的配置系統 ,方便dba對線上操作,整套配置系統分為三層,頂層為runtime,中間層為memory,底層也就是持久層為disk 和config file,配置結構如下
runtime:代表當前生效的正在使用的配置,無法直接修改這里的配置,必須從下一層load進來
memory:上層連runtime下面連接持久化,這層是可以正常操作proxysql的配置,隨便修改,不會影響生產環境,修改這個配置一般是先在memory中完成的,確認正常后在加載到runtime和持久化到磁盤上
disk 和config file:持久化信息,重啟后內存的信息會丟失,所有需要持久化
9. 添加主從服務器列表
使用超管用戶登錄
/usr/local/mysql/bin/mysql -uadmin -padmin -h 127.0.0.1 -P 6032
use main;
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'10.106.145.181',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'10.106.145.182',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'10.106.145.183',3306);
load mysql servers to runtime;
save mysql servers to disk;
查詢狀態
select *from mysql_servers;
10. 添加監控賬戶
set mysql-monitor_username='monitor';
set mysql-monitor_password='monitor';
load mysql variables to runtime;
save mysql variables to disk;
驗證
select *from monitor.mysql_server_connect_log;
監控正常,沒有報錯信息
11.配置主從分組信息
show create table mysql_replication_hostgroups;
里面write_hostgroup 是寫入組編號,reader_hostgroup是讀取組編號,我們這里使用10 作為寫入組,20為讀取組編號
insert into mysql_replication_hostgroups(writer_hostgroup,reader_hostgroup,comment) values(10,20,'proxy');
load mysql servers to runtime;
save mysql servers to disk;
select *from mysql_replication_hostgroups;
proxysql 會根據server的read_only的取值來將服務器進行分組, 只讀的分配到20(讀取組),不是只讀的分配到10(寫入組)
12.配置對外訪問賬戶
對方訪問賬戶默認指定主庫,并對該用戶開啟事務持久化保護
mysql_users表中的transaction_persistent 的字段默認是0,建議在創建完用戶之后設置為1,避免發生臟讀幻讀現象,命令如下
insert into mysql_users(username,password,default_hostgroup) values('zsprox','zsprox',10);
update mysql_users set transaction_persistent=1 where username='zsprox';
load mysql users to runtime;
save mysql users to disk;
驗證登錄的服務器就是主庫(這里登錄ip就是我們安裝proxysql的服務器地址,一般建議單獨安裝一臺 ,不要和mysql集群中的機器使用一臺)
/usr/local/mysql/bin/mysql -uzsprox -pzsprox -h 10.106.145.183 -P 6033 -e "select @@hostname"
注意對外端口是6033
13 配置讀寫分離策略
配置讀寫分離需要使用mysql_query_rules 表,表中的match_pattern字段就是代表設置的規則,destination_hostgroup字段代表默認指定的分組,Apply代表真正執行的應用規則。
把所有以select開頭的語句全部分配到20的讀組中,其他都分配到寫組10中去
insert into mysql_query_rules(active,match_pattern,destination_hostgroup,apply) values(1,'^select.*for update$',10,1);
insert into mysql_query_rules(active,match_pattern,destination_hostgroup,apply) values(1,'^select',20,1);
load mysql query rules to runtime;
save mysql query rules to disk;
14 測試讀寫分離
通過創建對外賬戶zsproxy連接proxysql登錄數據庫
命令如下
/usr/local/mysql/bin/mysql -u zsprox -p -h 10.106.145.183 -P 6033
查詢一個表
select * from test.b
在登錄管理端口 查詢監控狀態
/usr/local/mysql/bin/mysql -uadmin -padmin -h 127.0.0.1 -P 6032
select *from stats_mysql_query_digest;
在6033端口執行插入操作
insert into b values(20);
再次查詢狀態
15 調整權重
讀寫分離成功后,我們可以調整權重,讓某臺機器承受更多的讀操作,在表mysql_servers上進行設置
update mysql_servers set weight=10 where hostname='10.106.145.181';
load mysql servers to runtime;
save mysql servers to disk;
到此讀寫分離正式配置完畢了