合适的语法高亮可以帮助快速找到想要的信息

下面正则适用secureCRT, 理论上xshell也是适用

解决了 secureCRT 在某些场景下的开启语法高亮后卡顿的问题

一、 secureCRT shell 高亮

ipv4

([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})

stop end disable close

(\bstop(ped)?\b)|(\bend\b)|(\bfinish(ed)?\b)|(\bdisable(d)?\b)|(\bdelete(d)?\b)|(\bclose(d)?\b)

error fail flase down dead failure

(\berror(s)?\b)|(\bfail(ed)?\b)|(\bfalse\b)|(\bdown\b)|(\bdead\b)|(\bfailure\b)

active success true ok up enable

(\bactive(d)?\b)|(\bsuccess(ful(ly)?)?\b)|(\btrue\b)|(\bok\b)|(\bup\b)|(\benable(d)\b)

username@hostname

[a-z0-9-]*@[a-z0-9-]*

注意: xshell中关于电子邮件的高亮规则如何在secureCRT, 会消耗大量资源, 导致执行htop或者查看大量日志的时候终端卡顿.

效果图:

SecureCRT开启高亮

Options-->Configure-->Default Session-->keyword Highlighting

Xshell开启高亮

工具-->突出显示集

一、 samba 部署

1.1 samba 安装

yum install samba*

1.2 samba 启动

systemctl enable smb --now
systemctl status smb

1.3 测试 smb

添加配置
vim /etc/samba/smb.conf

[share]
path = /samba/share
browsable = Yes
writable = Yes
guest ok = Yes
read only = N

创建用户
useradd smb
smbpasswd smb

Windows资源管理器输入 \\192.168.1.201 , 在跳出的窗口输入刚才的用户名和密码即可.

二、 修改 samba 默认端口

由于安全原因, 不允许常见服务运行在常见的端口上

2.1 修改配置文件

在 [globle] 选项下面添加从参数 smb port = 9445
重启 smb 生效

vim /etc/samba/smb.conf

三、 修改端口后客户端去连接smb

3.1 Linux下smb客户端安装

sudo apt install smbclient

3.2 连接 9445端口的 smb

sudo smbclient -L 192.168.1.201 -p 9445 -U smb
sudo smbclient //192.168.1.201/smb -p 9445 -U smb

3.3 Windows下连接 smb

smb的Windows客户端没有指定端口的选项, 可以通过修改注册表, 但是不一定成功。
使用端口映射, 将192.168.1.201:9445 映射到本地 127.0.0.1:445
资源管理器访问 \\127.0.0.1

3.3.1 关闭Windows下的smb服务端

[服务]–>[server]–>[关闭]–>[重启Windows]

3.3.2 添加端口映射

管理员权限cmd执行:
netsh interface portproxy add v4tov4 listenport=445 listenaddress=127.0.0.1 connectport=9445 connectaddress= 192.168.1.201

查看映射规则:

netsh interface portproxy show all

一、 密码复杂度审计

1.1 查看当前密码策略

MySQL> SHOW VARIABLES LIKE 'validate_password%';

1.2 插件安装

MySQL> install plugin validate_password soname 'validate_password.so';

1.3 my.cnf 参数配置

vim /etc/my.cnf

[mysqld]
plugin-load-add=validate_password.so
validate-password=ON
validate_password_policy = 1
validate_password_length = 8
validate_password_mixed_case_count = 1
validate_password_number_count = 2
validate_password_special_char_count = 1

二、 登录失败处理

2.1 数据库并查看是否开启登录失败和超时功能参数

MySQL> show variables like '%connection_control%';

2.2 安装插件

MySQL> install plugin CONNECTION_CONTROL soname 'connection_control.so';
MySQL> install plugin CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS soname 'connection_control.so';

2.3 修改配置文件my.cnf

vim /etc/my.cnf

[mysqld]
plugin-load-add=connection_control.so
connection-control-failed-connections-threshold=5
connection-control-min-connection-delay=300000

三、 配置模板

3.1 某生产环境使用的配置文件

[mysqld]
skip_ssl
skip-name-resolve
default_password_lifetime=0
user = mysql
basedir = /usr/local/mysql
datadir = /data/mysql/data
port = 3306
server_id = 1
socket = /usr/local/mysql/mysql.sock
pid-file = /usr/local/mysql/mysql.pid
log-error = /data/mysql/data/mysql.err
log-bin = /data/mysql/data/binlog/mysql-bin
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
lower_case_table_names=1
character-set-server = utf8mb4
log_bin_trust_function_creators=1
explicit_defaults_for_timestamp=true
default_time_zone = "+8:00"
log_timestamps = SYSTEM
explicit_defaults_for_timestamp = 1

table_open_cache = 500
table_definition_cache = 1000
table_open_cache_instances = 64
thread_stack = 512K
thread_cache_size = 700
max_allowed_packet = 256M
join_buffer_size = 4M
key_buffer_size = 32M
read_buffer_size = 8M
read_rnd_buffer_size = 8M
sort_buffer_size = 2M
max_connections = 3000
max_connect_errors = 2000

innodb_log_buffer_size = 32M
innodb_log_file_size = 2G
innodb_log_files_in_group = 2
innodb_buffer_pool_size = 48G #重要参数,建议为内存的80%
innodb_buffer_pool_instances = 8
innodb_io_capacity=1200
innodb_page_cleaners=8

log_bin_trust_function_creators=1
binlog_cache_size = 1M
expire_logs_days = 7
binlog_format = row

####mysql master
gtid-mode = ON
enforce-gtid-consistency = ON

slow_query_log = 1
slow_query_log_file = /data/mysql/data/slow_query.log
long_query_time= 60
log_queries_not_using_indexes = 1

[mysqldump]
quick
max_allowed_packet = 256M

[client]
port = 3306
socket = /usr/local/mysql/mysql.sock
#default-character-set = utf8mb4

零、 说明

仅在 CentOS7 下测试, 理论上适用RHEL系列
适用于 二级等保, 三级等保, 阿里云安全基线检查

一、 系统用户密码策略相关

Linux对应的密码策略模块有:pam_passwdqc.sopam_pwquality.so
密码复杂度: pam_pwquality.so 模块对应文件的是 /etc/security/pwquality.conf
密码有效期: pam_passwdqc.so 模块对应文件的是 /etc/login.defs

针对密码复杂度, 推荐编辑pam配置文件/etc/pam.d/system-auth-ac去引用pam_pwquality.so
也可以直接编辑 /etc/security/pwquality.conf
“禁止使用最近三次使用过的密码” 就无法在 pwquality.conf 配置

1.1 密码复杂度

示例: 要求所有用户密码复杂度达到

  • 至少15个字符
  • 至少包含一个大写字符
  • 至少包含一个数字
  • 至少包含一个小写字母
  • 至少包含一个特殊字符
  • 拒绝包含连续相同字符超过5个
  • 允许与原密码相同的字符不超过3个
  • 禁止使用最近24次使用过的密码

方法一: 编辑配置文件: /etc/pam.d/system-auth-ac
注释15行, 并添加如下两行
line16:
password requisite pam_pwquality.so try_first_pass local_users_only enforce_for_root minlen=15 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 maxrepeat=5 retry=3 difok=3
或者
password requisite pam_pwquality.so try_first_pass local_users_only enforce_for_root minlen=15 minclass=4 maxrepeat=5 retry=3 difok=3

line17:
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=24

方法二: 编辑配置文件 /etc/security/pwquality.conf
修改下面参数

  • retry=3: 定义登录 / 修改密码失败时,可以重试的次数
  • minlen=8: 密码最小长度为 8 个字符
  • lcredit=-1: 密码应包含的小写字母的至少1个
  • ucredit=-1: 密码应包含的大写字母至少1个
  • dcredit=-1: 将密码包含的数字至少为1个
  • ocredit=-1: 设置其他符号的最小数量,例如 @,#、! $%等,至少要有1个
  • minclass=3: 所需字符类最小数量(大写, 小写, 数字, 其他)
  • enforce_for_root: 即使是 root 用户设置密码,也应强制执行复杂性策略检查
  • maxrepeat=5: 拒绝包含超过相同连续字符个数
  • difok=3 : 允许不超过与原密码相同的字符个数
  • remember=24: 禁止使用最近24次使用过的密码

注意关于上述参数的负数解释, 详见引用

引用: pam_pwquality(8) - Linux man page

pam_pwquality.so相关错误日志: /var/log/secure

1.2 密码有效期

修改配置文件: /etc/login.defs
注意: 该配置文件对所有用户生效, 若只想针对某个用户生效, 使用命令 chage

一般设置如下:
PASS_MAX_DAYS 90 对应命令为: chage --maxdays 90 root
PASS_MIN_LEN 12
PASS_MIN_DAYS 7 对应命令为: chage --mindays 7 root
PASS_WARN_AGE 30 对应命令为: chage --warndays 7 root
UMASK 077

推荐修改/etc/login.defs后, 再使用chage执行相应的命令

参数 含义
MAIL_DIR /var/spool/mail 创建用户时,系统会在目录 /var/spool/mail 中创建一个用户邮箱,比如 lamp 用户的邮箱是 /var/spool/mail/lamp
PASS_MAX_DAYS 99999 密码有效期,99999 是自 1970 年 1 月 1 日起密码有效的天数,相当于 273 年,可理解为密码始终有效
PASS_MIN_DAYS 0 表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认值是 0
PASS_MIN_LEN 5 指定密码的最小长度,默认不小于 5 位,但是现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效
PASS_WARN_AGE 7 指定在密码到期前多少天,系统就开始通过用户密码即将到期,默认为 7 天
UID_MIN 500 指定最小 UID 为 500,也就是说,添加用户时,默认 UID 从 500 开始。注意,如果手工指定了一个用户的 UID 是 550,那么下一个创建的用户的 UID 就会从551 开始,哪怕 500~549 之间的 UID 没有使用
UID_MAX 60000 指定用户最大的 UID 为 60000
GID_MIN 500 指定最小 GID 为 500,也就是在添加组时,组的 GID 从 500 开始
GID_MAX 60000 用户 GID 最大为 60000
CREATE_HOME yes 指定在创建用户时,是否同时创建用户主目录,yes 表示创建,no 则不创建,默认是 yes
UMASK 077 用户主目录的权限默认设置为 077
USERGROUPS_ENAB yes 指定删除用户的时候是否同时删除用户组,准备地说,这里指的是删除用户的初始组,此项的默认值为 yes
ENCRYPT_METHOD SHA512 指定用户密码采用的加密规则,默认采用 SHA512,这是新的密码加密模式,原先的 Linux 只能用 DES 或 MD5 加密

引用: pam_passwdqc(8) - Linux man page

1.3 空密码账户

查找空密码账户: awk -F: '($2 == "") {print $1}' /etc/shadow
锁定该账户: passwd -l 用户名

1.4 UID 为0的账户

查找 UID为0的账户: awk -F: '$3 == 0' /etc/passwd

Linux 系统中 UID为0的账户为root, 如果发现UID为0而不是root账户, 应该立即删除此账户或者修改该账户的UID不为0

删除用户: userdel 用户名

二、 SSH 服务相关策略

编辑配置文件: /etc/ssh/sshd_config

ClientAliveInterval = 600     服务器向客户端发送请求以确认客户端是否仍然活跃的时间间隔(单位:秒)
ClientAliveCountMax = 2 服务器终止连接之前,允许服务器向客户端发送请求的次数
PermitEmptyPasswords = no 是否允许空密码登录
MaxAuthTries = 4 允许最大登陆失败尝试次数
LogLevel INFO 日志等级: 信息

三、 安全审计

3.1 开启日志审计

systemctl enable rsyslog --now
systemctl enable auditd --now

四、 权限相关

4.1 敏感文件及目录

chown root:root /etc/hosts.allow 
chown root:root /etc/hosts.deny
chown root:root /etc/passwd /etc/shadow /etc/group /etc/gshadow

chmod 644 /etc/hosts.deny
chmod 644 /etc/hosts.allow
chmod 0644 /etc/group
chmod 0644 /etc/passwd
chmod 0400 /etc/shadow
chmod 0400 /etc/gshadow

4.2 系统账户三权分立

普通用户: ordinary

useradd ordinary
passwd ordinary
chmod 750 /home/ordinary

审计用户: auditors

useradd auditors
passwd auditors
chmod 750 /home/auditors

安全用户: security

useradd security
passwd security
chmod 750 /home/security

注意: 三个用户的密码应符合1.1和1.2这两条策略

五、 入侵防范

5.1 开启地址空间布局随机化

编辑配置文件
/etc/sysctl.conf
添加参数: kernel.randomize_va_space = 2
使其生效: sysctl -p

一、 离线安装

1.1 下载安装包

Github Release

1.2 解压

tar -xzvf harbor-offline-installer-v2.7.3.tgz -C /usr/local

1.3 加载镜像

docker load -i /usr/local/harbor/harbor.v2.7.3.tar.gz

1.4 创建相关数据日志目录

mkdir /data/harbor /var/log/harbor -p

1.5 创建配置文件

cp /usr/local/harbor/harbor.yml.tmpl /usr/local/harbor/harbor.yml

vim /usr/local/harbor/harbor.yml

修改相应的主机,端口号, 密码等.

1.6 安装

./prepare
./install

二、 注意事项

harbor自带registry, 安装之前请卸载原来官方的registry(如果你有的话)

零、 ENV

  • OS: CentOS 7.9
  • HW: 4c4g
  • platform: KVM
  • version: GitLab Community Edition 12.10.6
  • ip: 192.168.128.100

一、 官方源安装

1.1 安装 CE 版本yum源

https://packages.gitlab.com/gitlab/gitlab-ce
curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash

1.2 安装

yum repo-pkgs gitlab_gitlab-ce list --showduplicates
yum install gitlab-ce-12.10.6

二、 启动

2.1 编辑gitlab配置文件

vim /etc/gitlab/gitlab.rb

2.2 配置生效

gitlab-ctl reconfigure

2.3 启动 gitlab

gitlab start

三、 GitLab升级

由于GitLab有严格的版本控制, 无法随意升级.

官方给出的升级办法.

3.1 升级路线查询

https://gitlab-com.gitlab.io/support/toolbox/upgrade-path/

升级

  1. 可以直接 yum install + 包名称-版本号
  2. 也可以直接下载 rpm 包然后通过 rpm -uvh + xxx.rpm

看到如下标志表示安装/升级成功.

零、 说明

  • 三种部署方式
    • rpm 包部署 (简单, 不写)
    • 二进制部署
    • docker 构建

一、 二进制安装

1.1 下载

下载连接

1.2 解压并复制到指定目录

tar -zxvf grafana-enterprise-10.1.2.linux-amd64.tar.gz
cp -rf grafana-10.1.2/ /usr/local/grafana

1.3 创建用户/组

groupadd grafana
useradd -g grafana grafana

1.4 创建相关目录

mkdir -p /etc/grafana
mkdir -p /etc/grafana/provisioning
mkdir -p /var/log/grafana
mkdir -p /var/lib/grafana
mkdir -p /var/lib/grafana/plugins

1.5 修改目录权限

chown -R grafana:grafana /usr/local/grafana/
chown -R grafana:grafana /etc/grafana/
chown -R grafana:grafana /var/lib/grafana/
chown -R grafana:grafana /var/log/grafana/

1.6 复制 grafana 配置文件

cp /usr/local/grafana/conf/sample.ini /etc/grafana/grafana.ini

1.7 环境配置文件

vim /etc/sysconfig/grafana-server

GRAFANA_USER=grafana
GRAFANA_GROUP=grafana
GRAFANA_HOME=/usr/local/grafana
LOG_DIR=/var/log/grafana
DATA_DIR=/var/lib/grafana
MAX_OPEN_FILES=10000
CONF_DIR=/etc/grafana
CONF_FILE=/etc/grafana/grafana.ini
RESTART_ON_UPGRADE=true
PLUGINS_DIR=/var/lib/grafana/plugins
PROVISIONING_CFG_DIR=/etc/grafana/provisioning
# Only used on systemd systems
PID_FILE_DIR=/var/run/grafana

1.8 systemd 管理脚本

vim /usr/lib/systemd/system/grafana-server.service

# /usr/lib/systemd/system/grafana-server.service
[Unit]
Description=Grafana instance
Documentation=http://docs.grafana.org
Wants=network-online.target
After=network-online.target
After=postgresql.service mariadb.service mysqld.service influxdb.service

[Service]
EnvironmentFile=/etc/sysconfig/grafana-server
User=grafana
Group=grafana
Type=notify
Restart=on-failure
WorkingDirectory=/usr/local/grafana
RuntimeDirectory=grafana
RuntimeDirectoryMode=0750
ExecStart=/usr/local/grafana/bin/grafana server \
--config=${CONF_FILE} \
--pidfile=${PID_FILE_DIR}/grafana-server.pid \
--packaging=rpm \
cfg:default.paths.logs=${LOG_DIR} \
cfg:default.paths.data=${DATA_DIR} \
cfg:default.paths.plugins=${PLUGINS_DIR} \
cfg:default.paths.provisioning=${PROVISIONING_CFG_DIR}

LimitNOFILE=10000
TimeoutStopSec=20
CapabilityBoundingSet=
DeviceAllow=
LockPersonality=true
MemoryDenyWriteExecute=false
NoNewPrivileges=true
PrivateDevices=true
PrivateTmp=true
ProtectClock=true
ProtectControlGroups=true
ProtectHome=true
ProtectHostname=true
ProtectKernelLogs=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectProc=invisible
ProtectSystem=full
RemoveIPC=true
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
RestrictNamespaces=true
RestrictRealtime=true
RestrictSUIDSGID=true
SystemCallArchitectures=native
UMask=0027

[Install]
WantedBy=multi-user.target

1.9 启动

systemctl daemon-reload
systemctl enable grafana-server --now

1.10 注意

如果启动报错, 注意配置文件还有相关目录的权限

二、 docker 构建

2.1 拉取镜像

docker pull grafana/grafana-enterprise

2.2 docker-compose

vim grafana.yaml

version: "3"
services:
grafana:
image: grafana/grafana-enterprise
container_name: grafana
restart: unless-stopped
user: "0"
ports:
- "3000:3000"
volumes:
- /var/lib/grafana:/var/lib/grafana

2.3 启动

docker-compose -f grafana.yaml up -d

零、 说明

  • 两种部署方式
    • 二进制包部署+systemd管理
    • docker 部署

一、 二进制方式部署

1.1 下载

下载连接

1.2 解压

tar -xzvf prometheus-2.47.0.linux-amd64.tar.gz
cp -r prometheus-2.47.0.linux-amd64 /usr/local/prometheus

1.3 运行测试

cd /usr/local/prometheus
./prometheus --config.file=./prometheus.yml

默认数据目录: ./data

1.4 访问测试

curl http://192.168.128.203:9090/metrics

有数据返回一般就没什么问题了.

1.5 使用 systemd 管理

# /usr/local/prometheus-2.47/prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network-online.target

[Service]
Type=simple
User=root
Restart=on-failure
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/usr/local/prometheus-2.47/prometheus \
--config.file=/usr/local/prometheus-2.47/prometheus.yml \
--storage.tsdb.path /usr/local/prometheus-2.47/data \
--storage.tsdb.retention=15d

[Install]
WantedBy=multi-user.target

systemctl daemon-reload
systemctl enable prometheus --now

二、 使用 docker 构建

2.1 基于centos7.9镜像构建

docker build --network=host -t prometheus-2.47.0 .

  • -network=host可以有效避免yum install的报错
  • -t prometheus-2.47.0 指定构建后的镜像名称

Dockerfile: vim Dockerfile

FROM centos:centos7

# Define Prometheus home and its version
ARG PROMETHEUS_HOME=/opt/prometheus
ARG PROMETHEUS_VERSION=2.47.0

# Define TAR & folder names, as well as download URL for easier use
ARG PROMETHEUS_TAR_MAYOR=prometheus-${PROMETHEUS_VERSION}.linux-amd64
ARG PROMETHEUS_TAR_FULLNAME=${PROMETHEUS_TAR_MAYOR}.tar.gz
ARG PROMETHEUS_URL=https://github.com/prometheus/prometheus/releases/download/v${PROMETHEUS_VERSION}/${PROMETHEUS_TAR_FULLNAME}

# Install wget; download Prometheus
RUN yum install -y wget && \
wget ${PROMETHEUS_URL}

# Untar the file and rename it to "prometheus"
RUN tar xvfz ${PROMETHEUS_TAR_FULLNAME} -C /opt && \
mv /opt/${PROMETHEUS_TAR_MAYOR} /opt/prometheus && \
rm -rf /opt/prometheus/prometheus.yml

RUN groupadd -r prometheus && \
useradd -g prometheus -s /bin/bash -c "Prometheus user" prometheus && \
chown -R prometheus:prometheus /opt/prometheus

COPY config/prometheus.yml /opt/prometheus/prometheus.yml

RUN chown prometheus:prometheus /opt/prometheus/prometheus.yml && \
chmod 755 /opt/prometheus/prometheus.yml

EXPOSE 9090
VOLUME [ "/opt/prometheus" ]
WORKDIR ${PROMETHEUS_HOME}

USER prometheus

ENTRYPOINT [ "./prometheus" ]
CMD [ "--config.file=prometheus.yml" ]

运行镜像测试:
docker run -p 9090:9090 prometheus-2.47.0


没有条件访问github的使用这个Dockerfile
docker build -f prometheus.yml -t prometheus-2.49-rc2 .

FROM centos:centos7.9.2009

ARG PROMETHEUS_HOME=/usr/local/prometheus

# Add file
COPY ./prometheus-2.49.0-rc.2.linux-amd64.tar.gz /opt

# tar file and rename to "prometheus"
RUN mkdir -p ${PROMETHEUS_HOME}
RUN tar -xzvf /opt/prometheus-2.49.0-rc.2.linux-amd64.tar.gz -C /usr/local/prometheus --strip-components=1

RUN groupadd -r prometheus && \
useradd -g prometheus -s /bin/bash -c "Prometheus user" prometheus && \
chown -R prometheus:prometheus /usr/local/prometheus

# port
EXPOSE 9090

VOLUME [ "/usr/local/prometheus" ]

WORKDIR ${PROMETHEUS_HOME}

USER prometheus

ENTRYPOINT [ "./prometheus" ]
CMD [ "--config.file=prometheus.yml" ]

2.2 使用 docker-compose 快速构建

vim Prometheus.yaml

version: "3"
services:
prometheus:
image: prometheus-2.47.0:latest
user: "1000:1000"
ports:
- "9090:9090"
container_name: prometheus
restart: always
volumes:
- /usr/local/prometheus-2.47/prometheus.yml:/opt/prometheus/prometheus.yml
networks:
default:
driver: bridge

运行:

docker-compose -f prometheus.yaml up -d

三、 常见问题

3.1 Prometheus查询不到数据

报错详情: Error on ingesting samples that are too old or are too far into the future
报错详情: err=”out of bounds”

caller=scrape.go:1741 level=warn component="scrape manager" scrape_pool=prometheus target=http://192.168.128.203:9090/metrics msg="Error on ingesting samples that are too old or are too far into the future" num_dropped=666

caller=scrape.go:1405 level=warn component="scrape manager" scrape_pool=prometheus target=http://192.168.128.203:9090/metrics msg="Append failed" err="out of bounds"

引用

问题解决: 构建镜像或者其他原因造成的容器内时间和容器外时间不一致,且Prometheus已获取了错误时间内的相关数据.
清空容器内 /opt/prometheus/data 的数据 并重启容器.

清空容器内错误数据:
docker exec -it prometheus /bin/bash
cd /opt/prometheus/data
rm -rf 0* wal/0* wal/checkpoint.0*

重启容器:
docker-compose -f prometheus.yaml down
docker-compose -f prometheus.yaml up -d

零、 环境

  • OS: Kylin Server V10
  • Arch: aarch64
  • MySQL release: mysql-5.7.40-Linux-aarch64
  • HW: 4c16g

一、 安装前准备

1.1 安装依赖

yum install gcc gcc-c++ cmake

1.2 下载安装包

下载带有boost的安装, 省去单独安装boost的步骤

下载链接

编译安装

2.1 解压

tar -xzvf mysql-boost-5.7.43.tar.gz

2.2 编译安装

cd mysql-5.7.43

mkdir bld && cd bld

cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DENABLED_LOCAL_INFILE=ON \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DCOMPILATION_COMMENT='Mysqlma' \
-DWITH_READLINE=ON \
-DWITH_BOOST=/root/mysql-5.7.43/boost/boost_1_59_0 \
-DSYSCONFDIR=/data/mysql \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock

make && make install

三、 部署

参考另外一篇文章

四、 相关问题

4.1 RPC 相关问题

问题描述: rpc相关头文件找不到

--   Package 'libtirpc', required by 'virtual:world', not found
CMake Error at cmake/rpc.cmake:76 (MESSAGE):
Could not find rpc/rpc.h in /usr/include or /usr/include/tirpc
Call Stack (most recent call first):
rapid/plugin/group_replication/configure.cmake:60 (MYSQL_CHECK_RPC)
rapid/plugin/group_replication/CMakeLists.txt:25 (INCLUDE)

解决:
yum install libtirpc libtirpc-devel

但是在 Kylin V10 aarch64 下找不到 libtirpc-devel

只好从其他操作系统里 /usr/bin/rpc 拷贝一份

零、 环境

字段 位置
ENV: vmware centos7.2 4c8g
VER: mysql release: 5.7.34
BIN_PATH: /usr/local/mysql
DATA-DIR: /data/mysql
CONFIGURE: /etc/my.cnf

一、安装前准备

1.0 安装依赖

yum install libaio

1.1 下载

下载地址

1.2 解压二进制文件

tar -xzvf mysql-5.7.43-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.43-linux-glibc2.12-x86_64 /usr/local
ln -s /usr/local/mysql-5.7.43-linux-glibc2.12-x86_64 /usr/local/mysql

1.3 创建相关目录和用户及组

groupadd mysql
useradd -r -g mysql -s /bin/false mysql
mkdir -p /data/mysql
mkdir -p /usr/local/mysql/tmp
chown -R mysql:mysql /data/mysql
chown -R mysql:mysql /usr/local/mysql

1.4 为MySQL实例创建配置文件

vim /etc/my.cnf

[mysqld]
user=mysql
datadir=/data/mysql/
socket=/usr/local/mysql/mysql.sock
log-error=/usr/local/mysql/mysql-err.log
port=3306
server-id=1
innodb_buffer_pool_size = 50G
lower_case_table_names=0
tmpdir=/usr/local/mysql/tmp/
lc_messages_dir=/usr/local/mysql/share
log_timestamps=SYSTEM

二、 安装

2.1 初始化实例

./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

这里注意如下几个点:

  • 保证 /usr/local/mysql/data/mysql/usr/local/mysql/tmp的权限为 mysql:mysql
  • 保证 /data/mysql 目录为空

To initialize the data directory, invoke mysqld with the --initialize or --initialize-insecure option, depending on whether you want the server to generate a random initial password for the 'root'@'localhost' account, or to create that account with no password:

Use --initialize for “secure by default” installation (that is, including generation of a random initial root password). In this case, the password is marked as expired and you must choose a new one.

With --initialize-insecure , no root password is generated. This is insecure; it is assumed that you intend to assign a password to the account in a timely fashion before putting the server into production use.

可以使用 grep "password" /path to you mysql-err.log 找到使用--initialize生成的随机密码

三、 管理 MySQL

3.1 传统方式管理

  • 配置管理文件
    cp -a /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld

  • 修改如下两行 (大约46/47两行)
    vim /etc/rc.d/init.d/mysqld
    basedir=/usr/local/mysql
    datadir=/data/mysql

  • 管理 mysql
    /etc/rc.d/init.d/mysql start / status / stop / reload / restart

3.2 使用 systemd 管理

  • 完成传统方式管理的配置之后添加文件如下
    vim /usr/lib/systemd/system/mysqld.service

    # vim /usr/lib/systemd/system/mysqld.service
    [Unit]
    Documentation=man:systemd-sysv-generator(8)
    SourcePath=/etc/rc.d/init.d/mysqld
    Description=LSB: start and stop MySQL
    Before=runlevel2.target
    Before=runlevel3.target
    Before=runlevel4.target
    Before=runlevel5.target
    Before=shutdown.target
    After=network-online.target
    After=remote-fs.target
    After=ypbind.service
    After=nscd.service
    After=ldap.service
    After=ntpd.service
    After=xntpd.service
    After=network-online.target
    After=sshd.service
    Wants=network-online.target
    Conflicts=shutdown.target

    [Service]
    Type=forking
    Restart=no
    TimeoutSec=5min
    IgnoreSIGPIPE=no
    KillMode=process
    GuessMainPID=no
    RemainAfterExit=yes
    ExecStart=/etc/rc.d/init.d/mysqld start
    ExecStop=/etc/rc.d/init.d/mysqld stop
    ExecReload=/etc/rc.d/init.d/mysqld reload

    systemctl daemon-reload
    systemctl enable mysql --now
    systemctl status mysql

四、 MySQL 配置文件参数优化

仅供参考:

[client]                                        #客户端配置
port= 3306 #监听端口
socket= /tmp/mysql.sock #socket通信文件
default-character-set = utf8 #客户端字符编码

[mysql] #终端管理
prompt="MySQL [\d]> " #prompt="\\u@\\h:\\d>" 终端连接后显示后用户、主机、当前数据库
no-auto-rehash #auto-rehash 命令行自动补全功能

[mysqld] #服务器配置
port = 3306 #端口
socket = /tmp/mysql.sock #套接字
datadir = /data/mysql #数据库文件所在目录
basedir = /usr/local/mysql #基准路径,其它路径都相对于此路径
pid-file = /usr/local/mysql/mysql.pid #pid文件
user = mysql #管理用户
server-id=1 #本机序列号
init-connect = 'SET NAMES utf8' #当一个连接进来时,做一些操作,此处为连接创建时设置字符编码
character_set_server=utf8 #服务器默认字符集
#skip-networking #开启则彻底关闭mysql的TCP/IP连接方式
back_log = 300 #并发是等待的数量
open_files_limit = 65535 #打开的文件描述符限制
binlog_cache_size = 1M #事务未提交时会记录到cache,等到事务提交,则把日志持久化到磁盘,默认32k,如果事务比此值大,会使用磁盘临时文件替代
max_heap_table_size = 8M #用户创建的内存表最大值,为防止意外超大的内存表耗尽内存资源
tmp_table_size = 128M #内存中临时表的大小,如果超过此值,则转换为基于磁盘的表,默认32M
ft_min_word_len = 4 #全文索引最小长度,
log_bin = mysql-bin #二进制文件
binlog_format = mixed #二进制日志格式,默认statement,建议mixed
expire_logs_days = 7 #指定二进制日志的有效时间
log_error = /usr/local/mysql/mysql-error.log #错误日志
slow_query_log = 1 #默认不开启,on|off
long_query_time = 1 #超过多少秒的查询就写入日志
slow_query_log_file = /usr/local/mysql/mysql-slow.log #慢查询日志文件,mysqldumpslow -h自带的查询慢日志工具。实例mysqldumpslow -s c -t 20 host-slow.log
performance_schema = 0 #用于收集数据库服务器性能参数
explicit_defaults_for_timestamp #自动填补timestamp字段的值
lower_case_table_names = 1 #0存储和比较都是大小写敏感,1存储时转换为小写,比较时不区分大小写。2存储时区分大小写,比较时转换为小写
skip-external-locking #跳过外部锁定,即多台服务器使用同一个数据目录,那么每台必须开启external-locking

##network setting
skip-name-resolve #禁止mysql对外部连接DNS解析。如果打开,则所有远程主机授权都要使用IP方式,否则无法处理请求
bind-address = 0.0.0.0 #服务监听地址
max_connections = 1024 #指定Mysql允许的最大连接进程数,可以过'conn%'通配符查看当前状态的连接数量,以定夺该值的大小。
max_connect_errors = 102400 #对于同一主机,如果超过该值的中断错误连接,则该主机被禁止连接。解禁FLUSH HOST
max_allowed_packet = 32M #接受的数据包大小,增加该值十分的安全,这是因为只有当需要时才会分配额外的内存。去较小值是预防偶尔使用大信息而导致内存溢出
interactive_timeout = 28800 #默认28800,8小时。服务器关闭交互连接前等待活动的描述
wait_timeout = 28800 #默认28800,服务器关闭非交互连接之前等待活动的秒数

##innodb setting
default_storage_engine = InnoDB #默认存储引擎
innodb_file_per_table = 1 #独享表空间,关闭即可
innodb_open_files = 500 #默认300,限制Innodb能打开表的数据
innodb_buffer_pool_size = 1024M #数据和索引的缓冲池,典型值5-6G(8G内存),20-25GB(32GB内存),100-120GB(128GB内存)。
innodb_write_io_threads = 4 #写入磁盘IO
innodb_read_io_threads = 4 #读取磁盘IO
innodb_thread_concurrency = 0 #你的服务器CPU有几个就设置为几,建议用默认一般为8
innodb_purge_threads = 1 #最大值32,控制做purge(净化)操作的后台线程数
innodb_flush_log_at_trx_commit = 2 #为2表示事务日志在提交时写入日志,但日志文件每次刷新到磁盘一次
innodb_log_buffer_size = 2M #指定日志文件所用内存大小,1-8之间
innodb_log_file_size = 32M #指定日志文件大小
innodb_log_files_in_group = 3 #默认2,推荐3.mysql以循环方式将日志文件写入多个文件
innodb_max_dirty_pages_pct = 90 #默认75
innodb_lock_wait_timeout = 120 #默认50秒,

##cache setting
key_buffer_size = 32M #索引缓冲区大小,增加它可以得到更好的处理性能。对于4G左右服务器来说,该参数可设为256MB或384MB
table_open_cache = 512 #这个参数在5.1.3之后的版本中叫做table_open_cache,用于设置table高速缓存的数量。由于每个客户端连接都会至少访问一个表,
sort_buffer_size = 2M #查询排序时所能使用的缓冲区大小,是一个connection级参数,即500个链接会占用500*8=4G内存
join_buffer_size = 2M #联合查询所能使用的缓冲区大小,该参数分配的内存也是每个链接独享,默认2M
read_buffer_size = 2M #用于对myisam表全表扫描时使用缓冲区大小,读查询所能使用的缓冲区大小,该参数分配的内存也是每个链接独享
read_rnd_buffer_size = 8M #当需要时线程分配,当在排序后,从一个已经分配好的序列中读取行时,行数据从这个缓冲区读取防止磁盘寻道
thread_cache_size = 64 #服务器线程缓存,连接断开时放入缓存,线程重新被请求从缓存读取。设置规则:1GB内存配置8,2G内存配置18,3G内存32,4G或更高可配置更大
query_cache_type = 1 #是否开启查询缓存,默认0不开启,1缓存所有结果,2仅缓存select语句中通过SQL_CACHE指定的查询
query_cache_size = 64M #指定查询缓冲区大小 ,一个select工作后,db会把该语句缓冲,当同一个SQL再次来到,DB未检查到该表发生变化时,会直接把结果返给client
query_cache_limit = 2M #指定单个查询缓存所能使用的缓冲区大小
bulk_insert_buffer_size = 8M #默认8M,批量插入数据缓存大小,可以提高插入效率

myisam_sort_buffer_size = 64M #myisam表发生变化时,重新排序所需的缓冲,默认8M
myisam_max_sort_file_size = 10G #mysql重建索引时允许的临时文件大小

#event_scheduler =ON
#skip-external-locking
#sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

[mysqldump]
quick #备份方式
max_allowed_packet = 500M #服务器发送和接受的最大包长度

[myisamchk]
key_buffer_size = 256M #key缓冲
sort_buffer_size = 8M #排序缓冲
read_buffer = 4M #读取缓冲
write_buffer = 4M #写入缓冲