Kubernetes-部署高可用的MySQL
1、MySQL簡介
MySQL 是一個開源的關係型資料庫管理系統,使用標準的sql語言,由瑞典 MySQL AB 公司開發,當前屬於 Oracle 公司。能夠 支援大型的資料庫,可以處理上千萬條的資料記錄。可以運行於在Windows、Linux等多種系統上;支援C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等程式語言。對於32位系統,MySQL的表文件最大可支援4GB,對於64位系統,MySQL支援最大的表文件為8TB。
2、MySQL的高可用方案
本文的MySQL高可用方案為主從複製+讀寫分離,即由單一的master和多個slave所構成。其中,客戶端通過master對資料庫進行寫操作,通過slave端進行讀操作。master出現問題後,可以將應用切換到slave端。 此方案是MySQL官方提供的一種高可用解決方案,節點間的資料同步採用MySQL Replication技術。
MySQL Replication從一個MySQL資料庫伺服器(master)的資料複製到一個或多個MySQL資料庫伺服器(slave)。在預設情況下,複製是非同步的;slave不需要一直接收來自主機的更新。根據配置,可以複製資料庫中的所有資料庫、選定的資料庫,或者特定的表。
MySQL中複製的優點包括:
- 擴容解決方案:在多個slave之間擴充套件負載以提高效能。在這種模式下,所有的寫入和更新操作都必須在主伺服器上進行。然而,讀取操作通過slave映象。該模型可以提高寫入操作的效能,同時,也能夠通過增加slave的節點數量,從而顯著地提升讀取速度。
- 資料安全:資料從master被複制到slave,並且slave可以暫停複製過程。因此,可以在不損壞master的情況下,在slave上執行備份服務。
- 分析:現場資料可以在master上建立,而對資訊的分析可以在slave進行,而不影響master的效能。
- 遠端資料分發:可以使用複製為遠端站點建立本地資料的副本,而不必一直通過訪問master。
此高可用的解決方案適用於對資料實時性要求不是特別嚴格的場景,在使用時可以通過廉價的硬體來擴充套件slave的節點數量,將讀壓力分散到多臺slave的機器上面。此方案能夠在很大的程度上解決資料庫讀取資料的壓力瓶頸問題,這是因為在大多的應用系統中,讀壓力要比寫壓力大很多多。
3、安裝部署
3.1 環境要求
- 已有Kubernetes 1.6+環境;
- 在Kubernetes中提供多個(具體數量根據有狀態副本集的個數而定)容量大於10g的持久化儲存卷。
3.2 部署MySql
此示例由一個ConfigMap、兩個Service和一個StatefulSet所組成。
3.2.1 建立ConfigMap
通過YAML檔案建立名為mysql的ConfigMap:
$ kubectl create -f{path}/mysql-configmap.yaml --namespace=kube-public
apiVersion:v1kind:ConfigMapmetadata:name:mysqllabels:app:mysqldata:master.cnf:|# Apply this config only on the master.[mysqld]log-bin log_bin_trust_function_creators=1 lower_case_table_names=1slave.cnf:|# Apply this config only on slaves.[mysqld]super-read-only log_bin_trust_function_creators=1
3.2.2 建立Services
通過yaml檔案建立mysql和mysql-read這兩個Service:
$ kubectl create -f{path}/mysql-services.yaml --namespace=kube-public
# Headless service for stable DNS entries of StatefulSet members.apiVersion:v1kind:Servicemetadata: name:mysql labels: app:mysqlspec: ports:-name:mysql port:3306 clusterIP:None selector: app:mysql---# Client service for connecting to any MySQL instance for reads.# For writes, you must instead connect to the master: mysql-0.mysql.apiVersion:v1kind:Servicemetadata: name:mysql-read labels: app:mysqlspec: ports:-name:mysql port:3306 selector: app:mysql
StatefulSet控制器為Pod建立了一個DNS條目,而Headless服務為DNS條目提供一個主機。因為Headless服務的名稱為mysql,其他Pod通過<pod-name>.mysql訪問此Pod。客戶端訪問被稱為mysql-read,客戶端服務通過訪問mysql-read讀取資料。通過連線myql執行寫入資料的操作。
3.2.3 建立StatefulSet
通過yaml檔案建立名為mysql的StatefulSet:
$ kubectl create -f{path}/mysql-statefulset.yaml --namespace=kube-public
apiVersion: apps/v1 kind:StatefulSet metadata: name: mysql spec: selector: matchLabels: app: mysql serviceName: mysql replicas:3template: metadata: labels: app: mysql spec: initContainers:- name: init-mysql image: mysql:5.7 command:- bash -"-c"-|set-ex # Generate mysql server-id from pod ordinal index.[[`hostname`=~-([0-9]+)$ ]]||exit1 ordinal=${BASH_REMATCH[1]} echo [mysqld]>/mnt/conf.d/server-id.cnf # Add an offset to avoid reserved server-id=0 value. echo server-id=$((100+ $ordinal))>>/mnt/conf.d/server-id.cnf # Copy appropriate conf.d files from config-map to emptyDir.if[[ $ordinal -eq 0]];then cp /mnt/config-map/master.cnf /mnt/conf.d/else cp /mnt/config-map/slave.cnf /mnt/conf.d/fi volumeMounts:- name: conf mountPath:/mnt/conf.d - name: config-map mountPath:/mnt/config-map - name: clone-mysql image: gcr.io/google-samples/xtrabackup:1.0 command:- bash -"-c"-|set-ex # Skip the clone if data already exists.[[-d /var/lib/mysql/mysql ]]&&exit0# Skip the clone on master (ordinal index 0).[[`hostname`=~-([0-9]+)$ ]]||exit1 ordinal=${BASH_REMATCH[1]}[[ $ordinal -eq 0]]&&exit0# Clone data from previous peer. ncat --recv-only mysql-$(($ordinal-1)).mysql 3307| xbstream -x -C /var/lib/mysql # Prepare the backup. xtrabackup --prepare --target-dir=/var/lib/mysql volumeMounts:- name: data mountPath:/var/lib/mysql subPath: mysql - name: conf mountPath:/etc/mysql/conf.d containers:- name: mysql image: mysql:5.7 env:- name: MYSQL_ALLOW_EMPTY_PASSWORD value:"1" ports:- name: mysql containerPort:3306 volumeMounts:- name: data mountPath:/var/lib/mysql subPath: mysql - name: conf mountPath:/etc/mysql/conf.d resources: requests: cpu:500m memory:1Gi livenessProbe:exec: command:["mysqladmin","ping"] initialDelaySeconds:30 periodSeconds:10 timeoutSeconds:5 readinessProbe:exec:# Check we can execute queries over TCP (skip-networking is off). command:["mysql","-h","127.0.0.1","-e","SELECT 1"] initialDelaySeconds:5 periodSeconds:2 timeoutSeconds:1- name: xtrabackup image: gcr.io/google-samples/xtrabackup:1.0 ports:- name: xtrabackup containerPort:3307 command:- bash -"-c"-|set-ex cd /var/lib/mysql # Determine binlog position of cloned data, if any.if[[-f xtrabackup_slave_info ]];then# XtraBackup already generated a partial "CHANGE MASTER TO" query# because we're cloning from an existing slave. mv xtrabackup_slave_info change_master_to.sql.in# Ignore xtrabackup_binlog_info in this case (it's useless). rm -f xtrabackup_binlog_info elif[[-f xtrabackup_binlog_info ]];then# We're cloning directly from master. Parse binlog position.[[`cat xtrabackup_binlog_info`=~^(.*?)[[:space:]]+(.*?)$ ]]||exit1 rm xtrabackup_binlog_info echo "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',\ MASTER_LOG_POS=${BASH_REMATCH[2]}"> change_master_to.sql.infi# Check if we need to complete a clone by starting replication.if[[-f change_master_to.sql.in]];then echo "Waiting for mysqld to be ready (accepting connections)"until mysql -h 127.0.0.1-e "SELECT 1";do sleep 1;done echo "Initializing replication from clone position"# In case of container restart, attempt this at-most-once. mv change_master_to.sql.in change_master_to.sql.orig mysql -h 127.0.0.1<<EOF $(<change_master_to.sql.orig), MASTER_HOST='mysql-0.mysql', MASTER_USER='root', MASTER_PASSWORD='', MASTER_CONNECT_RETRY=10; START SLAVE; EOF fi# Start a server to send backups when requested by peers.exec ncat --listen --keep-open --send-only --max-conns=13307-c \ "xtrabackup --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=root" volumeMounts:- name: data mountPath:/var/lib/mysql subPath: mysql - name: conf mountPath:/etc/mysql/conf.d resources相關推薦
Kubernetes-部署高可用的MySQL
1、MySQL簡介MySQL 是一個開源的關係型資料庫管理系統,使用標準的sql語言,由瑞典 MySQL AB 公司開發,當前屬於 Oracle 公司。能夠 支援大型的資料庫,可以處理上千萬條的資料記錄。可以運行於在Windows、Linux等多種系統上;支援C、C++、Py
使用kuberspay部署高可用kubernetes叢集
0 環境 環境: 主機名 IP k8s-node01 172.16.120.151 k8s-node02 172.16.120.152 k8s-node03 172.16.120.153
在Kubernetes叢集上部署高可用Harbor映象倉庫
一、實驗環境 harbor的工作節點 10.142.71.120 paasm1 10.142.71.121 paasm2 10.142.71.123 paashar 作業系統:CentOS Linux release 7.2.1511 (Core)
使用kubespray部署高可用kubernetes叢集
0 環境環境:主機名IPk8s-node01172.16.120.151k8s-node02172.16.120.152k8s-node03172.16.120.153ansible-client設定主機名:hostnamectl --static set-hostname
基於saltstack自動化部署高可用kubernetes集群
內核模塊 .com state.sls nio nginx 插件 perl oot mono SaltStack自動化部署HA-Kubernetes 本項目在GitHub上,會不定期更新,大家也可以提交ISSUE,地址為:https://github.com/skym
kubernetes叢集部署高可用Postgresql的Stolon方案
目錄 前言 ....前言 本文選用Stolon的方式搭建Postgresql高可用方案,主要為Harbor提供高可用資料庫,Harbor搭建可檢視kubernetes搭建Harbor無坑及Harbor倉庫同步,之後會提供redis高可用及Harbor高可用方案搭建 方案比較 幾種postgresql高可用方案
kubeadm部署高可用叢集Kubernetes 1.14.1版本
Kubernetes高可用叢集部署 部署架構: Master 元件: kube-apiserver Kubernetes API,叢集的統一入口,各元件協調者,以HTTP API提供介面服務,所有物件資源的增刪改查和監聽操作都交給APIServer處理後再提交給Etcd儲存。
HA 高可用mysql集群
註意 保持 service title pri 數據庫 用戶和組 ash lin 註意問題: 1.保持mysql用戶和組的ID號是一致的; 2.filesystem 共享存儲必須要有寫入權限; 3.刪除資源必須先刪除約束,在刪除資源; 1.安裝數據庫,這裏使用maridb數
lvs+keepalived部署高可用集群
lvs+keepalived本環境基於centos7部署,基本架構圖:client ip: 192.168.1.101lvs1 ip: 192.168.1.173lvs2 ip: 192.168.1.110web1: 192.168.1.114web2: 192.168.1.119VIP: 192.168.1
keepalived+nginx-upstream部署高可用反向代理
proxy route 服務器 宕機 127.0.0.1 trac 訪問 代理 _id 實驗拓撲 實驗要求 兩個web server提供httpd服務,ip地址分別是172.18.27.201、202,掩碼是16 兩個nginx proxy提供高可用反向代理,ip地
再探使用kubeadm部署高可用的k8s集群-01引言
data- mode etcd [1] working -s device master 基本 再探使用kubeadm部署高可用的k8s集群-01引言 2018/1/26 提示 僅供測試用途前言:高可用一直是重要的話題,需要持續研究。最近關註到 k8s 官網文檔有更新,其中
redis-部署=高可用
。;‘/centos6.9環境部署mkdir -p /data --創建目錄 下載安裝包:wget http://download.redis.io/releases/redis-3.2.6.tar.gz解壓:tar xf redis-3.2.6.tar.gz 進入解壓目錄進行編譯:cd redis-3.2.
使用heartbeatV3部署高可用集群
自用 部署 高可用 集群 1.確保設置好IP地址,設置好hostname和修改/etc/sysconfig/network內hostname一致。同步時間:#ntpdate ntp.api.bz2.node1和node2先做好互信。node1:#ssh-keygen -t rsa -f ~/.
高性能高可用Mysql讀寫分離架構設計
AR get aid HR com RM term lan SQ https://ke.qq.com/webcourse/index.html#course_id=235439&term_id=100277631&taid=2034508828481455&
Amoeba搭建高可用Mysql集群(實現Mysql主從復制、讀寫分離、負載均衡)
proc 分布式數據庫 啟動 parent 分布 技術分享 事務 admin str Amoeba是什麽? Amoeba(變形蟲)項目,該開源框架於2008年 開始發布一款 Amoeba for Mysql軟件。這個軟件致力於MySQL的分布式數據庫前端代理層,它主要在應用
MySql-MMM搭建高可用mysql集群
fff tab 兩臺 虛擬地址 mon pre emc base mysql-mmm 簡介 MMM(Master-Master replication manager for MySQL)是一套支持雙主故障切換和雙主日常管理的腳本程序。MMM使用Perl語言開發,主要用來
MMM搭建高可用mysql集群
ping ns3 51cto wal fault 註意 get lld 沒有 簡介 MMM(Master-Master replication manager for MySQL)是一套支持雙主故障切換和雙主日常管理的腳本程序。MMM使用Perl語言開發,主要用來監控和管
Haproxy Mysql cluster 高可用Mysql集群
最大 default fault 修改 日誌記錄 true chroot check linux -----client-----------haproxy---------mysql1----------mysql2------192.168.1.250 192.
consul-template + nginx部署高可用負載均衡
mas server web key use 健康 png ice pre 簡介 Consul-template是Consul的一個方擴展工具,通過監聽Consul中的數據可以動態修改一些配置文件,大家比較熱衷於應用在Nginx,HAProxy上動態配置健康
docker中部署高可用負載均衡前後端專案異常
異常:在基於jdk的docker容器中可以使用jar方式啟動jar檔案,但有時候要終止程式該怎麼做? 當我在宿主機上去殺死對應的容器對映程式時,發現雖然外層宿主機刪除了程序,當容器中還是在執行 當檢視docker容器中nohup.out檔案時總是顯示地址被佔用 測試:ps -ef | g