From 0beb5c788eeb81163b1da0769bc94f5c58009c4c Mon Sep 17 00:00:00 2001 From: tennix Date: Mon, 29 Apr 2019 15:05:08 +0800 Subject: [PATCH 01/14] use TiDB v2.1.8 by default & remove pushgateway --- charts/tidb-backup/values.yaml | 2 +- .../templates/config/_drainer-config.tpl | 30 ++- .../config/_privileged-tidb-config.tpl | 249 ------------------ .../templates/config/_pump-config.tpl | 5 +- .../templates/config/_tidb-config.tpl | 30 ++- .../templates/config/_tikv-config.tpl | 33 +-- .../templates/privileged-tidb-configmap.yaml | 18 -- .../templates/privileged-tidb-deployment.yaml | 96 ------- .../templates/privileged-tidb-service.yaml | 28 -- .../scripts/_start_privileged_tidb.sh.tpl | 36 --- .../tidb-cluster/templates/tidb-cluster.yaml | 6 - charts/tidb-cluster/values.yaml | 54 ++-- docs/local-dind-tutorial.md | 6 +- .../tidb-cluster-values.yaml | 12 +- pkg/controller/controller_utils.go | 22 -- pkg/controller/controller_utils_test.go | 20 -- pkg/manager/member/tikv_member_manager.go | 19 +- 17 files changed, 108 insertions(+), 558 deletions(-) delete mode 100644 charts/tidb-cluster/templates/config/_privileged-tidb-config.tpl delete mode 100644 charts/tidb-cluster/templates/privileged-tidb-configmap.yaml delete mode 100644 charts/tidb-cluster/templates/privileged-tidb-deployment.yaml delete mode 100644 charts/tidb-cluster/templates/privileged-tidb-service.yaml delete mode 100644 charts/tidb-cluster/templates/scripts/_start_privileged_tidb.sh.tpl diff --git a/charts/tidb-backup/values.yaml b/charts/tidb-backup/values.yaml index e5fb6d3c0e2..455bfb718b3 100644 --- a/charts/tidb-backup/values.yaml +++ b/charts/tidb-backup/values.yaml @@ -10,7 +10,7 @@ mode: backup # backup | restore name: fullbackup-20190306 image: pullPolicy: IfNotPresent - binlog: pingcap/tidb-binlog:v2.1.0 + binlog: pingcap/tidb-binlog:v2.1.8 # https://github.com/tennix/tidb-cloud-backup backup: pingcap/tidb-cloud-backup:latest diff --git a/charts/tidb-cluster/templates/config/_drainer-config.tpl b/charts/tidb-cluster/templates/config/_drainer-config.tpl index 59f4c7009a1..7e50c461307 100644 --- a/charts/tidb-cluster/templates/config/_drainer-config.tpl +++ b/charts/tidb-cluster/templates/config/_drainer-config.tpl @@ -13,6 +13,9 @@ data-dir = "/data" # a comma separated list of PD endpoints pd-urls = "http://{{ template "cluster.name" . }}-pd:2379" +# Use the specified compressor to compress payload between pump and drainer +compressor = "" + #[security] # Path of file that contains list of trusted SSL CAs for connection with cluster components. # ssl-ca = "/path/to/ca.pem" @@ -24,14 +27,18 @@ pd-urls = "http://{{ template "cluster.name" . }}-pd:2379" # syncer Configuration. [syncer] -# disable sync these schema -ignore-schemas = {{ .Values.binlog.drainer.ignoreSchemas | default "INFORMATION_SCHEMA,PERFORMANCE_SCHEMA,mysql" | quote }} +# Assume the upstream sql-mode. +# If this is setted , will use the same sql-mode to parse DDL statment, and set the same sql-mode at downstream when db-type is mysql. +# If this is not setted, it will not set any sql-mode. +# sql-mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION" # number of binlog events in a transaction batch -txn-batch = {{ .Values.binlog.drainer.txnBatch | default 1 }} +txn-batch = {{ .Values.binlog.drainer.txnBatch | default 20 }} # work count to execute binlogs -worker-count = {{ .Values.binlog.drainer.workerCount | default 1 }} +# if the latency between drainer and downstream(mysql or tidb) are too high, you might want to increase this +# to get higher throughput by higher concurrent write to the downstream +worker-count = {{ .Values.binlog.drainer.workerCount | default 16 }} disable-dispatch = {{ .Values.binlog.drainer.disableDispatch | default false }} @@ -42,10 +49,14 @@ safe-mode = {{ .Values.binlog.drainer.safeMode | default false }} # valid values are "mysql", "pb", "tidb", "flash", "kafka" db-type = "{{ .Values.binlog.drainer.destDBType }}" +# disable sync these schema +ignore-schemas = {{ .Values.binlog.drainer.ignoreSchemas | default "INFORMATION_SCHEMA,PERFORMANCE_SCHEMA,mysql" | quote }} + ##replicate-do-db priority over replicate-do-table if have same db name ##and we support regex expression , start with '~' declare use regex expression. # #replicate-do-db = ["~^b.*","s1"] + #[[syncer.replicate-do-table]] #db-name ="test" #tbl-name = "log" @@ -54,6 +65,11 @@ db-type = "{{ .Values.binlog.drainer.destDBType }}" #db-name ="test" #tbl-name = "~^a.*" +# disable sync these table +#[[syncer.ignore-table]] +#db-name = "test" +#tbl-name = "log" + {{- if eq .Values.binlog.drainer.destDBType "mysql" }} # the downstream mysql protocol database [syncer.to] @@ -61,10 +77,9 @@ host = {{ .Values.binlog.drainer.mysql.host | quote }} user = {{ .Values.binlog.drainer.mysql.user | default "root" | quote }} password = {{ .Values.binlog.drainer.mysql.password | quote }} port = {{ .Values.binlog.drainer.mysql.port | default 3306 }} -# Time and size limits for flash batch write -time-limit = {{ .Values.binlog.drainer.mysql.timeLimit | default "30s" | quote }} -size-limit = {{ .Values.binlog.drainer.mysql.sizeLimit | default 100000 | quote }} + [syncer.to.checkpoint] +# you can uncomment this to change the database to save checkpoint when the downstream is mysql or tidb #schema = "tidb_binlog" {{- end }} @@ -73,6 +88,7 @@ size-limit = {{ .Values.binlog.drainer.mysql.sizeLimit | default 100000 | quote # Compress compresses output file, like pb and sql file. Now it supports "gzip" algorithm only. # Values can be "gzip". Leave it empty to disable compression. [syncer.to] +# directory to save pb file, default same as data-dir(save checkpoint file) if this is not configured. dir = "/data/pb" compression = "gzip" {{- end }} diff --git a/charts/tidb-cluster/templates/config/_privileged-tidb-config.tpl b/charts/tidb-cluster/templates/config/_privileged-tidb-config.tpl deleted file mode 100644 index b6558971756..00000000000 --- a/charts/tidb-cluster/templates/config/_privileged-tidb-config.tpl +++ /dev/null @@ -1,249 +0,0 @@ -# TiDB Configuration. - -# TiDB server host. -host = "0.0.0.0" - -# tidb server advertise IP. -advertise-address = "" - -# TiDB server port. -port = 4000 - -# Registered store name, [tikv, mocktikv] -store = "mocktikv" - -# TiDB storage path. -path = "/tmp/tidb" - -# The socket file to use for connection. -socket = "" - -# Run ddl worker on this tidb-server. -run-ddl = true - -# Schema lease duration, very dangerous to change only if you know what you do. -lease = "45s" - -# When create table, split a separated region for it. It is recommended to -# turn off this option if there will be a large number of tables created. -split-table = true - -# The limit of concurrent executed sessions. -token-limit = 1000 - -# Only print a log when out of memory quota. -# Valid options: ["log", "cancel"] -oom-action = "log" - -# Set the memory quota for a query in bytes. Default: 32GB -mem-quota-query = 34359738368 - -# Enable coprocessor streaming. -enable-streaming = false - -# Set system variable 'lower_case_table_names' -lower-case-table-names = 2 - -# Make "kill query" behavior compatible with MySQL. It's not recommend to -# turn on this option when TiDB server is behind a proxy. -compatible-kill-query = false - -[log] -# Log level: debug, info, warn, error, fatal. -level = {{ .Values.privilegedTidb.logLevel | default "info" | quote }} - -# Log format, one of json, text, console. -format = "text" - -# Disable automatic timestamp in output -disable-timestamp = false - -# Stores slow query log into separated files. -slow-query-file = "" - -# Queries with execution time greater than this value will be logged. (Milliseconds) -slow-threshold = 300 - -# Queries with internal result greater than this value will be logged. -expensive-threshold = 10000 - -# Maximum query length recorded in log. -query-log-max-len = 2048 - -# File logging. -[log.file] -# Log file name. -filename = "" - -# Max log file size in MB (upper limit to 4096MB). -max-size = 300 - -# Max log file keep days. No clean up by default. -max-days = 0 - -# Maximum number of old log files to retain. No clean up by default. -max-backups = 0 - -# Rotate log by day -log-rotate = true - -[security] -# This option causes the server to start without using the privilege system at all. -skip-grant-table = true -# Path of file that contains list of trusted SSL CAs for connection with mysql client. -ssl-ca = "" - -# Path of file that contains X509 certificate in PEM format for connection with mysql client. -ssl-cert = "" - -# Path of file that contains X509 key in PEM format for connection with mysql client. -ssl-key = "" - -# Path of file that contains list of trusted SSL CAs for connection with cluster components. -cluster-ssl-ca = "" - -# Path of file that contains X509 certificate in PEM format for connection with cluster components. -cluster-ssl-cert = "" - -# Path of file that contains X509 key in PEM format for connection with cluster components. -cluster-ssl-key = "" - -[status] -# If enable status report HTTP service. -report-status = true - -# TiDB status port. -status-port = 10080 - -# Prometheus pushgateway address, leaves it empty will disable prometheus push. -metrics-addr = "" - -# Prometheus client push interval in second, set \"0\" to disable prometheus push. -metrics-interval = 15 - -[performance] -# Max CPUs to use, 0 use number of CPUs in the machine. -max-procs = 0 -# StmtCountLimit limits the max count of statement inside a transaction. -stmt-count-limit = 5000 - -# Set keep alive option for tcp connection. -tcp-keep-alive = true - -# Whether support cartesian product. -cross-join = true - -# Stats lease duration, which influences the time of analyze and stats load. -stats-lease = "3s" - -# Run auto analyze worker on this tidb-server. -run-auto-analyze = true - -# Probability to use the query feedback to update stats, 0 or 1 for always false/true. -feedback-probability = 0.05 - -# The max number of query feedback that cache in memory. -query-feedback-limit = 1024 - -# Pseudo stats will be used if the ratio between the modify count and -# row count in statistics of a table is greater than it. -pseudo-estimate-ratio = 0.8 - -# Force the priority of all statements in a specified priority. -# The value could be "NO_PRIORITY", "LOW_PRIORITY", "HIGH_PRIORITY" or "DELAYED". -force-priority = "NO_PRIORITY" - -[proxy-protocol] -# PROXY protocol acceptable client networks. -# Empty string means disable PROXY protocol, * means all networks. -networks = "" - -# PROXY protocol header read timeout, unit is second -header-timeout = 5 - -[prepared-plan-cache] -enabled = false -capacity = 100 - -[opentracing] -# Enable opentracing. -enable = false - -# Whether to enable the rpc metrics. -rpc-metrics = false - -[opentracing.sampler] -# Type specifies the type of the sampler: const, probabilistic, rateLimiting, or remote -type = "const" - -# Param is a value passed to the sampler. -# Valid values for Param field are: -# - for "const" sampler, 0 or 1 for always false/true respectively -# - for "probabilistic" sampler, a probability between 0 and 1 -# - for "rateLimiting" sampler, the number of spans per second -# - for "remote" sampler, param is the same as for "probabilistic" -# and indicates the initial sampling rate before the actual one -# is received from the mothership -param = 1.0 - -# SamplingServerURL is the address of jaeger-agent's HTTP sampling server -sampling-server-url = "" - -# MaxOperations is the maximum number of operations that the sampler -# will keep track of. If an operation is not tracked, a default probabilistic -# sampler will be used rather than the per operation specific sampler. -max-operations = 0 - -# SamplingRefreshInterval controls how often the remotely controlled sampler will poll -# jaeger-agent for the appropriate sampling strategy. -sampling-refresh-interval = 0 - -[opentracing.reporter] -# QueueSize controls how many spans the reporter can keep in memory before it starts dropping -# new spans. The queue is continuously drained by a background go-routine, as fast as spans -# can be sent out of process. -queue-size = 0 - -# BufferFlushInterval controls how often the buffer is force-flushed, even if it's not full. -# It is generally not useful, as it only matters for very low traffic services. -buffer-flush-interval = 0 - -# LogSpans, when true, enables LoggingReporter that runs in parallel with the main reporter -# and logs all submitted spans. Main Configuration.Logger must be initialized in the code -# for this option to have any effect. -log-spans = false - -# LocalAgentHostPort instructs reporter to send spans to jaeger-agent at this address -local-agent-host-port = "" - -[tikv-client] -# Max gRPC connections that will be established with each tikv-server. -grpc-connection-count = 16 - -# After a duration of this time in seconds if the client doesn't see any activity it pings -# the server to see if the transport is still alive. -grpc-keepalive-time = 10 - -# After having pinged for keepalive check, the client waits for a duration of Timeout in seconds -# and if no activity is seen even after that the connection is closed. -grpc-keepalive-timeout = 3 - -# max time for commit command, must be twice bigger than raft election timeout. -commit-timeout = "41s" - -[txn-local-latches] -# Enable local latches for transactions. Enable it when -# there are lots of conflicts between transactions. -enabled = false -capacity = 10240000 - -[binlog] -# enable to write binlog. -enable = false - -# WriteTimeout specifies how long it will wait for writing binlog to pump. -write-timeout = "15s" - -# If IgnoreError is true, when writting binlog meets error, TiDB would stop writting binlog, -# but still provide service. -ignore-error = false diff --git a/charts/tidb-cluster/templates/config/_pump-config.tpl b/charts/tidb-cluster/templates/config/_pump-config.tpl index 241f0edd731..e27d75a70d2 100644 --- a/charts/tidb-cluster/templates/config/_pump-config.tpl +++ b/charts/tidb-cluster/templates/config/_pump-config.tpl @@ -27,6 +27,9 @@ pd-urls = "http://{{ template "cluster.name" . }}-pd:2379" # Path of file that contains X509 key in PEM format for connection with cluster components. # ssl-key = "/path/to/drainer-key.pem" # +[storage] +# Set to `true` (default) for best reliability, which prevents data loss when there is a power failure. +sync-log = {{ .Values.binlog.pump.syncLog | default true }} # # we suggest using the default config of the embedded LSM DB now, do not change it unless you know what you are doing # [storage.kv] @@ -36,7 +39,7 @@ pd-urls = "http://{{ template "cluster.name" . }}-pd:2379" # compaction-L0-trigger = 8 # compaction-table-size = 67108864 # compaction-total-size = 536870912 -# compaction-total-size-multiplier = 8 +# compaction-total-size-multiplier = 8.0 # write-buffer = 67108864 # write-L0-pause-trigger = 24 # write-L0-slowdown-trigger = 17 diff --git a/charts/tidb-cluster/templates/config/_tidb-config.tpl b/charts/tidb-cluster/templates/config/_tidb-config.tpl index 56525ec41f1..19e1374145d 100644 --- a/charts/tidb-cluster/templates/config/_tidb-config.tpl +++ b/charts/tidb-cluster/templates/config/_tidb-config.tpl @@ -22,7 +22,7 @@ socket = "" run-ddl = true # Schema lease duration, very dangerous to change only if you know what you do. -lease = "45s" +lease = {{ .Values.tidb.lease | default "45s" | quote }} # When create table, split a separated region for it. It is recommended to # turn off this option if there will be a large number of tables created. @@ -36,11 +36,14 @@ token-limit = 1000 oom-action = "log" # Set the memory quota for a query in bytes. Default: 32GB -mem-quota-query = 34359738368 +mem-quota-query = {{ .Values.tidb.memQuotaQuery | default "34359738368" | atoi }} # Enable coprocessor streaming. enable-streaming = false +# Enable batch commit for the DMLs. +enable-batch-dml = {{ .Values.tidb.enableBatchDml | default false }} + # Set system variable 'lower_case_table_names' lower-case-table-names = 2 @@ -48,6 +51,12 @@ lower-case-table-names = 2 # turn on this option when TiDB server is behind a proxy. compatible-kill-query = false +# check mb4 value in utf8 is used to control whether to check the mb4 characters when the charset is utf8. +check-mb4-value-in-utf8 = {{ .Values.tidb.checkMb4ValueInUtf8 | default true }} + +# treat-old-version-utf8-as-utf8mb4 use for upgrade compatibility. Set to true will treat old version table/column UTF8 charset as UTF8MB4. +treat-old-version-utf8-as-utf8mb4 = {{ .Values.tidb.treatOldVersionUtf8AsUtf8mb4 | default true }} + [log] # Log level: debug, info, warn, error, fatal. level = {{ .Values.tidb.logLevel | default "info" | quote }} @@ -121,7 +130,7 @@ metrics-interval = 15 [performance] # Max CPUs to use, 0 use number of CPUs in the machine. -max-procs = 0 +max-procs = {{ .Values.tidb.maxProcs | default 0 }} # StmtCountLimit limits the max count of statement inside a transaction. stmt-count-limit = 5000 @@ -151,6 +160,18 @@ pseudo-estimate-ratio = 0.8 # The value could be "NO_PRIORITY", "LOW_PRIORITY", "HIGH_PRIORITY" or "DELAYED". force-priority = "NO_PRIORITY" +# The limitation of the number for the entries in one transaction. +# If using TiKV as the storage, the entry represents a key/value pair. +# WARNING: Do not set the value too large, otherwise it will make a very large impact on the TiKV cluster. +# Please adjust this configuration carefully. +txn-entry-count-limit = {{ .Values.tidb.txnEntryCountLimit | default "300000" | atoi }} + +# The limitation of the size in byte for the entries in one transaction. +# If using TiKV as the storage, the entry represents a key/value pair. +# WARNING: Do not set the value too large, otherwise it will make a very large impact on the TiKV cluster. +# Please adjust this configuration carefully. +txn-total-size-limit = {{ .Values.tidb.txnTotalSizeLimit | default "104857600" | atoi }} + [proxy-protocol] # PROXY protocol acceptable client networks. # Empty string means disable PROXY protocol, * means all networks. @@ -245,3 +266,6 @@ write-timeout = "15s" # If IgnoreError is true, when writting binlog meets error, TiDB would stop writting binlog, # but still provide service. ignore-error = false + +# use socket file to write binlog, for compatible with kafka version tidb-binlog. +binlog-socket = "" diff --git a/charts/tidb-cluster/templates/config/_tikv-config.tpl b/charts/tidb-cluster/templates/config/_tikv-config.tpl index 6cddc4c2565..6505207432a 100644 --- a/charts/tidb-cluster/templates/config/_tikv-config.tpl +++ b/charts/tidb-cluster/templates/config/_tikv-config.tpl @@ -18,21 +18,12 @@ log-level = {{ .Values.tikv.logLevel | default "info" | quote }} # log-rotation-timespan = "24h" [readpool.storage] -{{- if .Values.tikv.readpoolStorageConcurrency }} -# size of thread pool for high-priority operations -high-concurrency = {{ .Values.tikv.readpoolStorageConcurrency }} -# size of thread pool for normal-priority operations -normal-concurrency = {{ .Values.tikv.readpoolStorageConcurrency }} -# size of thread pool for low-priority operations -low-concurrency = {{ .Values.tikv.readpoolStorageConcurrency }} -{{- else }} # size of thread pool for high-priority operations # high-concurrency = 4 # size of thread pool for normal-priority operations # normal-concurrency = 4 # size of thread pool for low-priority operations # low-concurrency = 4 -{{- end }} # max running high-priority operations of each worker, reject if exceed # max-tasks-per-worker-high = 2000 # max running normal-priority operations of each worker, reject if exceed @@ -70,7 +61,15 @@ low-concurrency = {{ .Values.tikv.readpoolCoprocessorConcurrency }} # maximum number of messages can be processed in one tick. # messages-per-tick = 4096 -# compression type for grpc channel, available values are none, deflate and gzip. +## Status address. +## This is used for reporting the status of TiKV directly through the HTTP address. +## Empty string means disabling it. +status-addr = "0.0.0.0:20180" + +## Set the maximum number of worker threads for the status report HTTP service. +# status-thread-pool-size = 1 + +## Compression type for gRPC channel: none, deflate or gzip. # grpc-compression-type = "none" # size of thread pool for grpc server. # grpc-concurrency = 4 @@ -120,11 +119,7 @@ low-concurrency = {{ .Values.tikv.readpoolCoprocessorConcurrency }} # scheduler's worker pool size, should increase it in heavy write cases, # also should less than total cpu cores. -{{- if .Values.tikv.storageSchedulerWorkerPoolSize }} -scheduler-worker-pool-size = {{ .Values.tikv.storageSchedulerWorkerPoolSize }} -{{- else }} # scheduler-worker-pool-size = 4 -{{- end }} # When the pending write bytes exceeds this threshold, # the "scheduler too busy" error is displayed. @@ -134,14 +129,6 @@ scheduler-worker-pool-size = {{ .Values.tikv.storageSchedulerWorkerPoolSize }} # pd endpoints # endpoints = [] -[metric] -# the Prometheus client push interval. Setting the value to 0s stops Prometheus client from pushing. -# interval = "15s" -# the Prometheus pushgateway address. Leaving it empty stops Prometheus client from pushing. -address = "http://localhost:9091" # empty or http://localhost:9091 to disable or enable tikv push metrics -# the Prometheus client push job name. Note: A node id will automatically append, e.g., "tikv_1". -# job = "tikv" - [raftstore] # true (default value) for high reliability, this can prevent data loss when power failure. sync-log = {{ .Values.tikv.syncLog }} @@ -261,7 +248,7 @@ sync-log = {{ .Values.tikv.syncLog }} # Max size of rocksdb's MANIFEST file. # For detailed explanation please refer to https://github.com/facebook/rocksdb/wiki/MANIFEST -# max-manifest-file-size = "20MB" +# max-manifest-file-size = "128MB" # If true, the database will be created if it is missing. # create-if-missing = true diff --git a/charts/tidb-cluster/templates/privileged-tidb-configmap.yaml b/charts/tidb-cluster/templates/privileged-tidb-configmap.yaml deleted file mode 100644 index f13962d0861..00000000000 --- a/charts/tidb-cluster/templates/privileged-tidb-configmap.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- if .Values.privilegedTidb }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "cluster.name" . }}-privileged-tidb - labels: - app.kubernetes.io/name: {{ template "chart.name" . }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: privileged-tidb - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} -data: - startup-script: |- -{{ tuple "scripts/_start_privileged_tidb.sh.tpl" . | include "helm-toolkit.utils.template" | indent 4 }} - - config-file: |- -{{ tuple "config/_privileged-tidb-config.tpl" . | include "helm-toolkit.utils.template" | indent 4 }} -{{- end }} diff --git a/charts/tidb-cluster/templates/privileged-tidb-deployment.yaml b/charts/tidb-cluster/templates/privileged-tidb-deployment.yaml deleted file mode 100644 index 78141998e34..00000000000 --- a/charts/tidb-cluster/templates/privileged-tidb-deployment.yaml +++ /dev/null @@ -1,96 +0,0 @@ -{{- if .Values.privilegedTidb }} -apiVersion: apps/v1beta1 -kind: Deployment -metadata: - name: {{ template "cluster.name" . }}-privileged-tidb - labels: - app.kubernetes.io/name: {{ template "chart.name" . }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: privileged-tidb - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} -spec: - replicas: {{ .Values.privilegedTidb.replicas }} - selector: - matchLabels: - app.kubernetes.io/name: {{ template "chart.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: privileged-tidb - template: - metadata: - labels: - app.kubernetes.io/name: {{ template "chart.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: privileged-tidb - spec: - {{- if .Values.privilegedTidb.nodeSelector }} - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - {{- range $key, $val := .Values.privilegedTidb.nodeSelector }} - {{- $valList := splitList "," $val }} - - key: {{ $key }} - operator: In - values: - {{- range $kl, $vl := $valList }} - - {{ $vl }} - {{- end }} - {{- end }} - {{- end }} - containers: - - name: privileged-tidb - image: {{ .Values.privilegedTidb.image }} - imagePullPolicy: {{ .Values.privilegedTidb.imagePullPolicy | default "IfNotPresent" }} - {{- if .Values.privilegedTidb.resources }} - resources: -{{ toYaml .Values.privilegedTidb.resources | indent 10 }} - {{- end }} - command: - - /bin/sh - - /usr/local/bin/privileged_tidb_start_script.sh - ports: - - name: mysql-client - containerPort: 4000 - protocol: TCP - env: - - name: CLUSTER_NAME - value: {{ template "cluster.name" . }} - - name: TZ - value: {{ .Values.timezone | default "UTC" }} - volumeMounts: - - name: config - readOnly: true - mountPath: /etc/tidb - - name: annotations - readOnly: true - mountPath: /etc/podinfo - - name: startup-script - readOnly: true - mountPath: /usr/local/bin - restartPolicy: Always - volumes: - - name: config - configMap: - name: {{ template "cluster.name" . }}-privileged-tidb - items: - - key: config-file - path: tidb.toml - - name: annotations - downwardAPI: - items: - - path: annotations - fieldRef: - fieldPath: metadata.annotations - - name: startup-script - configMap: - name: {{ template "cluster.name" . }}-privileged-tidb - items: - - key: startup-script - path: privileged_tidb_start_script.sh - {{- if .Values.privilegedTidb.tolerations }} - tolerations: -{{ toYaml .Values.privilegedTidb.tolerations | indent 6 }} - {{- end }} -{{- end }} diff --git a/charts/tidb-cluster/templates/privileged-tidb-service.yaml b/charts/tidb-cluster/templates/privileged-tidb-service.yaml deleted file mode 100644 index 54f5c758f3a..00000000000 --- a/charts/tidb-cluster/templates/privileged-tidb-service.yaml +++ /dev/null @@ -1,28 +0,0 @@ -{{- if .Values.privilegedTidb }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "cluster.name" . }}-privileged-tidb - labels: - app.kubernetes.io/name: {{ template "chart.name" . }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: privileged-tidb - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} -spec: - type: {{ .Values.privilegedTidb.service.type }} - ports: - - name: mysql-client - port: 4000 - targetPort: 4000 - protocol: TCP -{{- if (.Values.privilegedTidb.service.type) and eq .Values.privilegedTidb.service.type "NodePort" }} - {{- if .Values.privilegedTidb.service.nodePort }} - nodePort: {{ .Values.service.nodePort }} - {{- end }} -{{- end }} - selector: - app.kubernetes.io/name: {{ template "chart.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: privileged-tidb -{{- end }} diff --git a/charts/tidb-cluster/templates/scripts/_start_privileged_tidb.sh.tpl b/charts/tidb-cluster/templates/scripts/_start_privileged_tidb.sh.tpl deleted file mode 100644 index 0f0831f1b6a..00000000000 --- a/charts/tidb-cluster/templates/scripts/_start_privileged_tidb.sh.tpl +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh - -# This script is used to start privileged tidb containers in kubernetes cluster - -# Use DownwardAPIVolumeFiles to store informations of the cluster: -# https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#the-downward-api -# -# runmode="normal/debug" -# -set -euo pipefail -ANNOTATIONS="/etc/podinfo/annotations" - -if [[ ! -f "${ANNOTATIONS}" ]] -then - echo "${ANNOTATIONS} does't exist, exiting." - exit 1 -fi -source ${ANNOTATIONS} 2>/dev/null || true - -runmode=${runmode:-normal} -if [[ X${runmode} == Xdebug ]] -then - echo "entering debug mode." - tail -f /dev/null -fi - -ARGS="--store=tikv \ ---run-ddl=false \ ---host=0.0.0.0 \ ---path=${CLUSTER_NAME}-pd:2379 \ ---config=/etc/tidb/tidb.toml -" - -echo "start privileged-tidb-server ..." -echo "/tidb-server ${ARGS}" -exec /tidb-server ${ARGS} diff --git a/charts/tidb-cluster/templates/tidb-cluster.yaml b/charts/tidb-cluster/templates/tidb-cluster.yaml index a0a91c4dabb..8eab712c3c1 100644 --- a/charts/tidb-cluster/templates/tidb-cluster.yaml +++ b/charts/tidb-cluster/templates/tidb-cluster.yaml @@ -54,12 +54,6 @@ spec: {{- if .Values.tikv.tolerations }} tolerations: {{ toYaml .Values.tikv.tolerations | indent 4 }} - {{- end }} - tikvPromGateway: - image: {{ .Values.tikvPromGateway.image }} - imagePullPolicy: {{ .Values.tikvPromGateway.imagePullPolicy | default "IfNotPresent" }} - {{- if .Values.tikvPromGateway.resources }} -{{ toYaml .Values.tikvPromGateway.resources | indent 4 }} {{- end }} tidb: replicas: {{ .Values.tidb.replicas }} diff --git a/charts/tidb-cluster/values.yaml b/charts/tidb-cluster/values.yaml index 6d264f09861..c9c066e42ed 100644 --- a/charts/tidb-cluster/values.yaml +++ b/charts/tidb-cluster/values.yaml @@ -42,7 +42,7 @@ discovery: pd: replicas: 3 - image: pingcap/pd:v2.1.0 + image: pingcap/pd:v2.1.8 logLevel: info # storageClassName is a StorageClass provides a way for administrators to describe the "classes" of storage they offer. # different classes might map to quality-of-service levels, or to backup policies, @@ -84,7 +84,7 @@ pd: tikv: replicas: 3 - image: pingcap/tikv:v2.1.0 + image: pingcap/tikv:v2.1.8 logLevel: info # storageClassName is a StorageClass provides a way for administrators to describe the "classes" of storage they offer. # different classes might map to quality-of-service levels, or to backup policies, @@ -135,17 +135,6 @@ tikv: # also should less than total cpu cores. # storageSchedulerWorkerPoolSize: 4 -tikvPromGateway: - image: prom/pushgateway:v0.3.1 - imagePullPolicy: IfNotPresent - resources: - limits: {} - # cpu: 100m - # memory: 100Mi - requests: {} - # cpu: 50m - # memory: 50Mi - tidb: replicas: 2 # The secret name of root password, you can create secret with following command: @@ -155,10 +144,32 @@ tidb: # initSql is the SQL statements executed after the TiDB cluster is bootstrapped. # initSql: |- # create database app; - image: pingcap/tidb:v2.1.0 + image: pingcap/tidb:v2.1.8 # Image pull policy. imagePullPolicy: IfNotPresent logLevel: info + # Set the memory quota for a query in bytes. Default: 32GB + memQuotaQuery: "34359738368" + # The limitation of the number for the entries in one transaction. + # If using TiKV as the storage, the entry represents a key/value pair. + # WARNING: Do not set the value too large, otherwise it will make a very large impact on the TiKV cluster. + # Please adjust this configuration carefully. + txnEntryCountLimit: "300000" + # The limitation of the size in byte for the entries in one transaction. + # If using TiKV as the storage, the entry represents a key/value pair. + # WARNING: Do not set the value too large, otherwise it will make a very large impact on the TiKV cluster. + # Please adjust this configuration carefully. + txnTotalSizeLimit: "104857600" + # enableBatchDml enables batch commit for the DMLs + enableBatchDml: false + # check mb4 value in utf8 is used to control whether to check the mb4 characters when the charset is utf8. + checkMb4VauleInUtf8: true + # treat-old-version-utf8-as-utf8mb4 use for upgrade compatibility. Set to true will treat old version table/column UTF8 charset as UTF8MB4. + treatOldVersionUtf8AsUtf8mb4: true + # lease is schema lease duration, very dangerous to change only if you know what you do. + lease: 45s + # Max CPUs to use, 0 use number of CPUs in the machine. + maxProcs: 0 resources: limits: {} # cpu: 16000m @@ -265,7 +276,7 @@ binlog: pump: create: false replicas: 1 - image: pingcap/tidb-binlog:v2.1.0 + image: pingcap/tidb-binlog:v2.1.8 imagePullPolicy: IfNotPresent logLevel: info # storageClassName is a StorageClass provides a way for administrators to describe the "classes" of storage they offer. @@ -274,6 +285,7 @@ binlog: # refer to https://kubernetes.io/docs/concepts/storage/storage-classes storageClassName: local-storage storage: 10Gi + syncLog: true # a integer value to control expiry date of the binlog data, indicates for how long (in days) the binlog data would be stored. # must bigger than 0 gc: 7 @@ -282,7 +294,7 @@ binlog: drainer: create: false - image: pingcap/tidb-binlog:v2.1.0 + image: pingcap/tidb-binlog:v2.1.8 imagePullPolicy: IfNotPresent logLevel: info # storageClassName is a StorageClass provides a way for administrators to describe the "classes" of storage they offer. @@ -291,8 +303,8 @@ binlog: # refer to https://kubernetes.io/docs/concepts/storage/storage-classes storageClassName: local-storage storage: 10Gi - # parallel worker count (default 1) - workerCount: 1 + # parallel worker count (default 16) + workerCount: 16 # the interval time (in seconds) of detect pumps' status (default 10) detectInterval: 10 # disbale detect causality @@ -305,8 +317,8 @@ binlog: initialCommitTs: 0 # enable safe mode to make syncer reentrant safeMode: false - # number of binlog events in a transaction batch (default 1) - txnBatch: 1 + # number of binlog events in a transaction batch (default 20) + txnBatch: 20 # downstream storage, equal to --dest-db-type # valid values are "mysql", "pb", "kafka" destDBType: pb @@ -326,7 +338,7 @@ binlog: scheduledBackup: create: false - binlogImage: pingcap/tidb-binlog:v2.1.0 + binlogImage: pingcap/tidb-binlog:v2.1.8 binlogImagePullPolicy: IfNotPresent # https://github.com/tennix/tidb-cloud-backup mydumperImage: pingcap/tidb-cloud-backup:latest diff --git a/docs/local-dind-tutorial.md b/docs/local-dind-tutorial.md index 85c777e2422..23f5bd28451 100644 --- a/docs/local-dind-tutorial.md +++ b/docs/local-dind-tutorial.md @@ -102,9 +102,9 @@ demo-pd-1 1/1 Running 0 1m demo-pd-2 1/1 Running 0 1m demo-tidb-0 1/1 Running 0 1m demo-tidb-1 1/1 Running 0 1m -demo-tikv-0 2/2 Running 0 1m -demo-tikv-1 2/2 Running 0 1m -demo-tikv-2 2/2 Running 0 1m +demo-tikv-0 1/1 Running 0 1m +demo-tikv-1 1/1 Running 0 1m +demo-tikv-2 1/1 Running 0 1m ``` To access the TiDB cluster, use `kubectl port-forward` to expose the services to host. diff --git a/images/tidb-operator-e2e/tidb-cluster-values.yaml b/images/tidb-operator-e2e/tidb-cluster-values.yaml index 734e1d25388..29d7da86678 100644 --- a/images/tidb-operator-e2e/tidb-cluster-values.yaml +++ b/images/tidb-operator-e2e/tidb-cluster-values.yaml @@ -36,7 +36,7 @@ discovery: pd: replicas: 3 - image: pingcap/pd:v2.1.0 + image: pingcap/pd:v2.1.8 imagePullPolicy: IfNotPresent logLevel: info # storageClassName is a StorageClass provides a way for administrators to describe the "classes" of storage they offer. @@ -76,7 +76,7 @@ pd: tikv: replicas: 3 - image: pingcap/tikv:v2.1.0 + image: pingcap/tikv:v2.1.8 imagePullPolicy: IfNotPresent logLevel: info # storageClassName is a StorageClass provides a way for administrators to describe the "classes" of storage they offer. @@ -127,7 +127,7 @@ tidb: # initSql is the SQL statements executed after the TiDB cluster is bootstrapped. # initSql: |- # create database app; - image: pingcap/tidb:v2.1.0 + image: pingcap/tidb:v2.1.8 imagePullPolicy: IfNotPresent logLevel: info resources: @@ -214,7 +214,7 @@ monitor: fullbackup: create: false - binlogImage: pingcap/tidb-binlog:v2.1.0 + binlogImage: pingcap/tidb-binlog:v2.1.8 binlogImagePullPolicy: IfNotPresent # https://github.com/tennix/tidb-cloud-backup mydumperImage: pingcap/tidb-cloud-backup:latest @@ -255,7 +255,7 @@ binlog: pump: create: false replicas: 1 - image: pingcap/tidb-binlog:v2.1.0 + image: pingcap/tidb-binlog:v2.1.8 imagePullPolicy: IfNotPresent logLevel: info # storageClassName is a StorageClass provides a way for administrators to describe the "classes" of storage they offer. @@ -272,7 +272,7 @@ binlog: drainer: create: false - image: pingcap/tidb-binlog:v2.1.0 + image: pingcap/tidb-binlog:v2.1.8 imagePullPolicy: IfNotPresent logLevel: info # storageClassName is a StorageClass provides a way for administrators to describe the "classes" of storage they offer. diff --git a/pkg/controller/controller_utils.go b/pkg/controller/controller_utils.go index ece3327da63..faee7142f2b 100644 --- a/pkg/controller/controller_utils.go +++ b/pkg/controller/controller_utils.go @@ -34,8 +34,6 @@ var ( ) const ( - // defaultPushgatewayImage is default image of pushgateway - defaultPushgatewayImage = "prom/pushgateway:v0.3.1" // defaultTiDBSlowLogImage is default image of tidb log tailer defaultTiDBLogTailerImage = "busybox:1.26.2" ) @@ -111,26 +109,6 @@ func TiKVCapacity(limits *v1alpha1.ResourceRequirement) string { return fmt.Sprintf("%dGB", int(float64(i)/math.Pow(2, 30))) } -// DefaultPushGatewayRequest for the TiKV sidecar -func DefaultPushGatewayRequest() corev1.ResourceRequirements { - rr := corev1.ResourceRequirements{} - rr.Requests = make(map[corev1.ResourceName]resource.Quantity) - rr.Limits = make(map[corev1.ResourceName]resource.Quantity) - rr.Requests[corev1.ResourceCPU] = resource.MustParse("50m") - rr.Requests[corev1.ResourceMemory] = resource.MustParse("50Mi") - rr.Limits[corev1.ResourceCPU] = resource.MustParse("100m") - rr.Limits[corev1.ResourceMemory] = resource.MustParse("100Mi") - return rr -} - -// GetPushgatewayImage returns TidbCluster's pushgateway image -func GetPushgatewayImage(cluster *v1alpha1.TidbCluster) string { - if img := cluster.Spec.TiKVPromGateway.Image; img != "" { - return img - } - return defaultPushgatewayImage -} - func GetSlowLogTailerImage(cluster *v1alpha1.TidbCluster) string { if img := cluster.Spec.TiDB.SlowLogTailer.Image; img != "" { return img diff --git a/pkg/controller/controller_utils_test.go b/pkg/controller/controller_utils_test.go index 23a50340d77..9c9b0a75db7 100644 --- a/pkg/controller/controller_utils_test.go +++ b/pkg/controller/controller_utils_test.go @@ -21,7 +21,6 @@ import ( "github.com/pingcap/tidb-operator/pkg/apis/pingcap.com/v1alpha1" apps "k8s.io/api/apps/v1beta1" corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" ) @@ -138,25 +137,6 @@ func TestTiKVCapacity(t *testing.T) { } } -func TestDefaultPushGatewayRequest(t *testing.T) { - g := NewGomegaWithT(t) - - rr := DefaultPushGatewayRequest() - g.Expect(rr.Requests[corev1.ResourceCPU]).To(Equal(resource.MustParse("50m"))) - g.Expect(rr.Requests[corev1.ResourceMemory]).To(Equal(resource.MustParse("50Mi"))) - g.Expect(rr.Limits[corev1.ResourceCPU]).To(Equal(resource.MustParse("100m"))) - g.Expect(rr.Limits[corev1.ResourceMemory]).To(Equal(resource.MustParse("100Mi"))) -} - -func TestGetPushgatewayImage(t *testing.T) { - g := NewGomegaWithT(t) - - tc := &v1alpha1.TidbCluster{} - g.Expect(GetPushgatewayImage(tc)).To(Equal(defaultPushgatewayImage)) - tc.Spec.TiKVPromGateway.Image = "image-1" - g.Expect(GetPushgatewayImage(tc)).To(Equal("image-1")) -} - func TestGetSlowLogTailerImage(t *testing.T) { g := NewGomegaWithT(t) diff --git a/pkg/manager/member/tikv_member_manager.go b/pkg/manager/member/tikv_member_manager.go index 8fe442a2bfe..e68c19474e2 100644 --- a/pkg/manager/member/tikv_member_manager.go +++ b/pkg/manager/member/tikv_member_manager.go @@ -293,7 +293,6 @@ func (tkmm *tikvMemberManager) getNewSetForTidbCluster(tc *v1alpha1.TidbCluster) }}, }, } - pgwVolMounts := []corev1.VolumeMount{} // pushgateway volumeMounts var q resource.Quantity var err error @@ -328,7 +327,7 @@ func (tkmm *tikvMemberManager) getNewSetForTidbCluster(tc *v1alpha1.TidbCluster) Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: tikvLabel.Labels(), - Annotations: controller.AnnProm(9091), + Annotations: controller.AnnProm(20180), }, Spec: corev1.PodSpec{ SchedulerName: tc.Spec.SchedulerName, @@ -380,22 +379,6 @@ func (tkmm *tikvMemberManager) getNewSetForTidbCluster(tc *v1alpha1.TidbCluster) }, }, }, - { - Name: v1alpha1.PushGatewayMemberType.String(), - Image: controller.GetPushgatewayImage(tc), - ImagePullPolicy: tc.Spec.TiKVPromGateway.ImagePullPolicy, - Ports: []corev1.ContainerPort{ - { - Name: "metrics", - ContainerPort: int32(9091), - Protocol: corev1.ProtocolTCP, - }, - }, - VolumeMounts: pgwVolMounts, - Resources: util.ResourceRequirement(tc.Spec.TiKVPromGateway.ContainerSpec, - controller.DefaultPushGatewayRequest()), - Env: []corev1.EnvVar{{Name: "TZ", Value: tc.Spec.Timezone}}, // Note: `TZ` is unused in pushgateway image, we set it here just to keep consistency - }, }, RestartPolicy: corev1.RestartPolicyAlways, Tolerations: tc.Spec.TiKV.Tolerations, From 3bb2114cd541f785c95d6296e16a0e5ad857e354 Mon Sep 17 00:00:00 2001 From: qiffang <947321353@qq.com> Date: Mon, 29 Apr 2019 22:30:49 +0800 Subject: [PATCH 02/14] remove-pushgateway --- .../templates/config/_grafana-prestart.tpl | 21 +++++++++++++++++++ .../templates/monitor-configmap.yaml | 4 ++++ .../monitor-dashboard-configmap.yaml | 11 +++++----- .../templates/monitor-deployment.yaml | 18 +++++++++------- 4 files changed, 41 insertions(+), 13 deletions(-) create mode 100644 charts/tidb-cluster/templates/config/_grafana-prestart.tpl diff --git a/charts/tidb-cluster/templates/config/_grafana-prestart.tpl b/charts/tidb-cluster/templates/config/_grafana-prestart.tpl new file mode 100644 index 00000000000..39be1a4d882 --- /dev/null +++ b/charts/tidb-cluster/templates/config/_grafana-prestart.tpl @@ -0,0 +1,21 @@ +{{- define "setup" }} +#!/bin/sh + +#decompress dashboard files +gzip -dc /tmp/dashboard-gz/tidb.json.gz > /grafana-dashboard-definitions/tidb/tidb.json +gzip -dc /tmp/dashboard-gz/pd.json.gz > /grafana-dashboard-definitions/tidb/pd.json +gzip -dc /tmp/dashboard-gz/tikv.json.gz > /grafana-dashboard-definitions/tidb/tikv.json +gzip -dc /tmp/dashboard-gz/overview.json.gz > /grafana-dashboard-definitions/tidb/overview.json + +#replace dashboard name using cluster name +clusterName={{ template "cluster.name" . }} + +if [ $clusterName != "" ] +then + sed -i 's/TIDB-Cluster-TiDB/'$clusterName'-TIDB/g' /grafana-dashboard-definitions/tidb/tidb.json + sed -i 's/TIDB-Cluster-PD/'$clusterName'-PD/g' /grafana-dashboard-definitions/tidb/pd.json + sed -i 's/TIDB-Cluster-TiKV/'$clusterName'-TIKV/g' /grafana-dashboard-definitions/tidb/tikv.json + sed -i 's/TIDB-Cluster-Overview/'$clusterName'-OVERVIEW/g' /grafana-dashboard-definitions/tidb/overview.json +fi + +{{- end }} diff --git a/charts/tidb-cluster/templates/monitor-configmap.yaml b/charts/tidb-cluster/templates/monitor-configmap.yaml index 650b4176bc5..bfdea7996a6 100644 --- a/charts/tidb-cluster/templates/monitor-configmap.yaml +++ b/charts/tidb-cluster/templates/monitor-configmap.yaml @@ -21,5 +21,9 @@ data: {{ tuple "config/_grafana-dashboard.tpl" . | include "helm-toolkit.utils.template" | indent 4 }} grafana-config: |- {{ tuple "config/_grafana-config.tpl" . | include "helm-toolkit.utils.template" | indent 4 }} + grafana-prestart: | +{{- include "setup" . | indent 4 }} {{- end }} {{- end }} + + diff --git a/charts/tidb-cluster/templates/monitor-dashboard-configmap.yaml b/charts/tidb-cluster/templates/monitor-dashboard-configmap.yaml index 8cf4c08a920..e384e92645d 100644 --- a/charts/tidb-cluster/templates/monitor-dashboard-configmap.yaml +++ b/charts/tidb-cluster/templates/monitor-dashboard-configmap.yaml @@ -25,11 +25,12 @@ metadata: helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} binaryData: pd.json.gz: |- - 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 tidb.json.gz: |- - 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 tikv.json.gz: |- - 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 overview.json.gz: |- - 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 -{{- end }} + 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 + {{- end }} + diff --git a/charts/tidb-cluster/templates/monitor-deployment.yaml b/charts/tidb-cluster/templates/monitor-deployment.yaml index 21f876b7698..ba47222dae7 100644 --- a/charts/tidb-cluster/templates/monitor-deployment.yaml +++ b/charts/tidb-cluster/templates/monitor-deployment.yaml @@ -97,14 +97,7 @@ spec: lifecycle: postStart: exec: - command: - - "/bin/sh" - - "-c" - - > - gzip -dc /tmp/dashboard-gz/tidb.json.gz > /grafana-dashboard-definitions/tidb/tidb.json && - gzip -dc /tmp/dashboard-gz/pd.json.gz > /grafana-dashboard-definitions/tidb/pd.json && - gzip -dc /tmp/dashboard-gz/tikv.json.gz > /grafana-dashboard-definitions/tidb/tikv.json && - gzip -dc /tmp/dashboard-gz/overview.json.gz > /grafana-dashboard-definitions/tidb/overview.json + command: ["/bin/sh", "/tmp/grafanaPrestart.sh"] {{- if .Values.monitor.grafana.resources }} resources: {{ toYaml .Values.monitor.grafana.resources | indent 12 }} @@ -159,6 +152,9 @@ spec: - mountPath: /grafana-dashboard-definitions/tidb name: grafana-dashboard readOnly: false + - mountPath: /tmp + name: grafana-prestart + readOnly: false {{- end }} volumes: - name: monitor-data @@ -200,6 +196,12 @@ spec: - configMap: name: {{ template "cluster.name" . }}-monitor-dashboard name: dashboard-gz + - configMap: + name: {{ template "cluster.name" . }}-monitor + items: + - key: grafana-prestart + path: grafanaPrestart.sh + name: grafana-prestart {{- end }} {{- if .Values.monitor.tolerations }} tolerations: From 81a5dfc44a6f341cba8b5e94d5cda3b5513e6375 Mon Sep 17 00:00:00 2001 From: tennix Date: Tue, 30 Apr 2019 14:58:16 +0800 Subject: [PATCH 03/14] address comment --- charts/tidb-cluster/templates/config/_drainer-config.tpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/charts/tidb-cluster/templates/config/_drainer-config.tpl b/charts/tidb-cluster/templates/config/_drainer-config.tpl index 7e50c461307..a93d90a7bc0 100644 --- a/charts/tidb-cluster/templates/config/_drainer-config.tpl +++ b/charts/tidb-cluster/templates/config/_drainer-config.tpl @@ -28,8 +28,8 @@ compressor = "" [syncer] # Assume the upstream sql-mode. -# If this is setted , will use the same sql-mode to parse DDL statment, and set the same sql-mode at downstream when db-type is mysql. -# If this is not setted, it will not set any sql-mode. +# If this is set , will use the same sql-mode to parse DDL statment, and set the same sql-mode at downstream when db-type is mysql. +# The default value will not set any sql-mode. # sql-mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION" # number of binlog events in a transaction batch From 10f7951cf3032ae099cf917238dc9dafdfcc40f6 Mon Sep 17 00:00:00 2001 From: tennix Date: Tue, 30 Apr 2019 16:26:01 +0800 Subject: [PATCH 04/14] address comment --- .../templates/config/_grafana-prestart.tpl | 6 +++--- .../templates/config/_tidb-config.tpl | 4 ++-- .../templates/config/_tikv-config.tpl | 15 +++++++++++++-- charts/tidb-cluster/values.yaml | 4 +++- pkg/apis/pingcap.com/v1alpha1/types.go | 2 -- 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/charts/tidb-cluster/templates/config/_grafana-prestart.tpl b/charts/tidb-cluster/templates/config/_grafana-prestart.tpl index 39be1a4d882..c2015520dd2 100644 --- a/charts/tidb-cluster/templates/config/_grafana-prestart.tpl +++ b/charts/tidb-cluster/templates/config/_grafana-prestart.tpl @@ -12,10 +12,10 @@ clusterName={{ template "cluster.name" . }} if [ $clusterName != "" ] then - sed -i 's/TIDB-Cluster-TiDB/'$clusterName'-TIDB/g' /grafana-dashboard-definitions/tidb/tidb.json + sed -i 's/TIDB-Cluster-TiDB/'$clusterName'-TiDB/g' /grafana-dashboard-definitions/tidb/tidb.json sed -i 's/TIDB-Cluster-PD/'$clusterName'-PD/g' /grafana-dashboard-definitions/tidb/pd.json - sed -i 's/TIDB-Cluster-TiKV/'$clusterName'-TIKV/g' /grafana-dashboard-definitions/tidb/tikv.json - sed -i 's/TIDB-Cluster-Overview/'$clusterName'-OVERVIEW/g' /grafana-dashboard-definitions/tidb/overview.json + sed -i 's/TIDB-Cluster-TiKV/'$clusterName'-TiKV/g' /grafana-dashboard-definitions/tidb/tikv.json + sed -i 's/TIDB-Cluster-Overview/'$clusterName'-Overview/g' /grafana-dashboard-definitions/tidb/overview.json fi {{- end }} diff --git a/charts/tidb-cluster/templates/config/_tidb-config.tpl b/charts/tidb-cluster/templates/config/_tidb-config.tpl index 19e1374145d..3f7325f4a42 100644 --- a/charts/tidb-cluster/templates/config/_tidb-config.tpl +++ b/charts/tidb-cluster/templates/config/_tidb-config.tpl @@ -181,8 +181,8 @@ networks = "" header-timeout = 5 [prepared-plan-cache] -enabled = false -capacity = 100 +enabled = {{ .Values.tidb.preparedPlanCacheEnabled | default false }} +capacity = {{ .Values.tidb.preparedPlanCacheCapacity | default 100 }} [opentracing] # Enable opentracing. diff --git a/charts/tidb-cluster/templates/config/_tikv-config.tpl b/charts/tidb-cluster/templates/config/_tikv-config.tpl index 6505207432a..c1e90491d42 100644 --- a/charts/tidb-cluster/templates/config/_tikv-config.tpl +++ b/charts/tidb-cluster/templates/config/_tikv-config.tpl @@ -18,12 +18,21 @@ log-level = {{ .Values.tikv.logLevel | default "info" | quote }} # log-rotation-timespan = "24h" [readpool.storage] +{{- if .Values.tikv.readpoolStorageConcurrency }} +# size of thread pool for high-priority operations +high-concurrency = {{ .Values.readpoolStorageConcurrency }} +# size of thread pool for normal-priority operations +normal-concurrency = {{ .Values.readpoolStorageConcurrency }} +# size of thread pool for low-priority operations +low-concurrency = {{ .Values.readpoolStorageConcurrency }} +{{- else }} # size of thread pool for high-priority operations # high-concurrency = 4 # size of thread pool for normal-priority operations # normal-concurrency = 4 # size of thread pool for low-priority operations # low-concurrency = 4 +{{- end }} # max running high-priority operations of each worker, reject if exceed # max-tasks-per-worker-high = 2000 # max running normal-priority operations of each worker, reject if exceed @@ -36,7 +45,6 @@ log-level = {{ .Values.tikv.logLevel | default "info" | quote }} [readpool.coprocessor] # Notice: if CPU_NUM > 8, default thread pool size for coprocessors # will be set to CPU_NUM * 0.8. - {{- if .Values.tikv.readpoolCoprocessorConcurrency }} high-concurrency = {{ .Values.tikv.readpoolCoprocessorConcurrency }} normal-concurrency = {{ .Values.tikv.readpoolCoprocessorConcurrency }} @@ -119,8 +127,11 @@ status-addr = "0.0.0.0:20180" # scheduler's worker pool size, should increase it in heavy write cases, # also should less than total cpu cores. +{{- if .Values.tikv.storageSchedulerWorkerPoolSize }} +scheduler-worker-pool-size = {{ .Values.tikv.storageSchedulerWorkerPoolSize }}o +{{- else }} # scheduler-worker-pool-size = 4 - +{{- end }} # When the pending write bytes exceeds this threshold, # the "scheduler too busy" error is displayed. # scheduler-pending-write-threshold = "100MB" diff --git a/charts/tidb-cluster/values.yaml b/charts/tidb-cluster/values.yaml index c9c066e42ed..7e4f17b4710 100644 --- a/charts/tidb-cluster/values.yaml +++ b/charts/tidb-cluster/values.yaml @@ -148,6 +148,8 @@ tidb: # Image pull policy. imagePullPolicy: IfNotPresent logLevel: info + preparedPlanCacheEnabled: false + preparedPlanCacheCapacity: 100 # Set the memory quota for a query in bytes. Default: 32GB memQuotaQuery: "34359738368" # The limitation of the number for the entries in one transaction. @@ -163,7 +165,7 @@ tidb: # enableBatchDml enables batch commit for the DMLs enableBatchDml: false # check mb4 value in utf8 is used to control whether to check the mb4 characters when the charset is utf8. - checkMb4VauleInUtf8: true + checkMb4ValueInUtf8: true # treat-old-version-utf8-as-utf8mb4 use for upgrade compatibility. Set to true will treat old version table/column UTF8 charset as UTF8MB4. treatOldVersionUtf8AsUtf8mb4: true # lease is schema lease duration, very dangerous to change only if you know what you do. diff --git a/pkg/apis/pingcap.com/v1alpha1/types.go b/pkg/apis/pingcap.com/v1alpha1/types.go index 458543df41e..d24a29a5de9 100644 --- a/pkg/apis/pingcap.com/v1alpha1/types.go +++ b/pkg/apis/pingcap.com/v1alpha1/types.go @@ -42,8 +42,6 @@ const ( TiDBMemberType MemberType = "tidb" // TiKVMemberType is tikv container type TiKVMemberType MemberType = "tikv" - // PushGatewayMemberType is pushgateway container type - PushGatewayMemberType MemberType = "pushgateway" // SlowLogTailerMemberType is tidb log tailer container type SlowLogTailerMemberType MemberType = "slowlog" // UnknownMemberType is unknown container type From 0b7c68862a5e8b9ac392fe00f009c86ed3193e85 Mon Sep 17 00:00:00 2001 From: tennix Date: Tue, 30 Apr 2019 16:48:27 +0800 Subject: [PATCH 05/14] tinyfix --- .../tidb-cluster/templates/config/_tikv-config.tpl | 10 ++++++---- .../tidb-cluster/templates/monitor-configmap.yaml | 2 -- .../_grafana-prestart.sh.tpl} | 13 +++++-------- 3 files changed, 11 insertions(+), 14 deletions(-) rename charts/tidb-cluster/templates/{config/_grafana-prestart.tpl => scripts/_grafana-prestart.sh.tpl} (53%) diff --git a/charts/tidb-cluster/templates/config/_tikv-config.tpl b/charts/tidb-cluster/templates/config/_tikv-config.tpl index c1e90491d42..451afd59d3a 100644 --- a/charts/tidb-cluster/templates/config/_tikv-config.tpl +++ b/charts/tidb-cluster/templates/config/_tikv-config.tpl @@ -20,11 +20,11 @@ log-level = {{ .Values.tikv.logLevel | default "info" | quote }} [readpool.storage] {{- if .Values.tikv.readpoolStorageConcurrency }} # size of thread pool for high-priority operations -high-concurrency = {{ .Values.readpoolStorageConcurrency }} +high-concurrency = {{ .Values.tikv.readpoolStorageConcurrency }} # size of thread pool for normal-priority operations -normal-concurrency = {{ .Values.readpoolStorageConcurrency }} +normal-concurrency = {{ .Values.tikv.readpoolStorageConcurrency }} # size of thread pool for low-priority operations -low-concurrency = {{ .Values.readpoolStorageConcurrency }} +low-concurrency = {{ .Values.tikv.readpoolStorageConcurrency }} {{- else }} # size of thread pool for high-priority operations # high-concurrency = 4 @@ -45,6 +45,7 @@ low-concurrency = {{ .Values.readpoolStorageConcurrency }} [readpool.coprocessor] # Notice: if CPU_NUM > 8, default thread pool size for coprocessors # will be set to CPU_NUM * 0.8. + {{- if .Values.tikv.readpoolCoprocessorConcurrency }} high-concurrency = {{ .Values.tikv.readpoolCoprocessorConcurrency }} normal-concurrency = {{ .Values.tikv.readpoolCoprocessorConcurrency }} @@ -128,10 +129,11 @@ status-addr = "0.0.0.0:20180" # scheduler's worker pool size, should increase it in heavy write cases, # also should less than total cpu cores. {{- if .Values.tikv.storageSchedulerWorkerPoolSize }} -scheduler-worker-pool-size = {{ .Values.tikv.storageSchedulerWorkerPoolSize }}o +scheduler-worker-pool-size = {{ .Values.tikv.storageSchedulerWorkerPoolSize }} {{- else }} # scheduler-worker-pool-size = 4 {{- end }} + # When the pending write bytes exceeds this threshold, # the "scheduler too busy" error is displayed. # scheduler-pending-write-threshold = "100MB" diff --git a/charts/tidb-cluster/templates/monitor-configmap.yaml b/charts/tidb-cluster/templates/monitor-configmap.yaml index bfdea7996a6..7ec1dd4f3c2 100644 --- a/charts/tidb-cluster/templates/monitor-configmap.yaml +++ b/charts/tidb-cluster/templates/monitor-configmap.yaml @@ -25,5 +25,3 @@ data: {{- include "setup" . | indent 4 }} {{- end }} {{- end }} - - diff --git a/charts/tidb-cluster/templates/config/_grafana-prestart.tpl b/charts/tidb-cluster/templates/scripts/_grafana-prestart.sh.tpl similarity index 53% rename from charts/tidb-cluster/templates/config/_grafana-prestart.tpl rename to charts/tidb-cluster/templates/scripts/_grafana-prestart.sh.tpl index c2015520dd2..e924cdb5cd2 100644 --- a/charts/tidb-cluster/templates/config/_grafana-prestart.tpl +++ b/charts/tidb-cluster/templates/scripts/_grafana-prestart.sh.tpl @@ -9,13 +9,10 @@ gzip -dc /tmp/dashboard-gz/overview.json.gz > /grafana-dashboard-definitions/tid #replace dashboard name using cluster name clusterName={{ template "cluster.name" . }} +clusterName=${clusterName:-"TiDB-Cluster"} -if [ $clusterName != "" ] -then - sed -i 's/TIDB-Cluster-TiDB/'$clusterName'-TiDB/g' /grafana-dashboard-definitions/tidb/tidb.json - sed -i 's/TIDB-Cluster-PD/'$clusterName'-PD/g' /grafana-dashboard-definitions/tidb/pd.json - sed -i 's/TIDB-Cluster-TiKV/'$clusterName'-TiKV/g' /grafana-dashboard-definitions/tidb/tikv.json - sed -i 's/TIDB-Cluster-Overview/'$clusterName'-Overview/g' /grafana-dashboard-definitions/tidb/overview.json -fi - +sed -i 's/TIDB-Cluster-TiDB/'$clusterName'-TiDB/g' /grafana-dashboard-definitions/tidb/tidb.json +sed -i 's/TIDB-Cluster-PD/'$clusterName'-PD/g' /grafana-dashboard-definitions/tidb/pd.json +sed -i 's/TIDB-Cluster-TiKV/'$clusterName'-TiKV/g' /grafana-dashboard-definitions/tidb/tikv.json +sed -i 's/TIDB-Cluster-Overview/'$clusterName'-Overview/g' /grafana-dashboard-definitions/tidb/overview.json {{- end }} From 7d12d82b6943bcd903a0ce585907d3f5f72eb08f Mon Sep 17 00:00:00 2001 From: tennix Date: Wed, 1 May 2019 08:12:31 +0800 Subject: [PATCH 06/14] add some performance related parameters to values.yaml --- charts/tidb-cluster/templates/config/_tidb-config.tpl | 6 +++--- charts/tidb-cluster/templates/config/_tikv-config.tpl | 4 ++++ charts/tidb-cluster/values.yaml | 8 ++++++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/charts/tidb-cluster/templates/config/_tidb-config.tpl b/charts/tidb-cluster/templates/config/_tidb-config.tpl index 3f7325f4a42..f22bdc7aa26 100644 --- a/charts/tidb-cluster/templates/config/_tidb-config.tpl +++ b/charts/tidb-cluster/templates/config/_tidb-config.tpl @@ -29,7 +29,7 @@ lease = {{ .Values.tidb.lease | default "45s" | quote }} split-table = true # The limit of concurrent executed sessions. -token-limit = 1000 +token-limit = {{ .Values.tidb.tokenLimit | default "1000" | atoi }} # Only print a log when out of memory quota. # Valid options: ["log", "cancel"] @@ -253,8 +253,8 @@ commit-timeout = "41s" [txn-local-latches] # Enable local latches for transactions. Enable it when # there are lots of conflicts between transactions. -enabled = false -capacity = 10240000 +enabled = {{ .Values.tidb.txnLocalLatchesEnabled | default false }} +capacity = {{ .Values.tidb.txnLocalLatchesCapacity | default "10240000" | atoi }} [binlog] # enable to write binlog. diff --git a/charts/tidb-cluster/templates/config/_tikv-config.tpl b/charts/tidb-cluster/templates/config/_tikv-config.tpl index 451afd59d3a..ab8f4a3ac51 100644 --- a/charts/tidb-cluster/templates/config/_tikv-config.tpl +++ b/charts/tidb-cluster/templates/config/_tikv-config.tpl @@ -81,7 +81,11 @@ status-addr = "0.0.0.0:20180" ## Compression type for gRPC channel: none, deflate or gzip. # grpc-compression-type = "none" # size of thread pool for grpc server. +{{- if .Values.tikv.grpcConcurrency }} +grpc-concurrency = {{ .Values.tikv.grpcConcurrency }} +{{- else }} # grpc-concurrency = 4 +{{- end }} # The number of max concurrent streams/requests on a client connection. # grpc-concurrent-stream = 1024 # The number of connections with each tikv server to send raft messages. diff --git a/charts/tidb-cluster/values.yaml b/charts/tidb-cluster/values.yaml index 7e4f17b4710..6d1c6c9e945 100644 --- a/charts/tidb-cluster/values.yaml +++ b/charts/tidb-cluster/values.yaml @@ -98,6 +98,8 @@ tikv: # syncLog is a bool value to enable or disable syc-log for raftstore, default is true # enable this can prevent data loss when power failure syncLog: true + # size of thread pool for grpc server. + grpcConcurrency: 4 resources: limits: {} # cpu: 16000m @@ -150,6 +152,12 @@ tidb: logLevel: info preparedPlanCacheEnabled: false preparedPlanCacheCapacity: 100 + # Enable local latches for transactions. Enable it when + # there are lots of conflicts between transactions. + txnLocalLatchesEnabled: false + txnLocalLatchesCapacity: "10240000" + # The limit of concurrent executed sessions. + tokenLimit: "1000" # Set the memory quota for a query in bytes. Default: 32GB memQuotaQuery: "34359738368" # The limitation of the number for the entries in one transaction. From 7fb0e2f3d93eeadbc4085d302f405e3298c1fb0d Mon Sep 17 00:00:00 2001 From: tennix Date: Thu, 2 May 2019 12:31:53 +0800 Subject: [PATCH 07/14] Allow anonymous access to Grafana --- charts/tidb-cluster/templates/config/_grafana-config.tpl | 2 +- charts/tidb-cluster/values.yaml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/charts/tidb-cluster/templates/config/_grafana-config.tpl b/charts/tidb-cluster/templates/config/_grafana-config.tpl index 1e0f4ecd4f7..05f0212cddb 100644 --- a/charts/tidb-cluster/templates/config/_grafana-config.tpl +++ b/charts/tidb-cluster/templates/config/_grafana-config.tpl @@ -204,7 +204,7 @@ root_url = %(protocol)s://%(domain)s:%(http_port)s/ #################################### Anonymous Auth ########################## [auth.anonymous] # enable anonymous access -;enabled = false +enabled = {{ .Values.monitor.grafana.anonymousEnabled | default true }} # specify organization name that should be used for unauthenticated users ;org_name = Main Org. diff --git a/charts/tidb-cluster/values.yaml b/charts/tidb-cluster/values.yaml index 6d1c6c9e945..317e8189712 100644 --- a/charts/tidb-cluster/values.yaml +++ b/charts/tidb-cluster/values.yaml @@ -251,6 +251,7 @@ monitor: # memory: 4Gi username: admin password: admin + anonymousEnabled: true service: type: NodePort # if grafana is running behind a reverse proxy with subpath http://foo.bar/grafana From 5931851f06491dbababdf1d6dbea09cc175ed658 Mon Sep 17 00:00:00 2001 From: tennix Date: Fri, 3 May 2019 00:21:10 +0800 Subject: [PATCH 08/14] fix anonymous access to grafana and update aws deploy values --- .../templates/config/_grafana-config.tpl | 4 +- .../templates/monitor-deployment.yaml | 6 +- charts/tidb-cluster/values.yaml | 2 +- .../templates/tidb-cluster-values.yaml.tpl | 65 ++++++++++++++----- 4 files changed, 54 insertions(+), 23 deletions(-) diff --git a/charts/tidb-cluster/templates/config/_grafana-config.tpl b/charts/tidb-cluster/templates/config/_grafana-config.tpl index 05f0212cddb..0a48c77982c 100644 --- a/charts/tidb-cluster/templates/config/_grafana-config.tpl +++ b/charts/tidb-cluster/templates/config/_grafana-config.tpl @@ -207,10 +207,10 @@ root_url = %(protocol)s://%(domain)s:%(http_port)s/ enabled = {{ .Values.monitor.grafana.anonymousEnabled | default true }} # specify organization name that should be used for unauthenticated users -;org_name = Main Org. +org_name = Main Org. # specify role for unauthenticated users -;org_role = Viewer +org_role = Viewer #################################### Github Auth ########################## [auth.github] diff --git a/charts/tidb-cluster/templates/monitor-deployment.yaml b/charts/tidb-cluster/templates/monitor-deployment.yaml index ba47222dae7..64f9e148e25 100644 --- a/charts/tidb-cluster/templates/monitor-deployment.yaml +++ b/charts/tidb-cluster/templates/monitor-deployment.yaml @@ -134,10 +134,8 @@ spec: - name: TZ value: {{ .Values.timezone | default "UTC" }} volumeMounts: - # configmap is always mounted as read only volume in container - # grafana startup script will fail with read only configuration directory - # - name: grafana-config - # mountPath: /etc/grafana + - name: grafana-config + mountPath: /etc/grafana - name: monitor-data mountPath: /data - mountPath: /etc/grafana/provisioning/datasources diff --git a/charts/tidb-cluster/values.yaml b/charts/tidb-cluster/values.yaml index 317e8189712..86dacbcd357 100644 --- a/charts/tidb-cluster/values.yaml +++ b/charts/tidb-cluster/values.yaml @@ -99,7 +99,7 @@ tikv: # enable this can prevent data loss when power failure syncLog: true # size of thread pool for grpc server. - grpcConcurrency: 4 + # grpcConcurrency: 4 resources: limits: {} # cpu: 16000m diff --git a/deploy/aws/templates/tidb-cluster-values.yaml.tpl b/deploy/aws/templates/tidb-cluster-values.yaml.tpl index 30e5ed55083..ece94bbc8b4 100644 --- a/deploy/aws/templates/tidb-cluster-values.yaml.tpl +++ b/deploy/aws/templates/tidb-cluster-values.yaml.tpl @@ -99,6 +99,8 @@ tikv: # syncLog is a bool value to enable or disable syc-log for raftstore, default is true # enable this can prevent data loss when power failure syncLog: true + # size of thread pool for grpc server. + # grpcConcurrency: 4 resources: limits: {} # cpu: 16000m @@ -137,21 +139,10 @@ tikv: # also should less than total cpu cores. # storageSchedulerWorkerPoolSize: 4 -tikvPromGateway: - image: prom/pushgateway:v0.3.1 - imagePullPolicy: IfNotPresent - resources: - limits: {} - # cpu: 100m - # memory: 100Mi - requests: {} - # cpu: 50m - # memory: 50Mi - tidb: replicas: ${tidb_replicas} # The secret name of root password, you can create secret with following command: - # kubectl create secret generic tidb-secret --from-literal=root_password= + # kubectl create secret generic tidb-secret --from-literal=root= --namespace= # If unset, the root password will be empty and you can set it after connecting # passwordSecretName: tidb-secret # initSql is the SQL statements executed after the TiDB cluster is bootstrapped. @@ -161,6 +152,36 @@ tidb: # Image pull policy. imagePullPolicy: IfNotPresent logLevel: info + preparedPlanCacheEnabled: false + preparedPlanCacheCapacity: 100 + # Enable local latches for transactions. Enable it when + # there are lots of conflicts between transactions. + txnLocalLatchesEnabled: false + txnLocalLatchesCapacity: "10240000" + # The limit of concurrent executed sessions. + tokenLimit: "1000" + # Set the memory quota for a query in bytes. Default: 32GB + memQuotaQuery: "34359738368" + # The limitation of the number for the entries in one transaction. + # If using TiKV as the storage, the entry represents a key/value pair. + # WARNING: Do not set the value too large, otherwise it will make a very large impact on the TiKV cluster. + # Please adjust this configuration carefully. + txnEntryCountLimit: "300000" + # The limitation of the size in byte for the entries in one transaction. + # If using TiKV as the storage, the entry represents a key/value pair. + # WARNING: Do not set the value too large, otherwise it will make a very large impact on the TiKV cluster. + # Please adjust this configuration carefully. + txnTotalSizeLimit: "104857600" + # enableBatchDml enables batch commit for the DMLs + enableBatchDml: false + # check mb4 value in utf8 is used to control whether to check the mb4 characters when the charset is utf8. + checkMb4ValueInUtf8: true + # treat-old-version-utf8-as-utf8mb4 use for upgrade compatibility. Set to true will treat old version table/column UTF8 charset as UTF8MB4. + treatOldVersionUtf8AsUtf8mb4: true + # lease is schema lease duration, very dangerous to change only if you know what you do. + lease: 45s + # Max CPUs to use, 0 use number of CPUs in the machine. + maxProcs: 0 resources: limits: {} # cpu: 16000m @@ -184,6 +205,7 @@ tidb: exposeStatus: true annotations: service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0 + service.beta.kubernetes.io/aws-load-balancer-type: nlb # separateSlowLog: true slowLogTailer: image: busybox:1.26.2 @@ -195,6 +217,15 @@ tidb: cpu: 20m memory: 5Mi + # tidb plugin configuration + plugin: + # enable plugin or not + enable: false + # the start argument to specify the folder containing + directory: /plugins + # the start argument to specify the plugin id (name "-" version) that needs to be loaded, e.g. 'conn_limit-1'. + list: ["whitelist-1"] + # mysqlClient is used to set password for TiDB # it must has Python MySQL client installed mysqlClient: @@ -224,6 +255,7 @@ monitor: # memory: 4Gi username: admin password: admin + anonymousEnabled: true service: type: LoadBalancer # if grafana is running behind a reverse proxy with subpath http://foo.bar/grafana @@ -268,6 +300,7 @@ binlog: # refer to https://kubernetes.io/docs/concepts/storage/storage-classes storageClassName: local-storage storage: 10Gi + syncLog: true # a integer value to control expiry date of the binlog data, indicates for how long (in days) the binlog data would be stored. # must bigger than 0 gc: 7 @@ -285,8 +318,8 @@ binlog: # refer to https://kubernetes.io/docs/concepts/storage/storage-classes storageClassName: local-storage storage: 10Gi - # parallel worker count (default 1) - workerCount: 1 + # parallel worker count (default 16) + workerCount: 16 # the interval time (in seconds) of detect pumps' status (default 10) detectInterval: 10 # disbale detect causality @@ -299,8 +332,8 @@ binlog: initialCommitTs: 0 # enable safe mode to make syncer reentrant safeMode: false - # number of binlog events in a transaction batch (default 1) - txnBatch: 1 + # number of binlog events in a transaction batch (default 20) + txnBatch: 20 # downstream storage, equal to --dest-db-type # valid values are "mysql", "pb", "kafka" destDBType: pb From f079262c8c4834946f8455719831893695052524 Mon Sep 17 00:00:00 2001 From: tennix Date: Fri, 3 May 2019 00:45:28 +0800 Subject: [PATCH 09/14] remove pushgateway in CRD schema --- manifests/crd.yaml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/manifests/crd.yaml b/manifests/crd.yaml index 3573d2268a7..789dde4285c 100644 --- a/manifests/crd.yaml +++ b/manifests/crd.yaml @@ -101,13 +101,3 @@ spec: properties: cpu: type: string - tikvPromGateway: - properties: - limits: - properties: - cpu: - type: string - requests: - properties: - cpu: - type: string From 3202d101dbffdd83fcaf36b23fe0f41e1c020183 Mon Sep 17 00:00:00 2001 From: tennix Date: Sun, 5 May 2019 11:19:53 +0800 Subject: [PATCH 10/14] flexible Grafana configuration using environment variables --- .../templates/config/_grafana-config.tpl | 409 ------------------ .../templates/monitor-deployment.yaml | 26 +- charts/tidb-cluster/values.yaml | 12 +- 3 files changed, 13 insertions(+), 434 deletions(-) delete mode 100644 charts/tidb-cluster/templates/config/_grafana-config.tpl diff --git a/charts/tidb-cluster/templates/config/_grafana-config.tpl b/charts/tidb-cluster/templates/config/_grafana-config.tpl deleted file mode 100644 index 0a48c77982c..00000000000 --- a/charts/tidb-cluster/templates/config/_grafana-config.tpl +++ /dev/null @@ -1,409 +0,0 @@ -##################### Grafana Configuration Example ##################### -# -# Everything has defaults so you only need to uncomment things you want to -# change - -# possible values : production, development -; app_mode = production - -# instance name, defaults to HOSTNAME environment variable value or hostname if HOSTNAME var is empty -; instance_name = ${HOSTNAME} - -#################################### Paths #################################### -[paths] -# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used) -# -;data = /var/lib/grafana -# -# Directory where grafana can store logs -# -;logs = /var/log/grafana -# -# Directory where grafana will automatically scan and look for plugins -# -;plugins = /var/lib/grafana/plugins - -# -#################################### Server #################################### -[server] -# Protocol (http or https) -;protocol = http - -# The ip address to bind to, empty will bind to all interfaces -;http_addr = - -# The http port to use -;http_port = 3000 - -# The public facing domain name used to access grafana from a browser -{{- if .Values.monitor.grafana.serverDomain }} -domain = {{ .Values.monitor.grafana.serverDomain }} -{{- else }} -domain = localhost -{{- end }} - -# Redirect to correct domain if host header does not match domain -# Prevents DNS rebinding attacks -;enforce_domain = false - -# The full public facing url you use in browser, used for redirects and emails -# If you use reverse proxy and sub path specify full url (with sub path) -{{- if .Values.monitor.grafana.serverRootUrl }} -root_url = {{ .Values.monitor.grafana.serverRootUrl }} -{{- else }} -root_url = %(protocol)s://%(domain)s:%(http_port)s/ -{{- end }} - -# Log web requests -;router_logging = false - -# the path relative working path -;static_root_path = public - -# enable gzip -;enable_gzip = false - -# https certs & key file -;cert_file = -;cert_key = - -#################################### Database #################################### -[database] -# You can configure the database connection by specifying type, host, name, user and password -# as seperate properties or as on string using the url propertie. - -# Either "mysql", "postgres" or "sqlite3", it's your choice -;type = sqlite3 -;host = 127.0.0.1:3306 -;name = grafana -;user = root -# If the password contains # or ; you have to wrap it with trippel quotes. Ex """#password;""" -;password = - -# Use either URL or the previous fields to configure the database -# Example: mysql://user:secret@host:port/database -;url = - -# For "postgres" only, either "disable", "require" or "verify-full" -;ssl_mode = disable - -# For "sqlite3" only, path relative to data_path setting -;path = grafana.db - -# Max conn setting default is 0 (mean not set) -;max_conn = -;max_idle_conn = -;max_open_conn = - - -#################################### Session #################################### -[session] -# Either "memory", "file", "redis", "mysql", "postgres", default is "file" -;provider = file - -# Provider config options -# memory: not have any config yet -# file: session dir path, is relative to grafana data_path -# redis: config like redis server e.g. `addr=127.0.0.1:6379,pool_size=100,db=grafana` -# mysql: go-sql-driver/mysql dsn config string, e.g. `user:password@tcp(127.0.0.1:3306)/database_name` -# postgres: user=a password=b host=localhost port=5432 dbname=c sslmode=disable -;provider_config = sessions - -# Session cookie name -;cookie_name = grafana_sess - -# If you use session in https only, default is false -;cookie_secure = false - -# Session life time, default is 86400 -;session_life_time = 86400 - -#################################### Data proxy ########################### -[dataproxy] - -# This enables data proxy logging, default is false -;logging = false - - -#################################### Analytics #################################### -[analytics] -# Server reporting, sends usage counters to stats.grafana.org every 24 hours. -# No ip addresses are being tracked, only simple counters to track -# running instances, dashboard and error counts. It is very helpful to us. -# Change this option to false to disable reporting. -;reporting_enabled = true - -# Set to false to disable all checks to https://grafana.net -# for new vesions (grafana itself and plugins), check is used -# in some UI views to notify that grafana or plugin update exists -# This option does not cause any auto updates, nor send any information -# only a GET request to http://grafana.net to get latest versions -;check_for_updates = true - -# Google Analytics universal tracking code, only enabled if you specify an id here -;google_analytics_ua_id = - -#################################### Security #################################### -[security] -# default admin user, created on startup -# admin_user = admin - -# default admin password, can be changed before first start of grafana, or in profile settings -# admin_password = admin - -# used for signing -;secret_key = SW2YcwTIb9zpOOhoPsMm - -# Auto-login remember days -;login_remember_days = 7 -;cookie_username = grafana_user -;cookie_remember_name = grafana_remember - -# disable gravatar profile images -;disable_gravatar = false - -# data source proxy whitelist (ip_or_domain:port separated by spaces) -;data_source_proxy_whitelist = - -[snapshots] -# snapshot sharing options -;external_enabled = true -;external_snapshot_url = https://snapshots-origin.raintank.io -;external_snapshot_name = Publish to snapshot.raintank.io - -# remove expired snapshot -;snapshot_remove_expired = true - -# remove snapshots after 90 days -;snapshot_TTL_days = 90 - -#################################### Users #################################### -[users] -# disable user signup / registration -;allow_sign_up = true - -# Allow non admin users to create organizations -;allow_org_create = true - -# Set to true to automatically assign new users to the default organization (id 1) -;auto_assign_org = true - -# Default role new users will be automatically assigned (if disabled above is set to true) -;auto_assign_org_role = Viewer - -# Background text for the user field on the login page -;login_hint = email or username - -# Default UI theme ("dark" or "light") -;default_theme = dark - -[auth] -# Set to true to disable (hide) the login form, useful if you use OAuth, defaults to false -;disable_login_form = false - -#################################### Anonymous Auth ########################## -[auth.anonymous] -# enable anonymous access -enabled = {{ .Values.monitor.grafana.anonymousEnabled | default true }} - -# specify organization name that should be used for unauthenticated users -org_name = Main Org. - -# specify role for unauthenticated users -org_role = Viewer - -#################################### Github Auth ########################## -[auth.github] -;enabled = false -;allow_sign_up = true -;client_id = some_id -;client_secret = some_secret -;scopes = user:email,read:org -;auth_url = https://github.com/login/oauth/authorize -;token_url = https://github.com/login/oauth/access_token -;api_url = https://api.github.com/user -;team_ids = -;allowed_organizations = - -#################################### Google Auth ########################## -[auth.google] -;enabled = false -;allow_sign_up = true -;client_id = some_client_id -;client_secret = some_client_secret -;scopes = https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email -;auth_url = https://accounts.google.com/o/oauth2/auth -;token_url = https://accounts.google.com/o/oauth2/token -;api_url = https://www.googleapis.com/oauth2/v1/userinfo -;allowed_domains = - -#################################### Generic OAuth ########################## -[auth.generic_oauth] -;enabled = false -;name = OAuth -;allow_sign_up = true -;client_id = some_id -;client_secret = some_secret -;scopes = user:email,read:org -;auth_url = https://foo.bar/login/oauth/authorize -;token_url = https://foo.bar/login/oauth/access_token -;api_url = https://foo.bar/user -;team_ids = -;allowed_organizations = - -#################################### Grafana.net Auth #################### -[auth.grafananet] -;enabled = false -;allow_sign_up = true -;client_id = some_id -;client_secret = some_secret -;scopes = user:email -;allowed_organizations = - -#################################### Auth Proxy ########################## -[auth.proxy] -;enabled = false -;header_name = X-WEBAUTH-USER -;header_property = username -;auto_sign_up = true -;ldap_sync_ttl = 60 -;whitelist = 192.168.1.1, 192.168.2.1 - -#################################### Basic Auth ########################## -[auth.basic] -;enabled = true - -#################################### Auth LDAP ########################## -[auth.ldap] -;enabled = false -;config_file = /etc/grafana/ldap.toml -;allow_sign_up = true - -#################################### SMTP / Emailing ########################## -[smtp] -;enabled = false -;host = localhost:25 -;user = -# If the password contains # or ; you have to wrap it with trippel quotes. Ex """#password;""" -;password = -;cert_file = -;key_file = -;skip_verify = false -;from_address = admin@grafana.localhost -;from_name = Grafana - -[emails] -;welcome_email_on_sign_up = false - -#################################### Logging ########################## -[log] -# Either "console", "file", "syslog". Default is console and file -# Use space to separate multiple modes, e.g. "console file" -;mode = console file - -# Either "trace", "debug", "info", "warn", "error", "critical", default is "info" -level = {{ .Values.monitor.grafana.logLevel }} - -# optional settings to set different levels for specific loggers. Ex filters = sqlstore:debug -;filters = - - -# For "console" mode only -[log.console] -;level = - -# log line format, valid options are text, console and json -;format = console - -# For "file" mode only -[log.file] -;level = - -# log line format, valid options are text, console and json -;format = text - -# This enables automated log rotate(switch of following options), default is true -;log_rotate = true - -# Max line number of single file, default is 1000000 -;max_lines = 1000000 - -# Max size shift of single file, default is 28 means 1 << 28, 256MB -;max_size_shift = 28 - -# Segment log daily, default is true -;daily_rotate = true - -# Expired days of log file(delete after max days), default is 7 -;max_days = 7 - -[log.syslog] -;level = - -# log line format, valid options are text, console and json -;format = text - -# Syslog network type and address. This can be udp, tcp, or unix. If left blank, the default unix endpoints will be used. -;network = -;address = - -# Syslog facility. user, daemon and local0 through local7 are valid. -;facility = - -# Syslog tag. By default, the process' argv[0] is used. -;tag = - - -#################################### AMQP Event Publisher ########################## -[event_publisher] -;enabled = false -;rabbitmq_url = amqp://localhost/ -;exchange = grafana_events - -;#################################### Dashboard JSON files ########################## -[dashboards.json] -;enabled = false -;path = /var/lib/grafana/dashboards - -#################################### Alerting ############################ -[alerting] -# Disable alerting engine & UI features -;enabled = true -# Makes it possible to turn off alert rule execution but alerting UI is visible -;execute_alerts = true - -#################################### Internal Grafana Metrics ########################## -# Metrics available at HTTP API Url /api/metrics -[metrics] -# Disable / Enable internal metrics -;enabled = true - -# Publish interval -;interval_seconds = 10 - -# Send internal metrics to Graphite -[metrics.graphite] -# Enable by setting the address setting (ex localhost:2003) -;address = -;prefix = prod.grafana.%(instance_name)s. - -#################################### Internal Grafana Metrics ########################## -# Url used to to import dashboards directly from Grafana.net -[grafana_net] -;url = https://grafana.net - -#################################### External image storage ########################## -[external_image_storage] -# Used for uploading images to public servers so they can be included in slack/email messages. -# you can choose between (s3, webdav) -;provider = - -[external_image_storage.s3] -;bucket_url = -;access_key = -;secret_key = - -[external_image_storage.webdav] -;url = -;username = -;password = diff --git a/charts/tidb-cluster/templates/monitor-deployment.yaml b/charts/tidb-cluster/templates/monitor-deployment.yaml index 64f9e148e25..dd290ffcbbc 100644 --- a/charts/tidb-cluster/templates/monitor-deployment.yaml +++ b/charts/tidb-cluster/templates/monitor-deployment.yaml @@ -107,18 +107,6 @@ spec: containerPort: 3000 protocol: TCP env: - # The following two env (SERVER_ROOT_URL and SERVER_DOMAIN) should be configured in configuration file - # but grafana container startup script will chown of configuration directory - # this will be failed because configmap is mounted as readonly volume in container - # so they're temporarily set here as env - {{- if .Values.monitor.grafana.serverRootUrl }} - - name: GF_SERVER_ROOT_URL - value: {{ .Values.monitor.grafana.serverRootUrl | quote }} - {{- end }} - {{- if .Values.monitor.grafana.serverRootUrl }} - - name: GF_SERVER_DOMAIN - value: {{ .Values.monitor.grafana.serverDomain | quote }} - {{- end }} - name: GF_PATHS_DATA value: /data/grafana - name: GF_SECURITY_ADMIN_USER @@ -131,11 +119,15 @@ spec: secretKeyRef: name: {{ template "cluster.name" . }}-monitor key: password + {{- if .Values.monitor.grafana.config }} + {{- range $key, $value := .Values.monitor.grafana.config }} + - name: GF_{{ $key | replace "." "_" | upper }} + value: {{ $value | quote }} + {{- end }} + {{- end }} - name: TZ value: {{ .Values.timezone | default "UTC" }} volumeMounts: - - name: grafana-config - mountPath: /etc/grafana - name: monitor-data mountPath: /data - mountPath: /etc/grafana/provisioning/datasources @@ -171,12 +163,6 @@ spec: - key: alert-rules-config path: alert.rules {{- if .Values.monitor.grafana.create }} - - name: grafana-config - configMap: - name: {{ template "cluster.name" . }}-monitor - items: - - key: grafana-config - path: grafana.ini - configMap: name: {{ template "cluster.name" . }}-monitor items: diff --git a/charts/tidb-cluster/values.yaml b/charts/tidb-cluster/values.yaml index 86dacbcd357..bf02c19abe5 100644 --- a/charts/tidb-cluster/values.yaml +++ b/charts/tidb-cluster/values.yaml @@ -251,13 +251,15 @@ monitor: # memory: 4Gi username: admin password: admin - anonymousEnabled: true + config: + # Configure Grafana using environment variables except GF_PATHS_DATA, GF_SECURITY_ADMIN_USER and GF_SECURITY_ADMIN_PASSWORD + # Ref https://grafana.com/docs/installation/configuration/#using-environment-variables + GF_AUTH_ANONYMOUS_ENABLED: "true" + # if grafana is running behind a reverse proxy with subpath http://foo.bar/grafana + # GF_SERVER_DOMAIN: foo.bar + # GF_SERVER_ROOT_URL: "%(protocol)s://%(domain)s/grafana/" service: type: NodePort - # if grafana is running behind a reverse proxy with subpath http://foo.bar/grafana - # config the `serverDomain` and `serverRootUrl` as follows - # serverDomain: foo.bar - # serverRootUrl: "%(protocol)s://%(domain)s/grafana/" prometheus: image: prom/prometheus:v2.2.1 imagePullPolicy: IfNotPresent From 936c1f6a47578ab0fa7fc90ef57a1dd48d743d34 Mon Sep 17 00:00:00 2001 From: tennix Date: Sun, 5 May 2019 11:52:43 +0800 Subject: [PATCH 11/14] fix Grafana environment variables --- charts/tidb-cluster/templates/monitor-configmap.yaml | 2 -- charts/tidb-cluster/templates/monitor-deployment.yaml | 2 +- charts/tidb-cluster/values.yaml | 2 ++ 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/charts/tidb-cluster/templates/monitor-configmap.yaml b/charts/tidb-cluster/templates/monitor-configmap.yaml index 7ec1dd4f3c2..f2ebcd633b0 100644 --- a/charts/tidb-cluster/templates/monitor-configmap.yaml +++ b/charts/tidb-cluster/templates/monitor-configmap.yaml @@ -19,8 +19,6 @@ data: {{ tuple "config/_grafana-datasource.tpl" . | include "helm-toolkit.utils.template" | indent 4 }} dashboard-config: |- {{ tuple "config/_grafana-dashboard.tpl" . | include "helm-toolkit.utils.template" | indent 4 }} - grafana-config: |- -{{ tuple "config/_grafana-config.tpl" . | include "helm-toolkit.utils.template" | indent 4 }} grafana-prestart: | {{- include "setup" . | indent 4 }} {{- end }} diff --git a/charts/tidb-cluster/templates/monitor-deployment.yaml b/charts/tidb-cluster/templates/monitor-deployment.yaml index dd290ffcbbc..ef93931568a 100644 --- a/charts/tidb-cluster/templates/monitor-deployment.yaml +++ b/charts/tidb-cluster/templates/monitor-deployment.yaml @@ -121,7 +121,7 @@ spec: key: password {{- if .Values.monitor.grafana.config }} {{- range $key, $value := .Values.monitor.grafana.config }} - - name: GF_{{ $key | replace "." "_" | upper }} + - name: {{ $key }} value: {{ $value | quote }} {{- end }} {{- end }} diff --git a/charts/tidb-cluster/values.yaml b/charts/tidb-cluster/values.yaml index bf02c19abe5..cb822d517d9 100644 --- a/charts/tidb-cluster/values.yaml +++ b/charts/tidb-cluster/values.yaml @@ -255,6 +255,8 @@ monitor: # Configure Grafana using environment variables except GF_PATHS_DATA, GF_SECURITY_ADMIN_USER and GF_SECURITY_ADMIN_PASSWORD # Ref https://grafana.com/docs/installation/configuration/#using-environment-variables GF_AUTH_ANONYMOUS_ENABLED: "true" + GF_AUTH_ANONYMOUS_ORG_NAME: "Main Org." + GF_AUTH_ANONYMOUS_ORG_ROLE: "Viewer" # if grafana is running behind a reverse proxy with subpath http://foo.bar/grafana # GF_SERVER_DOMAIN: foo.bar # GF_SERVER_ROOT_URL: "%(protocol)s://%(domain)s/grafana/" From 6de34fcc1385bec0f6e4685d9f29296afeeb7943 Mon Sep 17 00:00:00 2001 From: tennix Date: Sun, 5 May 2019 16:56:20 +0800 Subject: [PATCH 12/14] fix document about upgrade --- docs/local-dind-tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/local-dind-tutorial.md b/docs/local-dind-tutorial.md index 23f5bd28451..e4a11bcc8d1 100644 --- a/docs/local-dind-tutorial.md +++ b/docs/local-dind-tutorial.md @@ -156,7 +156,7 @@ You can scale out or scale in the TiDB cluster simply by modifying the number of 1. Configure the `charts/tidb-cluster/values.yaml` file. - For example, change the version of PD/TiKV/TiDB `image` to `v2.1.1`. + For example, change the version of PD/TiKV/TiDB `image` to `v2.1.9`. 2. Run the following command to apply the changes: From 2355f74b1c14905fad4adaee26596a5bf906ee6e Mon Sep 17 00:00:00 2001 From: tennix Date: Mon, 6 May 2019 19:38:30 +0800 Subject: [PATCH 13/14] address comment --- charts/tidb-cluster/templates/monitor-configmap.yaml | 4 ++-- .../tidb-cluster/templates/scripts/_grafana-prestart.sh.tpl | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/charts/tidb-cluster/templates/monitor-configmap.yaml b/charts/tidb-cluster/templates/monitor-configmap.yaml index f2ebcd633b0..6ed2fbc3951 100644 --- a/charts/tidb-cluster/templates/monitor-configmap.yaml +++ b/charts/tidb-cluster/templates/monitor-configmap.yaml @@ -19,7 +19,7 @@ data: {{ tuple "config/_grafana-datasource.tpl" . | include "helm-toolkit.utils.template" | indent 4 }} dashboard-config: |- {{ tuple "config/_grafana-dashboard.tpl" . | include "helm-toolkit.utils.template" | indent 4 }} - grafana-prestart: | -{{- include "setup" . | indent 4 }} + grafana-prestart: |- +{{- tuple "scripts/_grafana-prestart.sh.tpl" . | include "helm-toolkit.utils.template" | indent 4 }} {{- end }} {{- end }} diff --git a/charts/tidb-cluster/templates/scripts/_grafana-prestart.sh.tpl b/charts/tidb-cluster/templates/scripts/_grafana-prestart.sh.tpl index e924cdb5cd2..0b87b1bf22b 100644 --- a/charts/tidb-cluster/templates/scripts/_grafana-prestart.sh.tpl +++ b/charts/tidb-cluster/templates/scripts/_grafana-prestart.sh.tpl @@ -1,4 +1,3 @@ -{{- define "setup" }} #!/bin/sh #decompress dashboard files @@ -15,4 +14,3 @@ sed -i 's/TIDB-Cluster-TiDB/'$clusterName'-TiDB/g' /grafana-dashboard-definitio sed -i 's/TIDB-Cluster-PD/'$clusterName'-PD/g' /grafana-dashboard-definitions/tidb/pd.json sed -i 's/TIDB-Cluster-TiKV/'$clusterName'-TiKV/g' /grafana-dashboard-definitions/tidb/tikv.json sed -i 's/TIDB-Cluster-Overview/'$clusterName'-Overview/g' /grafana-dashboard-definitions/tidb/overview.json -{{- end }} From e71f29d64ee7f4085f94190a02881fae1f9e75a8 Mon Sep 17 00:00:00 2001 From: tennix Date: Mon, 6 May 2019 20:34:35 +0800 Subject: [PATCH 14/14] update value settings in aliyun/aws deployment --- .../templates/monitor-service.yaml | 4 + .../templates/tidb-cluster-values.yaml.tpl | 82 +++++++++++++------ .../templates/tidb-cluster-values.yaml.tpl | 14 ++-- 3 files changed, 72 insertions(+), 28 deletions(-) diff --git a/charts/tidb-cluster/templates/monitor-service.yaml b/charts/tidb-cluster/templates/monitor-service.yaml index 8c57ee40244..cbd297333d2 100644 --- a/charts/tidb-cluster/templates/monitor-service.yaml +++ b/charts/tidb-cluster/templates/monitor-service.yaml @@ -10,6 +10,10 @@ metadata: app.kubernetes.io/instance: {{ .Release.Name }} app.kubernetes.io/component: monitor helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }} + {{- if .Values.monitor.grafana.service.annotations }} + annotations: +{{ toYaml .Values.monitor.grafana.service.annotations | indent 4 }} + {{- end }} spec: ports: - name: grafana diff --git a/deploy/alicloud/templates/tidb-cluster-values.yaml.tpl b/deploy/alicloud/templates/tidb-cluster-values.yaml.tpl index abcd02dbc5a..3509aeb1611 100644 --- a/deploy/alicloud/templates/tidb-cluster-values.yaml.tpl +++ b/deploy/alicloud/templates/tidb-cluster-values.yaml.tpl @@ -99,6 +99,8 @@ tikv: # syncLog is a bool value to enable or disable syc-log for raftstore, default is true # enable this can prevent data loss when power failure syncLog: true + # size of thread pool for grpc server. + # grpcConcurrency: 4 resources: limits: {} # cpu: 16000m @@ -134,21 +136,10 @@ tikv: # also should less than total cpu cores. # storageSchedulerWorkerPoolSize: 4 -tikvPromGateway: - image: prom/pushgateway:v0.3.1 - imagePullPolicy: IfNotPresent - resources: - limits: {} - # cpu: 100m - # memory: 100Mi - requests: {} - # cpu: 50m - # memory: 50Mi - tidb: replicas: ${tidb_replicas} # The secret name of root password, you can create secret with following command: - # kubectl create secret generic tidb-secret --from-literal=root_password= + # kubectl create secret generic tidb-secret --from-literal=root= --namespace= # If unset, the root password will be empty and you can set it after connecting # passwordSecretName: tidb-secret # initSql is the SQL statements executed after the TiDB cluster is bootstrapped. @@ -158,6 +149,36 @@ tidb: # Image pull policy. imagePullPolicy: IfNotPresent logLevel: info + preparedPlanCacheEnabled: false + preparedPlanCacheCapacity: 100 + # Enable local latches for transactions. Enable it when + # there are lots of conflicts between transactions. + txnLocalLatchesEnabled: false + txnLocalLatchesCapacity: "10240000" + # The limit of concurrent executed sessions. + tokenLimit: "1000" + # Set the memory quota for a query in bytes. Default: 32GB + memQuotaQuery: "34359738368" + # The limitation of the number for the entries in one transaction. + # If using TiKV as the storage, the entry represents a key/value pair. + # WARNING: Do not set the value too large, otherwise it will make a very large impact on the TiKV cluster. + # Please adjust this configuration carefully. + txnEntryCountLimit: "300000" + # The limitation of the size in byte for the entries in one transaction. + # If using TiKV as the storage, the entry represents a key/value pair. + # WARNING: Do not set the value too large, otherwise it will make a very large impact on the TiKV cluster. + # Please adjust this configuration carefully. + txnTotalSizeLimit: "104857600" + # enableBatchDml enables batch commit for the DMLs + enableBatchDml: false + # check mb4 value in utf8 is used to control whether to check the mb4 characters when the charset is utf8. + checkMb4ValueInUtf8: true + # treat-old-version-utf8-as-utf8mb4 use for upgrade compatibility. Set to true will treat old version table/column UTF8 charset as UTF8MB4. + treatOldVersionUtf8AsUtf8mb4: true + # lease is schema lease duration, very dangerous to change only if you know what you do. + lease: 45s + # Max CPUs to use, 0 use number of CPUs in the machine. + maxProcs: 0 resources: limits: {} # cpu: 16000m @@ -193,6 +214,15 @@ tidb: cpu: 20m memory: 5Mi + # tidb plugin configuration + plugin: + # enable plugin or not + enable: false + # the start argument to specify the folder containing + directory: /plugins + # the start argument to specify the plugin id (name "-" version) that needs to be loaded, e.g. 'conn_limit-1'. + list: ["whitelist-1"] + # mysqlClient is used to set password for TiDB # it must has Python MySQL client installed mysqlClient: @@ -222,12 +252,19 @@ monitor: # memory: 4Gi username: admin password: admin + config: + # Configure Grafana using environment variables except GF_PATHS_DATA, GF_SECURITY_ADMIN_USER and GF_SECURITY_ADMIN_PASSWORD + # Ref https://grafana.com/docs/installation/configuration/#using-environment-variables + GF_AUTH_ANONYMOUS_ENABLED: "true" + GF_AUTH_ANONYMOUS_ORG_NAME: "Main Org." + GF_AUTH_ANONYMOUS_ORG_ROLE: "Viewer" + # if grafana is running behind a reverse proxy with subpath http://foo.bar/grafana + # GF_SERVER_DOMAIN: foo.bar + # GF_SERVER_ROOT_URL: "%(protocol)s://%(domain)s/grafana/" service: type: LoadBalancer - # if grafana is running behind a reverse proxy with subpath http://foo.bar/grafana - # config the `serverDomain` and `serverRootUrl` as follows - # serverDomain: foo.bar - # serverRootUrl: "%(protocol)s://%(domain)s/grafana/" + annotations: + service.beta.kubernetes.io/alicloud-loadbalancer-address-type: ${monitor_slb_network_type} prometheus: image: prom/prometheus:v2.2.1 imagePullPolicy: IfNotPresent @@ -241,8 +278,6 @@ monitor: # memory: 4Gi service: type: NodePort - annotations: - service.beta.kubernetes.io/alicloud-loadbalancer-address-type: ${monitor_slb_network_type} reserveDays: ${monitor_reserve_days} # alertmanagerURL: "" nodeSelector: {} @@ -268,6 +303,7 @@ binlog: # refer to https://kubernetes.io/docs/concepts/storage/storage-classes storageClassName: ${local_storage_class} storage: 10Gi + syncLog: true # a integer value to control expiry date of the binlog data, indicates for how long (in days) the binlog data would be stored. # must bigger than 0 gc: 7 @@ -285,8 +321,8 @@ binlog: # refer to https://kubernetes.io/docs/concepts/storage/storage-classes storageClassName: ${local_storage_class} storage: 10Gi - # parallel worker count (default 1) - workerCount: 1 + # parallel worker count (default 16) + workerCount: 16 # the interval time (in seconds) of detect pumps' status (default 10) detectInterval: 10 # disbale detect causality @@ -299,8 +335,8 @@ binlog: initialCommitTs: 0 # enable safe mode to make syncer reentrant safeMode: false - # number of binlog events in a transaction batch (default 1) - txnBatch: 1 + # number of binlog events in a transaction batch (default 20) + txnBatch: 20 # downstream storage, equal to --dest-db-type # valid values are "mysql", "pb", "kafka" destDBType: pb @@ -368,4 +404,4 @@ scheduledBackup: metaInstance: "{{ $labels.instance }}" metaType: "{{ $labels.type }}" -metaValue: "{{ $value }}" \ No newline at end of file +metaValue: "{{ $value }}" diff --git a/deploy/aws/templates/tidb-cluster-values.yaml.tpl b/deploy/aws/templates/tidb-cluster-values.yaml.tpl index ece94bbc8b4..7b5e1a49d28 100644 --- a/deploy/aws/templates/tidb-cluster-values.yaml.tpl +++ b/deploy/aws/templates/tidb-cluster-values.yaml.tpl @@ -255,13 +255,17 @@ monitor: # memory: 4Gi username: admin password: admin - anonymousEnabled: true + config: + # Configure Grafana using environment variables except GF_PATHS_DATA, GF_SECURITY_ADMIN_USER and GF_SECURITY_ADMIN_PASSWORD + # Ref https://grafana.com/docs/installation/configuration/#using-environment-variables + GF_AUTH_ANONYMOUS_ENABLED: "true" + GF_AUTH_ANONYMOUS_ORG_NAME: "Main Org." + GF_AUTH_ANONYMOUS_ORG_ROLE: "Viewer" + # if grafana is running behind a reverse proxy with subpath http://foo.bar/grafana + # GF_SERVER_DOMAIN: foo.bar + # GF_SERVER_ROOT_URL: "%(protocol)s://%(domain)s/grafana/" service: type: LoadBalancer - # if grafana is running behind a reverse proxy with subpath http://foo.bar/grafana - # config the `serverDomain` and `serverRootUrl` as follows - # serverDomain: foo.bar - # serverRootUrl: "%(protocol)s://%(domain)s/grafana/" prometheus: image: prom/prometheus:v2.2.1 imagePullPolicy: IfNotPresent