Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条。

Atlas主要功能: 
1.读写分离 
2.从库负载均衡 
3.IP过滤 
4.自动分表 
5.DBA可平滑上下线DB 
6.自动摘除宕机的DB

Atlas介绍

Atlas是一个位于应用程序与MySQL之间中间件。在后端DB看来, Atlas相当于连接它的客户端,在前端应用看来, Atlas相当于一个DB。 Atlas作为服务端与应用程序通讯,它实现了MySQL的客户端和服务端协议,同时作为客户端与MySQL通讯。它对应用程序屏蔽了DB的细节,同时为了降低MySQL负担,它还维护了连接池

Atlas相对于官方MySQL-Proxy的优势 
1.将主流程中所有Lua代码用C重写,Lua仅用于管理接口 
2.重写网络模型、线程模型 
3.实现了真正意义上的连接池 
4.优化了锁机制,性能提高数十倍

Atlas安装配置

    1. https://github.com/Qihoo360/Atlas/releases 页面下载最新版RPM包,然后执行: 
      sudo rpm –i Atlas-XX.el6.x86_64.rpm安装。

注: Atlas只能安装运行在64位的系统上。后端mysql版本应大于5.1,建议使用Mysql 5.6 及以上

    1. 配置文件修改 
      Atlas运行需要依赖一个配置文件(test.cnf)。在运行Atlas之前,需要对该文件进行配置。 
      Atlas的安装目录是/usr/local/mysql-proxy,进入安装目录下的conf目录,可以看到已经有一个名为test.cnf的默认配置文件,我们只需要修改里面的某些配置项 
      test.cnf
  1. [mysql-proxy]
  2. (必备,默认值即可)管理接口的用户名
  3. admin-username = user
  4. (必备,默认值即可)管理接口的密码
  5. admin-password = pwd
  6. (必备,根据实际情况配置)主库的IP和端口
  7. proxy-backend-addresses = 192.168.0.12:3306
  8. (非必备,根据实际情况配置)从库的IP和端口, @后面的数字代表权重,用来作负载均衡,若省略则默认
  9. 1,可设置多项, 用逗号分隔。如果想让主库也能分担读请求的话,只需要将主库信息加入到下面的配
  10. 置项中。
  11. proxy-read-only-backend-addresses = 192.168.0.13:3306,192.168.0.14:3306
  12. (必备,根据实际情况配置)用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程
  13. encrypt加密,用户名与密码之间用冒号分隔。 主从数据库上需要先创建该用户并设置密码(用户名和密
  14. 码在主从数据库上要一致) 。比如用户名为myuser,密码为mypwd,执行./encrypt mypwd结果为
  15. HJBoxfRsjeI=。如果有多个用户用逗号分隔即可。则设置如下行所示:
  16. pwds = myuser: HJBoxfRsjeI=,myuser2:HJBoxfRsjeI=
  17. (必备,默认值即可)Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发
  18. 调试时设为false,线上运行时设为true
  19. daemon = true
  20. (必备,默认值即可)设置Atlas的运行方式,设为trueAtlas会启动两个进程,一个为monitor,一个为
  21. worker monitorworker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发
  22. 调试时设为false,线上运行时设为true
  23. keepalive = true
  24. (必备,根据实际情况配置)工作线程数,推荐设置成系统的CPU核数的24
  25. event-threads = 4
  26.  
  27. (必备,默认值即可)日志级别,分为message warning critical error debug五个级别
  28. log-level = message
  29. (必备,默认值即可)日志存放的路径
  30. log-path = /usr/local/mysql-proxy/log
  31.  
  32. (必备,根据实际情况配置)SQL日志的开关,可设置为OFF ON REALTIMEOFF代表不记录
  33. SQL日志,ON代表记录SQL日志,该模式下日志刷新是基于缓冲区的,当日志填满缓冲区后,
  34. 才将日志信息刷到磁盘。 REALTIME用于调试,代表记录SQL日志且实时写入磁盘,默认为OFF
  35. sql-log = OFF
  36. (可选项,可不设置)慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-logslow(单位:ms)的日志记录。不设置该参数则输出全部日志。
  37. sql-log-slow = 10
  38. (可选项,可不设置)关闭不活跃的客户端连接设置。当设置了该参数时,Atlas会主动关闭经过
  39. 'wait-timeout'时间后一直未活跃的连接。单位:秒
  40. wait-timeout = 10
  41. (必备,默认值即可)Atlas监听的工作接口IP和端口
  42. proxy-address = 0.0.0.0:1234
  43. (必备,默认值即可)Atlas监听的管理接口IP和端口 admin-address = 0.0.0.0:2345
  44. (可选项,可不设置)默认字符集,若不设置该项,则默认字符集为latin1
  45. charset = utf8
  46. (可选项,可不设置)允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗
  47. 号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连接
  48. client-ips = 127.0.0.1, 192.168.0.1

  

运行Atlas 
进入/usr/local/mysql-proxy/bin目录,执行下面的命令启动、重启或停止Atlas。 
(1). sudo ./mysql-proxyd test start,启动Atlas。 
(2). sudo ./mysql-proxyd test restart,重启Atlas。 
(3). sudo ./mysql-proxyd test stop,停止Atlas。 
执行命令:mysql -h127.0.0.1 -P1234 -u用户名 -p密码,如果能连上则证明Atlas初步 
测试正常,可以再尝试发几条SQL语句看看执行结果是否正确。

Atlas读写分离

Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔 
例如 
proxy-backend-addresses = 192.168.237.128:3308

Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔 
proxy-read-only-backend-addresses = 192.168.237.130:3308@1

关闭主备库复制关系,在主库上查看

当MySQL主库关闭的情况下,写操作失败,读操作依然可以执行 
当MySQL仅有的一个从库关闭的情况下,写操作成功,读操作也漂移到主库上执行

Atlas负载均衡

当有多个从库的情况下 
Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔 
proxy-backend-addresses = 192.168.237.128:3308 
Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重(数字越大读取的机会更高),用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔

例如:

  1. proxy-read-only-backend-addresses =192.168.237.130:3308@1,192.168.237.131:3308@1

  

当第一个从库崩溃时执行查询语句,语句都在第二个节点查询

当有多个读节点时,权重越大,被读取的可能性就越高

Atlas后端连接的MySQL从库的IP和端口, @后面的数字代表权重,用来作负载均衡,若省略则默认为1, 
可设置多项,用逗号分隔

例:

proxy-read-only-backend-addresses = 192.168.237.130:3308@1,192.168.237.131:3308@2

自动读写分离挺好,但有时候写完马上就想读,万一主从同步延迟怎么办? 
SQL语句前增加 /*master*/ 就可以将读请求强制发往主库。在mysql命令行测试该功能时,需要加-c选项,以防mysql客户端过滤掉注释信息。

主库宕机,读操作受影响么? 
在Atlas中读操作不受影响,Atlas会将读请求转发到其他还存活的从库上。但此时写请求将会失败,因为主库宕机了。

Altas支持多个主库的运行模式吗? 
官网:目前还未对于Atlas后面挂接多个主库的情形进行测试过,不建议这样使用。建议使用一主一从或一主多从的模式。 
可以做双主,在proxy-backend-addresses = ip1,ip2 但是不建议使用

Atlas分表功能

类似在一个库,创建了多个子表

使用Atlas的分表功能时,首先需要在配置文件(test.cnf)设置tables参数。

tables参数设置格式:数据库名.表名.分表字段.子表数量,比如你的数据库名叫school,表名叫stu,分表字段叫id,总共分为100张表,那么就写为school.stu.id.100,如果还有其他的分表,以逗号分隔即可。用户 
需要在数据库手动建立100张子表(stu_0,stu_1,…stu_99,注意子表序号是从0开始的)。 且所有的子表必须在DB的同一个database里·

分表的效果是: 
当通过Atlas执行(SELECT、 DELETE、 UPDATE、 INSERT、 REPLACE)操作时, 
Atlas会根据分表字段结果(id%100=k),定位到相应的子表(stu_k)。 
例如,执行 
select * from stu where id=110;,Atlas会自动从stu_10这张子表返回查询结果。 
但如果执行SQL语句(select * from stu;)时不带上id,则会提示执行stu 表不存在。

Atlas暂不支持自动建表和跨库分表的功能 
Atlas目前支持分表的语句有SELECT、 DELETE、 UPDATE、 INSERT、 REPLACE

需要安装非shard版本,sharding版本不支持分表功能 
分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项

局限性: 
应用程序连接atlas分表的时候,查询必须要加where 条件 ,分表字段= 不能用范围查询>,<,或者between and ,不支持全表查询。

例:

  1. mysql> select * from students where id=0;
  2. Empty set (0.00 sec)
  3. mysql> select * from students;
  4. ERROR 1146 (42S02): Table 'test.students' doesn't exist
  5. mysql> select * from students where id>2;
  6. ERROR 1146 (42S02): Table 'test.students' doesn't exist

  

Atlas 分片

Sharding当前是Atlas的分布式分支, 是Atlas最近重点开发的功能. Sharding的基本思想 
就是把一个数据表中的数据切分成多个部分, 存放到不同的主机上去(切分的策略有多种),从而缓解单台机器的性能跟容量的问题. sharding是一种水平切分, 适用于单表数据庞大的情景

Atlas以表为单位sharding, 同一个数据库内可以同时共有sharding的表和不sharding的表, 不sharding的表数据存在未sharding的数据库组中.

目前Atlas sharding支持insert, delete, select, update语句, 所有的写操作如insert,delete, update只能一次命中一个组, 否则会报”ERROR 1105 (HY000):write operationis only allow to one dbgroup!”错误.

Sharding数据库组

在Atlas中, 将一个组看做是数据存储的单位,一个组由一台master, 零台或者多台slave组成(mysql主从同步需要由用户自己配置). 每个组之间的数据独立, 没有关系, 表的数据的各个部分存储在各个组中.

组内读写分离

与非sharding的方案一样,Atlas sharding也支持组内的读写分离, 也就是说Atlas在命中了某个组之后, 还是会对这个组内的master和slave执行读写分离(读发送到slave, 写发送到master)

Sharding 数据切分策略

Range 方式 
范围数据切分方式,比如 
shard Key范围在0-1000的数据存放在Group0中, 
范围在1000-2000的数据存放在Group1中, 
2000-MaxInt 的数据存放在Group2 中. 
这些范围的大小不需要相同.比如id为shard key的话, sql: “select * from test where id = 1500;”, 
Atlas会将此语句发往Group1. 暂时Atlas的range是静态的, 不支持动态的增加范围

hash 方式 
目前Atlas使用取模的方式实现Hash, 也就是说Hash(id) = id % group_count, 如id =10, id % 3 = 1, 所以会命中到DbGroup1中.

Atlas sharding部分新增配置项,包含两个部分: 
shardrule. 一个shardrule对应一个分表规则,不同的shardrule通过下划线后面的数字区分

例如shardrule-0, shardrule-1….。 
一个shardrule里面有以下几项:

  1. [shardrule-0]
  2. table = test.sharding_test #分表名,由数据库+表名组成
  3. type = range #sharding类型:range 或 hash
  4. shard-key = id #sharding 字段
  5. groups = 0:0-999,1:1000-1999 #分片的group,
  6. 如果是range类型的sharding,则groups的格式是:group_id:id范围。
  7. 如果是hash类型的sharding,则groups的格式是:group_id。例如groups = 0, 1
  8. group. 一个group一般包含一主多从,由masterproxy-backend-addresses)和
  9. slaveproxy-read-only-backend-addresses)组成。 group之间的区别也是通过下
  10. 划线后面的数字区分。

  

假设我们有以下一个sharding的表, 建表语句如下:

  1. DROP TABLE IF EXISTS `sharding_test`;
  2. CREATE TABLE `sharding_test` ( `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` char(50) COLLATE utf8_bin NOT NULL,
  4. `age` int(11) DEFAULT NULL,
  5. `birthday` date DEFAULT NULL,
  6. `nickname` char(50) COLLATE utf8_bin DEFAULT NULL,
  7. PRIMARY KEY (`id`) );

  

有两个dbgroup(数据库组), 每个dbgroup有一个master, sharding_test使用range的方 
式, 以id作为shard key, 属于test数据库, dbgroup0属于范围0 - 999, dbgroup1 属于 
范围 1000 - 1999

dbgroup0 有一主, 192.168.237.130:3308 
dbgroup1 有一主, 192.168.237.131:3308

  1. [mysql-proxy]
  2. admin-username = user
  3. admin-password = pwd
  4. #Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
  5. proxy-backend-addresses = 192.168.237.128:3308
  6. #proxy-read-only-backend-addresses = 192.168.237.130:3308@1,192.168.237.131:3308@1
  7. daemon = true
  8. keepalive = false
  9. event-threads = 4
  10. log-level = debug
  11. log-path = /usr/local/mysql-proxy/log
  12. sql-log = realtime
  13. proxy-address = 0.0.0.0:1234
  14. admin-address = 0.0.0.0:2345
  15. charset = UTF8
  16. wait-timeout = 3600
  17. pwds = root:S4HJu78/H/6I/aYp2Xdb8Q==
  18. [shardrule-0]
  19. table = test3.sharding_test
  20. type = range
  21. shard-key = id
  22. groups = 0:0-999,1:1000-1999
  23. [group-0]
  24. # master
  25. proxy-backend-addresses=192.168.237.130:3308
  26. # slave
  27. #proxy-read-only-backend-addresses=127.0.0.1:3308
  28. [group-1]
  29. proxy-backend-addresses=192.168.237.131:3308
  30. #proxy-read-only-backend-addresses=127.0.0.1:3310

  

运行Atlas 
进入/usr/local/mysql-proxy/bin目录,执行下面的命令启动、重启或停止Atlas。 
(1). sudo ./mysql-proxyd test start,启动Atlas。 
(2). sudo ./mysql-proxyd test restart,重启Atlas。 
(3). sudo ./mysql-proxyd test stop,停止Atlas

执行命令: mysql -h 127.0.0.1 -P 1234 -u 用户名 -p,如果能连上则证明Atlas初步 
测试正常,可以再尝试发几条SQL语句看看执行结果是否正确。

关于支持的语句

Atlas sharding只对sql语句提供有限的支持, 目前支持基本的Select, insert/replace, delete, update语句, 支持全部的Where语法(SQL-92标准), 不支持DDL(create drop alter)以及一些管理语句, DDL请直连MYSQL执行, 请只在Atlas上执行Select, insert, delete, update(CRUD)语句

对于以下语句, 如果语句命中了多台dbgroup, Atlas均未做支持(如果语句只命中了一个dbgroup, 如select count(*) from test where id < 1000, 其中dbgroup0范围是0 - 1000, 那么这些特性都是支持的) 
Limit Offset (支持Limit 同一个dbgroup) 
Order by 
Group by 
Join 
count, Max, Min等函数不支持

子查询在Sharding中可能会返回不正确的结果, 也请不要使用子查询. 请把语句拆分成多句执行 
对于写操作, 如果写操作命中了多个数据库组, 由于部分成功(某个组执行失败)需要回滚的问题, 暂时不支持写操作命中多个数据组的语句.请拆分成多个sql语句执行

Atlas可能会在接下来的版本中对其中的一些特性中做出支持.

例用Atlas插入几条数据,做一下测试:

  1. $ mysql -h127.0.0.1 -P1234 -uroot -pmysqltest -c
  2. mysql> use test3;
  3. Database changed
  4. mysql> insert into sharding_test(id, name, age) values(1, 'test', 0);
  5. Query OK, 1 row affected (0.00 sec)
  6. mysql> insert into sharding_test(id, name, age) values(50, 'test', 0), (999, 'test', 0);
  7. Query OK, 2 rows affected (0.00 sec)

  

以上几条数据都插入到了dbgroup0, 请注意第二条多值插入的语句, 因为50和999都命中了dbgroup0, 所以其执行成功, 但是如果执行以下的语句:

  1. mysql> insert into sharding_test(id, name, age) values(100, 'test', 0), (1500, 'test',
  2. 0);
  3. ERROR 1105 (HY000): Proxy Warning - write operation is only allow to one

  

dbgroup! 在sharding的表中, 这是不允许的, 因为id为100命中了dbgroup0, 而id为1500 命中了dbgroup1, 由于分布式的多值插入可能导致部分成功, 需要回滚, 这个Atlas暂不支持. update, delete, replace同理.

再插几条数据到dbgroup1:

  1. mysql> insert into sharding_test(id, name, age) values(1000, 'test', 0), (1999,
  2. 'test', 0);
  3. Query OK, 2 rows affected (0.00 sec)
  4. mysql> select * from sharding_test;
  5. +------+------+------+----------+----------+
  6. | id | name | age | birthday | nickname |
  7. +------+------+------+----------+----------+
  8. | 1 | test | 0 | NULL | NULL |
  9. | 50 | test | 0 | NULL | NULL |
  10. | 999 | test | 0 | NULL | NULL |
  11. | 1000 | test | 0 | NULL | NULL |
  12. | 1999 | test | 0 | NULL | NULL |
  13.  
  14. mysql> select * from sharding_test where id>50;
  15. +------+------+------+----------+----------+
  16. | id | name | age | birthday | nickname |
  17. +------+------+------+----------+----------+
  18. | 999 | test | 0 | NULL | NULL |
  19. | 1000 | test | 0 | NULL | NULL |
  20. | 1999 | test | 0 | NULL | NULL |
  21.  
  22. #JOIN操作,不支持
  23. mysql> select * from sharding_test a,test.temp b on a.id=b.id;
  24. ERROR 1105 (sqlst): Proxy Warning - Sharing Hit Multi Dbgroup Not Support
  25. SQL
  26.  
  27. #update操作
  28. mysql> update sharding_test set name='test2';
  29. ERROR 1105 (HY000): Proxy Warning - Syntax Forbidden!
  30. mysql> update sharding_test set name='test2' where id<2000;
  31. ERROR 1105 (sqlst): Proxy Warning - write operation is only allow to one
  32. dbgroup!
  33. mysql> update sharding_test set name='test2' where id<999;
  34. Query OK, 2 rows affected (0.01 sec)
  35.  
  36. #delete操作
  37. mysql> delete from sharding_test;
  38. ERROR 1105 (HY000): Proxy Warning - Syntax Forbidden!
  39. mysql> delete from sharding_test where id<2000;
  40. ERROR 1105 (sqlst): Proxy Warning - write operation is only allow to one
  41. dbgroup!
  42. mysql> delete from sharding_test where id>1900;
  43. Query OK, 1 row affected (0.01 sec)

  

更多的看看官方文档:https://github.com/Qihoo360/Atlas/wiki

MySql 高可用架构Atlas的更多相关文章

  1. (转)MySQL高可用架构之MHA

    MySQL高可用架构之MHA  原文:http://www.cnblogs.com/gomysql/p/3675429.html 简介: MHA(Master High Availability)目前 ...

  2. mysql高可用架构之MHA,haproxy实现读写分离详解

    MySQL高可用架构之MHA 一.运维人员需要掌握的MySQL技术: 1.基本SQL语句 2.基本的管理[库表数据的管理    权限的管理] 3.容灾       保证数据不丢失. 二.工作中MySQ ...

  3. MySQL高可用架构之Mycat-关于Mycat安装和参数设置详解

    MySQL高可用架构之Mycat-关于Mycat安装和参数设置详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Mycat介绍 1>.什么是Mycat Mycat背后是 ...

  4. 032:基于Consul和MGR的MySQL高可用架构

    目录 一.Consul 1.Consul简介 2.准备环境 3.Consul 安装 4.Consul配置文件 5.Consul 服务检查脚本 6.Consul启动 二.MGR搭建 1.MGR配置 2. ...

  5. MySQL 高可用架构在业务层面的应用分析

    MySQL 高可用架构在业务层面的应用分析 http://mp.weixin.qq.com/s?__biz=MzAxNjAzMTQyMA==&mid=208312443&idx=1&a ...

  6. 从mysql高可用架构看高可用架构设计

    高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间. 假设系统一直能够提供服务,我们说系统的可用性是100%.如果 ...

  7. MySQL高可用架构应该考虑什么? 你认为应该如何设计?

    一.MySQL高可用架构应该考虑什么? 对业务的了解,需要考虑业务对数据库一致性要求的敏感程度,切换过程中是否有事务会丢失 对于基础设施的了解,需要了解基础设施的高可用的架构.例如 单网线,单电源等情 ...

  8. MySQL高可用架构之MySQL5.7组复制MGR

    MySQL高可用架构之MySQL5.7组复制MGR########################################################################### ...

  9. 转一下大师兄的"MySQL高可用架构之MHA"

    简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是 ...

随机推荐

  1. Ubuntu下安装pycharm并设置快捷方式

    作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7070327.html Ubuntu下安装pycharm并设置快捷方式 下载P ...

  2. ADALINE小demo

    线性逼近 clear;clc;close all x = [1,0.5; 1.5,1.1; 3,3; -1.2,-1]; y = x(:,2); x = [ones(size(x,1),1),x(:, ...

  3. (转)转一份在 51testing 上的讨论——如何测试一个门户网站是否可以支持10万用户同时在线?

    转自:http://www.cnblogs.com/jackei/archive/2006/11/16/561846.html 这个帖子的内容比较典型,大家有兴趣可以也思考一下. 先是楼主提出问题: ...

  4. kepware http接口 OCaml

    读取某变量的值 open Cohttp_lwt_unix open Cohttp open Lwt let uri = Uri.of_string "http://127.0.0.1:393 ...

  5. POJ1195--Mobile phones(基础二维BIT)

    Description Suppose that the fourth generation mobile phone base stations in the Tampere area operat ...

  6. 6.form表单四种提交方式

    一.使用jquery的ajax方式提交: 二.使用easyui的form组件内置的submit方法提交: 三.先定义表单,然后使用submit方法提交: 四.先定义表单,然后按下enter键时提交:

  7. windows下安装ubuntu

    在学习linux的过程中,ubuntu无疑是初学者的最佳选择. 下面来列举给Windows系统安装ubuntu双系统的三种方法. 一.虚拟机安装(不推荐) 使用工具:Vmware 如果不是因为迫不得已 ...

  8. Azure DevOps Server: 使用Rest Api获取拉取请求Pull Request中的变更文件清单

    需求: Azure DevOps Server 的拉取请求模块,为开发团队提供了强大而且灵活的代码评审功能.拉取请求中变更文件清单,对质量管理人员,是一个宝贵的材料.质量保障人员可以从代码清单中分析不 ...

  9. MySQL--当mysqldump --single-transaction遇到alter table(1)

    部分生产环境采用mysqldump --single-transaction的方式在夜间进行数据库备份,而同事恰好在备份期间执行了alter table操作,操作部分成功部分失败,为啥呢? ##=== ...

  10. C# 动态创建SQL数据库(一)

    最近在做项目中要求能够要求动态添加数据库并建表.具体思路如下 1 提供数据名,根据数据库创建数据库 2 自定数据库与数据表,提供数据表自定与数据类型创建表 创建sqlhelper类,用于数据库操作 u ...