MySQL主从同步

CentOS7 安装MySQL

下载rpm并安装

1
2
wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
rpm -ivh mysql57-community-release-el7-9.noarch.rpm

使用yum命令即可完成安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 安装
yum install mysql-server

# 启动msyql:
systemctl start mysqld

# 获取安装时的临时密码(在第一次登录时就是用这个密码):
grep 'temporary password' /var/log/mysqld.log

# 登录
mysql -u root -p

# 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

#刷新
flush privileges;

七、其他配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

# 设置安全选项:
mysql_secure_installation

# 关闭MySQL
systemctl stop mysqld

# 重启MySQL
systemctl restart mysqld

# 查看MySQL运行状态
systemctl status mysqld

# 设置开机启动
systemctl enable mysqld

# 关闭开机启动
systemctl disable mysqld

# 配置默认编码为utf8:
vi /etc/my.cnf #添加 [mysqld] character_set_server=utf8 init_connect='SET NAMES utf8'

# 其他默认配置文件路径:
#配置文件:
/etc/my.cnf
#日志文件:
/var/log//var/log/mysqld.log
#服务启动脚本:
/usr/lib/systemd/system/mysqld.service
#socket文件:
/var/run/mysqld/mysqld.pid

# 查看版本
select version();

准备:
两台MySQL服务器:
1、Master:192.168.172.110
2、Slave:192.168.172.111
端口都是3306

配置详解:
一、主库配置:
1、编辑配置文件:

1
2
3
4
5
6
7
8
9
10
11
$ vim /etc/my.cnf

server-id=110 #设置主服务器的ID(不能和别的服务器重复,建议使用ip的最后一段)
innodb_flush_log_at_trx_commit=2 #可以配置的值:0/1/2; 0、效率最高,最不安全;1、最安全,但是效率最低;2、安全和效率平衡的取舍,在服务器系统挂掉的情况下会丢失数据;
sync_binlog=1 #,值可设置 1、500、1000;可自己根据测试性能配置
log-bin=mysql-bin #binlog日志文件名
binlog-ignore-db=mysql # 表示不同步mysql库
binlog-ignore-db=information_schema # 表示不同步information_schema库
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
binlog-do-db=xxxx # 这个表示只同步某个库 (如果没有此项,表示同步所有的库)

2、创建用于主从同步的账户:

1
2
3
4
5
6
#登录MySQL 
$ mysql -u root -p
mysql> create user 'sync'@'%' identified by 'Sync@0000'; # 5.7要求密码必须含有大小写英文,符号和数字
mysql> grant FILe on *.* to 'sync'@'192.168.172.111' identified by 'Sync@0000'; #赋予FILE权限,允许从从库ip访问主库
mysql> grant replication slave on *.* to 'sync'@'192.168.172.111' identified by 'Sync@0000'; #赋予主从同步权限
mysql> flush privileges;

3、重启MySQL,使my.cnf 配置生效;查看主库状态:

1
2
3
4
5
6
7
8
9
$ service mysqld restart #重启MySQL
mysql -u root -p
mysql> show master status; #查看主库的状态 file,position 这两个值很有用,记一下;需要放到slave配置中
+--------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+--------------------+----------+--------------+------------------+-------------------+
| mysql-bin.00001 | 156 | xxxx | | |
+--------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

二、从库配置:
1、编辑配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ vim /etc/my.cnf

server-id=111
#log-bin=mysql-bin #从库提高性能可以不开bin-log日志
replicate-ignore-db=mysql #配置不需要复制的库mysql
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
replicate-ignore-db=sys
replicate_do_db=python #标记出需要同步的数据库名,在多从配置时可以按需配置
innodb_flush_log_at_trx_commit=2 # 可以配置的值:0/1/2; 0、效率最高,最不安全;1、最安全,但是效率最低;2、安全和效率平衡的取舍,在服务器系统挂掉的情况下会丢失数据;
sync_binlog=1000 # 每进行n次事务提交之后,MySQL将binlog_cache中的数据强制写入磁盘。
slave_parallel_workers=4 #根据实际情况决定开启多少个线程用于主从复制
slave_parallel_type=logical_clock #基于组提交的并行复制方式
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON

2、配置完成后,重启从库的MySQL;

1
2
3
4
5
6
$ service mysqld restart #重启MySQL
$ mysql -u root -p #登录mysql
mysql> stop slave; #关闭从库
mysql> change master to master_host='192.168.172.110', master_user='sync' ,master_password='Sync@0000', master_log_file='mysql-bin.00001' ,master_log_pos=156; #配置主库信息
mysql> start slave; #开启从库
mysql> show slave status \G; #Slave_IO_Running,Slave_SQL_Running 都为Yes的时候表示配置成功

3、验证主从:
可以在主库上对数据进行操作,再在从库上刷新是否同步;

MySQL的主从配置很简单

Got fatal error 1236 from master when reading data from binary log: ‘Could not find first log file name in binary log index file’系列一:
主库添加log-bin-index 参数后,从库报这个错误:Got fatal error 1236 from master when reading data from binary log: ‘Could not find first log file name in binary log index file’

Got fatal error 1236 from master when reading data from binary log: ‘could not find next log’

可以

1
2
3
stop slave;
reset slave;
start slave;

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建数据库和用户
create database databasename default charset utf8 collate utf8_general_ci;
create user 'username'@'%' identified by 'password';
grant all privileges on databasename.* to 'username'@'%'
flush privileges;

# 替换文字
语法:UPDATE 表名 SET 字段名=replace(字段名, '被替换字符串', '新的字符串') ;
示例:UPDATE tb_user SET name=replace( name, '\'', '') ;

# 复制表结构
CREATE TABLE targetTable LIKE sourceTable;
# 复制表数据
INSERT INTO targetTable SELECT * FROM sourceTable;

数据库设计软件推荐

PDMan软件

信息

1
2
3
4
5
6
7
# Git地址 https://gitee.com/robergroup/pdman

#下载地址
# 主:https://gitee.com/robergroup/pdman/attach_files
# 备:
# MAC: http://static.kedaotech.com/PDMan-darwin_v2.1.6.dmg
# X86_64: http://static.kedaotech.com/PDMan-win64_v2.1.6.exe

Docker

CentOS7下安装Docker

准备工作

  • 更新操作系统
1
yum update
  • 安装常用软件
1
2
3
yum install -y unzip zip wget vim net-tools lrzsz
# 打包镜像的机器根据开发语言的不同,按实际需要的进行安装

安装

  • Docker CE版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#安装yum-utils软件包,以便使用yum-config-manager设置稳定库
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装最新版本的Docker
yum install docker-ce docker-ce-cli containerd.io

# Docker开机自启
systemctl enable docker

# 启动Docker
systemctl start docker

# 验证Docker是否安装成功
docker run hello-world

文档: https://docs.docker.com/engine/install/centos/

  • Docker开机自启
1
systemctl enable docker

Docker国内镜像加速

参考文档

安装redis

1
2
3
4
5
6
7

# 安装redis
docker run -p 6379:6379 --restart=always -d redis:latest redis-server

# 安装redis 并限制100M内存
docker run -it -m 100M --memory-swap -1 -p 6379:6379 --restart=always -d redis:latest redis-server

私有镜像库

  • 安装镜像库

    • 下载镜像

      1
      docker pull registry
    • 运行registry容器

      1
      2
      3
      4
      5
      6
      7
      8
      #参数说明
      #-itd:在容器中打开一个伪终端进行交互操作,并在后台运行;
      #-v:把宿主机的/data/registry目录绑定 到 容器/var/lib/registry目录(这个目录是registry容器中存放镜像文件的目录),来实现数据的持久化;
      #-p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了;
      #--restart=always:这是重启的策略,假如这个容器异常退出会自动重启容器;
      #--name registry:创建容器命名为registry,你可以随便命名;
      #registry:latest:这个是刚才pull下来的镜像;
      docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
  • 上传镜像

    配置镜像服务器

    1
    2
    3
    4
    5
    [root@node ~]# vim /etc/docker/daemon.json 
    {
    "registry-mirrors": [ "https://registry.docker-cn.com"],
    "insecure-registries": [ "镜像服务器IP:5000"]
    }

    镜像打标签

    1
    docker tag test:latest  镜像服务器IP:5000/test:v1

    镜像上传

    1
    docker push 镜像服务器IP:5000/test:v1
  • 查看镜像

    1
    curl http://IP:5000/v2/_catalog
  • 查看test镜像都有哪些tag

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        http://镜像服务器IP:5000/v2/busybox/tags/list
    ···


    ### 常用组件

    - MinIO 文件存储(单实例运行)
    ```bash
    docker run -itd -p 9000:9000 --restart=always --name minio1 -v /data/minio:/data -e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" -e "MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" minio/minio server /data

    # 纠删码方式

    docker run -itd -p 9000:9000 --restart=always --name minio1 -v /home/minio/data00:/data00 -v /home/minio/data01:/data01 -v /home/minio/data02:/data02 -v /home/minio/data03:/data03 -v /home/minio/data04:/data04 -v /home/minio/data05:/data05 -v /home/minio/data06:/data06 -v /home/minio/data07:/data07 -v /home/minio/data08:/data08 -v /home/minio/data09:/data09 -e "MINIO_ACCESS_KEY=qwert12345" -e "MINIO_SECRET_KEY=qwert12345" minio/minio server /data00 /data01 /data02 /data03 /data04 /data05 /data06 /data07 /data08 /data09

文档:https://docs.min.io/docs/minio-docker-quickstart-guide

  • MySQL5.7
1
2
3
4
5
6
7
# 创建MySQL 且不区别大小写,时区为东八区 密码为root
# 注意mysql数据保存位置,root用户名密码 镜像版本号
docker run -id --name=ry_mysql -e TZ=Asia/Shanghai -p 3306:3306 --restart=always -e MYSQL_ROOT_PASSWORD=root -v /home/mysqldata:/var/lib/mysql mysql:5.7.38 --lower_case_table_names=1

# 创建MySQL 限制内存
docker run -it -m 256M --memory-swap -1 -id --name=ry_mysql -e TZ=Asia/Shanghai -p 3306:3306 --restart=always -e MYSQL_ROOT_PASSWORD=root -v /home/mysqldata:/var/lib/mysql mysql:5.7.38 --lower_case_table_names=1

  • ElasticSearch
1
docker run -e "ES_JAVA_OPTS=-Xms64m -Xmx251m" --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node"  --restart=always -d elasticsearch:7.2.0

docker中的容器时区更改

  • 进入需要更改时区的容器
1
    docker exec -it 容器ID bash
  • 将宿主机的时区链接到容器里面
1
2
3
4
# 这里使用的是上海的时区
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
    #如果本地时区不正确,可以更改本地时区:
    echo "Asia/Shanghai" > /etc/timezone
  • 退出容器并重启容器
1
2
    exit  # 退出容器
    docker restart 容器ID #重启容器
  • 删除无用和没有tag的镜像
1
docker image prune -f
  • 阿里云效容器加速打包
1
2
3
4
5
6
# jre8的版本 带字体修复
registry.cn-beijing.aliyuncs.com/qtubiao/openjdk:8-jre-alpine-font

# jdk17的版本 带字体修复
registry.cn-beijing.aliyuncs.com/qtubiao/openjdk:17-jdk-alpine3.14-font

  • 一键部署maven私服
1
docker run -d -p 48081:8081  --privileged=true --name nexus -v /data1/zhongyj/data/nexus-data:/nexus-data --restart=always sonatype/nexus3 
  • 安装rockylinux
1

1
2
# 查看容器日志最后十行
docker compose logs -f -t --tail=10
  • docker 命令 push pull 设置代理
1
2
3
4
5
6
export http_proxy="http://127.0.0.1:7890"
export https_proxy=$http_proxy

# 设置setproxy和unsetproxy 可以快速切换代理 需要时候使用
alias setproxy="export http_proxy='http://127.0.0.1:7890'; export https_proxy='http://127.0.0.1:7890'; echo '设置代理成功';"
alias unsetproxy="unset http_proxy; unset https_proxy; echo '取消代理成功';"

ApacheBench压力测试

CentOS下安装ApacheBench

1
yum install httpd-tools

执行命令

向某个链接的机器并发400发送20000个请求

1
ab -n 20000 -c 400 https://xxx.com

性能指标(某圈广告投放):

  • Requests per second: >=1500
  • Time per request: <=200ms

说明: 每秒QPS>=1500 响应时间<=200ms

FFmpeg常用命令

MP4转为GIF

为GIF提取色板

1
ffmpeg -i a.mp4 -vf fps=15,scale=-1:-1::flags=lanczos,palettegen palette.png

转为固定高度/12帧速的GIF图片

1
ffmpeg -i a.mp4 -i palette.png -lavfi fps=12,scale=-1:960:flags=lanczos[x];[x][1:v]paletteuse -y a.gif

PNG转为JPG

为JPG提取色板

1
ffmpeg -i tempchart1.png -vf fps=15,scale=-1:-1::flags=lanczos,palettegen -y palette.png

转为固定宽度的JPG图片

1
ffmpeg -i tempchart1.png -i palette.png -lavfi scale=400:-1:flags=lanczos[x];[x][1:v]paletteuse -y tempchart1.jpg

视频添加音频

1
2
3
4
#效果:音频淡入淡出  音频时长小于视频时 音频循环播放
ffmpeg -stream_loop -1 -i xxx.mp3 -i xxx.mp4 -af afade=t=in:st=0:d=3,afade=t=out:st=${overtime}:d=3 -ss 00:00:00 -to ${endTimeStr} -y -b:v 1024k -profile:v main -brand mp42 out.mp4
#参数:${overtime} 音频淡出的开始秒数
#参数:${endTimeStr} 视频结束时间

视频中减去音轨

1
ffmpeg -i xxx.mp4 -an -y xx.mp4

使用硬件加速

1
2
3
4
5
6
7
8
9
10
11
12
13

N卡支持情况: https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new


# 使用nvidia GPU加速
ffmpeg -i xxxx.mp4 -c:v h264_nvenc -y xx.mp4

# 使用intel 核显加速
ffmpeg -i xxxx.mp4 -c:v h264_qsv -y xx.mp4

# 使用nvidia GPU加速 h265
ffmpeg -i xxxx.mp4 -c:v hevc_nvenc -c:a copy -y xx.mp4

转为固定尺寸视频

1
2
3
4
# 转为1080P
ffmpeg -i xxxx.mp4 -s hd1080 -y xx.mp4
# 转为720P
ffmpeg -i xxxx.mp4 -s hd720 -y xx.mp4

PNG转为带通道视频

1
2
3
4
5
6
7
8
9
10
11
12
# 两种方式生成mov视频
ffmpeg -f concat -safe 0 -i input.txt -vcodec png aa.mov
ffmpeg -f concat -safe 0 -i input.txt -vcodec qtrle bb.mov
# 转为WEBM格式
ffmpeg -i bb.mov -c:v libvpx-vp9 out.webm

# 生成的MOV文件过大的问题 可以转libx264
ffmpeg -f concat -safe 0 -i input.txt -vcodec png -c:v libx264 aaa.mov


ffmpeg -f concat -safe 0 -i input.txt -vcodec qtrle -pix_fmt yuva420p bb.mov

视频裁剪

1
2
3
4
5
6
7
# crop的参数格式为w:h:x:y
w、h为输出视频的宽和高,
x、y标记输入视频中的某点,将该点作为基准点,向右下进行裁剪得到输出视频。
如果x y不写的话,默认居中剪切

ffmpeg -i XX.mp4 -vf crop=400:400 XXX.mp4 -y
ffmpeg -i XX.mp4 -vf crop=400:400:0:0 XXX.mp4 -y

windows下 ffmpeg命令行批量转换视频

1
2
3
4
5
# 在命令行:
for %a in ("*.mp4") do ffmpeg -i "%a" -threads 2 -vcodec libx264 -preset slow -crf 20 -y "newfiles\%~na.mp4"

# 批处理文件中: 需要多加个%号
for %%a in ("*.mp4") do ffmpeg -i "%%a" -threads 2 -vcodec libx264 -preset slow -crf 20 -y "%%~na.mp4"