1. 程式人生 > >Kubernetes-部署高可用的MySQL

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