OneProxy实现MySQL读写分离与负载均衡

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
传统型负载均衡 CLB,每月750个小时 15LCU
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介:

Part1:写在最前

    OneProxy平民软件完全自主开发的分布式数据访问层,帮助用户在MySQL/PostgreSQL集群上快速搭建支持分库分表的分布式数据库中间件,也是一款具有SQL白名单(防SQL注入)及IP白名单功能的SQL防火墙软件。采用与MySQL Proxy一致的反向协议输出模式,对应用非常简单和透明易用,让用户畏惧的数据库故障切换(Failover)、读写分离(Read/Write Split)、分库分表(Horizontal Partitioning)等复杂方案变得极其简单可控!基于Libevent机制实现,单个实例可以实现25万的SQL转发能力,用一个OneProxy节点可以带动整个MySQL集群,为业务发展贡献一份力量。


Part2:环境简介

HE1:192.168.1.248 slave1

HE2:192.168.1.249 slave2

HE3:192.168.1.250 Master

HE4:192.168.1.251 Oneproxy


环境构建

Part1:安装Oneproxy

1
2
3
[root@HE4 ~] # tar xvf oneproxy-rhel5-linux64-v5.8.5-ga.tar.gz
[root@HE4 oneproxy] # ls
bin  conf  demo.sh  log  oneproxy.service  README  testadmin.sql  testautocommit.sql  testproxy.sql  trantest.sql


Part2:构建主从环境

本文的架构是一主两从,HE3作为Master,HE1,HE2作为Slave。主从的构建不是本文的重点,需要的可移步:

1分钟利用mysqlreplicate快速搭建MySQL主从

http://suifu.blog.51cto.com/9167728/1878443


Part3:配置Oneproxy

目录中的demo是初次启动脚本,oneproxy.service是启停脚本,在新版的oneproxy中,conf文件夹的proxy.cnf为配置文件

1
2
3
4
5
6
[root@HE4 oneproxy] # cat demo.sh 
#/bin/bash
#
export  ONEPROXY_HOME= /root/oneproxy
# valgrind --leak-check=full \
   ${ONEPROXY_HOME} /bin/oneproxy  --defaults- file =${ONEPROXY_HOME} /conf/proxy .conf

我们将demo.sh中的ONEPROXY_HOME变更为解压oneproxy时所在的目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[root@HE4 oneproxy] # cat oneproxy.service 
#!/bin/bash
# chkconfig: - 30 21
# description: OneProxy service.
# Source Function Library
/etc/init .d /functions
# OneProxy Settings
ONEPROXY_HOME= /root/oneproxy
ONEPROXY_SBIN= "${ONEPROXY_HOME}/bin/oneproxy"
ONEPROXY_CONF= "${ONEPROXY_HOME}/conf/proxy.conf"
ONEPROXY_PID= "${ONEPROXY_HOME}/log/oneproxy.pid"
RETVAL=0
prog= "OneProxy"
start() {
         echo  -n $ "Starting $prog ... "
         daemon $ONEPROXY_SBIN --defaults- file =$ONEPROXY_CONF
RETVAL=$?
echo
}
stop() {
         echo  -n $ "Stopping $prog ... "
if  [ -e ${ONEPROXY_PID} ];  then
daemon  kill  -INT $( cat  ${ONEPROXY_PID})
        RETVAL=$?
fi
echo
}
restart(){
         stop
sleep  1
         start
}
case  "$1"  in
   start)
         start
         ;;
   stop)
         stop
         ;;
   restart)
         restart
         ;;
   *)
         echo  $ "Usage: $0 {start|stop|restart}"
         RETVAL=1
esac
exit  $RETVAL

同时,将oneproxy.service中的ONEPROXY_HOME也改为解压时的目录


进入oneproxy中的bin目录,使用mysqlpwd对密码进行加密

[root@HE4 oneproxy]# cd bin/

[root@HE4 bin]# ls

mysqlpwd  oneproxy

[root@HE4 bin]# ./mysqlpwd MANAGER

1C6D087BA5D2607A27DECB2F2AFE247E911E877A


编辑proxy.cnf中的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@HE4 conf] # cat proxy.conf 
[oneproxy]
keepalive     = 1
event-threads = 4
proxy-group-policy.2 =  test : read -slave
log- file       = log /oneproxy .log
pid- file       = log /oneproxy .pid
lck- file       = log /oneproxy .lck
proxy-auto- readonly  = 1
proxy-forward-clientip = 1
proxy-trans-debug = 1
proxy-address            = :3307
mysql-version = 5.7.16
proxy-master-addresses.1 = 192.168.1.250:3306@ test
proxy-slave-addresses.2 = 192.168.1.248:3306@ test
proxy-slave-addresses.3 = 192.168.1.249:3306@ test
proxy-user-list          = sys_admin /1C6D087BA5D2607A27DECB2F2AFE247E911E877A @ test
proxy-user-group         =  test :sys_admin /1C6D087BA5D2607A27DECB2F2AFE247E911E877A @ test
proxy-part-template      = conf /template .txt
proxy-part-tables.1      = conf /part .txt
proxy-part-tables.2      = conf /part2 .txt
proxy-part-tables.3      = conf /cust1 .txt
proxy-charset            = utf8_bin
proxy-secure-client = 127.0.0.1
# proxy-license  = 32C54560E06EFF3E
proxy-httpserver = :8080
proxy-httptitle = OneProxy Monitor


Part4:启动Oneproxy

[root@HE4 oneproxy]# ./demo.sh

[root@HE4 oneproxy]# ./oneproxy.service restart

Stopping OneProxy ...                                      [  OK  ]

Starting OneProxy ...                                      [  OK  ]

测试

Part1:Oneproxy状态校验

浏览器打开192.168.1.251:8080端口能够看到oneproxy的管理页面

wKioL1haDsfRxw9DAALDhlq5SCA495.jpg

这里可以看到主从的各种状态信息。



Part2:负载均衡与读写分离校验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
[root@HE1 ~] # mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"select @@hostname;"
mysql: [Warning] Using a password on the  command  line interface can be insecure.
+------------+
| @@ hostname  |
+------------+
| HE1        |
+------------+
[root@HE1 ~] # mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"select @@hostname;"
mysql: [Warning] Using a password on the  command  line interface can be insecure.
+------------+
| @@ hostname  |
+------------+
| HE2        |
+------------+
[root@HE1 ~] # mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"select @@hostname;"
mysql: [Warning] Using a password on the  command  line interface can be insecure.
+------------+
| @@ hostname  |
+------------+
| HE1        |
+------------+
[root@HE1 ~] # mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"select @@hostname;"
mysql: [Warning] Using a password on the  command  line interface can be insecure.
+------------+
| @@ hostname  |
+------------+
| HE2        |
+------------+
[root@HE1 ~] # mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"select @@hostname;"
mysql: [Warning] Using a password on the  command  line interface can be insecure.
+------------+
| @@ hostname  |
+------------+
| HE1        |
+------------+
[root@HE1 ~] # mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"begin;select @@hostname;commit;"
mysql: [Warning] Using a password on the  command  line interface can be insecure.
+------------+
| @@ hostname  |
+------------+
| HE3        |
+------------+
[root@HE1 ~] # mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 -e"begin;select @@hostname;commit;"
mysql: [Warning] Using a password on the  command  line interface can be insecure.
+------------+
| @@ hostname  |
+------------+
| HE3        |
+------------+

可以看到HE1,HE2两个slave作为负载均衡没有问题,HE3作为写服务器也没有问题。




——总结——

OneProxy配合MySQL实现读写分离与负载均衡实验构建成功,Oneproxy还具有分库分表功能,今后会进一步研究。由于笔者的水平有限,编写时间也很仓促,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。







 本文转自 dbapower 51CTO博客,原文链接: http://blog.51cto.com/suifu/1884673
,如需转载请自行联系原作者

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
关系型数据库 MySQL Java
MySQL的主从复制 && SpringBoot整合Sharding-JDBC解决读写分离
MySQL的主从复制 && SpringBoot整合Sharding-JDBC解决读写分离
139 0
|
1月前
|
负载均衡 监控 关系型数据库
MySQL 官宣:支持读写分离了!!
【10月更文挑战第8天】MySQL的读写分离功能显著提升了数据库性能、可用性和可靠性。通过将读写操作分配至不同服务器,有效减轻单个服务器负载,提高响应速度与吞吐量,并增强系统稳定性。此外,它还支持便捷的扩展方式,可通过增加只读服务器提升读操作性能。实现读写分离的方法包括软件层面(如使用数据库中间件)和硬件层面(使用独立服务器)。使用时需注意数据一致性、负载均衡及监控管理等问题。
102 0
|
6月前
|
SQL 关系型数据库 MySQL
mysql 主从复制与读写分离
mysql 主从复制与读写分离
|
2月前
|
关系型数据库 MySQL Java
MySQL主从复制实现读写分离
MySQL主从复制(二进制日志)、 Sharding-JDBC实现读写分离
MySQL主从复制实现读写分离
|
3月前
|
负载均衡 算法 关系型数据库
MySQL集群如何实现负载均衡?
【8月更文挑战第16天】MySQL集群如何实现负载均衡?
183 6
|
3月前
|
SQL 关系型数据库 MySQL
(二十五)MySQL主从实践篇:超详细版读写分离、双主热备架构搭建教学
在上篇《主从原理篇》中,基本上把主从复制原理、主从架构模式、数据同步方式、复制技术优化.....等各类细枝末节讲清楚了,本章则准备真正对聊到的几种主从模式落地实践,但实践的内容通常比较枯燥乏味,因为就是调整各种配置、设置各种参数等步骤。
542 2
|
3月前
|
关系型数据库 MySQL PHP
开发者必看:MySQL主从复制与Laravel读写分离的完美搭配
开发者必看:MySQL主从复制与Laravel读写分离的完美搭配
72 2
|
3月前
|
SQL 关系型数据库 MySQL
mysql读写分离,主从同步
本文介绍了如何在Laravel项目中配置数据库读写分离,并实现MySQL主从同步。主要步骤包括:在`config/database.php`中设置读写分离配置;为主机授予从机访问权限;配置各MySQL服务器的`/etc/my.cnf`文件以确保唯一的`server-id`;以及通过SQL命令设置主从关系并启动从服务。文章还针对一些常见错误提供了排查方法。最后通过验证确认主从同步是否成功。[原文链接](https://juejin.cn/post/6901581801458958344)。版权所有者为作者佤邦帮主,转载请遵循相关规定。
|
3月前
|
cobar 关系型数据库 MySQL
使用MyCat实现MySQL主从读写分离(一)概述
【8月更文挑战第11天】MySQL读写分离通过主从复制分散负载,主库负责写操作,从库承担读查询,以复制技术确保数据一致性。此策略有效缓解锁竞争,提升查询效能并增强系统可用性。实现方式包括应用层处理,简便快捷但灵活性受限;或采用中间件如MyCAT、Vitess等,支持复杂场景但需专业团队维护。
111 0
|
3月前
|
SQL 关系型数据库 MySQL
基于proxysql实现MySQL读写分离
基于proxysql实现MySQL读写分离

推荐镜像

更多