点击蓝字关注这个神奇的公众号~
OneProxy部署MySQL数据库的读写分离
一、简介
OneProxy平民软件完全自主开发的分布式数据访问层,帮助用户在MySQL/PostgreSQL集群上快速搭建支持分库分表的分布式数据库中间件,也是一款具有SQL白名单(防SQL注入)及IP白名单功能的SQL防火墙软件。采用与MySQL Proxy一致的反向协议输出模式,对应用非常简单和透明易用,让用户畏惧的数据库故障切换(Failover)、读写分离(Read/Write Split)、分库分表(Horizontal Partitioning)等复杂方案变得极其简单可控!基于Libevent机制实现,单个实例可以实现25万的SQL转发能力,用一个OneProxy节点可以带动整个MySQL集群,为业务发展贡献一份力量。
OneProxy功能:
透明连接池、自动故障切换、透明读写分离、水平分库分表、结果集合并、并行查询支持、安全控制和SQL审计、SQL防火墙、性能统计信息、高可用机制、分布式Sequence、SQL关联度分析、敏感数据识别、事务监控、大数据分析、MyCAT分片兼容、多种集群策略、支持图形客户端
超高性能
OneProxy for MySQL使用C&C++语言开发,充分发挥高性能的异步网络事件编程框架(libevent)优势,历经168小时的高压内存泄漏测试,做到零内存泄露,并使用jemalloc来优化内存分配,单个OneProxy实例可支持高达40W的QPS/TPS。
OneProxy for MySQL内置高效的SQL分析器,解析一条SQL的平均时间为100微秒,基本做到无时延的请求转发,无须担心代理层的性能和时延消耗;固定可调节的工作进程的模式,可以在任何机器上发挥优异的性能, 充分利用CPU和万兆网络资源,实现100万QPS转发。
如图所示,在256个并发的情况下,和直连MySQL有同等的QPS能力,达到无损转发。使用透明连接池的功能,具备MySQL企业版连接池效果,提升后端数据库的处理能力,让应用无限扩容,无须担心后端MySQL连接数。
透明集群
OneProxy for MySQL可在协议层实现对应用透明的读写分离路由,实现读操作的无限扩展,并可实时监控主备之间的复制时延,并与MHA PXC MGR等多种高可用集群技术配合,实现实现应用对后端无感知的高可用。
OneProxy for MySQL可以透明分析SQL语句,根据Where条件中的值在协议层实现分库分表路由,实现写操作的灵活扩展,并实时监控后端数据库的运行状态,根据既定的集群策略进行故障切换,应用无须知道后端运行状态和节点规模。
OneProxy for MySQL支持跨分片的多结果集合操作,例如排序、汇总、分页等等,可让应用无须知道后端节点的规模数,实现对应用透明的扩容和缩容,搭建对应用透明的数据库集群。
安全审计
OneProxy for MySQL可以对不安全的登录和访问请求进实时拦截,可以根据SQL请求的类型进行灵活处理,比如禁止DDL语句、不允许数据删除命令等; 可以根据请求的IP地址进行拦截,对登录者身份进行额外的身份验证(基于不可逆的算法)。
OneProxy for MySQL完全接管应用的登录验证工作,可以实现前后端的密码分离,应用只配置登录OneProxy的密码,而真正登录数据库的密码只需配置在OneProxy上,以防止黑客从应用机器上获取密码。
OneProxy for MySQL可对每一个SQL请求进行实时检查和拦截,可以动态配置黑白SQL名单进行SQL特征检查,以杜绝SQL注入式攻击。通过丰富的实时访问统计数据,以及记录所有的SQL错误操作,可以快速发现试探性的黑客行为。
流量分析
OneProxy for MySQL可实时分析SQL和结果集的流量,与数据库后端的性能视图相比,OneProxy知道SQL语句的来源IP地址、会话及事务上下文,有更多的维度可展示数据,具有更强的结果呈现能力。
根据IP维度的统计,可以快速了解不同应用的数据库交互情况,包括应用访问具体表的情况、SQL执行信息、事务的性能数据,也可了解不同应用使用数据库的交集,实现数据架构的快速优化。
根据事务维度的统计,可以快速了解不同事务和数据库交互情况,包括事务的执行频率、总体执行时间、纯SQL的执行时间、DML操作所占的时间,高效进行性能优化,并可轻松分析事务之间的关联,推动业务数据模型的优化。
稳定可靠
OneProxy for MySQL历经168小时(数百亿次SQL)高压测试,并且对公众用户开放Binary进行试用,数百个用户使用同一个OneProxy版本进行丰富的业务场景验证,造就了OneProxy稳定可靠的品质。
OneProxy for MySQL内置高可用机制,即有实现进程级的重起机制,也有跨机器之间的HA/VIP机制(可实现三节点,用类Paxos机制实现多点选主),也可与Haproxy LVS Zookeeper配合实现多活架构,以确保OneProxy的高可用。
OneProxy for MySQL可与多种高可用架构(如MHA、 Percoan XTraDB Cluster、 MySQL Group Replication等)进行协同工作,实现故障的快速发现、隔离或切换,确保业务层稳定可靠。
一、实验环境
二、实验步骤
部署前准备工作
1、编辑/etc/hosts文件
#vi etc/hosts

2、关闭selinux
#vi etc/selinux/config

3、关闭防火墙
#systemctl stop firewalld
#systemctl disable firewalld
二、安装MySQL,并构建主从
#rpm -e mariadb-libs --nodeps
#tar zxf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
#cd /usr/local/
#mv mysql-5.7.18-linux-glibc2.5-x86_64 mysql
#groupadd mysql
# useradd -r -g mysql -s /bin/false mysql
#vim /etc/my.cnf

#mkdir /usr/local/mysql/data
# chown -R mysql:mysql /usr/local/mysql/
# chmod 755 /usr/local/mysql/data/
# /usr/local/mysql/bin/mysqld --initialize
#cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
#echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
# source /etc/profile
#cat /usr/local/mysql/data/mysql.err | grep password | awk -F localhost: ‘{print $2}’ gn1:E%cjP3x9
#chown -R mysql:mysql /usr/local/mysql/
#service mysqld start
#mysql -u root -p’gn1:E%cjP3x9’
mysql>alter user root@localhost identified by ‘123456’;
#mysql -u root -p123456
搭建主从同步
master1执行:
1、编辑主配置文件
#vi /etc/my.cnf

#service mysqld restart 重启服务
2、授权账户

3、查看master状态
slave1,slave2执行:

#service mysqld restart 重启服务
启动slave,并查看状态
在master1上执行:

在slave1,slave2上执行:

由上述结果看主从同步没问题,下面配置读写分离。
在oneproxy主机执行:
安装OneProxy中间件
http://www.onexsoft.com/zh/oneproxy-read-traffic-scaleout.html 官方文档读写分离
1、安装OneProxy
#tar zxf oneproxy-rhel5-linux64-v6.1.0-ga.tar.gz
#mv oneproxy /usr/local/oneproxy
#cd /usr/local/oneproxy
#cp /usr/local/oneproxy/oneproxy.service /etc/init.d/oneproxy
2、修改服务文件
#vi /etc/init.d/oneproxy
ONEPROXY_HOME=/date/oneproxy 默认
修改为:oneproxy的安装目录
ONEPROXY_HOME=/usr/local/oneproxy
3、编辑启动demo.sh文件
#vi demo.sh
export ONEPROXY_HOME=/date/oneproxy 默认
修改为:oneproxy安装目录

#chmod +x /etc/init.d/oneproxy 给执行权限
#chmod +x demo.sh给执行权限
#chkconfig --add oneproxy 添加为系统服务
#chkconfig oneproxy on 开机自启动
4、进入oneproxy中的bin目录,使用mysqlpwd对密码进行加密

5、修改主配置文件
#vi /usr/local/oneproxy/conf/proxy.conf
[oneproxy]
#proxy-license = A2FF461456A67F28,D2F6A5AD70C9042D
keepalive = 1 //自动检查和重起OneProxy服务
event-threads = 4
proxy-httpserver = :8080//登录web界面的地址及端口(不写即为本机地址)
proxy-adress = :3307//Proxy Server第一个监听地址以及端口
mysql-version = 5.7.18//mysql 的版本
proxy-auto-readonly = 1//自动调整节点类型,简化主从切换!
proxy-forward-clientip = 1
proxy-trans-debug = 1
其中@后面是“Server Group”的名字,如果不指定,则默认为“default”
proxy-master-addresses.1 = 192.168.126.128:3306@servermaster节点(可写入)
proxy-slave-addresses.2 = 192.168.126.129:3306@serverslave1节点(可读取)
proxy-slave-addresses.3 = 192.168.126.130:3306@server slave2节点(可读取)
# proxy-slave-addresses.3 = ...
proxy-group-policy = server:read_slave
proxy组列表,中间密钥是执行./mysqlpwd 123 生成的密钥
proxy-user-list = test/956C97523BADD23B6091B09E332A77B5CBDBBEEF@server
admin-address.1 = 192.168.126.131:4041//proxy管理地址及端口
log-file = log/oneproxy.log
pid-file = log/oneproxy.pid
lck-file = log/oneproxy.lck
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-httptitle = OneProxy Monitor//web界面的密码OneProxy
在master1执行
授权用户
在oneproxy执行:
启动oneproxy服务
#./demo.sh
#service oneproxy start
查看端口
登陆oneproxy web界面
用户名:admin
密码:OneProxy
http://192.168.126.131:8080
交互界面查看状态
负载均衡
读写分离
此时master是126.129
停掉master1;

再次查看 可见还能插入数据;

此时master1已宕掉,master还是由slave1:192.168.126.129担任
停掉slave1:192.168.126.129
此时已经切换到master1:192.168.126.128做master
总结:
由此可见OneProxy相当厉害,无论哪一个宕掉都可以进行自动切换,都可以作为主以及从服务器,起到了负载均衡及读写分离。增加了用户的体验。减少了运维工作,不用担心宕机而至于用户不能写入。同时减轻了主服务器压力。

























