kingshard初探

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 起因:之前的相当长时间一直在寻找mysql的分布式解决方案,一直没有特别理想的答案,有同事给推荐了kingshard,所以决定一探究竟。 1.安装 机器共3台 机器 IP 说明 机器1 192.168.122.1 安装kingshard 机器1 192.168.122.3 安装mysql实例(node1) master 没有slave 机器1 192.168.122.4 安装mysql实例(node2) master 没有slave 安装请参考官方资料 https://github.com/flike/kingshard/blob/master/doc/KingDoc/kingshard_install_document.md 我安装的kingshard 2016年8月9日的版本,目前kingshard还没有参数或配置,把kingshard以后台守护进程的方式启动,因此作者建议使用supervisor进行管理。 因为我主要是为了观察效果,所以直接在终端中启动 ./kingshard -config=../etc/ks.yaml 以下是我的配置文件 ks.yaml # server listen addr addr : 0.0.0.0:9696 # server user and password user : kingshard password : kingshard # if set log_path, the sql log will write into log_path/sql.log,the system log # will write into log_path/sys.log #log_path : /Users/flike/log # log level[debug|info|warn|error],default error log_level : debug # if set log_sql(on|off) off,the sql log will not output log_sql: on # only log the query that take more than slow_log_time ms #slow_log_time : 100 # the path of blacklist sql file # all these sqls in the file will been forbidden by kingshard #blacklist_sql_file: /Users/flike/blacklist # only allow this ip list ip to connect kingshard #allow_ips: 127.0.0.1 # the charset of kingshard, if you don't set this item # the default charset of kingshard is utf8. #proxy_charset: gbk # node is an agenda for real remote mysql server. nodes : - name : node1 # default max conns for mysql server max_conns_limit : 32 # all mysql in a node must have the same user and password user : kingshard password : kingshard # master represents a real mysql master server master : 192.168.122.3:3306 # slave represents a real mysql salve server,and the number after '@' is # read load weight of this slave. #slave : 192.168.59.101:3307@2,192.168.59.101:3307@3 down_after_noalive : 32 - name : node2 # default max conns for mysql server max_conns_limit : 32 # all mysql in a node must have the same user and password user : kingshard password : kingshard # master represents a real mysql master server master : 192.168.122.4:3306 # slave represents a real mysql salve server slave : # down mysql after N seconds noalive # 0 will no down down_after_noalive: 32 # schema defines sharding rules, the db is the sharding table database. schema : db : kingshard nodes: [node1,node2] default: node1 shard: - table: test_shard_day key: mtime # 指定分表所用的时间字段 type: date_day nodes: [node1,node2] date_range: [20160306-20160307,20160308-20160309] 由于我主要是用到kingshard的按时间分表功能,所以这里只配置了 ...

January 1, 2018 · 4 min

docker 常用命令(持续更新)

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 1. 删除image docker rmi myapp/base 2. 给image 打tag docker tag 4424b58cae58 myapp/base 3. 容器的存储层保存下来成为镜像 docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]] docker commit webserver nginx:v2

January 1, 2018 · 1 min

peewee 对象clone函数

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 起因: 我需要得到peewee对象的clone对象,写个简单的小程序 def clone(instance): obj = instance.__class__() # print a._meta.fields data = getattr(instance, "_data") for key in a._meta.fields: # print key if key != 'id': setattr(obj, key, data[key]) return obj

January 1, 2018 · 1 min

Percona监控工具初探

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 起因: 一直找不到合适的MySQL监控工具,正好听同事无意中说起,Percona在2016年4月发布了一个监控套件,可以同时对多个MySQL、MongoDB实例进行监控 参考资料: https://www.percona.com/blog/2016/04/18/percona-monitoring-and-management/ https://www.percona.com/doc/percona-monitoring-and-management/index.html https://www.percona.com/doc/percona-monitoring-and-management/install.html 安装过程描述的非常详尽,参考此文档足以 环境 操作系统版本CentOS 6.7 MySQL版本为 MySQL 5.7 1. 安装 1.1 PMM Server 负责将收集到的数据存储、聚合和展现 假定安装在192.168.100.1上 1) docker percona/pmm-server:1.0.6 2) docker create \ -v /opt/prometheus/data \ -v /opt/consul-data \ -v /var/lib/mysql \ -v /var/lib/grafana \ --name pmm-data \ percona/pmm-server:1.0.6 /bin/true 3) $ docker run -d \ -p 80:80 \ --volumes-from pmm-data \ --name pmm-server \ --restart always \ percona/pmm-server:1.0.6 到此,docker已经启动,可以访问 ...

January 1, 2018 · 3 min

rtorrent初探--利用好你的云主机

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 起因: 有了云主机以后,我常常想能够用它来做什么,当然可以用来挂网站,然后还能做什么,我想到可以把一些下载任务(BT)直接放到云主机来做,经过调研我选择了rtorrent。 1. 简介 rTorrent为一款纯文本环境BT客户端,具有占用内存小、频宽利用率高、支持 utf-8 编码等功能,除了在终端机界面操作,也可以在第三方支持下透过浏览器界面操作本软件。开发者杰瑞·森德尔(Jari Sundell)的目标是“一个侧重于高性能的良好代码。”属于自由软件。 2. 安装 centos yum install rtorrent ubuntu apt-get install rtorrent 安装完成以后,需要手动创建一个配置文件,配置文件需放在 ~/.rtorrent.rc 样例 以下列出比较重要的一些 # Directory to manage temporary downloads to # 下载好的文件的保存路径 directory = ~/Downloads/torrents/rtorrent_temp/ # 其它可调参, 单位是KB upload_rate = 30 download_rate = 200 peer_exchange = yes # 监听目录,只要有后缀为.torrent的文件就自动开始下载 schedule = watch_directory,0,10,load_start=~/Downloads/torrents/rtorrent_watch/*.torrent 启动(可以任何目录下直接启动) rtorrent 重要的命令: ↑↓ 用于选择任务 ctrl + s 开始下载任务 ctrl + d 停止下载任务,再按一次,删除停止的下载任务 ctrl + q 退出rtorrent **重要: ** 最后 rtorrent 只能在当前窗口运行,关闭窗口会导致程序退出 要想让它一直运行,需要和screen 或者tmux 结合使用 ...

January 1, 2018 · 1 min

requests 库的另类用法(stream)

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 起因: 同事让我帮他抓取一批URL,并获取对应URL的<title>标签中的文字,忽略对应URL网站的封禁问题,这个任务并不是一个特别麻烦的事情。然后实际跑起来,却发现流量打的很高,超过10Mb/s。 经过排查发现,是因为很多URL,实际是下载链接,会触发文件下载,这些URL对应的html中根本不会包含<title>标签,那么处理逻辑就很清晰了,先拿到headers,取出Content-Type,判断是否是 text/html,如果不是,则该Response的body体,就没有必要读取了。 查找requests的相应资料 By default, when you make a request, the body of the response is downloaded immediately. You can override this behaviour and defer downloading the response body until you access the Response.content attribute with the stream parameter: tarball_url = &#039;https://github.com/kennethreitz/requests/tarball/master&#039; r = requests.get(tarball_url, stream=True) At this point only the response headers have been downloaded and the connection remains open, hence allowing us to make content retrieval conditional: ...

January 1, 2018 · 1 min

算法题(6)

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 题目: 已知一个矩阵 matrix = [ [&#039;A&#039;, &#039;P&#039;, &#039;H&#039;, &#039;S&#039;], [&#039;U&#039;, &#039;L&#039;, &#039;O&#039;, &#039;A&#039;], [&#039;O&#039;, &#039;M&#039;, &#039;L&#039;, &#039;K&#039;], [&#039;F&#039;, &#039;B&#039;, &#039;I&#039;, &#039;R&#039;], ] 在矩阵中查找多个字符串,字符串的数量可能很多 [&quot;LFK&quot;, &quot;HMM&quot;, &quot;RPOOI&quot;] 对于字符串"LFK",它由3个字符组成,‘L’、‘F’、‘K’ 这三个字符在矩阵中的位置分别为(1,1),(3,0),(2,3) 对于这个三个字符串分别返回 LFK True, [(1,1),(3,0),(2,3)] HMM 矩阵中的每个字符只能被使用一次,字符M在矩阵中只有一个,因此 HMM 无法找到 False, [] RPOOI True, [(3,3),(0,1),(1,2),(2,0),(3,2)] 分析 矩阵中的字符数量有限(全是大写字母),且每个字符只能被使用一次,由于待查的字符串数量很多,所以需要为查找建立索引 最终代码如下: # encoding=utf-8 from collections import defaultdict def get_position(matrix, str_list): # 初始化索引 dd = defaultdict(list) for i in range(len(matrix)): for j in range(len(matrix[i])): ch = matrix[i][j] dd[ch].append((i, j)) # deal res = [] for ss in str_list: print ss curr_dd = defaultdict(int) flag = True position_list = [] for ch in ss: curr_dd[ch] += 1 if curr_dd[ch] &lt;= len(dd[ch]): position_list.append(dd[ch][curr_dd[ch] - 1 ]) else: flag = False res.append((False, [])) break if flag: res.append((True, position_list)) return res if __name__ == &#039;__main__&#039;: matrix = [ [&#039;A&#039;, &#039;P&#039;, &#039;H&#039;, &#039;S&#039;], [&#039;U&#039;, &#039;L&#039;, &#039;O&#039;, &#039;A&#039;], [&#039;O&#039;, &#039;M&#039;, &#039;L&#039;, &#039;K&#039;], [&#039;F&#039;, &#039;B&#039;, &#039;I&#039;, &#039;R&#039;], ] str_list = [&quot;ISIS&quot;, &quot;ALLAHU&quot;] res = get_position(matrix, str_list) for item in res: print item

January 1, 2018 · 1 min

时间片计算

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc ###起因 要进行预约时间的计算,干脆做一个简单的模块专门用于时间片的计算,等时间有空了会传到pypi上 1. 时间片的合并 ll = [] dd = { &quot;start_time&quot;: &quot;20:00&quot;, &quot;end_time&quot;: &quot;22:00&quot; } ll.append(dd) dd = { &quot;start_time&quot;: &quot;10:00&quot;, &quot;end_time&quot;: &quot;12:00&quot; } ll.append(dd) dd = { &quot;start_time&quot;: &quot;14:00&quot;, &quot;end_time&quot;: &quot;18:00&quot; } ll.append(dd) dd = { &quot;start_time&quot;: &quot;15:00&quot;, &quot;end_time&quot;: &quot;17:00&quot; } ll.append(dd) dd = { &quot;start_time&quot;: &quot;11:00&quot;, &quot;end_time&quot;: &quot;15:00&quot; } ll.append(dd) dd = { &quot;start_time&quot;: &quot;18:00&quot;, &quot;end_time&quot;: &quot;19:00&quot; } ll.append(dd) res = TimeFrame.merge(ll) record = res[0] assert record[&#039;start_time&#039;] == &quot;10:00&quot; assert record[&#039;end_time&#039;] == &quot;19:00&quot; record = res[1] assert record[&#039;start_time&#039;] == &quot;20:00&quot; assert record[&#039;end_time&#039;] == &quot;22:00&quot; 2. 时间片相减 item_list1 = [] dd = { &quot;start_time&quot;: &quot;08:00&quot;, &quot;end_time&quot;: &quot;15:00&quot;, } item_list1.append(dd) item_list2 = [] dd = { &quot;start_time&quot;: &quot;09:00&quot;, &quot;end_time&quot;: &quot;10:00&quot;, } item_list2.append(dd) dd = { &quot;start_time&quot;: &quot;11:00&quot;, &quot;end_time&quot;: &quot;12:00&quot;, } item_list2.append(dd) res_list = TimeFrame.minus(item_list1, item_list2) record = res_list[0] assert record[&#039;start_time&#039;] == &quot;08:00&quot; assert record[&#039;end_time&#039;] == &quot;09:00&quot; record = res_list[1] assert record[&#039;start_time&#039;] == &quot;10:00&quot; assert record[&#039;end_time&#039;] == &quot;11:00&quot; record = res_list[2] assert record[&#039;start_time&#039;] == &quot;12:00&quot; assert record[&#039;end_time&#039;] == &quot;15:00&quot; 代码如下 time_frame.py ...

January 1, 2018 · 2 min

指定出口IP,发起HTTP请求

# -*- coding=utf-8 -*- import socket import requests true_socket = socket.socket ipbind=&#039;xxx.xxx.xxx.xxx&#039; def bound_socket(*a, **k): sock = true_socket(*a, **k) # 端口是0, 操作系统会自动选择可用的端口号 sock.bind((ipbind, 0)) return sock socket.socket = bound_socket r = requests.get(&#039;http://ip.cn/&#039;) print r.status_code

January 1, 2018 · 1 min

kafka查看队列的消费情况

kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --broker-info --group $group --topic $topic --zookeeper $zk_host:2181 0.9.0以后官方建议使用 kafka-consumer-groups.sh --new-consumer --bootstrap-server $broker:9092 --describe --group $topic

January 1, 2018 · 1 min