Coup de Grace

数据库需求系列 Proxy

很久以前我们有当当的sharding-jdbc源码解读.

说起来做一些中间层分库分表,读写分离这种,可以实现的位置

前两者就是可操作性不强,对程序侵入接近硬编码.

后两者目前有各家的实现,前者侵入工程,需要配置一些规则,后者需要占一些机器,把parse sql的压力集中到机器上了.


单位的情况:


参考了以下文章:

看到了如下观点:

  1. 结合explain和慢查询,优化你的sql和索引
  2. 应用级别可以加缓存,redis/memcached/aerospike都可以
  3. 如果查询的量级过大,就要做主从复制或主主复制,读写分离.可以在应用层或者mysql中间层实现;
  4. 垂直拆分,根据你的业务情况把热点的表拆出分库分表
  5. 终极绝招,水平切分.选定一个sharding key,进行分库分表.
  6. 中间其实可以在加一个步骤,就是hhd -> ssd的升级.提升硬件的效果是相当喜人的,一个200 iops 和 几万的iops可想而知效果.

另外单表尽量控制到一千万左右,单库的表尽量控制在500左右.


在拥有一些资源,面临一些合适的需求的情况下

我觉得kingshard很适合目前的情况.

原因实际很简单:


配合着前文的:

想简单玩玩可以用这个在Compose里或者这个用mysql_multi跑一哈子.


安装与启动

wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
sudo tar -xzf go$VERSION.$OS-$ARCH.tar.gz -C /usr/local 
echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile
source /etc/profile 
git clone https://github.com/flike/kingshard.git src/github.com/flike/kingshard
cd src/github.com/flike/kingshard
source ./dev.sh
make
# 设置配置文件(不写config的话会去/etc/下面找)
./bin/kingshard -config=etc/ks.yaml

配置文件

参考来自:

那么我们目前计划:

那么配置模板:

addr : 0.0.0.0:9696
user :  kingshard
password : kingshard

web_addr : 0.0.0.0:9797
web_user : kingshard
web_password : kingshard

log_level : error
log_sql : off
slow_log_time : 1000
log_path : /root/kingsahrd/logs
#blacklist_sql_file: /root/kingsahrd/blacklist
#allow_ips: 127.0.0.1
# default utf8
proxy_charset: utf8mb4

nodes :
-
    name : master1
    # 这里需要跟mysql实例同步设置,不清楚的话不要设置
    # max_conns_limit : 750
    # master和slave的用户名和密码必须一致
    user :  root
    password : root
    master : master1:3306
    slave : slave1:3306,slave2:3306
    down_after_noalive : 60

schema :
    nodes: [master1]
    default: master1
    shard:
    -
        db : tt
        table: tttable1
        key: id
        type: hash
        nodes: [master1]
        # 带有location与range范围的需要预先定义好,否则无法启动
        locations: [20]
    -
        db : tt
        table: tttable2
        key: id
        type: range
        nodes: [master1]
        # 带有location与range范围的需要预先定义好,否则无法启动
        locations: [20]
        table_row_limit: 100000
    -
        db : tt
        table: tttable3
        key: gmt_created
        type: date_month
        nodes: [master1]
        # 带有location与range范围的需要预先定义好,否则无法启动
        date_range: [201701-201912]

kingshard分表涉及到的子表需要自己创建

格式方面hash与range是table_name_0000,date相关是table_name_00[00][00]


Supervisor

参考以前的日志监控平台优化-启用Supervisor.

安装

yum install python-setuptools 
easy_install supervisor
echo_supervisord_conf > /etc/supervisord.conf
vim /etc/supervisord.conf
// 修改最后一行: vim->shift+G
    [include]
    files = /etc/supervisor/conf.d/*.conf 
mkdir -p /etc/supervisor/conf.d
vim tt.conf

配置文件

tt.conf

[program:kingshard]
command=/root/src/github.com/flike/kingshard/bin/kingshard -config=/root/src/github.com/flike/kingshard/etc/ks.yaml
autostart = true     
startsecs = 5        
autorestart = true   
startretries = 3     
user = root

启动

# 启动服务
supervisord -c /etc/supervisord.conf
# 启动客户端
supervisorctl -c /etc/supervisord.conf 
# 修改配置后
supervisorctl reload 

简单验收

schema :
    nodes: [master1]
    default: master1
    shard:
    -
        db : tt
        table: tttable
        key: gmt_created
        type: date_month
        nodes: [master1]
        date_range: [201703-201704]
for i in `seq 1 10`;do mysql -h ks -P 9696 -u kingshard -pkingshard tt -e "insert into tttable (gmt_created) values('2017-03-01 11:23:45')";done

for i in `seq 1 10`;do mysql -h ks -P 9696 -u kingshard -pkingshard tt -e "insert into tttable (gmt_created) values('2017-04-01 11:23:45')";done

同时验收一下主从上的记录是否符合我们的预期.


其他管控文档

黑名单功能

sql黑名单文档

单node的事务

kingshard支持在单个node上执行事务,也就是说同一个事务不能跨多个node,当出现跨node的情况时,kingshard会返回错误给客户端。可以跨同node上的不同子表。

kingshard的管理端操作

分表的插入和查询

查询操作(select)可以跨多个node,

分表的更新

当更新操作涉及到多个node时,kingshard会以非事务的方式执行跨node的更新。为了保证数据一致性,请根据实际需求使用非事务方式的跨node更新操作。

指定发送的node

只需要在sql语句前面加上包含node名称的注释(连接MySQL时需要加上-c选项,避免客户端过滤掉注释)。

  1. mysql -h127.0.0.1 -ukingshard -pkingshard -P9696 -c
  2. mysql> /*node2*/desc kingshard_test_conn;

强制读主库

mysql> select/*master*/ * from kingshard_test_conn;

跨node的sum和count函数

kingshard会将相应的SQL发送到正确的DB,并将结果合并起来再返回给客户

跨node的order by

kingshard先将合适的SQL发生到对应的node,然后将结果集在内存中排序,从而实现select的order by操作


done.