Podman使用阿里云容器镜像

Podman 是一个开源的容器管理工具,语法兼容 Docker ,但是某些方面比原生 Docker 命令更好用,比如能够以非 root 用户的身份去运行容器,而且不需要守护进程。

Podman 引入了一个注册表的概念,注册表就是包括 docker.io 在内的多个容器镜像源,默认的有 redhat docker fedora centos quay

国内直接用 podman pull 拉取镜像会很慢,所以需要配置阿里云容器镜像来加速访问。

Podman 默认注册表配置文件在 /etc/containers/registries.conf

修改为以下内容:

unqualified-search-registries = ["docker.io"]

[[registry]]
prefix = "docker.io"
location = "******.mirror.aliyuncs.com"

把 location 对应的值修改为你的阿里云容器加速镜像地址就可以了,现在拉取镜像就是用的阿里云加速

API设计指南

第一、设计原则

  1. 必须使用 TLS(https)
  2. 请求和响应都要带有版本号
  3. 支持缓存
  4. 给每个请求都分配一个 Request-ID
  5. 响应的大小要有限制

第二、请求的设计

  1. 每个请求要有身份验证
  2. 对请求进行限流和限速

第三、响应的设计

  1. 每一个响应都要有合适的状态码
  2. 每个响应至少包含状态码、消息提示和数据体

rpm打包教程

一、安装 rpm-build

yum install -y rpm-build rpmdevtools gcc gcc-c++ make autoconf

二、生成相关目录

useradd www
su www
rpmdev-setuptree

三、编写 spec 文件:/root/rpmbuild/SPECS/redis.spec


Name: redis
Version: 3.2.8
Release: 1
Vendor: Redis
Summary: GUN Redis X86_64
License: GPL
Source: redis-3.2.8.tar.gz
Group: Redis
URL: https://redis.io/
Packager: mogu
%description
Redis 3.2.8 Server

%pre
useradd redis
mkdir -p /www/redis/6379
echo '
bind 127.0.0.1
port 6379
dir /www/redis/6379
pidfile /www/redis/6379/redis.pid
logfile /www/redis/6379/redis.log
daemonize yes
requirepass 123456
maxmemory 1G
' > /www/redis/6379/redis.conf
chown redis.redis /www/redis

%prep
pkill redis-server
%setup -q
%build
make
%install
make install
%clean
make clean

%files
%defattr (-,root,root)

四、把源码包放在 /root/rpmbuild/SOURCES 目录下

cp redis-3.2.8.tar.gz /root/rpmbuild/SOURCES/

五、开始打包

rpmbuild -bb /root/rpmbuild/SPECS/redis.spec

记一次数据库崩溃记录

今天公司的数据库主服务器突然崩溃,查看错误日志发现有下面这行提示:


key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 32827455 K  bytes of memory

这句话的意思是根据这个公式计算得到的值,是否超过服务器的物理内存,如果超过就说明是参数设置的太高,导致内存不足而崩溃。

所以在配置数据库参数时,要确保上面几个参数的计算结果小于最大内存。

Python获取系统监控参数

系统监控


import os, json

# load
load = os.popen('cat /proc/loadavg').read()

# uptime
uptime = os.popen('uptime').read()

# net
net = os.popen('cat /proc/net/dev').read()

# memory
memory = os.popen('free -m').read()

# tcp
tcp = os.popen('ss -ant | wc -l').read()

# disk
disk = os.popen('df -hli').read()

# iostat
iostat = os.popen('iostat').read()

# data
data = {'load':load, 'uptime':uptime, 'net':net, 'memory':memory, 'tcp':tcp, 'disk':disk, 'iostat':iostat}

send = json.dumps(data)

MySQL压力测试脚本

数据库压测


import mysql.connector, threading

THREAD_NUM = 10
WORKER_NUM = 100

def working():
    conn = mysql.connector.connect(host='192.168.1.12', user='mogu', password='123456', database='blog')
    for i in range(WORKER_NUM):
        cursor = conn.cursor()
        cursor.execute('select * from wp_users where ID = %s', ('1',))
        values = cursor.fetchall()
        cursor.close()
    conn.close()

def main():
    Threads = []
    for i in range(THREAD_NUM):
        t = threading.Thread(target=working, name=str(i))
        t.setDaemon(True)
        Threads.append(t)
    for t in Threads:
        t.start()
    for t in Threads:
        t.join()
    print("main end")

if __name__ == "__main__":
    main()

Redis安全部署

redis默认以root权限运行,非常的不安全,这个方案是把redis的所有权限限制到redis用户上,实现redis的安全部署


# 创建 redis 用户
useradd redis

# 创建目录
mkdir -p /www/redis
chown redis.redis /www/redis

# 创建 redis 服务,端口 6379
iptables -I INPUT -p tcp -m tcp --dport 6379 -j ACCEPT
su redis
mkdir /www/redis/6379
echo '

bind 127.0.0.1
port 6379
dir /www/redis/6379
pidfile /www/redis/6379/redis.pid
logfile /www/redis/6379/redis.log
daemonize yes
requirepass 123456
maxmemory 1G

' > /www/redis/6379/redis.conf

# 启动
redis-server /www/redis/6379/redis.conf

C语言文件操作

一、打开文件

[c]
#include <stdio.h>
#include <stdlib.h>

main(){

	FILE *fp;

	fp = fopen("test", "r");

	if(fp == NULL){
	// 打开操作不成功
	    printf("The file can not be opened.\n");
	    exit(1);
	}

}
[/c]

二、读取文件

[c]

#include <stdio.h>
#include <stdlib.h>

main(){

	int str;
	FILE *fp;

	fp = fopen("test", "r");

	str = fgetc(fp); // 读取一个字符

	if(str != EOF){
		putchar(str);
	}

	fclose(fp);

}

[/c]

三、读取一行

[c]

#include <stdio.h>
#include <stdlib.h>

main(){

	char str[1024];
	FILE *fp;

	fp = fopen("test", "r");

	fgets(str, 1024, fp);

	printf("%s\n", str);

	fclose(fp);

}

[/c]

四、写入文件

[c]
#include <stdio.h>

main(){

	FILE *fp;

	fp = fopen("test", "w");

	fputs("this is test\n", fp);

	fclose(fp);

}
[/c]

五、其他

C语言使用Socket

C语言使用Socket发起HTTP请求

[c]


#include <string.h>
#include <sys/socket.h>
#include <resolv.h>

int request(char *host, int port){

    int sockfd;
    struct sockaddr_in server;
    char buffer[2048];
    char *request = "GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n";

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    server.sin_addr.s_addr = inet_addr(host);

    connect(sockfd, (struct sockaddr*)&server, sizeof(server));

    send(sockfd, request, strlen(request), 0);

    recv(sockfd, buffer, sizeof(buffer), 0);

    close(sockfd);

    printf("%s", buffer);

    return 0;
}

void main(){
    request("219.239.21.42", 80);
}



[/c]

下载源码

C语言字符串函数

C语言字符串函数

复制字符串

strcpy(p, p1)

复制指定长度字符串

strncpy(p, p1, n)

附加字符串

strcat(p, p1)

附加指定长度字符串

strncat(p, p1, n)

取字符串长度

strlen(p)

比较字符串

strcmp(p, p1)

忽略大小写比较字符串

strcasecmp(p, p1)

比较指定长度字符串

strncmp(p, p1, n)

在字符串中查找指定字符

strchr(p, c)

在字符串中反向查找

strrchr(p, c)

查找字符串

strstr(p, p1)

字符串类型转换

strtod(p, p1) 字符串转换 double 类型
strtol(p, p1, base) 字符串转换 long 类型
atoi(p) 字符串转换到 int 整型 
atof(p) 字符串转换到 double 符点数 
atol(p) 字符串转换到 long 整型

字符串类型检查

isalpha() 检查是否为字母字符 
isupper() 检查是否为大写字母字符 
islower() 检查是否为小写字母字符 
isdigit() 检查是否为数字 
isxdigit() 检查是否为十六进制数字表示的有效字符 
isspace() 检查是否为空格类型字符 
iscntrl() 检查是否为控制字符 
ispunct() 检查是否为标点符号 
isalnum() 检查是否为字母和数字 
isprint() 检查是否是可打印字符 
isgraph() 检查是否是图形字符