1.安装oneproxy
选择oneproxy6.2版本
解压缩后放入/usr/local下,在目录下的oneproxy.service 用于对oneproxy的启动,停止,重启
修改demo.sh 的安装路径为/usr/local/oneproxy
运行demo.sh
可以把oneproxy.service 复制到/etc/init.d/oneproxy,修改里面的安装路径,
chkconfig oneproxy on
2.conf/proxy.conf配置文件
[oneproxy] proxy-license = A2FF461456A67F28,D2F6A5AD70C9042D user = oneproxy keepalive = 1 event-threads = 4 log-file = log/oneproxy.log pid-file = log/oneproxy.pid proxy-charset = utf8_general_ci # admin user:admin ;admin password:oneproxy admin-username = admin admin-password =4841E43E59A4337D61C5D14291D737EAA1A38B4E #proxy-group-security = 0 proxy-httpserver = 0.0.0.0:8080 proxy-address = :3307 proxy-auto-readonly = 0 #proxy-slave-addresses.1 = db1:3306@default proxy-master-addresses.1 =127.0.0.1 :3306@cluster_slog proxy-group-policy = cluster_slog:master_only #user :root ,password:root ;user:snow ,password:snow proxy-user-list.1 = root/77A7916E10A51A9DC83F17390071DC003982F785@slog proxy-user-list.2 = snow/15BA3A957175EE9897137F9E94E941CBAC8F3E68@slog remote-address.1 = 192.168.33.11:4041 #proxy-part-template = conf/template.txt #proxy-part-tables = conf/part.txt proxy-part-tables = conf/part_slog.txt proxy-table-map.1=tool_uselocation_log:cluster_slog proxy-table-map.1=tool_operate_log:cluster_slog proxy-table-map.1=gift_log:cluster_slog #proxy-sequence-group = cluster_slog proxy-sequence.1 = cluster_slog
3.分表配置
[ { "table" : "gift_log", "pkey" : "uid", "type" : "int", "method" : "range", "partitions": [ {"db":"slog", "suffix" : "_0", "group": "cluster_slog", "value" : "10" }, {"db":"slog", "suffix" : "_1", "group": "cluster_slog", "value" : "20" }, {"db":"slog", "suffix" : "_2", "group": "cluster_slog", "value" : "30" }, {"db":"slog", "suffix" : "_3", "group": "cluster_slog", "value" : null } ] }, { "table" : "tool_operate_log", "pkey" : "uid", "type" : "int", "method" : "range", "partitions": [ {"db":"slog", "suffix" : "_0", "group": "cluster_slog", "value" : "10" }, {"db":"slog", "suffix" : "_1", "group": "cluster_slog", "value" : "20" }, {"db":"slog", "suffix" : "_2", "group": "cluster_slog", "value" : "30" }, {"db":"slog", "suffix" : "_3", "group": "cluster_slog", "value" : null } ] }, { "table" : "tool_uselocation_log", "pkey" : "ttid", "type" : "int", "method" : "hash", "partitions":4, "groups":["cluster_slog"] } ]
4.参数说明
table:为虚拟表名,
数据库中表以partitions的配置为准
group:用于集群管理,一般master服武器和slave放在同一个group下面
proxy-master-addresses=db_host:port@集群名
proxy-slave-addresses=db_host:port@集群名
proxy-group-policy=集群名:(master_only,master_balance,slave_failover,slave_read,slave_balance,主要有这几种)
proxy-user-list=username/password@dbname
proxy-database: 指定默认数据库
proxy-charset: 指定数据库字符集, 查看支持的字符集可以登陆到4041的命令窗口执行 list charset; 查看
5.重要命令
进入oneproxy管理shell命令:
mysql -uadmin -pOneProxy -P4041 --protocol=TCP
passwd '要加密的密码'会生成加密密码,用于proxy.conf文件中管理密码和用户密码配置
启动命令也可以用到参数形式(注意行尾和换行符转义之间要有空格):
bin/oneproxy --keepalive --proxy-address=192.168.33.11:3307 \
--proxy-master-addresses=127.0.0.1:3306@slog \
--proxy-user-list=root/77A7916E10A51A9DC83F17390071DC003982F785@slog \
--log-file=${ONEPROXY_HOME}/log/oneproxy.log \
--pid-file=${ONEPROXY_HOME}/log/oneproxy.pid \
--proxy-part-tables=${ONEPROXY_HOME}/conf/part_slog.txt \
--proxy-database=slog \
--proxy-charset=utf8_general_ci
oneproxy客户端连接:mysql -uroot -proot -h127.0.0.1 -P3307 ,
如果成功进入则会有Server version: 5.5.18 OneProxy-6.2.0 (OneXSoft),表示进入的是oneproxy的客户端,
添加mysql用户:
MySQL>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'yourpassword' WITH GRANT OPTION;
MySQL>FLUSH PRIVILEGES;
6.遇到的问题
1.Ignoring query to other database错误
在连接mysql时没有"-u"参数导致的重新连接mysql 加上-u参数 一切正常
2.生成加密口令
可以用“bin/mysqlhash”来生成加密后的口令和passwd
3.在my.cnf中注释掉socket配置,不然会-h127.0.0.1后不能登录成功
4.当OneProxy无法从SQL取到分区列上的值时,会选择所有的分区,对于DML更新类操作,OneProxy因为不支持分布式事务,所在对DML语句能操作的分区数做了严格的限定,即只能操作一个分区。事实上对于在显式事务中的查询语句,也有同样的限制,比如我们显式开始一个事务,然后对虚拟表做全表查询,看看OneProxy会如何反馈?报错,
5.mysql分表后select查询oneproxy的问题解决
SQLSTATE[42000]: Syntax error or access violation: 1149 prepared statement not supported in OneProxy
报错表示不能在oneproxy使用prepare,
查看new PDO时的param参数是否有PDO::ATTR_EMULATE_PREPARES = false 的配置
如果有该配置,改为true,或者直接去掉该选项, 问题能解决.
笔记:
PDO::ATTR_EMULATE_PREPARES = false,表示 PDO 禁用模拟预处理语句,并使用 real parepared statements 。这可以确保SQL语句和相应的值在传递到mysql服务器之前是不会被PHP解析的(禁止了所有可能的恶意SQL注入攻击)。
当调用 prepare() 时,查询语句已经发送给了数据库服务器,此时只有占位符 ? 发送过去,没有用户提交的数据;当调用到 execute()时,用户提交过来的值才会传送给数据库,他们是分开传送的,两者独立的,SQL攻击者没有一点机会。
1、你不能让占位符 ? 代替一组值
2.你不能让占位符代替数据表名或列名
3 你不能让占位符 ? 代替任何其他SQL语法
7.注意事项
1、不支持 Server Side Cursor 接口,比如 mysql C API 里的 Prepare、Bind、 Execute调用接口
2、不支持 use命令切换数据库(use被改写为切换group)
3、默认禁止 CALL, PREPARE, EXECUTE, DEALLOCATE 命令,也就是说不能用存储过程
4、单库(单实例)分表–insert/update/delete要加字段名,如insert into t1(id,name) values(1,’张三’);
5、单库(单实例) 分表–目前分了N张表,如果以自增id做关联查询,那么每张表的自增id都是从1开始,在与其他表join关联查询时,数据会不准确
6、单库(单实例)分表–当where条件有分区列时,值不能有函数转换,也不能有算术表达式,必须是原子值,否则结果不准确
7、分库分表(多实例)–不支持垮库join,例如user_0表在10.0.0.1机器里,现在要join关联查询10.0.0.2机器里的money_detail表,不支持
8、分库分表(多实例)–不支持分布式事务,例如user_0表在10.0.0.1机器里,user_1表在10.0.0.2机器里,现在想同时update更新两张表,不支持
9、读写分离 –默认读操作全部访问slave,如果想强制走主库,例如涉及金钱类的查询操作,SQL改为select /master/ from t1 where id=1;
10、分库分表/分表 –where条件带分区列时,直接命中该表,如果未带分区列,会逐一扫描所有分表(单线程),考虑性能问题,要加并行查询(多线程),SQL改为select /parallel/ from t1 where name=’李四’; 并行查询会增加额外的CPU消耗
11、分表规则:支持range(范围),hash(取模),hash规则要提前规划好,具体分多少张表,如前期分64张表,1年后想扩容128张表,数据需要重新导出导入,成本非常高,目前二级分表还不支持。
12.sql语法
– select * from my_range order by id;
– select * from my_range order by id limit 2, 3;– select col2, sum(id) from my_range group by col2;
– select distinct col2 from my_range;
• 不支持(仅在查询涉及多分片时)
– select count(distinct …) from …
– select avg(…) from …
– select … from … group by … having count(*)
8.参考连接
oneproxy参数配置详情,
http://blog.csdn.net/h331895809/article/details/53282882http://www.onexsoft.com/zh/onesql-cpu-binding.html
oneproxy pdf文档
链接:https://pan.baidu.com/s/1f-01Jm1d3jiBwwpAdNTcfw 密码:8tg9