当前位置:网站首页>Harbor高可用集群设计及部署(实操+视频),基于离线安装方式
Harbor高可用集群设计及部署(实操+视频),基于离线安装方式
2022-06-21 18:42:00 【51CTO】

【摘要】基于离线安装方式的Harbor高可用集群部署方案,从理论到实践,文档 + 视频结合的方式全面、详细的对部署过程进行解读。
1.环境说明
1.1 架构图

1.2 主机清单
IP地址 | 主机名 | 描述 |
192.168.2.107 | harbor1 | Harbor实例1,8021端口 |
192.168.2.108 | harbor2 | Harbor实例2,8021端口 |
192.168.2.110 | harbor-data | 部署Harbor实例的共享存储、外部数据库、外部缓存服务 |
192.168.2.111 | / | 负载均衡VIP,8121端口 |
1.3 集群拓扑图

1.4 服务版本
相关服务的版本要求如表:
服务 | 版本要求 | 安装版本 |
Harbor | / | 2.3.5 |
Docker | 17.06.0+ | 19.03.8 |
Docker-compose | 1.18.0+ | v2.2.3 |
Redis | 6.0.16 | 6.2.7 |
PostgreSQL | v13.2+ | 13.5 |
2.主机初始化
Harbor实例主机进行初始化
- 安装docker
- 安装docker-compose
- 配置内核参数
2.1 安装docker
$ wget
-O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$ yum install
-y docker-ce
$ systemctl enable
--now docker
$ systemctl status docker
$ cat
<<EOF > /etc/docker/daemon.json
{
"registry-mirrors": ["https://xcg41ct3.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors":
["https://3hjcmqfe.mirror.aliyuncs.com"],
"log-driver": "json-file",
"log-opts": {
"max-size": "500m",
"max-file": "2"
}
}
EOF
$ systemctl daemon-reload
$ systemctl restart docker
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
exec-opts": ["native.cgroupdriver=systemd"], #驱动器
registry-mirrors: 镜像加速地址,可多个
max-file: log最多保留数量
live-restore: 重启docker不重启容器,多用于k8s上
2.2 安装docker-compose
安装docker-compose 1.18.0以上的版本,本处安装v2.2.3版本。
2.3 配置内核参数
3.使用NFS提供外部存储
在192.168.2.110部署NFS服务提供共享存储给Harbor1实例、Harbor2实例使用。
192.168.2.110作为NFS服务端,harbor实例为客户端。
3.1 部署NFS服务端
1)安装并启动nfs
注意:正在将请求转发到“systemctl enable nfs.service”。
2)创建共享目录
客户端的数据将远程存入到共享目录下。
3)修改配置

4)重启nfs服务
5)检查共享目录信息
3.2 部署客户端
在harbor1和harbor2上操作
3.3 客户端挂载NFS共享存储
在harbor1和harbor2节点操作,创建实例的存储目录,然后挂载道NFS。
挂载格式:NFSIP:共享目录 本地目录 nfs defaults 0 0
测试是否可以正常使用:
[[email protected] ~]
# touch
/data/harbor_data/test.txt
[[email protected] ~]
# ls /data/harbor_data/
test.txt
- 1.
- 2.
- 3.
- 4.
4.部署Redis缓存服务(源码)

在192.168.2.110部署Redis缓存服务,为harbor1和harbor2实例提供外部redis缓存服务。
Redis是一款高性能的key/value分布式内存数据库。
4.1 下载安装包
4.2 安装依赖包
4.3 源码编译
[[email protected] ~]
mkdir
-p /app/
[[email protected] ~] tar zxvf redis-6.2.7.tar.gz
-C /app
[[email protected] ~]
cd /app/redis-6.2.7/
[[email protected] redis-6.2.7]
# make #编译
[[email protected] redis-6.2.7]
# make install #安装
- 1.
- 2.
- 3.
- 4.
- 5.
4.4 修改配置文件
redis默认只支持本地使用,本处需要修改为外部可连接;
redis启动方式;
redis远程连接密码;
[[email protected] ~]
# vim /app/redis-6.2.7/redis.conf
#bind 127.0.0.1 -::1 #75行,注释掉bind的行,允许任何主机连接;
daemonize
yes
#259行,将no修改为yes,使redis可以使用守护进程方式启动;
requirepass lidabai666
#903行,设置redis连接的auth密码(lidabai666)
- 1.
- 2.
- 3.
- 4.
4.5 启动Redis服务
前面配置了使用守护进程方式启动,所以直接使用systemctl则可以启动redis服务。
[[email protected] redis-6.2.7]
# pwd
/app/redis-6.2.7
[[email protected] redis-6.2.7]
# redis-server redis.conf
- 1.
- 2.
- 3.
4.6 查看Redis服务版本
4.7 查看端口
redis默认监听6379端口
[[email protected] redis-6.2.7]
# ps aux | grep 6379
root
6200
0.1
0.2
162416
10020 ? Ssl
17:59
0:00 redis-server *:6379
root
6231
0.0
0.0
112720
984 pts/0 R
+
18:01
0:00
grep
--color
=auto
6379
- 1.
- 2.
- 3.
4.8 客户端连接Redis
harbor1和harbor2作为redis客户端
客户端使用redis-cli工具连接Redis服务器
[[email protected] redis-6.2.7]
# which redis-cli #查看redis-cli工具位置
/usr/local/bin/redis-cli
[[email protected] redis-6.2.7]
# scp /usr/local/bin/redis-cli 192.168.2.107:/usr/local/bin/
[[email protected] redis-6.2.7]
# scp /usr/local/bin/redis-cli 192.168.2.108:/usr/local/bin/
[[email protected] ~]
# redis-cli -h 192.168.2.110 -p 6379 -a lidabai666
- 1.
- 2.
- 3.
- 4.
- 5.
-a参数指定redis连接密码
5.部署PostgreSQL外部数据库服务(源码)
在192.168.2.110主机以源码的方式安装PostgreSQL数据库服务,为harbor1和harbor2实例提供共享存储。
5.1 新建postgres用户
默认超级用户(root)不能启动postgresql,需要手动建用户postgres。
[[email protected] ~]
# useradd postgres
[[email protected] ~]
# id postgres
uid
=
1000(postgres)
gid
=
1000(postgres) 组
=
1000(postgres)
- 1.
- 2.
- 3.
5.2 安装依赖包
5.3 下载解压源码包
5.4 编译安装
[[email protected] ~]
# cd /app/postgresql-13.5/
[[email protected] postgresql-13.5]
# ./configure --prefix=/usr/local/postgresql
[[email protected] postgresql-13.5]
# make && make install
- 1.
- 2.
- 3.
5.5 创建数据目录
5.6 设置postgres环境变量
[[email protected] postgresql-13.5]
# su - postgres
[[email protected] ~]
$ vim
+ .bash_profile
PGHOME
=/usr/local/postgresql
#psql安装目录
export PGHOME
PGDATA
=/data/postgresql/data
#数据库目录
export PGDATA
PATH
=
$PATH:
$HOME/bin:
$HOME/.local/bin:
$PGHOME/bin
export PATH
[[email protected] ~]
$ source ./.bash_profile
[[email protected] ~]
$ which psql
/usr/local/postgresql/bin/psql
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 查看版本
5.7 初始化数据库
由于 Red Hat 系列发行版的政策,PostgreSQL 安装不会启用自动启动或自动初始化数据库。要完成数据库安装,您需要根据您的发行版执行以下步骤:
[[email protected] ~]
$ initdb
......
You can change this by editing pg_hba.conf or
using the option
-A, or
--auth
-local and
--auth
-host, the next time
you run initdb.
Success. You can now
start the database
server using:
#表示初始化成功
pg_ctl
-D /data/postgresql/data
-l logfile
start
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
5.8 启动PostgreSQL
根据刚才初始化成功后的提示执行启动命令!
[[email protected] ~]
$ pg_ctl
-D /data/postgresql/data
-l logfile
start
waiting
for server to
start....
done
server started
- 1.
- 2.
- 3.
- 4.
5.9 设置(修改)Postgresql密码
默认psql本地登录是不需要密码的,即使我们设置了密码,也不需要密码就能登录。应为配置文件pg_hba.conf中的local设置为trust , 为了安全我们修改为 password,就是使用密码才能登陆,(当我们忘记密码的时间,也可以使用这用方式,先设置为trust之后,修改密码,然后在设置为password。
[[email protected] ~]
$ psql
psql (13.5)
Type
"help"
for help.
postgres
=
# \password
Enter new password:
#输入设置的密码 Lidabai666
Enter it again:
#确认密码(再次输入)
postgres
=
# \q #退出
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.

5.10 设置可远程登录PostgreSQL
[[email protected] ~]
$ vim /data/postgresql/data/postgresql.conf
listen_addresses
=
'*'
#60行,监听所有地址
[[email protected] ~]
$ vim
+
/data/postgresql/data/pg_hba.conf
local
all all password
host
all all
0.0.0.0/0 password
host
all all ::1/128 password
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.

5.10 重启PostgreSQL

5.11 创建数据库
Harbor 2.3.5需要创建的数据库:notaryserver、notarysigner、registry 目前Harbor仅支持PostgraSQL数据库,需要手动在外部的PostgreSQL上创建harbor、notary_signer、notary_servers三个数据库,Harbor启动时会自动在对应数据库下生成表。
因为本处主要是演示环境,PostgreSQL数据库的用户就以超级管理员- postgres为例,如果是生产环境,建议新建用户,并授予harbor、notary_signer、notary_servers三个数据库相对应的权限。
[[email protected] ~]
$ psql
Password
for user postgres:
#输入密码
postgres
=
# create database registry;
CREATE DATABASE
postgres
=
# create database notary_signer;
CREATE DATABASE
postgres
=
# create database notary_servers;
CREATE DATABASE
postgres
=
# \l
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.

5.12 创建用户
创建server用户和signer用户

5.13 客户端测试链接
6.负载均衡设置(Nginx +Keepalived)
使用keepalived和Nginx实现harbor的高可用。
在harbor1和harbor2节点上安装keepalived服务来提供VIP实现负载均衡。Nginx服务则实现将来到VIP的请求转发到后端服务器组harbor
6.1 安装nginx和keepalived
在harbor1和harbor2操作
nginx从1.9.0开始新增了steam模块,用来实现四层协议的转发、代理、负载均衡等。
二进制安装的nginx则在./configure时添加--with-stream参数来安装stream模块。
6.2 修改nginx配置文件
在harbor1和harbor2的Nginx服务配置文件一样。
$ vim /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
#自动设置nginx的工作进程数量
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections
1024;
#工作进程的连接数
}
# 四层负载均衡,为两台harbor提供负载均衡
stream {
log_format main
'$remote_addr $upstream_addr - [$time_local]
$status $upstream_bytes_sent';
access_log /var/log/nginx/harbor-access.log main;
upstream harbor{
server
192.168.2.107:8021;
# harbor1
server
192.168.2.108:8021;
# harbor2
}
server {
listen
8121;
#由于nginx与harbor节点复用,这个监听端口不能是8021,否则会冲突
proxy_pass harbor;
}
}
http {
log_format main
'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout
65;
types_hash_max_size
2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen
80 default_server;
server_name _;
location / {
}
}
}
- 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.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 检测nginx配置文件语法
6.3 修改keepalived配置
本处以harbor1为keepalived服务的主节点,harbor2为keepalived的备节点。主备节点的keepalived配置文件不一样。
主节点(harbor1)
[[email protected] ~]
# cat /etc/keepalived/keepalived.conf
! Configuration File
for keepalived
global_defs {
notification_email {
859281177@qq.com
}
router_id master1
}
vrrp_instance lidabai {
state MASTER
interface ens33
mcast_src_ip:192.168.2.107
virtual_router_id
107
priority
100
advert_int
1
nopreempt
authentication {
auth_type PASS
auth_pass
1111
}
virtual_ipaddress {
192.168.2.111/24
#虚拟VIP地址
}
track_script {
chk_nginx
}
}
##### 健康检查
vrrp_script chk_nginx {
script
"/etc/keepalived/check_nginx.sh"
interval
2
weight
-20
}
- 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.
- 35.
备节点(harbor2)
[[email protected] ~]
# cat /etc/keepalived/keepalived.conf
! Configuration File
for keepalived
global_defs {
notification_email {
859281177@qq.com
}
router_id master2
}
vrrp_instance lidabai {
state BACKUP
interface ens33
mcast_src_ip:192.168.2.108
virtual_router_id
107
priority
80
#权重
advert_int
1
nopreempt
authentication {
auth_type PASS
auth_pass
1111
}
virtual_ipaddress {
192.168.2.111/24
}
track_script {
chk_nginx
}
}
vrrp_script chk_nginx {
script
"/etc/keepalived/check_nginx.sh"
interval
2
weight
-20
}
- 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.
6.4 编写健康检查脚本
在主备节点(harbor1和harbor2)同样操作。
$ vim /etc/keepalived/check_nginx.sh
#1、判断Nginx是否存活
counter
=
`ps -C nginx --no-header | wc -l`
if [
$counter
-eq
0 ];
then
#2、如果不存活则尝试启动Nginx
service nginx
start
sleep
2
#3、等待2秒后再次获取一次Nginx状态
counter
=
`ps -C nginx --no-header | wc -l`
#4、再次进行判断,如Nginx还不存活则停止Keepalived,让地址进行漂移
if [
$counter
-eq
0 ];
then
service keepalived
stop
fi
fi
$ chmod
+x /etc/keepalived/check_nginx.sh
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
6.5 启动服务
先启动master1和master2节点上的nginx服务,再启动keepalived服务
1)启动nginx服务
[[email protected] ~]
# systemctl enable --now nginx #启动nginx服务并设置开机自启
[[email protected] ~]
# systemctl enable --now nginx
[[email protected] ~]
# systemctl status nginx.service
[[email protected] ~]
# systemctl status nginx.service
- 1.
- 2.
- 3.
- 4.
2)启动keepalived服务
[[email protected] ~]
# systemctl enable --now keepalived
[[email protected] ~]
# systemctl enable --now keepalived
[[email protected] ~]
# systemctl status keepalived.service
[[email protected] ~]
# systemctl status keepalived.service
- 1.
- 2.
- 3.
- 4.
6.6 查看VIP
在harbor1节点查看VIP是否成功绑定。
[[email protected] ~]
# ip addr
......
2: ens33:
<BROADCAST,MULTICAST,UP,LOWER_UP> mtu
1500 qdisc pfifo_fast state UP
group default qlen
1000
link/ether
00:0c:29:f1:a3:65 brd ff:ff:ff:ff:ff:ff
inet
192.168.2.107/24 brd
192.168.2.255 scope global
noprefixroute ens33
valid_lft forever preferred_lft forever
inet
192.168.2.111/24 scope global secondary ens33
#VIP地址
valid_lft forever preferred_lft forever
inet6 fe80::80b0:1d7f:b5d4:19e8/64 scope link tentative dadfailed
......
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
通过ifconfig是无法查看到VIP的,通过`hostname -I`命令也可以查看到VIP。
7.部署Harbor实例1
在harbor1 192.168.2.107主机上部署harbor服务
7.1 下载解压离线安装包
7.2 修改配置文件
将配置文件模板复制为配置文件,然后修改对应参数。
[[email protected] ~]
# cd /app/harbor/
[[email protected] harbor]
# cp
harbor.yml.tmpl harbor.yml
[[email protected] harbor]
# vim harbor.yml
hostname:
192.168.2.107
http:
port:
8021
#取消https安全加密访问方式:
#https:
# port: 443
# certificate: /your/certificate/path
# private_key: /your/private/key/path
## 启用外部代理,启用后hostname将不再使用
external_url: http:192.168.2.111:8121
## 配置共享存储,即挂载的NFS目录
data_volume: /data/harbor_data
_version:
2.3.0
## 配置外部数据库
external_database:
harbor:
host:
192.168.2.110
# 数据库主机地址
port:
5432
# 数据库端口
db_name: registry
# 数据库名称
username: postgres
# 连接该数据库的用户名
password: Lidabai666
# 连接数据库的密码
ssl_mode: disable
max_idle_conns:
2
max_open_conns:
0
notary_signer:
host:
192.168.2.110
port:
5432
db_name: notary_signer
username: postgres
password: Lidabai666
ssl_mode: disable
notary_server:
host:
192.168.2.110
port:
5432
db_name: notary_server
username: postgres
password: Lidabai666
ssl_mode: disable
##配置外部Redis实例:
external_redis:
host:
192.168.2.110:6379
#redis服务IP地址和端口号。如果redis是哨兵模式,
# 这里应该是host_sentinel1:port_sentinel1,host_sentinel2:port_sentinel2
password: lidabai666
#连接外部redis服务的密码
# sentinel_master_set: #仅在使用 Sentinel模式(哨兵模式)时使用
registry_db_index:
1
jobservice_db_index:
2
#job服务的数据库索引
chartmuseum_db_index:3
#chartmuseum插件的Redis索引
trivy_db_index:
5
#Trivy扫描器的数据索引
idle_timeout_seconds:
30
#超时时间
#启用metrics数据采集插件:
metric:
enabled:
true
port:
9090
path: /metrics
- 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.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.


7.3 将配置文件注入到组件中
将harbor.yml配置文件的内容注入到各组件的配置文件中。

7.4 安装Harbor
安装期间会自动导入镜像,执行完成会自动启动Harbor服务。


----Harbor has been
installed and started successfully.----表示安装成功!
7.5 查看服务状态

7.6 浏览器登录Harbor UI
使用实例主机IP+端口在浏览器访问harbor UI
http://192.168.2.107:8021

用户名:admin
密码: Harbor12345
8.部署Harbor实例2
操作步骤跟部署Harbor实例1一致
[[email protected] harbor]
# mkdir /app
[[email protected] harbor]
# wget https://github.com/goharbor/harbor/releases/download/v2.3.5/harbor-offline-installer-v2.3.5.tgz
[[email protected] harbor]
# tar zxvf harbor-offline-installer-v2.3.5.tgz -C /app/
[[email protected] harbor]
# scp 192.168.2.107:/app/harbor/harbor.yml /app/harbor/
[[email protected] harbor]
# vim /app/harbor/harbor.yml’
hostname:
192.168.2.108
[[email protected] harbor]
# ./prepare
[[email protected] harbor]
# ./install.sh --with-trivy --with-chartmuseum
[[email protected] harbor]
# docker-compose ps
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.

9.服务验证
9.1 浏览器访问VIP和端口
http://192.168.2.111:8121
在Harbor UI界面测试镜像推送、拉取、创建用户、创建项目等是否正常

9.2 命令行登录Harbor

出现报错:
Error response from daemon: Get https://192.168.2.111:8121/v2/: http: server gave HTTP response to HTTPS client
在docker配置文件中添加参数:
[[email protected] harbor]
# vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://xcg41ct3.mirror.aliyuncs.com"],
"exec-opts": [
"native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://3hjcmqfe.mirror.aliyuncs.com"],
"insecure-registries": [
"192.168.2.111:8121"],
"log-driver":
"json-file",
"log-opts": {
"max-size":
"500m",
"max-file":
"2"
}
}
[[email protected] harbor]
# systemctl restart docker #然后重启docker
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
9.3 向Harbor推送镜像
[[email protected] harbor]
# docker pull alpine:3.16
[[email protected] harbor]
# docker tag alpine:3.16 192.168.2.111:8121/lidabai/alpine:3.16
[[email protected] harbor]
# docker push 192.168.2.111:8121/lidabai/alpine:3.16
- 1.
- 2.
- 3.
然后可以在Harbor UI界面查看到镜像已经推送成功!

10、视频部分
由于51上没发上传视频,视频和文档都放在微信公众号《Harbor进阶实战》了
边栏推荐
猜你喜欢
随机推荐
Cloudcompare & PCL point cloud AABB bounding box
开通融资融券账户安全吗?有什么要求?
mysql如何对列求和
Envi classic annotation object how to recall modification and deletion of element legend scale added
uniapp获取登录授权和手机号授权(整理)
Resttemplate multiple authentication information authorization
mysql如何對列求和
Comment MySQL additionne les colonnes
金鱼哥RHCA回忆录:DO447管理用户和团队的访问
[wechat applet] collaboration and publishing data binding
汇编语言贪吃蛇、俄罗斯方块双任务设计实现详解(一)——整体系统设计
RPA financial process automation | Shanghai Pudong Development Group and cloud expansion technology accelerate financial digital operation
Using fastjson to deserialize simplegrantedauthority in the security framework
How MySQL implements grouping sum
通过flinksql 的方式使其部分字段更新可以么?
How MySQL sums columns
mysql增加的语句是什么
国家认证--软件评测师考试要求
MySQL 5.7 compilation and installation
Custom code template









