?本文使用的是本機(jī)掛載數(shù)據(jù),這樣存在一個(gè)弊端沒(méi)有pvc掛載好?
重點(diǎn)來(lái)了:這種共享宿主機(jī)存儲(chǔ)的方法似乎可以解決Mysql數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)的場(chǎng)景,我們似乎可以萬(wàn)事大吉了!But,有的老鐵會(huì)問(wèn):如果我得宿主機(jī)掛了怎么辦?或者Pod沒(méi)有在上一次節(jié)點(diǎn)上拉起,而是在新的節(jié)點(diǎn)上拉起,那數(shù)據(jù)都不在一個(gè)宿主機(jī)上,還恢復(fù)個(gè)錘子!?聽(tīng)起來(lái)有點(diǎn)兒道理啊,確實(shí)存在這個(gè)問(wèn)題那怎么解決呢?還是那句話 :總有”好事者”替我們解決了這個(gè)問(wèn)題!
既然Host類型
的持久化存儲(chǔ)無(wú)法解決節(jié)點(diǎn)宕機(jī)或者pod在另外的機(jī)器上拉起導(dǎo)致數(shù)據(jù)無(wú)法恢復(fù)的Bug,那我們就應(yīng)該思考一個(gè)問(wèn)題:既然我無(wú)法在宿主機(jī)持久化,那我在集群之外的服務(wù)器上存儲(chǔ)數(shù)據(jù),讓我的Pod關(guān)聯(lián)到這個(gè)數(shù)據(jù)存儲(chǔ)服務(wù)器上,同時(shí)我對(duì)這個(gè)數(shù)據(jù)存儲(chǔ)服務(wù)器做高可用,豈不美哉??此處應(yīng)該有掌聲,三分鐘!
想法很好,那我們來(lái)介紹一下K8S給我們的解決方案:?PersistentVolumes?簡(jiǎn)稱PV
PV?是什么?它是一種插件,它能夠支持多種數(shù)據(jù)存儲(chǔ)服務(wù)器,通過(guò)PV,我們能在K8S集群中,把我們的數(shù)據(jù)持久化到外部的服務(wù)器中。下圖是PV能夠支持的數(shù)據(jù)存儲(chǔ)服務(wù)類型
k8s分為有狀態(tài)和無(wú)狀態(tài)兩種創(chuàng)建pod方式,?有狀態(tài)保證了數(shù)據(jù)的持久化適合mysql,不會(huì)像無(wú)狀態(tài)那樣滾動(dòng)升級(jí),而是關(guān)閉舊的pod在新啟動(dòng)一個(gè)pod,保證了數(shù)據(jù)持久化
背景
K8S 中,由于ReplicaSet、ReplicationController、Deployment等這些控制器都是無(wú)狀態(tài)的,但是想要使用k8s來(lái)編排有狀態(tài)的服務(wù)如數(shù)據(jù)庫(kù)等,k8s 推出了面向有狀態(tài)服務(wù)的工作負(fù)載 StatefulSet。網(wǎng)絡(luò)持久化、存儲(chǔ)持久化,部署持久化有狀態(tài)服務(wù)
定義
無(wú)狀態(tài)服務(wù)(stateless service)對(duì)單次請(qǐng)求的處理,不依賴其他請(qǐng)求,也就是說(shuō),處理一次請(qǐng)求所需的全部信息,要么都包含在這個(gè)請(qǐng)求里,要么可以從外部獲取到(比如說(shuō)數(shù)據(jù)庫(kù)),服務(wù)器本身不存儲(chǔ)任何信息。
有狀態(tài)服務(wù)(stateful service)則相反,它會(huì)在自身保存一些數(shù)據(jù),先后的請(qǐng)求是有關(guān)聯(lián)的。
電商購(gòu)物為例,在商城里購(gòu)買一件商品。需要經(jīng)過(guò)放入購(gòu)物車、確認(rèn)訂單、付款等多個(gè)步驟。由于HTTP協(xié)議本身是無(wú)狀態(tài)的,所以為了實(shí)現(xiàn)有狀態(tài)服務(wù),就需要通過(guò)一些額外的方案。比如最常見(jiàn)的session,將用戶挑選的商品(購(gòu)物車),保存到session中,當(dāng)付款的時(shí)候,再?gòu)馁?gòu)物車?yán)锶〕錾唐沸畔ⅰ?
二、無(wú)狀態(tài)服務(wù) 和 有狀態(tài)服務(wù)
無(wú)狀態(tài)服務(wù)特點(diǎn)
1、數(shù)據(jù)方面:無(wú)狀態(tài)服務(wù)不會(huì)在本地存儲(chǔ)持久化數(shù)據(jù).多個(gè)實(shí)例可以共享相同的持久化數(shù)據(jù)
2、結(jié)果方面:多個(gè)服務(wù)實(shí)例對(duì)于同一個(gè)用戶請(qǐng)求的響應(yīng)結(jié)果是完全一致的
3、關(guān)系方面:這種多服務(wù)實(shí)例之間是沒(méi)有依賴關(guān)系
4、影響方面:在k8s控制器 中動(dòng)態(tài)啟停無(wú)狀態(tài)服務(wù)的pod并不會(huì)對(duì)其它的pod產(chǎn)生影響
5、示例方面:nginx實(shí)例,tomcat實(shí)例,web應(yīng)用
6、資源方面:相關(guān)的k8s資源有:ReplicaSet、ReplicationController、Deployment
7、創(chuàng)建方式:Deployment被設(shè)計(jì)用來(lái)管理無(wú)狀態(tài)服務(wù)的pod
每個(gè) pod完全一致,原因如下:
無(wú)狀態(tài)服務(wù)內(nèi)的多個(gè) Pod創(chuàng)建的順序是沒(méi)有順序的
無(wú)狀態(tài)服務(wù)內(nèi)的多個(gè)Pod的名稱是隨機(jī)的.pod被重新啟動(dòng)調(diào)度后,它的名稱與IP都會(huì)發(fā)生變化
無(wú)狀態(tài)服務(wù)內(nèi)的多個(gè)Pod背后是共享存儲(chǔ)的
8、擴(kuò)縮容方式:隨機(jī)縮容
由于是無(wú)狀態(tài)服務(wù),所以這些控制器創(chuàng)建的pod序號(hào)都是隨機(jī)值。并且在縮容也是隨機(jī),并不會(huì)明確縮容某一個(gè)pod。因?yàn)樗袑?shí)例得到的返回值都是一樣,所以縮容任何一個(gè)pod都可以。
有狀態(tài)服務(wù)介紹
1、數(shù)據(jù)方面:有狀態(tài)服務(wù)需要在本地存儲(chǔ)持久化數(shù)據(jù),典型的是分布式數(shù)據(jù)庫(kù)的應(yīng)
2、結(jié)果方面:實(shí)例之間,請(qǐng)求結(jié)果可能存在不一致
3、關(guān)系方面:分布式節(jié)點(diǎn)實(shí)例之間有依賴的拓?fù)潢P(guān)系.比如,主從關(guān)系.
4、影響方面:如果K8S停止分布式集群中任 一實(shí)例pod,就可能會(huì)導(dǎo)致數(shù)據(jù)丟失或者集群的crash
5、示例方面:mysql數(shù)據(jù)庫(kù)、kafka、zookeeper、Redis主從架構(gòu)
6、資源方面:statefulSet
7、創(chuàng)建方式:statefulSet管理
Stateful管理有狀態(tài)的應(yīng)用,Pod有如下特征:
唯一性:每個(gè)Pod會(huì)被分配一個(gè)唯一序號(hào).
順序性:Pod啟動(dòng),更新,銷毀是按順序進(jìn)行.
穩(wěn)定的網(wǎng)絡(luò)標(biāo)識(shí):Pod主機(jī)名,DNS地址不會(huì)隨著Pod被重新調(diào)度而發(fā)生變化.
穩(wěn)定的持久化存儲(chǔ):Pod被重新調(diào)度后,仍然能掛載原有的PV,從而保證了數(shù)據(jù)的完整性和一致性
有狀態(tài)的 pod是用來(lái)運(yùn)行有狀態(tài)應(yīng)用的,所以其在數(shù)據(jù)卷上存儲(chǔ)的數(shù)據(jù)非常重要,在 Statefulset 縮容時(shí)刪除這個(gè)聲明將是災(zāi)難性的,特別是對(duì)于 Statefulset 來(lái)說(shuō),縮容就像減少其 replicas 數(shù)值一樣簡(jiǎn)單?;谶@個(gè)原因,當(dāng)需要釋放特定的持久卷時(shí),需要手動(dòng)刪除對(duì)應(yīng)的持久卷聲明。
無(wú)狀態(tài)服務(wù)(Stateless Service):?
是指該服務(wù)運(yùn)行的實(shí)例不會(huì)在本地存儲(chǔ)需要持久化的數(shù)據(jù),并且多個(gè)實(shí)例對(duì)于同一個(gè)請(qǐng)求響應(yīng)的結(jié)果是完全一致的。這類服務(wù)在網(wǎng)易蜂巢云平臺(tái)創(chuàng)建后,借助k8s內(nèi)部的負(fù)載均衡,當(dāng)訪問(wèn)該服務(wù)的請(qǐng)求到達(dá)服務(wù)一端后,負(fù)載均衡會(huì)隨機(jī)找到一個(gè)實(shí)例來(lái)完成該請(qǐng)求的響應(yīng)(目前為輪詢)。這類服務(wù)的實(shí)例可能會(huì)因?yàn)橐恍┰蛲V够蛘咧匦聞?chuàng)建(如擴(kuò)容時(shí)),這時(shí),這些停止的實(shí)例里的所有信息(除日志和監(jiān)控?cái)?shù)據(jù)外)都將丟失(重啟容器即會(huì)丟失)。因此如果您的容器實(shí)例里需要保留重要的信息,并希望隨時(shí)可以備份以便于以后可以恢復(fù)的話,那么建議您創(chuàng)建有狀態(tài)服務(wù)。
有狀態(tài)服務(wù)(Stateful Service):?
是指該服務(wù)的實(shí)例可以將一部分?jǐn)?shù)據(jù)隨時(shí)進(jìn)行備份,并且在創(chuàng)建一個(gè)新的有狀態(tài)服務(wù)時(shí),可以通過(guò)備份恢復(fù)這些數(shù)據(jù),以達(dá)到數(shù)據(jù)持久化的目的。有狀態(tài)服務(wù)只能有一個(gè)實(shí)例,因此不支持“自動(dòng)服務(wù)容量調(diào)節(jié)”。一般來(lái)說(shuō),數(shù)據(jù)庫(kù)服務(wù)或者需要在本地文件系統(tǒng)存儲(chǔ)配置文件或其它永久數(shù)據(jù)的應(yīng)用程序可以創(chuàng)建使用有狀態(tài)服務(wù)。要想創(chuàng)建有狀態(tài)服務(wù),必須滿足幾個(gè)前提:
待創(chuàng)建的服務(wù)鏡像(image)的Dockerfile中必須定義了存儲(chǔ)卷(Volume),因?yàn)橹挥写鎯?chǔ)卷所在目錄里的數(shù)據(jù)可以被備份?
創(chuàng)建服務(wù)時(shí),必須指定給該存儲(chǔ)卷分配的磁盤空間大小?
如果創(chuàng)建服務(wù)的同時(shí)需要從之前的一個(gè)備份里恢復(fù)數(shù)據(jù),那么還要指明該存儲(chǔ)卷用哪個(gè)備份恢復(fù)。
無(wú)狀態(tài)服務(wù)和有狀態(tài)服務(wù)主要有以下幾點(diǎn)區(qū)別:?
實(shí)例數(shù)量:無(wú)狀態(tài)服務(wù)可以有一個(gè)或多個(gè)實(shí)例,因此支持兩種服務(wù)容量調(diào)節(jié)模式;有狀態(tài)服務(wù)只能有一個(gè)實(shí)例,不允許創(chuàng)建多個(gè)實(shí)例,因此也不支持服務(wù)容量調(diào)節(jié)模式。?
存儲(chǔ)卷:無(wú)狀態(tài)服務(wù)可以有存儲(chǔ)卷,也可以沒(méi)有,即使有也無(wú)法備份存儲(chǔ)卷里面的數(shù)據(jù);有狀態(tài)服務(wù)必須要有存儲(chǔ)卷,并且在創(chuàng)建服務(wù)時(shí),必須指定給該存儲(chǔ)卷分配的磁盤空間大小。?
數(shù)據(jù)存儲(chǔ):無(wú)狀態(tài)服務(wù)運(yùn)行過(guò)程中的所有數(shù)據(jù)(除日志和監(jiān)控?cái)?shù)據(jù))都存在容器實(shí)例里的文件系統(tǒng)中,如果實(shí)例停止或者刪除,則這些數(shù)據(jù)都將丟失,無(wú)法找回;而對(duì)于有狀態(tài)服務(wù),凡是已經(jīng)掛載了存儲(chǔ)卷的目錄下的文件內(nèi)容都可以隨時(shí)進(jìn)行備份,備份的數(shù)據(jù)可以下載,也可以用于恢復(fù)新的服務(wù)。但對(duì)于沒(méi)有掛載卷的目錄下的數(shù)據(jù),仍然是無(wú)法備份和保存的,如果實(shí)例停止或者刪除,這些非掛載卷里的文件內(nèi)容同樣會(huì)丟失
https://help.aliyun.com/document_detail/163545.html?? ? ?
在邊緣托管集群創(chuàng)建過(guò)程中,平臺(tái)會(huì)默認(rèn)為您創(chuàng)建至少一個(gè)ECS實(shí)例,并接入到集群管控。該實(shí)例主要用來(lái)部署云端管控應(yīng)用,也支持您自定義的云端管控應(yīng)用部署。通過(guò)默認(rèn)自帶node-role.alib
abacloud.com/addon: Effect: NoSchedule污點(diǎn)(Taints),來(lái)保證邊緣業(yè)務(wù)不會(huì)部署在云端管控節(jié)點(diǎn)。截止1.14.8-aliyunedge.1版本,中心管控節(jié)點(diǎn)上默認(rèn)安裝的管控應(yīng)用有:
? ? ?...
? ? ? nodeSelector:
? ? ? ? alibabacloud.com/is-edge-worker: 'false'
? ? ? ? beta.kubernetes.io/arch: amd64
? ? ? ? beta.kubernetes.io/os: linux
? ? ? tolerations:
? ? ? ? - effect: NoSchedule
? ? ? ? ? key: node-role.alibabacloud.com/addon
? ? ? ? ? operator: Exists
? ? ? ...
還可以去除污點(diǎn)然后在加上污點(diǎn),這樣期間部署的pod也不會(huì)被驅(qū)逐
批量添加污點(diǎn)
- 登錄容器服務(wù)管理控制臺(tái),在左側(cè)導(dǎo)航欄中選擇集群。
- 在集群列表頁(yè)面中,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄中,選擇節(jié)點(diǎn)管理?>?節(jié)點(diǎn)。
- 在節(jié)點(diǎn)頁(yè)面右上角單擊標(biāo)簽與污點(diǎn)管理。
- 單擊污點(diǎn)頁(yè)簽,批量選擇節(jié)點(diǎn),單擊添加污點(diǎn)。
- 在彈出的對(duì)話框中設(shè)置名稱、值和Effect。
Effect參數(shù)的說(shuō)明如下,更多信息,請(qǐng)參見(jiàn)污點(diǎn)和容忍度。
參數(shù)名稱 參數(shù)說(shuō)明
NoSchedule 如果污點(diǎn)中存在至少一個(gè)Effect值為NoSchedule的污點(diǎn), 則系統(tǒng)不會(huì)將Pod分配到該節(jié)點(diǎn)。
NoExecute 任何不能忍受這個(gè)污點(diǎn)的Pod都會(huì)被驅(qū)逐,任何可以忍受這個(gè)污點(diǎn)的Pod都不會(huì)被驅(qū)逐。
PreferNoSchedule 系統(tǒng)會(huì)盡量避免將Pod調(diào)度到存在其不能容忍污點(diǎn)的節(jié)點(diǎn)上, 但這不是強(qiáng)制的。
node-role.alibabacloud.com/addon: effect: NoSchedule
?
例如追加這段話就是說(shuō)只運(yùn)行在管控節(jié)點(diǎn),不需要另外指定ip了
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
nodeSelector:
alibabacloud.com/is-edge-worker: 'false'
beta.kubernetes.io/arch: amd64
beta.kubernetes.io/os: linux
tolerations:
- effect: NoSchedule
key: node-role.alibabacloud.com/addon
operator: Exists
?在第一個(gè)spec后面加入一個(gè)serviceName可直接指定service
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis-cm
namespace: database
spec:
serviceName: redisdemo2
replicas: 1
selector:
matchLabels:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
configMap:
name: myconfigmap
? ? configMap:
? ? ? ? name: myconfigmap? ? 名稱一定要比上面那個(gè)少兩格否則只能掛成臨時(shí)目錄
掛載格式
volumeMounts:
# 從configmap獲取的配置文件,掛載到指定文件中
- name: conf
mountPath: /conf/redis.conf
subPath: redis.conf
- name: data
mountPath: /data/redis
- name: logs
mountPath: /logs
# 時(shí)區(qū)設(shè)置
- name: timezone
mountPath: /etc/localtime
volumes:
- name: conf
# 配置文件采用configMap
configMap:
name: redis
defaultMode: 0755
# 日志采用hostPath卷
- name: logs
hostPath:
type: DirectoryOrCreate
path: /logs
# 時(shí)區(qū)定義
- name: timezone
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
- name: data
hostPath:
type: DirectoryOrCreate
path: /home
掛載nasPVC?
volumeMounts:
- name: pvc-nas
mountPath: /data
volumes:
- name: pvc-nas
persistentVolumeClaim:
claimName: static-nas-pvc
?掛載云盤非vpc
volumeMounts:
- mountPath: /cache-test
name: cache-volume
volumes:
- name: cache-volume
csi:
driver: diskplugin.csi.alibabacloud.com
fsType: ext4
volumeAttributes:
volumeSize: "20"
tags: "test:eci"
參考配置1
[root@k8s-master1 ~]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: mysql #為該Deployment設(shè)置key為app,value為mysql的標(biāo)簽
name: mysql
namespace: test
spec:
replicas: 1 #副本數(shù)量
selector: #標(biāo)簽選擇器,與上面的標(biāo)簽共同作用
matchLabels: #選擇包含標(biāo)簽app:nginx的資源
app: mysql
template: #這是選擇或創(chuàng)建的Pod的模板
metadata: #Pod的元數(shù)據(jù)
labels: #Pod的標(biāo)簽,上面的selector即選擇包含標(biāo)簽app:nginx的Pod
app: mysql
spec: #期望Pod實(shí)現(xiàn)的功能(即在pod中部署)
containers: #生成container,與docker中的container是同一種
- name: mysql
image: mysql:5.7 #使用鏡像mysql: 創(chuàng)建container,該container默認(rèn)3306端口可訪問(wèn)
ports:
- containerPort: 3306 # 開(kāi)啟本容器的3306端口可訪問(wèn)
env:
- name: MYSQL_ROOT_PASSWORD
value: hjj123456
volumeMounts: #掛載持久存儲(chǔ)卷
- name: mysql-data #掛載設(shè)備的名字,與volumes[*].name 需要對(duì)應(yīng)
mountPath: /var/lib/mysql #掛載到容器的某個(gè)路徑下
- name: mysql-dev-conf
mountPath: /etc/mysql
volumes:
- name: mysql-data #和上面保持一致 這是本地的文件路徑,上面是容器內(nèi)部的路徑
nfs:
server: 10.0.19.129 #nfs的ip地址
path: /opt/data/mysql/data #此路徑需要實(shí)現(xiàn)創(chuàng)建
- name: mysql-dev-conf
nfs:
server: 10.0.19.129
name: /opt/data/mysql/cnf #此路徑需要實(shí)現(xiàn)創(chuàng)建
參考配置2
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config
namespace: plugins
labels:
app: mysql
data:
my.cnf: |-
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake = true
max_connections=2000
secure_file_priv=/var/lib/mysql
lower_case_table_names = 1
log-error=/var/lib/mysql/mysql_error.log
bind-address=0.0.0.0
symbolic-links=0
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
---
apiVersion: v1
kind: Service
metadata:
labels:
app: mysql
name: mysql-svc
namespace: plugins
spec:
type: NodePort
ports:
- name: http
port: 3306
nodePort: 30021
protocol: TCP
targetPort: 3306
selector:
app: mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: plugins
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- args:
- --datadir
- /var/lib/mysql/datadir
env:
- name: MYSQL_ROOT_PASSWORD
value: root
- name: MYSQL_USER
value: user
- name: MYSQL_PASSWORD
value: user
image: mysql:5.7
name: mysql-container
ports:
- containerPort: 3306
name: dbapi
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql-storage
- name: config
mountPath: /etc/mysql/conf.d/my.cnf
subPath: my.cnf
volumes:
- name: mysql-storage
persistentVolumeClaim:
claimName: nfs-plugins
- name: config
configMap:
name: mysql-config
- name: localtime
hostPath:
type: File
path: /etc/localtime
自己配置 ,???nodeName: gem-yxyw-t-c02,分配主機(jī)的時(shí)候需要查看主機(jī)名
需要說(shuō)明的是strategy部分,用于定義deployment的升級(jí)策略。
spec.strategy:用于定義升級(jí)的策略
spec.strategy.type:定義使用何種方式升級(jí)。一種是RollingUpdate,即滾動(dòng)升級(jí)。另一種方式為Recreate。即先將所有舊的Pod停止,然后再啟動(dòng)新的pod。默認(rèn)策略即為RollingUpdate
#這個(gè)升級(jí)策略很重要,之前沒(méi)有指定用的是默認(rèn)的滾動(dòng)升級(jí)RollingUpdate,會(huì)導(dǎo)致更新的pod無(wú)法啟動(dòng),因?yàn)檫@種模式之前的容器沒(méi)有停止還占用了掛載的宿主機(jī)目錄,改成將Recreate模式會(huì)將之前的容器停止,在新啟動(dòng)一個(gè)宿主機(jī)掛載目錄就沒(méi)有被占用會(huì)直接成功,這也導(dǎo)致重啟的時(shí)候會(huì)有一段停止時(shí)間
但是如果定義為無(wú)狀態(tài)就不需要指定升級(jí)策略
kind: StatefulSet? ? ?#有狀態(tài)
kind: Deployment? ?#無(wú)狀態(tài)
實(shí)際配置1?
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mysqldb01-config
labels:
app: gem-sale-t-db01
data:
my.cnf: |-
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake = true
max_connections=2000
secure_file_priv=/var/lib/mysql
lower_case_table_names = 1
bind-address=0.0.0.0
symbolic-links=0
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
---
apiVersion: v1
kind: Service
metadata:
labels:
app: gem-sale-t-db01
name: gem-sale-t-db01
spec:
type: NodePort
ports:
- name: http
port: 3306
nodePort: 30001
protocol: TCP
targetPort: 3306
selector:
app: gem-sale-t-db01
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: gem-sale-t-db01
name: gem-sale-t-db01
spec:
serviceName: gem-sale-t-db01
replicas: 1
selector:
matchLabels:
app: gem-sale-t-db01
strategy: #更新策略
type: Recreate # 策略類型 .spec.strategy.type 可以是 “Recreate” 或 “RollingUpdate”?!癛ollingUpdate” 是默認(rèn)值。
Recreate: #.spec.strategy 策略指定用于用新 Pod 替換舊 Pod 的策略。 .spec.strategy.type 可以是 “Recreate” 或 “RollingUpdate”。“RollingUpdate” 是默認(rèn)值。
maxSurge: 25% #最大峰值
maxUnavailable: 25% #最大不可用
template:
metadata:
labels:
app: gem-sale-t-db01
spec:
containers:
- name: gem-sale-t-db01
image: mysql:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: 3!y5cD&%2OWz
livenessProbe:
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
exec:
command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
readinessProbe:
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
exec:
command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
volumes:
- name: config
configMap:
name: mysqldb01-config
nodeName: gem-yxyw-t-c02
?實(shí)際配置2? ?mysql需要持久化推薦使用這個(gè)配置,這個(gè)不要加升級(jí)測(cè)略
---
apiVersion: v1
kind: ConfigMap
metadata:
name: gem-nacos-t-db
labels:
app: gem-nacos-t-db
data:
my.cnf: |-
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake = true
max_connections=2000
secure_file_priv=/var/lib/mysql
log-error=/var/lib/mysql/mysql_error.log
lower_case_table_names = 1
bind-address=0.0.0.0
symbolic-links=0
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
---
apiVersion: v1
kind: Service
metadata:
labels:
app: gem-nacos-t-db
name: gem-nacos-t-db
spec:
type: NodePort
ports:
- name: http
port: 3306
nodePort: 30005
protocol: TCP
targetPort: 3306
selector:
app: gem-nacos-t-db
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app: gem-nacos-t-db
name: gem-nacos-t-db
spec:
serviceName: gem-nacos-t-db
replicas: 1
selector:
matchLabels:
app: gem-nacos-t-db
template:
metadata:
labels:
app: gem-nacos-t-db
spec:
containers:
- name: gem-nacos-t-db
image: mysql:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: Gd*(53#SALE
livenessProbe:
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
exec:
command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
readinessProbe:
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
exec:
command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
- name: timezone
mountPath: /etc/localtime
- name: config
mountPath: /etc/mysql/conf.d/my.cnf
subPath: my.cnf
volumes:
- name: config
configMap:
name: gem-nacos-t-db
- name: timezone
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
- name: mysql-data
hostPath:
type: DirectoryOrCreate
path: /data/mysql/gem-nacos-t-db/mysql-data
nodeName: gem-yxyw-t-c02
實(shí)際配置3,local掛載,在k8s上創(chuàng)建pv和pvc
apiVersion: v1
kind: PersistentVolume
metadata:
name: gem-yx-d-db1
namespace: yx-dev
spec:
capacity:
storage: 50Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: gem-yx-d-db1
local:
path: /data/mysql/gem-yx-d-db1/data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- gem-yxyw-t-c02
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gem-yx-d-db1
namespace: yx-dev
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 50Gi
storageClassName: gem-yx-d-db1
---
apiVersion: v1
kind: ConfigMap
metadata:
name: gem-yx-d-db1
labels:
app: gem-yx-d-db1
data:
my.cnf: |-
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake = true
max_connections=2000
secure_file_priv=/var/lib/mysql
log-error=/var/lib/mysql/mysql_error.log
lower_case_table_names = 1
bind-address=0.0.0.0
symbolic-links=0
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
---
apiVersion: v1
kind: Service
metadata:
labels:
app: gem-yx-d-db1
name: gem-yx-d-db1
spec:
type: NodePort
ports:
- name: http
port: 3306
nodePort: 30003
protocol: TCP
targetPort: 3306
selector:
app: gem-yx-d-db1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app: gem-yx-d-db1
name: gem-yx-d-db1
spec:
serviceName: gem-yx-d-db1
replicas: 1
selector:
matchLabels:
app: gem-yx-d-db1
template:
metadata:
labels:
app: gem-yx-d-db1
spec:
containers:
- name: gem-yx-d-db1
image: mysql:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: Gd*(53#SALE
livenessProbe:
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
exec:
command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
readinessProbe:
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
exec:
command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
- name: timezone
mountPath: /etc/localtime
- name: config
mountPath: /etc/mysql/conf.d/my.cnf
subPath: my.cnf
volumes:
- name: config
configMap:
name: gem-yx-d-db1
- name: timezone
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
- name: mysql-data
persistentVolumeClaim:
claimName: gem-yx-d-db1
?mysql8.0部署,親測(cè)試驗(yàn)證可用,跟mysql5.7配置不同
---
apiVersion: v1
kind: ConfigMap
metadata:
name: gem-yx-t-db2
labels:
app: gem-yx-t-db2
data:
# my.cnf代表著mysql8的配置文件名稱
my.cnf: |
[mysql]
# mysql客戶端默認(rèn)字符集
default-character-set=utf8
[mysqld]
# 數(shù)據(jù)庫(kù)文件位置
datadir=/var/lib/mysql
# 允許最大連接數(shù)
max_connections=1000
# innodb的dml操作的行級(jí)鎖的等待時(shí)間
innodb_lock_wait_timeout=500
# 設(shè)置mysql服務(wù)端默認(rèn)字符集
character-set-server=utf8mb4
# 默認(rèn)創(chuàng)建新數(shù)據(jù)的新建排序規(guī)則
collation-server=utf8mb4_general_ci
# 創(chuàng)建新表時(shí)將使用的默認(rèn)存儲(chǔ)引擎
default-storage-engine=INNODB
# 緩存大小
sort_buffer_size=256MB
# 大小寫(xiě)敏感配置項(xiàng)0為敏感,1為不敏感
lower_case_table_names = 1 #不區(qū)分大小寫(xiě)
lower_case_table_names=1
# 選擇正8區(qū)
default-time-zone='+8:00'
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
---
apiVersion: v1
kind: Service
metadata:
labels:
app: gem-yx-t-db2
name: gem-yx-t-db2
spec:
type: NodePort
ports:
- name: http
port: 3306
nodePort: 30002
protocol: TCP
targetPort: 3306
selector:
app: gem-yx-t-db2
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app: gem-yx-t-db2
name: gem-yx-t-db2
spec:
serviceName: gem-yx-t-db2
replicas: 1
selector:
matchLabels:
app: gem-yx-t-db2
template:
metadata:
labels:
app: gem-yx-t-db2
spec:
containers:
- name: gem-yx-t-db2
image: mysql:8.0.19
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: 3!y5cD&%2OWz
livenessProbe:
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
exec:
command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
readinessProbe:
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
exec:
command: ["mysqladmin", "-uroot", "-p${MYSQL_ROOT_PASSWORD}", "ping"]
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
- name: timezone
mountPath: /etc/localtime
- name: config
mountPath: /etc/mysql/conf.d/my.cnf
subPath: my.cnf
volumes:
- name: config
configMap:
name: gem-yx-t-db2
- name: timezone
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
- name: mysql-data
hostPath:
type: DirectoryOrCreate
path: /data/mysql/gem-yx-t-db2/mysql-data
nodeName: gem-yxyw-t-c02
?mkdir -p /data/mysql/GEM-SALE-T-DB01/mysql-data
mkdir -p /data/mysql/GEM-SALE-T-DB02/mysql-data
參數(shù)簡(jiǎn)介:
show variables like '%max_connections%';? ? #查數(shù)據(jù)庫(kù)最大連接數(shù)確定配置是否生效
-
ports: 配置鏡像映射端口。
-
env: 鏡像環(huán)境變量配置,其中 MYSQL_ROOT_PASSWORD 是 Mysql 鏡像用于配置 root 用戶默認(rèn)密碼變量。
-
resources: 配置 CPU、Memory 資源限制,可以通過(guò)配置該值來(lái)配置 Pod 的 QoS 級(jí)別。
-
livenessProbe: 配置存活探針,定時(shí)檢測(cè) Mysql 應(yīng)用運(yùn)行狀態(tài),如果檢測(cè)到 Mysql 掛掉將進(jìn)行重啟操作。
-
readinessProbe: 配置就緒探針,定時(shí)檢測(cè) Mysql 應(yīng)用啟動(dòng)狀態(tài),如果啟動(dòng)成功將允許流量涌入,啟動(dòng)失敗將進(jìn)行重啟操作。
-
command: 探針執(zhí)行探測(cè)時(shí)執(zhí)行的探測(cè)命令。
-
volumeMounts: 存儲(chǔ)卷掛載配置,用于鏡像內(nèi)存儲(chǔ)的掛載配置,與 volumes 中對(duì)于的 name 進(jìn)行綁定。
-
volumes: 存儲(chǔ)卷配置,可配置使用 pvc、hostPath、emptyDir、nfs 等存儲(chǔ),需要配置 name 值與 VolumeMounts 進(jìn)行綁定。
-
在鏡像內(nèi)部命令行中輸入 mysql 登錄命令,測(cè)試是否能夠正常登錄:
$ mysql -h 10.36.21.220 -P 30336 --user=root --password=123456 mysql -h 10.36.21.220 -P 30336 -uroot -p'123456'
導(dǎo)出導(dǎo)入數(shù)據(jù)庫(kù)
導(dǎo)出數(shù)據(jù)庫(kù)所有庫(kù)
mysqldump -h 127.0.0.1 -uroot -p"Gd*(53#SALE" -R -E --all-databases >back.sql
導(dǎo)入數(shù)據(jù)庫(kù)所有庫(kù)
mysql -h 10.36.21.220 -P 30004 -uroot -p'3!y5cD&%2OWz' <back.sql
k8s的mysql的pod誤刪之后數(shù)據(jù)恢復(fù),
gem-sale-t-db04被刪除之后,掛載的數(shù)據(jù)卷還在/data/mysql/GEM-SALE-T-DB04/mysql-data,我們從新創(chuàng)建一個(gè)pod把數(shù)據(jù)拷貝到新的掛載卷,數(shù)據(jù)庫(kù)就自動(dòng)恢復(fù)了
cd?/data/mysql/GEM-SALE-T-DB06/mysql-data
?\cp -rf /data/mysql/GEM-SALE-T-DB04/mysql-data/* ./
數(shù)據(jù)恢復(fù)
docker容器數(shù)據(jù)恢復(fù)
恢復(fù)步驟
1. 查找數(shù)據(jù)卷位置
數(shù)據(jù)卷目錄在 /var/lib/docker/volumes 下,每個(gè)容器都會(huì)在該目錄下有一個(gè)文件夾,如果容器還存在的話,我們可以使用 docker inspect 容器ID 去查看 數(shù)據(jù)卷位置,這下容器被刪除了,可怎么辦,只能挨個(gè)去找了,一般 MySQL 容器數(shù)據(jù)卷目錄下會(huì)有一個(gè) _data 目錄,該目錄下會(huì)顯示你每個(gè)數(shù)據(jù)庫(kù)的文件夾,最終找到了
2. 創(chuàng)建新數(shù)據(jù)卷
使用 docker volume create 數(shù)據(jù)卷名字 命令新建一個(gè)數(shù)據(jù)卷,docker volume ls 查看數(shù)據(jù)卷列表
docker volume create mysqldata
docker volume ls
注意:使用數(shù)據(jù)卷進(jìn)行掛載的時(shí)候,數(shù)據(jù)卷必須是一個(gè)空的目錄,也就是說(shuō)不能有任何數(shù)據(jù)。
創(chuàng)建容器
執(zhí)行創(chuàng)建指令:
docker run -d -p 3306:3306 --name mysql -v mysqldata:/var/lib/mysql -e MYSQL\_ROOT\_PASSWORD=123456 -d mysql:5.7
恢復(fù)數(shù)據(jù)之前需要把剛剛建立的數(shù)據(jù)卷里面關(guān)聯(lián)的內(nèi)容刪除掉,然后把之前的數(shù)據(jù)卷內(nèi)容復(fù)制到現(xiàn)在的數(shù)據(jù)卷進(jìn)行數(shù)據(jù)恢復(fù)。
cd /var/lib/docker/volumes/mysqldata/_data/
rm -f *
rm -f -R *
復(fù)制內(nèi)容到數(shù)據(jù)卷
cd /var/lib/docker/volumes/容器id/_data/
cp -R * /var/lib/docker/volumes/mysqldata/_data/
至此數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)完成,需要重啟下mysql容器,進(jìn)入恢復(fù)的容器查看
docker stop mysql
docker start mysql
因使用Deployment創(chuàng)建的pod無(wú)法掛載數(shù)據(jù)庫(kù)配置文件,所以采用使用鏡像創(chuàng)建先創(chuàng)建一個(gè)配置文件后續(xù)好掛載,原理是先用YAML方式創(chuàng)建,然后編輯這個(gè)pod,新建一個(gè)鏡像參照這個(gè)手動(dòng)創(chuàng)建一個(gè)pod,指定節(jié)點(diǎn)后面可以yaml里面加入節(jié)點(diǎn)參數(shù),
最后找到原因了,掛載配置哪里不能自己命名只能使用默認(rèn)的名稱
?創(chuàng)建mysql配置文件
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-t1-config
labels:
app: gem-yx-t-db1
data:
my.cnf: |-
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake = true
max_connections=2000
secure_file_priv=/var/lib/mysql
lower_case_table_names = 1
bind-address=0.0.0.0
symbolic-links=0
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
?
?創(chuàng)建pod鏡像gem-yx-t-db1
mysql:5.7?
3306 tcp? ??
MYSQL_ROOT_PASSWORD? ? ?Gd*(53#SALE?
["mysqladmin","-uroot","-p${MYSQL_ROOT_PASSWORD}","ping"]
["mysqladmin","-uroot","-p${MYSQL_ROOT_PASSWORD}","ping"]
mysql-data ? ? /data/mysql/gem-yx-t-db1/mysql-data ? ? /var/lib/mysql
time ? ? ? ? ?/etc/localtime ? /etc/localtime
默認(rèn)配置名? ? mysql-t1-config ?/etc/mysql/conf.d? ? #自己取名無(wú)法啟動(dòng)
service創(chuàng)建
? ? ? nodeName: gem-yxyw-t-c02? ? #綁定節(jié)點(diǎn)
select now();? ? ?#查看數(shù)據(jù)庫(kù)時(shí)間是否正確
show variables like '%max_connections%';? ? #查數(shù)據(jù)庫(kù)最大連接數(shù)確定配置是否生效
在k8s集群中,service和pod都可以通過(guò)域名的形式進(jìn)行相互通信,換句話說(shuō),在k8s集群內(nèi),通過(guò)service和pod的域名,可以直接訪問(wèn)內(nèi)部應(yīng)用,不必在通過(guò)service ip地址進(jìn)行通信,一般的,我們創(chuàng)建service的時(shí)候不建議指定service的clusterIP,而是讓k8s自動(dòng)為service分配一個(gè)clusterIP,這樣,service的IP是自動(dòng)分配,但是service名字總是固定的吧,這樣在集群內(nèi)部就可以直接通過(guò)service的域名來(lái)連接即可,如前端pod應(yīng)用直接通過(guò)service域名來(lái)連接后端pod。
service的域名
<servicename>.<namespace>.svc.<clusterdomain>
?其中,servicename為service名稱,namespace為service所處的命名空間,clusterdomain是k8s集群設(shè)計(jì)的域名后綴,默認(rèn)為cluster.local
mysql -h gem-yx-t-db1.yx-test.svc.cluster.local -uroot -p'Gd*(53#SALE'
mysql -h gem-yx-t-db2.yx-test.svc.cluster.local -uroot -p'3!y5cD&%2OWz'
mysql -h gem-yx-d-db1.yx-dev.svc.cluster.local -uroot -p'Gd*(53#SALE'
mysql -h gem-zs-t-db1.yx-test.svc.cluster.local -uroot -p'zs@JINDI'
mysql -h gem-nacos-t-db.nacos.svc.cluster.local -uroot -p'Gd*(53#SALE'
MySQL數(shù)據(jù)庫(kù)之日志管理
[mysqld]
log-error=/home/mysql/mysql_error.log? ?#指定錯(cuò)誤日志的保存位置
general_log=ON ?通用查詢?nèi)罩荆脕?lái)記錄MySQL的所有連接和語(yǔ)句,默認(rèn)是關(guān)閉的。
general_log_file=/home/mysql/mysql_general.log
log-bin=mysql-bin ? ? ?#也可以log_bin=mysql-bin? ?#二進(jìn)制日志
#使用相對(duì)路徑,則文件存儲(chǔ)在默認(rèn)目錄/usr/local/mysql/data/中文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-426563.html
slow_query_log=ON
?slow_query_log_file=/home/mysql/mysql_slow_query.log?
?long_query_time=5 ???#慢查詢時(shí)間,設(shè)置超過(guò)5秒執(zhí)行的語(yǔ)句被記錄,缺省時(shí)為10秒文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-426563.html
[mysqld]
##錯(cuò)誤日志,用來(lái)記錄當(dāng)MySQL啟動(dòng)、停止或運(yùn)行時(shí)發(fā)生的錯(cuò)誤信息,默認(rèn)已開(kāi)啟
log-error=/home/mysql/mysql_error.log
?
?
##通用查詢?nèi)罩?,用?lái)記錄MySQL的所有連接和語(yǔ)句,默認(rèn)是關(guān)閉的
general_log=ON
general_log_file=/home/mysql/mysql_general.log
?
?
##二進(jìn)制日志(binlog),用來(lái)記錄所有更新了數(shù)據(jù)或者已經(jīng)潛在更新了數(shù)據(jù)的語(yǔ)句,記錄了數(shù)據(jù)的更改,可用于數(shù)據(jù)恢復(fù),默認(rèn)已開(kāi)啟
log-bin=mysql-bin #也可以log_bin=mysql-bin
#使用相對(duì)路徑,則文件存儲(chǔ)在默認(rèn)目錄/home/mysql/中
?
?
##慢查詢?nèi)罩?,用?lái)記錄所有執(zhí)行時(shí)間超過(guò)long_query_time秒的語(yǔ)句,可以找到哪些查詢語(yǔ)句執(zhí)行時(shí)間長(zhǎng),以便于優(yōu)化,默認(rèn)是關(guān)閉的
slow_query_log=ON
slow_query_log_file=/home/mysql/mysql_slow_query.log
long_query_time=5 #慢查詢時(shí)間,設(shè)置超過(guò)5秒執(zhí)行的語(yǔ)句被記錄,缺省時(shí)為10秒
mysql -u root -p[密碼]
?
#查看錯(cuò)誤日志存放位置
show variables like 'log_error';
#查看通用查詢?nèi)罩臼欠耖_(kāi)啟
show variables like 'general%';
#查看二進(jìn)制日志是否開(kāi)啟
show variables like 'log_bin%';
?
#查看慢查詢?nèi)展δ苁欠耖_(kāi)啟
show variables like '%slow%';
?
#查看慢查詢時(shí)間設(shè)置
show variables like 'long_query_time';
?
?
#在數(shù)據(jù)庫(kù)中設(shè)置開(kāi)啟慢查詢的方法,即以修改變量值的方式開(kāi)啟。但重啟服務(wù)后會(huì)失效。
set global slow_query_log=ON;
到了這里,關(guān)于k8s創(chuàng)建數(shù)據(jù)庫(kù)mysql MySQL數(shù)據(jù)庫(kù)之日志管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!