Google Cloud CDN 部署 HTTP 跳转 HTTPS

默认分类 2018-06-15 22:42 暂无评论

Google Cloud 目前注册验证通过信用卡还是有 $300 赠送免费使用一年的。

Google Cloud 的基础网络真的没得说。CDN 也非常的快,全球 ping 值都非常低,就是流量略贵。

首先使用 Google Cloud CDN 与传统的 CDN 使用方式不一样。现在大部分的 CDN 都是通过 CNAME 解析的,Google Cloud CDN 是以 GCE 为基础建立一个 Anycast 网络,在使用 Google Cloud CDN 前,你必须保证最少创建了一个 GCE 实例,否则无法成功使用 Google Cloud CDN 服务!

GCE 上所实现的这个功能是基于第七层的网络代理,所以其拓扑图是这样的:

用户 -- 边缘服务器 -- 实例

  1. 用户到边缘服务器之间的连接:使用 HTTP 或 HTTPS;如果是 HTTPS 连接,那么 TLS 加密过程是在边缘服务器上实现。
  2. 边缘服务器到实例的连接:使用 HTTP 或 HTTPS 连接,之前的网络是走的 Google 的专线。

不论配置了几个位置的实例,边缘服务器都是使用 Google 全部的边缘服务器。

启用这个功能后,就会得到另一个 Anycast 的 IP 地址,这是个独享的 IP 地址。

阅读剩余部分

Tornado 参数校验

Python 2017-06-07 22:34 暂无评论

tornado 做数据校验的时候有点麻烦,特别是我接收和输出都是 JSON 这里用到的是 jsonschema 来做校验数据,如果参数不符则报错。

import functools
from tornado.web import RequestHandler, Application
from tornado.escape import json_decode, json_encode
from tornado.web import asynchronous
from tornado import gen

# 校验 json 数据
def Validates(Schema):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(self, *args, **kwargs):
            try:
                validate(json_decode(self.request.body), Schema)
                return func(self, *args, **kwargs)
            except:
                self.set_status(500)
                self.write({"success": False, "message": "params error", "status": 500})
        return wrapper
    return decorator

class PlanHandler(BaseHandler):
    @asynchronous
    @gen.coroutine
    def get(self, *args, **kwargs):
        self.write("hello")

    @Validates(PlanSchema)
    @asynchronous
    @gen.coroutine
    def post(self, *args, **kwargs):
        params = json_decode(self.request.body)
        self.write(params)

再贴一个无参数的装饰器。有参数的要多一个函数。

# 校验令牌
def ValiAuth(func):
    def decorator(self, *args, **kwargs):
        if json_decode(self.request.body)["auth"] != self.auth:
            self.set_status(401)
            self.write({"success": False, "message": "Auth error", "status": 401})
        else:
            return func(self, *args, **kwargs)
    return decorator

MySQL 两表字段值对比

默认分类 2017-05-21 20:53 暂无评论

场景:查询未充值有兑换记录的用户 ID

两表 t1 是兑换表, t2 是充值表不考虑其他字段内容,只对比两表的记录并且去重

使用 LEFT JOIN 来实现对比,DISTINCT 去重复,最后返回的结果是 t2 结果为 NULL 的显示。

SELECT DISTINCT
    t1.user_number,
    t2.user_number
FROM
    (
        SELECT DISTINCT
            t1.user_number
        FROM
            t_card_list t1
    ) t1
LEFT JOIN (
    SELECT DISTINCT
        t2.user_number
    FROM
        t_recharge_log t2
    WHERE
        t2.type = 10
) t2 ON t1.user_number = t2.user_number
WHERE
    t2.user_number IS NULL;

MyCat 读写分离

运维的坑 2017-04-10 06:00 暂无评论

实验机两台,分别做主从读写分离。大部分满足一般需求。后期可以扩展到多主多从分库分表去做。

Master IP: 192.168.1.101
Slave IP : 192.168.1.102

这里设置两台 MySQL 服务器提供 Master/Slave 服务。MySQL 版本均为社区版 5.7.11 保持 MySQL 版本一致。

下载 JDK 以及 MyCat 解压并且配置环境变量。

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
http://dl.mycat.io/1.6-RELEASE/

环境变量:

export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin

修改 MySQL 的配置文件 /etc/my.cnf[mysqld] 节点下添加及修改 server-id

阅读剩余部分

MySQL 源码 CMake 编译部署

运维的坑 2017-03-20 08:57 暂无评论

随手记一下。

MySQL 源码编译选项参考 MySQL 官方文档:https://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html

1. 首先安装一下需要的依赖

yum install -y vim wget cmake gcc gcc-c++ ncurses-devel bison zlib libxml openssl perl perl-Data-Dumper

2. 把源码包下载下来

wget -c https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.35.tar.gz && tar zxf mysql-5.6.35.tar.gz && cd mysql-5.6.35

3. 创建用户及组

groupadd mysql && useradd mysql -g mysql -M -s /sbin/nologin

4. 编译安装

cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNODB_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_LOCAL_INIFILE=1 \
-DEXTRA_CHARSETS=all \
-DENABLED_LOCAL_INFILE=1

编译安装

make && make install

阅读剩余部分