Archery是一个国产的,开源的,而且免费的一站式的 SQL 审核查询平台,旨在提升DBA的工作效率,支持多数据库的SQL上线和查询,同时支持丰富的MySQL运维功能。
https://github.com/douban/charts/tree/master/charts charts地址
https://github.com/hhyo/Archery 项目github地址 https://github.com/hhyo/Archery/wiki/k8s
https://archerydms.com/ 官网地址
部署的各种方式官方文档上都有,我这里参照官方文档使用k8s helm的方式来进行部署。
helm repo add douban https://douban.github.io/charts/
helm repo update
my-values.yaml文件如下
这个是最小配置
image:
repository: hhyo/archery # 如果你有二次开发, 改成你自己的 repo
tag: v1.9.1 # 改到最新版, 或者你想要的版本
ingress:
enabled: true # 启用 ingress
className: "nginx"
paths:
- /
servicePort: 9123
hosts:
- sql.example.com # 你的ingress 域名 这个没有可以不用写
# 下面是两个内置的 redis 实例和 mysql 实例, 对 k8s 不熟的, 建议就不要用内置的, 维护起来不是很方便
# subcharts redis
redis:
#我这块直接使用我们现有的redis和mysql服务
embedded: false
# 也可以将 embedded 改成 false, 这里直接写连接串
url: "redis://[email protected]:6379/100"
# dingdingUrl: "redis://127.0.0.1:6379/1"
mysql:
embedded: false
# 这里 mysql 也是类似的
url: "mysql://xxx:[email protected]:3306/archery"
configMap:
enabled: true
# admin password
superuser:
username: admin
password: archery # 请尽快修改
email: "[email protected]"
data:
local_settings.py: |-
# -*- coding: UTF-8 -*-
helm install archery douban/archery -f my-values.yaml -n 命名空间
执行helm install命令就可以将archery服务部署成功。部署成功以后会启2个pod,一个是archery另外一个是archery-goinception。
官方chart文件地址:
https://github.com/douban/charts/tree/master/charts
如果想要将archery和archery-goinception单独部署的话,那就需要单独写一个goinception的value文件,并将archery-goinception服务相关的pod,service,configmap删除,然后再单独重新部署。如果不需要单独部署的话,可以忽略。
goinception的values yaml文件如下:
其中这几个变量需要单独配置一下,配置成自己MySQL的地址和信息
backup_host="xxx-xxxxx.mysql.rds.aliyuncs.com"
backup_port=3306
backup_user="xxxx"
backup_password="xxxxxx"
values.yaml文件详细内容如下:
# Default values for goinception.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
repository: hanchuanchuan/goinception
tag: latest
pullPolicy: IfNotPresent
nameOverride: ""
fullnameOverride: ""
service:
type: ClusterIP
port: 4000
targetPort: 4000
deployment:
labels: {}
annotations: {}
initEnv:
- name: BACKUP_PASSWORD
value: "5UESCBDDbT"
# - name: xxx
# value: xxx
resources: {}
configMap:
enabled: true
data:
config.toml.template: |-
host="0.0.0.0"
advertise_address=""
port=4000
[inc]
check_autoincrement_datatype=true
check_autoincrement_init_value=true
check_autoincrement_name=true
check_column_comment=true
check_column_default_value=true
check_column_position_change=true
check_column_type_change=true
check_dml_limit=true
check_dml_orderby=true
check_dml_where=true
check_identifier=true
check_index_prefix=true
check_insert_field=true
check_primary_key=true
check_table_comment=true
check_timestamp_default=true
check_timestamp_count=false
enable_autoincrement_unsigned=true
enable_blob_type=true
enable_column_charset=true
enable_drop_database=true
enable_drop_table=true
enable_enum_set_bit=false
enable_fingerprint=true
enable_foreign_key=false
enable_json_type=true
enable_identifer_keyword=false
enable_not_innodb=false
enable_nullable=false
enable_null_index_name=false
enable_orderby_rand=true
enable_partition_table=true
enable_pk_columns_only_int=true
enable_select_star=false
enable_set_charset=true
enable_set_collation=false
enable_set_engine=false
max_char_length=0
max_insert_rows=0
max_keys=5
max_key_parts=5
max_update_rows=5000
max_primary_key_parts=1
max_allowed_packet=33554432
merge_alter_table=true
check_float_double=true
support_charset="utf8,utf8mb4"
support_collation="utf8_general_ci,utf8mb4_general_ci"
backup_host="xxx-xxxxx.mysql.rds.aliyuncs.com"
backup_port=3306
backup_user="xxxx"
backup_password="xxxxxx"
#安全更新是否开启.
#-1表示不做操作,基于远端数据库[默认值]
#0表示关闭安全更新
#1表示开启安全更新
sql_safe_updates=0
#lang="en-US"
lang="zh-CN"
#是否记录全量日志
general_log=false
#开启统计功能
enable_sql_statistic=true
[inc_level]
er_cant_set_engine=2
er_cant_set_collation=2
er_table_must_have_comment=2
er_column_have_no_comment=2
er_table_must_have_pk=2
er_index_name_idx_prefix=1
er_index_name_uniq_prefix=1
er_autoinc_unsigned=2
er_alter_table_once=2
er_pk_too_many_parts=2
[osc]
osc_on=false
osc_min_table_size=16
osc_print_none=false
osc_bin_dir="/usr/local/bin"
[ghost]
ghost_on=false
ghost_allow_on_master=true
ghost_assume_rbr=true
ghost_chunk_size=1000
ghost_concurrent_rowcount=true
ghost_cut_over="atomic"
ghost_cut_over_lock_timeout_seconds=3
ghost_default_retries=60
ghost_heartbeat_interval_millis=500
ghost_max_lag_millis=1500
ghost_approve_renamed_columns=true
ghost_exponential_backoff_max_interval=64
ghost_dml_batch_size=10
[log]
# Log level: debug, info, warn, error, fatal.
level="error"
# Log format, one of json, text, console.
format="console"
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
nodeSelector: {}
tolerations: []
T SUITE: None
如果在部署过程中有问题,可以通过helm将archery服务删除掉。
helm -n 命名空间 uninstall archery
如果服务已经部署好了,这时需要修改value.yaml文件,可以执行如下命令,可以直接更新pod。
helm upgrade archery douban/archery -f my-values.yaml -n 命名空间
archery接入ldap需要在archery的values.yaml文件中添加ldap的信息,添加方式有2种,一种是通过环境变量的方式,一种是通过configmap的方式。
envs:
- name: ENABLE_LDAP
value: "true"
- name: AUTH_LDAP_ALWAYS_UPDATE_USER
value: "true"
- name: AUTH_LDAP_SERVER_URI
value: "ldap://openldap.xxx.xxx.xxx.xxx.xxx.cc:389"
- name: AUTH_LDAP_BIND_DN
value: 'cn=xxx,ou=xxx,dc=xxx,dc=xxx,dc=xx'
- name: AUTH_LDAP_BIND_PASSWORD
value: 'xxxxxxxx'
- name: AUTH_LDAP_USER_SEARCH_BASE
value: 'dc=xxx,dc=xxx,dc=xx'
- name: AUTH_LDAP_USER_SEARCH_FILTER
value: '(uid=%(user)s)'
configMap:
enabled: true
# admin password
superuser:
username: admin
password: archery # 默认密码, 请尽快修改
email: "[email protected]" # 超级管理员邮箱, 建议改成内网的邮箱
data:
# local_settings , 可以覆盖之前的所有 django settings 配置, python 代码, 灵活性很高
local_settings.py: |-
import ldap
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType
AUTH_LDAP_SERVER_URI = "ldap://openldap.xxx.xx.xx.xxx.xxx.xxx:389"
AUTH_LDAP_BIND_DN = "cn=xxxx,ou=xxx,dc=xxxx,dc=xxxx,dc=xxx"
AUTH_LDAP_BIND_PASSWORD = "xxxxxx"
AUTH_LDAP_USER_SEARCH = LDAPSearch("dc=xxx,dc=xxxxx,dc=xxx",ldap.SCOPE_SUBTREE,'(uid=%(user)s)',)
AUTH_LDAP_ALWAYS_UPDATE_USER = True
AUTH_LDAP_USER_ATTR_MAP = {
"username": "sAMAccountName",
"display": "displayName",
"first_name": "givenName",
"email": "mail"}
注意:由于对ldap有一些参数不是太熟悉,导致一直无法成功接入ldap,其中一定要注意这块ldap.SCOPE_SUBTREE参数的内容,由于之前我这边写的是(cn=%(user)s),导致一直无法接入ldap,这块要写成(uid=%(user)s)才行。
ldap中自动不能唯一或者查询出现问题
后端可能有的报错
django.db.utils.IntegrityError: (1062, "Duplicate entry '姓名' for key 'sql_users.username'")`
这个问题github上有写解决方法,我直接复制贴到这了,有需要的可以直接在这块复制粘贴使用,这段内容需要放到archery的values.yaml文件内。
# 建议改成sAMAccountName来注册
AUTH_LDAP_USER_ATTR_MAP = { # key为archery.sql_users字段名,value为ldap中字段名,用户同步信息
"username": "sAMAccountName",
"display": "displayname",
"first_name": "givenName",
"email": "mail"
}
配置完域名访问服务遇到的问题
给archery服务配置完域名以后,使用ldap账号和密码登录archery服务,提示403 forbidden。
出现这个问题还需要在configmap里添加权限,添加允许的域名才可以,我这边添加了下面三个字段,值直接写的*。
ALLOWED_HOSTS = ["*"]
CSRF_TRUSTED_ORIGINS = ['*']
CORS_ORIGIN_WHITELIST = ('*')
添加完configmap以后,需要更新一下pod,直接执行
helm upgrade archery douban/archery -f values.yaml -n 命名空间