性能监控

添加jprofiler监控参数

-agentpath:/Applications/JProfiler.app/Contents/Resources/app/bin/macos/libjprofilerti.jnilib=port=8849

添加perfino监控参数

-javaagent:/Applications/perfino/agent/perfino.jar=name=order-jvm

username: suxiaolin
password: 123456

限制jvm内存参数

-Xmx256m -Xms128m

image-20181208093638625-4232998

2018/5/20 posted in  JAVA

mvn 私有仓库认证配置

settings.xml

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <interactiveMode>true</interactiveMode>
  <offline>false</offline>
  <pluginGroups>
  </pluginGroups>
 
  <servers>
    <server>
      <id>oss</id>
      <username>suxiaolin</username>
      <password>123456</password>
    </server>
  </servers>
</settings>

mvn 私有仓库配置

<repositories>
    <repository>
        <id>oss-snapshot</id>
        <name>Nexus Snapshot Repository</name>
        <url>http://127.0.0.1:8081/repository/myrepo-SNAPSHOT/</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <releases>
            <enabled>false</enabled>
        </releases>
    </repository>
    <!-- 配置nexus远程仓库 -->
    <repository>
        <id>myrepo-2</id>
        <name>Nexus Snapshot Repository</name>
        <url>http://127.0.0.1:8081/repository/myrepo/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
2018/5/20 posted in  JAVA

rancher

30531939036831699

docker run -d --name=rancher --restart=unless-stopped \
  -p 8080:80 -p 8443:443 \
  -v ~/rancher:/var/lib/rancher
  rancher/rancher:latest
  
docker run -d --name=rancher --restart=unless-stopped \
  -p 8080:80 -p 8443:443 \
  rancher/rancher:latest
  
docker run -d --name=rancher --restart=unless-stopped \
  -p 8080:80 -p 8443:443 \
  -v ~/rancher:/var/lib/rancher \
  rancher/rancher:stable
  
docker run -d --name=rancher --restart=unless-stopped \
  -p 8880:80 -p 8843:443 \
  -v ~/rancher:/var/lib/rancher \
  rancher/rancher:stable
  
https://172.16.123.1:8843/v3/import/v2d7znsxv8vvjzfl6gcwkglvkvnm759f98zt227h9plzm9vdwlh56g.yaml

image-20181127123429327-3293269

curl --insecure -sfL https://172.16.123.1:8443/v3/import/kpb77vt4zl64bdxgz4jpxt2s2x8h94ng2tdlfqcmntv762vc4bf987.yaml | kubectl apply -f -

image-20181127125127117-3294287

curl -X "POST" "http://127.0.0.1:8080/order/get-list" \
     -H 'Content-Type: application/x-www-form-urlencoded' \
     --data-urlencode "user_id=9" \
     --data-urlencode "status=1,2,3,4,5,6" \
     --data-urlencode "order_type=1"
2018/5/20 posted in  OPS

shell脚本启动springboot

mrun() {
    port="-Dserver.port=$1"
    env="-Denv=local"
    memory="-Xms64m -Xmx128m"
    yourkit="-agentpath:/Applications/YourKit-Java-Profiler-2018.04.app/Contents/Resources/bin/mac/libyjpagent.jnilib"
    xrebel="-javaagent:/Users/suxiaolin/develop/xrebel/xrebel.jar"
    command="mvn spring-boot:run -Dspring-boot.run.jvmArguments=\"$memory $env $port $yourkit $xrebel\""
    echo "command: $command"
    sh -c $command
}

brun() {
    port="8080"
    if [ $1 = "order" ]                                                                                                                                                                                                                                                                    
    then
        port=8035
    elif [ $1 = "gateway" ]
    then
        port=8041
    fi  
    mrun $port
}
mntfs() {
    deviceNode=`diskutil info /Volumes/$1 | grep -oh "/dev/.*"`
    hdiutil eject "/Volumes/$1"
    sudo mkdir /Volumes/$1
    sudo mount_ntfs -o rw,nobrowse /dev/$deviceNode /Volumes/$1/
}

dattr() {
    xattr -l $1
    xattr -d com.apple.FinderInfo $1
}
2018/5/20 posted in  Spring Boot

阿里云ons消息队列使用小记

2018/5/20 posted in  消息队列

mysql配置主从复制小记

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@`%` IDENTIFIED BY 'repl';
flush privileges;
# for master-slave architecture
log_bin=mysql-bin
server_id=10
SHOW MASTER STATUS\G
log_bin = mysql-bin
server_id = 2
relay_log = /var/lib/mysql/mysql-relay-bin
log_slave_updates = 1
read_only = 1
CHANGE MASTER TO MASTER_HOST='mysql',
MASTER_USER='repl',
MASTER_PASSWORD='repl',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;
SHOW SLAVE STATUS\G
START SLAVE;
replicate_wild_do_table = test.%
2018/5/20 posted in  SQL

lua开发注意事项

lua中目前只有false和nil是假,空table,空字符串,0是真
image-20180604144329529

false转为数字为nil
image-20180604144254531

字符串连接符:..
image-20180604144422758

2018/5/20 posted in  LUA

app单点部署流程

部署流程

备份chupinxiu.com.conf配置文件

在web1上创建负载切换的lua文件:/opt/openresty-1.13.6.1/lua/php-fpm-upstream.lua

if ngx.var.project == "apipro" then
    return ngx.exec("@single")
else
    return ngx.exec("@mutiple")
end

编辑nginx配置文件: /opt/openresty-1.13.6.1/nginx/conf/vhost/chupinxiu.com.conf

配置两个php的upstream

upstream php-fpm-backend-mutiple {
    server unix:/var/run/php-fpm.sock weight=5; # web1
    server 10.135.216.41:9000 weight=5; # web2
}
upstream php-fpm-backend-single {
    server unix:/var/run/php-fpm.sock; # web1
}

为两个upstream配置两个location

    location @mutiple {
        root $dest;
        proxy_set_header Host $host;
        fastcgi_pass   php-fpm-backend-mutiple;
        fastcgi_index  index.php;
        include        fastcgi.conf;
    }

    location @single {
        root $dest;
        proxy_set_header Host $host;
        fastcgi_pass   php-fpm-backend-single;
        fastcgi_index  index.php;
        include        fastcgi.conf;
    }

normal location中使用php-fpm-upstream.lua选择upstream

    location @normal {
        content_by_lua_file    /opt/openresty-1.13.6.1/lua/php-fpm-upstream.lua;
    }

重启nginx

回滚流程

删除chupinxiu.com.conf

将chupinxiu.com.conf配置文件恢复

删除 /opt/openresty-1.13.6.1/lua/php-fpm-upstream.lua;

重启nginx

2018/5/20 posted in  OPS

数据库切换nginx部署流程

部署流程

将维护页面上传到/var/www/maintain目录,并命名为index.html,设置权限为www-data:deploy用户

备份chupinxiu.com.conf配置文件

修改chupinxiu.com.conf的location /代码段为

    location / {
        index  index.php index.html index.htm;
        try_files /index.html =404;

        # kill cache
        add_header Last-Modified $date_gmt;
        add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
        if_modified_since off;
        expires off;
        etag off;
    }

备份/opt/openresty-1.13.6.1/lua/grayroot.lua

在web1上修改设置root的lua文件:/opt/openresty-1.13.6.1/lua/grayroot.lua

local real_path = "/var/www/maintain"
return real_path

重启nginx

恢复流程

删除/opt/openresty-1.13.6.1/lua/grayroot.lua文件并从备份文件恢复

删除chupinxiu.com.conf并从备份文件恢复

重启nginx

2018/5/20 posted in  OPS

灰度发布

CREATE TABLE `gray` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `project` varchar(45) NOT NULL,
  `shopId` text,
  `status` tinyint(1) unsigned NOT NULL DEFAULT '1',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
INSERT INTO `cpx_prod`.`gray` (`id`, `project`, `shopId`, `status`, `created_at`, `updated_at`) VALUES ('2', 'kufang', '1804', '1', '2018-05-28 17:04:25', '2018-05-28 17:04:25');

灰度开发方案

  1. 设计灰度表结构和存储位置
  2. 设计redis键,选择灰度发布使用的redis服务器
  3. 在ops平台上开发店铺灰度灰度状态管理页面
  4. 使用ops现有的指定发布功能发布灰度代码
  5. nginx lua根据店铺的灰度状态走不同的项目路径

灰度缓存更新

  1. ops灰度系统设置了店铺灰度后更新灰度缓存
  2. lua检测到redis里没有缓存key,从mysql中读取店铺灰度数据,缓存到redis中,redis使用一个key保存所有灰度店铺的id,使用json序列化

灰度代码发布

  1. 灰度代码发布复用ops上的指定发布
Read more   2018/5/20 posted in  OPS LUA OpenResty

使用xtrabackup进行mysql备份恢复

docker run --name=cpx_prod20180430023756 -v $PWD:/root/tools -e MYSQL_ROOT_PASSWORD=root -d registry.cn-hangzhou.aliyuncs.com/xiayu/mysql-5.6-xtrabackup:latest
innobackupex --apply-log /root/tools/mysql --user=root --password=root

innobackupex --defaults-file=/etc/mysql/my.cnf --copy-back /root/tools/mysql
mysqld_safe --defaults-file=/root/tools/mysql/backup-my.cnf --user=mysql --datadir=/root/tools/mysql/ &
innobackupex --defaults-file=/root/tools/mysql/backup-my.cnf --apply-log /root/tools/mysql
mysqld_safe --defaults-file=/etc/mysql/my.cnf --user=root --datadir=/var/lib/mysql &
2018/5/20 posted in  SQL

查看网卡流量

sar -n DEV 1

比较重要的字段如下

rxpck/s:每秒钟接收的数据包
txpck/s:每秒钟发送的数据包
rxbyt/s:每秒钟接收的字节数
txbyt/s:每秒钟发送的字节数
rxcmp/s:每秒钟接收的压缩数据包
txcmp/s:每秒钟发送的压缩数据包
rxmcst/s:每秒钟接收的多播数据包
2018/5/20 posted in  OPS