mysql oneproxy mha_MHA+ProxySQL 读写分离高可用

文档结构如下:

b2ae8c8b9d7953b01f9964a2804ec92b.png

1、ProxySQL说明

ProxySQL是mysql的一款中间件的产品,是灵活的mysql代理层,可以实现读写分离,支持query路由器的功能,支持动态指定sql进行缓存,支持动态加载配置,故障切换和一些sql的过滤功能。

其他产品:Dbproxy,MyCAT,OneProxy等。

2、MHA+Proxysql 读写分离实验

2.1. 安装步骤

IP

角色

操作系统

版本

172.16.10.21

Proxysql

Redhat6.7

1.4.9

172.16.10.32

Master

Redhat6.7

5.7.20

172.16.10.34

Slave1

Redhat6.7

5.7.20

172.16.10.36

Salve2

Redhat6.7

5.7.20

172.16.10.30

VIP

从库开启read_only=1,主库read_only=0

ProxySQL安装源码包:

yum -y install perl-DBD-MYSQL perl-DBI perl-Time-Hires perl-IO-Socket-ssl

或者简单粗暴的 :yum -y install perl*

proxySQL软件包下载地址:

https://www.percona.com/downloads/proxysql/

安装proxysql

rpm -ivh proxysql-1.4.9-1.1.el6.x86_64.rpm

配置文件路径为:/etc/proxysql.cnf

启动proxysql

service proxysql start

f7e992ed5b92b16a207313469c37e409.png

netstat -anlp |grep proxysql

bb1356d4738cf1e2877f91eb5e1b0fd3.png

6032是管理端口,6033是对外服务的端口号

用户名和密码默认都是admin

使用帮助如下:

08482fdb9cd24d205faf2b6140fef5d0.png

查看proxysql 安装库情况:

mysql -uadmin -padmin -h127.0.0.1 -P6032

b4d5bc5dfd1bcdc8ba39853ee74064d9.png

2.2. Proxysql库说明

Proxysql 版本1.4.9-percona-1.1实例:

Main:内存配置数据库,即memory,表里存放后端db实例,用户验证,路由规则等信息。Main库中有如下信息:

40946969317d4b43252506f65916dfc8.png

mysql_servers          --后端可以连接mysql服务器的列表

mysql_users            --配置后端数据库的账号和监控的账号

mysql_query_rules    --指定query路由到后端不同服务器的规则列表

disk库:持续化磁盘的配置。

Stats库:统计信息的汇总。

Monitor库:一些监控的收集信息,包括数据库的健康状态。

2.3. 配置proxysql监控

顶层为runtime,中间层为memory,底层也就是持久层disk和config file。

3cb89b785e4c19469a9167f4e3b91102.png

Runtime:代表Proxysql当前生效的正在使用的配置,无法直接修改这里的配置,必须要从下一层load进来。

Memory:memory层上面连接runtime层,下面连接持久化层。在这层可以正常操作Proxysql配置,随便修改,不会影响生产环境。修改一个配置一般都是现在memory层完成,确认正常后在加载到runtime和持久化到磁盘。

Disk和config file:持久化配置信息,重启后内存的配置信息会丢失,所以需要将配置信息保留在磁盘中。重启时,可以从磁盘快速加载回来。

1为写组,2为读组。

insert into mysql_servers(hostgroup_id,hostname,port) values(10,'172.16.10.32',3307);

insert into mysql_servers(hostgroup_id,hostname,port) values(10,'172.16.10.34',3307);

insert into mysql_servers(hostgroup_id,hostname,port) values(10,'172.16.10.36',3307);

select * from mysql_servers;

fde7d3d61e83e32187b69fbf01736199.png

配置监控账户:

create user 'mon'@'172.16.10.%' IDENTIFIED BY 'mon';

GRANT all privileges ON *.* TO 'mon'@'172.16.10.%' with grant option;

对外访问账户:

create user 'wr'@'172.16.10.%' IDENTIFIED BY 'wr';

GRANT all privileges ON *.* TO ON *.* TO 'wr'@'172.16.10.%' with grant option;

配置Proxysql监控:

set mysql-monitor_username='mon';

set mysql-monitor_password='mon';

load mysql servers to runtime;

save mysql servers to disk;

9e932f99a8b8ec757376b055fa435efa.png

之后验证监控信息:

select * from monitor.mysql_server_connect_log limit 6;

40dedf24df72df7186d08ff158dd9a73.png

select * from monitor.mysql_server_ping_log order by time_start_us limit 6;

77c76f49433c356ab884a59521cb162d.png

监控信息提示正常。

2.4. 配置Proxysql主从分区信息

配置主从分区需要用到mysql_replication_hostgroups

show create table mysql_replication_hostgroups\G;

8f1e7ac19968993cfa7cb824b3e12329.png

writer_hostgroup 写入组的编号

reader_hostgroup 读取组的编号

实验使用10作为写入组,20作为读取组。

insert into mysql_replication_hostgroups values(10,20,'proxy');

load mysql servers to runtime;

save mysql servers to disk;

select * from mysql_replication_hostgroups;

607e069939fe7e07e4572d0ea82a85ff.png

Proxysql 会根据server的read_only的取值将服务进行分组,read_only=0的server,master被分到编号为10的组,read_only=1的server,slave则被分到编号为20的读组。

select * from mysql_servers;

22d7977b5369e477b71d9311f8da4ace.png

Mysql_users表中的 transaction_persistent字段默认为0,建议在创建完用户之后设置为1,避免发生脏读幻读等现象:

insert into mysql_users(username,password,default_hostgroup) values('wr','wr',10);

update mysql_users set transaction_persistent=1 where username='wr';

load mysql users to runtime;

save mysql users to disk;

测试登陆(端口6033):

mysql -uwr -pwr -h 172.16.10.34 -P3307 -e "show slave status\G"

7b4dab81c62dce0d0094e53f1c4ef13d.png

2.5. 配置读写分离策略

配置读写分离使用的表mysql_query_rules:

match_pattern:字段就是代表设置的规则。

destination_hostgroup:字段代表默认指定的分组。

apply代表真正执行应用规则。

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;

2.6. 测试读写分离

通过wr所创建的账户连接Proxysql登陆数据库。

mysql -uwr -pwr -h172.16.10.21 -P6033

72b4bd12f8b72b28513735556d19d0ab.png

b4eebad293a85e2ecffae27bc173f902.png

通过管理端口登陆查看:

mysql -uadmin -padmin -h127.0.0.1 -P6032

select * from stats_mysql_query_digest;

f5398978c58c352a4200b2b702b2ad9b.png

可以得知,select count(*) from t; 这条语句自动编号到20的读组上,即slave上。

测试update。

c19e7976530bf4ee41d6fb143d5775d7.png

939a9c3310efe6c410db3f79e484747b.png

测试update语句在10的写组上。

2.7. 读写分离权重调整

读写分离设置成功后,可以调节权重,如slave2(172.16.10.36)多进行读操作。

update mysql_servers set weight=10 where hostname='172.16.10.36';

load mysql servers to runtime;

load mysql variables to runtime;

load mysql users to runtime;

save mysql servers to disk;

save mysql variables to disk;

save mysql users to disk;

8d514fd970fa625aa38d969d7c5e7794.png

select * from mysql_servers;

05cc5f39d826bba3e596751531cd56ce.png

2.8. MHA failover测试

测试前:

Master 172.16.10.32为master,组数为10,写组。

Failover后:

ac6fa159178f54a091e8f71a4ce136e5.png

新的master为172.16.10.34(原slave1)

select * from runtime_mysql_servers;

2be9d23a9d705e78af396421c2574756.png

新的master为写组(10),原为20读组。

进行读写分离测试:

654108c793967133a67e1a568e237ec0.png

发现读写分离仍然成功(回切后也成功)。

1ad555180425f3ff76f76d4a890633ec.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值