OneProxy实现MySQL分库分表

OneProxy实现MySQL分库分表

简介

Part1:写在最前

随着网站的壮大,MySQL数据库架构一般会经历一个过程:

当我们数据量比较小的时候,一台单实例数据库足矣。等我们数据量增大的时候,我们会采用一主多从的数据库架构来降低我们的读写io。当我们某张业务表达到几百万上千万甚至上亿时,就应该去进行分表处理。本文演示OneProxy对数据库实现分表处理,对前端应用是透明的。

Part2:环境简介

HE1:192.168.1.248 Master1

HE3:192.168.1.250 Master2

HE4:192.168.1.251 Oneproxy

环境构建

Part1:安装Oneproxy

Oneproxy的安装不是本文讲述的重点,需要的可移步至

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

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

Part2:proxy.cnf

proxy.cnf文件是oneproxy的主要参数配置文件,新版的oneproxy对整个目录进行了重新的划分,配置文件都放在了conf目录里

[[email protected] oneproxy]# cat conf/proxy.conf 
[oneproxy]
keepalive = 1
event-threads = 4
log-file = log/oneproxy.log
pid-file = log/oneproxy.pid
lck-file = log/oneproxy.lck
mysql-version = 5.7.16
proxy-address = :3307
proxy-master-addresses.1 = 192.168.1.248:[email protected]
proxy-master-addresses.2 = 192.168.1.250:[email protected]
proxy-user-list = sys_admin/[email protected]
proxy-part-tables.1 = /root/oneproxy/conf/part.txt
#proxy-part-tables.2 = /root/oneproxy/conf/part2.txt
proxy-charset = utf8_bin
proxy-group-policy.1 = group1:master-only
proxy-group-policy.2 = group2:master-only
proxy-secure-client = 192.168.1.248
proxy-sequence.1 = default
proxy-httpserver = :8080
proxy-httptitle = OneProxy Monitor

Part3:part.txt

part.txt文件是分区策略配置文件,在本博文中,采取hash分区来进行简单演示

[[email protected] oneproxy]# cat conf/part.txt 
[
  {
    "table" : "helei",
    "pkey" : "id",
    "type" : "int",
    "method" : "hash",
    "partitions" :     
      [
        { "suffix" : "_0", "group": "group1" },
        { "suffix" : "_1", "group": "group2" },
        { "suffix" : "_2", "group": "group1" },
        { "suffix" : "_3", "group": "group2"}
      ]
  }
]


实战

Part1:启动OneProxy

[[email protected] oneproxy]# ./oneproxy.service start
Starting OneProxy ...                                      [  OK  ]

Part2:监控页面

我这里是两台Master


Part3:创建相关表

登录oneproxy管理库创建表

[[email protected] ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 test
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 103
Server version: 5.7.16 OneProxy-Community-5.8.5 (OneXSoft)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.
mysql> create table helei(
    -> id int(10) unsigned NOT NULL AUTO_INCREMENT,
    -> c1 int(10) NOT NULL DEFAULT ‘0‘,
    -> c2 int(10) unsigned DEFAULT NULL,
    -> c5 int(10) unsigned NOT NULL DEFAULT ‘0‘,
    -> c3 timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    -> c4 varchar(200) NOT NULL DEFAULT ‘‘,
    -> PRIMARY KEY(id),
    -> KEY idx_c1(c1),
    -> KEY idx_c2(c2)
    -> )ENGINE=InnoDB ;
Query OK, 0 rows affected (0.27 sec)
mysql> \q


Part4:插入数据

[[email protected] ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 test -e"insert into helei(id,c1,c2,c5,c4) values(1,1,1,1,‘1‘)"
mysql: [Warning] Using a password on the command line interface can be insecure.
[[email protected] ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 test -e"insert into helei(id,c1,c2,c5,c4) values(2,2,2,2,‘2‘)"
mysql: [Warning] Using a password on the command line interface can be insecure.
[[email protected] ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 test -e"insert into helei(id,c1,c2,c5,c4) values(3,3,3,3,‘3‘)"
mysql: [Warning] Using a password on the command line interface can be insecure.
[[email protected] ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 test -e"insert into helei(id,c1,c2,c5,c4) values(4,4,4,4,‘4‘)"
mysql: [Warning] Using a password on the command line interface can be insecure.

校验

Part1:校验oneproxy表内容

这里可以看到虚拟表helei中已经具有刚刚插入的内容;

[[email protected] ~]# mysql -usys_admin -pMANAGER -h192.168.1.251 -P3307 test -e"select * from helei";
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+----+------+----+---------------------+----+
| id | c1 | c2   | c5 | c3                  | c4 |
+----+----+------+----+---------------------+----+
|  4 |  4 |    4 |  4 | 2016-12-23 00:07:21 | 4  |
|  1 |  1 |    1 |  1 | 2016-12-23 16:07:04 | 1  |
|  2 |  2 |    2 |  2 | 2016-12-23 00:07:10 | 2  |
|  3 |  3 |    3 |  3 | 2016-12-23 16:07:16 | 3  |
+----+----+------+----+---------------------+----+


Part2:校验Master1中的内容

[[email protected] ~]# mysql -uroot -pMANAGER test
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 158
Server version: 5.7.16-log MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| checksums      |
| helei_0        |
| helei_2        |
| sbtest         |
+----------------+
4 rows in set (0.00 sec)
mysql> select * from helei_0;
+----+----+------+----+---------------------+----+
| id | c1 | c2   | c5 | c3                  | c4 |
+----+----+------+----+---------------------+----+
|  4 |  4 |    4 |  4 | 2016-12-23 00:07:21 | 4  |
+----+----+------+----+---------------------+----+
1 row in set (0.00 sec)
mysql> select * from helei_2;
+----+----+------+----+---------------------+----+
| id | c1 | c2   | c5 | c3                  | c4 |
+----+----+------+----+---------------------+----+
|  2 |  2 |    2 |  2 | 2016-12-23 00:07:10 | 2  |
+----+----+------+----+---------------------+----+
1 row in set (0.00 sec)


Part3:校验Master2中的内容

[[email protected] ~]# mysql -uroot -pMANAGER test
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2997
Server version: 5.7.16-log MySQL Community Server (GPL)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| checksums      |
| helei_1        |
| helei_3        |
+----------------+
3 rows in set (0.00 sec)
mysql> select * from helei_1;
+----+----+------+----+---------------------+----+
| id | c1 | c2   | c5 | c3                  | c4 |
+----+----+------+----+---------------------+----+
|  1 |  1 |    1 |  1 | 2016-12-23 16:07:04 | 1  |
+----+----+------+----+---------------------+----+
1 row in set (0.00 sec)
mysql> select * from helei_3;
+----+----+------+----+---------------------+----+
| id | c1 | c2   | c5 | c3                  | c4 |
+----+----+------+----+---------------------+----+
|  3 |  3 |    3 |  3 | 2016-12-23 16:07:16 | 3  |
+----+----+------+----+---------------------+----+
1 row in set (0.00 sec)


注意

Warning:警告1

不支持预编译语句 PreparedStatement,不支持Bind、Execute调用接口。

Warning:警告2

不支持使用use命令来切换后端数据库,use命令可执行,但其含义是切换到不同的MySQL主备集群,OneProxy在支持分库分表功能后,就将一个主备集群视为一个数据库了,链接Oneproxy时如果指定了数据库名,则需替换成Server Group的名字

Warning:警告3

禁止使用set命令,任何set命令都会直接返回成功,而不做任何处理。

Warning:警告4

默认禁止CALL、PREPARE、EXECUTE、DEALLOCATE命令,不支持存储过程和函数。

Warning:警告5

OneProxy支持master进行故障转移切换,但建议采用流行的高可用方案MHA实现。故障切换后,OneProxy可以自动识别哪台机器是master。另外,架构必须是一主带N从,不能是双主带N从。


——总结——

至此,OneProxy对MySQL的分库分表测试完成,对于前端应用而言,表名是透明的。无需变更代码。由于笔者的水平有限,编写时间也很仓促,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。

参考文献:

http://hcymysql.blog.51cto.com/5223301/1685146

http://www.onexsoft.com

时间: 2024-10-09 22:45:03

OneProxy实现MySQL分库分表的相关文章

MySQL分库分表方案

1. MySQL分库分表方案 1.1. 问题: 1.2. 回答: 1.2.1. 最好的切分MySQL的方式就是:除非万不得已,否则不要去干它. 1.2.2. 你的SQL语句不再是声明式的(declarative) 1.2.3. 你招致了大量的网络延时 1.2.4. 你失去了SQL的许多强大能力 1.2.5. MySQL没有API保证异步查询返回顺序结果 1.2.6. 总结 MySQL分库分表方案 翻译一个stackoverflow上的问答,关于分库分表的缺点的,原文链接: MySQL shard

企业Shell实战-MySQL分库分表备份脚本

本文来自http://www.xuliangwei.com/xubusi/252.html 免费视频讲解见 http://edu.51cto.com/course/course_id-5064.html 企业Shell实战-MySQL分库分表备份 今天是2015年的最后一天,大家都开心的跨年,而我还在苦逼的呵呵-省略 此处内容来自老男孩教育oldboy以及老男孩26期王续精彩分享整理而来  为表示感谢,特整理此篇博文分享给大家! 项目联系笔者QQ:572891887   也可以加入架构师交流群:

MYSQL分库分表

1 基本思想之什么是分库分表? 从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上. 2 基本思想之为什么要分库分表? 数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据 操作,增删改查的开销也会越来越大:另外,由于无法进行分布式式部署,而一台服务器的资源(CPU.磁盘.内存.IO等)是有限的,最终数据库所能承载的 数据量.数据处理能力都将遭遇瓶颈.

MYSQL分库分表和不停机更改表结构

在MYSQL分库分表中我们一般是基于数据量比较大的时间对mysql数据库一种优化的做法,下面我简单的介绍一下mysql分表与分库的简单做法. 1.分库分表 很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表members,查询起来非常之慢,同事的做法是将其散列到100个表中,分别从members0到members99,然后根据mid分发记录到这些表中,牛逼的代码大概是

(转)企业Shell实战-MySQL分库分表备份脚本

本文来自http://www.xuliangwei.com/xubusi/252.html 免费视频讲解见 http://edu.51cto.com/course/course_id-5064.html 企业Shell实战-MySQL分库分表备份 今天是2015年的最后一天,大家都开心的跨年,而我还在苦逼的呵呵-省略 此处内容来自老男孩教育oldboy以及老男孩26期王续精彩分享整理而来  为表示感谢,特整理此篇博文分享给大家! 项目联系笔者QQ:572891887   也可以加入架构师交流群:

【分库、分表】MySQL分库分表方案

一.Mysql分库分表方案 1.为什么要分表: 当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性.表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行.行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作. 2. mysql proxy:amoeba 做mysql集群,利用amoeba. 从上层的ja

实现MySQL分库分表备份的脚本

1)准备测试数据:通过写脚本批量建库建表并插入测试数据. [[email protected] scripts]# cat ceshi.sh #/bin/bash PATH="/usr/local/mysql/bin:$PATH"                 #定义mysql命令所在路径 MYUSER=root                                                     #定义数据用户名 DBPATH=/server/backup   

MySQL分库分表工具oneproxy安装说明

                    oneproxy数据库中间件说明 #wget http://www.onexsoft.com/software/oneproxy-rhel5-linux64-v6.0.0-ga.tar.gz #tar -zxvf oneproxy-rhel5-linux64-v6.0.0-ga.tar.gz  -C /usr/local/ # cd /usr/local/oneproxy/ 1.指定中间件启动的shell脚本和启动文件的程序目录位置 # sed -i 's

分享一个 MySQL 分库分表类(php)

当一个表数据记录过大时就会出现性能瓶颈,而一般对应的解决办法是要么做分区表,要么分表,分区表就不说了,分表又分为垂直分割和水平分割,具体区别请自行搜索.一般而言,分库分表属于水平分割,按照一定的规则将数据插入到不同的表中去.而分库则可以很方便的转移数据库的压力,比如将一个很大库的分别放在不同的服务器上. 下面是我写的一个分库分表的实现: <?php /** * User: guoyu * Date: 14-8-12 * Time: 下午3:16 */ namespace App\Model\Da