1. 程式人生 > >基於Kubernetes搭建MySQL主從叢集

基於Kubernetes搭建MySQL主從叢集

願你,忠於自己,活得像自己。

清單:
NameVersion
CentOS7
Kubernetes1.9.0
Docker17.09.1-ce
MySQL5.7

前言

令我始料不及的出差活動中,開始接觸Kubernetes並被要求搭建基於此的MySQL主從叢集,由於筆者在Linux、Kubernetes等方面都是小白,故此展開了填坑活動,寫本文目的只是為了讓其他程式猿少踩坑,下面簡單介紹下MySQL主從叢集。
我們用MySQL叢集的分散式部署來實現MySQL主從模式,在MySQL叢集中,Master節點主要負責資料的分發和slave節點的管理。因此Master節點主要負責資料的寫入和分發(包括insert、update、delete)。而slave節點主要負責資料的讀取(包括select)。基本的master和slave的分工作業,如下圖所示。


MySQL叢集架構

MySQL叢集在主從模式下實現一臺服務充當主伺服器,其他一臺或者多臺伺服器充當從伺服器。下面我們開始搭建。

一、安裝MySQL

二、構建Docker映象

  • 構建映象需要以下操作,先簡單說明後面步驟將此部分內容寫入Dockerfile中

master配置

  1. 檔案/etc/my.cnf中[mysqld]下新增配置
log-bin=mysql-bin
server-id=1
  1. 重啟MySQL
    # service mysqld restart
  2. 建立同步賬號
# mysql -u root -p
# create user 'sync'@'%' identified by 'MySQL@lipuan.2018';
  1. 賦予同步賬號遠端許可權
    # grant replication slave on *.* to 'sync'@'%' identified by '[email protected]';

slave配置

  1. 檔案/etc/my.cnf中[mysqld]下新增配置
log-bin=mysql-bin
server-id=2
  1. 重啟MySQL
    # service mysqld restart
  2. 配置主機IP
# mysql -u root -p
# change master to master_host='x.x.x.x',master_user='sync',master_password='MySQL@lipuan
.2018';

注意: server-id為主機標識,不能重複。x.x.x.x'為master伺服器IP

  • 下面我們將以上的配置寫入Dockerfile中

準備master映象

  1. 下載MySQL官方Docker映象檔案,並解壓
# wget https://codeload.github.com/docker-library/mysql/zip/master
# unzip master
# mkdir /home/lipuan/mysqlDockerFile
# cp -Rf mysql-master/5.7/Dockerfile /home/lipuan/mysqlDockerFile
# cp -Rf mysql-master/5.7/docker-entrypoint.sh /home/lipuan/mysqlDockerFile
# rm -rf mysql-master
# chmod +x docker-entrypoint.sh
  1. Dockerfile中新增,位置如下圖所示
RUN sed -i '/\[mysqld\]/a server-id=1\nlog-bin' /etc/mysql/mysql.conf.d/mysqld.cnf
Dockerfile-master
  1. docker-entrypoint.sh中新增,位置如下圖所示
echo "CREATE USER '$MYSQL_REPLICATION_USER'@'%' IDENTIFIED BY '$MYSQL_REPLICATION_PASSWORD' ;" | "${mysql[@]}"
echo "GRANT REPLICATION SLAVE ON *.* TO '$MYSQL_REPLICATION_USER'@'%' IDENTIFIED BY '$MYSQL_REPLICATION_PASSWORD' ;" | "${mysql[@]}"

echo 'FLUSH PRIVILEGES ;' | "${mysql[@]}"
entrypoint-master

準備slave的映象

  1. 下載MySQL官方Docker映象檔案
# wget https://codeload.github.com/docker-library/mysql/zip/master
# unzip master
# mkdir /home/lipuan/mysqlDockerFile
# cd ~
# cp -Rf mysql-master/5.7/Dockerfile /home/lipuan/mysqlDockerFile
# cp -Rf mysql-master/5.7/docker-entrypoint.sh /home/lipuan/mysqlDockerFile
# rm -rf mysql-master
# chmod +x docker-entrypoint.sh
  1. Dockerfile中新增,位置如下圖所示
RUN RAND="$(date +%s | rev | cut -c 1-2)$(echo ${RANDOM})" && sed -i '/\[mysqld\]/a server-id='$RAND'\nlog-bin' /etc/mysql/mysql.conf.d/mysqld.cnf

此處server-id用的是隨機數


Dockerfile-slave

2.3 docker-entrypoint.sh中新增,位置如下圖所示

echo "STOP SLAVE;" | "${mysql[@]}"
echo "CHANGE MASTER TO master_host='$MYSQL_MASTER_SERVICE_HOST', master_user='$MYSQL_REPLICATION_USER', master_password='$MYSQL_REPLICATION_PASSWORD' ;" | "${mysql[@]}"

echo "START SLAVE;" | "${mysql[@]}"

slave配置中,master_host一項用的是$MYSQL_MASTER_SERVICE_HOST,這個環境變數(enviromnent variable)是由k8s生成的。


entrypoint-slave.png
  1. 構建master映象
# cd /home/lipuan/mysqlDockerFile/
# docker build -t paulliu/mysql-master:0.1 .
  1. 構建slave映象
# cd /home/lipuan/mysqlDockerFile/
# docker build -t paulliu/mysql-slave:0.1 .
  1. 上傳映象
# docker login
# docke push paulliu/mysql-master:0.1
# docke push paulliu/mysql-slave:0.1

三、MySQL叢集部署

  • # cd /home/lipuan/DockerBuild此後內容若無指出均在此目錄下執行
  • 此部分操作,所有yaml檔案縮排空格必須嚴格,否則無法構建成功

master

  1. 新建mysql-master-rc.yaml檔案
    # touch mysql-master-rc.yaml
    新增內容
apiVersion: v1
kind: ReplicationController
metadata:
  name: mysql-master
  labels:
    name: mysql-master
spec:
  replicas: 1
  selector:
    name: mysql-master
  template:
    metadata:
      labels:
        name: mysql-master
    spec:
      containers:
      - name: master
        image: paulliu/mysql-master:0.1
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "[email protected]"
        - name: MYSQL_REPLICATION_USER
          value: "sync"
        - name: MYSQL_PASSWORD
          value: "[email protected]"
  1. 新建mysql-master-service.yaml檔案
    # touch mysql-master-service.yaml
    新增內容
apiVersion: v1
kind: Service
metadata:
  name: mysql-master
  labels:
    name: mysql-master
spec:
  ports:
  - port: 3306
    targetPort: 3306
  selector:
    name: mysql-master
  1. 部署MySQL master服務
# kubectl create -f mysql-master-rc.yaml
# kubectl create -f mysql-master-service.yaml
  1. 檢視執行情況
    # kubectl get pods,service,rc

slave

  1. 新建mysql-slave-rc.yaml檔案
    # touch mysql-slave-rc.yaml
    新增內容
apiVersion: v1
kind: ReplicationController
metadata:
  name: mysql-slave
  labels:
    name: mysql-slave
spec:
  replicas: 1
  selector:
    name: mysql-slave
  template:
    metadata:
      labels:
        name: mysql-slave
    spec:
      containers:
      - name: master
        image: paulliu/mysql-slave:0.1
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "[email protected]"
        - name: MYSQL_REPLICATION_USER
          value: "sync"
        - name: MYSQL_PASSWORD
          value: "[email protected]"
  1. 新建mysql-slave-service.yaml檔案
    # touch mysql-slave-service.yaml
    新增內容
apiVersion: v1
kind: Service
metadata:
  name: mysql-slave
  labels:
    name: mysql-slave
spec:
  ports:
  - port: 3306
    targetPort: 3306
  selector:
    name: mysql-slave
  1. 部署MySQL slave服務
# kubectl create -f mysql-slave-rc.yaml
# kubectl create -f mysql-slave-service.yaml
  1. 檢視執行情況
    # kubectl get pods,service,rc

寫在文末

寫到這裡基於Kubernetes的MySQL主從叢集就搭建成功了,如果有哪位朋友對於其中步驟不是很清楚,歡迎互相學習。
本文是筆者首次寫技術部落格,如有錯漏等問題,還望各位大大指出批評!

更新日誌

  1. 2018.01.13 在準備映象部分添加了對於docker-entrypoint.sh檔案授予可執行許可權,若無此步驟可能導致映象無法執行;

相關推薦

基於Kubernetes搭建MySQL主從叢集

願你,忠於自己,活得像自己。清單:NameVersionCentOS7Kubernetes1.9.0Docker17.09.1-ceMySQL5.7前言令我始料不及的出差活動中,開始接觸Kubernetes並被要求搭建基於此的MySQL主從叢集,由於筆者在Linux、Kubernetes等方面都是小白,故此展

基於Docker搭建MySQL主從復制

效果 重啟 conn chang eve iter cli 配置 bin 摘要: 本篇博文相對簡單,因為是初次使用Docker,MySQL的主從復制之前也在Centos環境下搭建過,但是也忘的也差不多了,因此本次嘗試在Docker中搭建。 本篇博文相對簡單,因為是初次使

基於Docker搭建MySQL主從複製

搭建環境Centos 7.2 64位MySQL 5.7.13Docker 1.13.1接下來,我們將會在一臺伺服器上安裝docker,並使用docker執行三個MySQL容器,分別為一主兩從。安裝docker執行命令[root@VM_0_17_centos ~]# yum install docker如果有提

基於docker搭建mysql主從+haproxy負載均衡

    使用容器對於部署來說省了不少事情,容器也有利於自己做各種分散式的架構實驗。這裡說一下使用docker搭建mysql主從以及通過haproxy做從庫的負載均衡。    一、mysql主從主節點    1、建立使用者,授權create user 'repl'@'172.2

Docker搭建MySQL主從叢集

        關於MySQL主從模式,如果我們直接在本機上搭建的話,是沒法搭建的,只能藉助於虛擬機器,但有的時候我們又需要搭建一

使用innobackupex基於從庫搭建mysql主從架構

oot word info conf over found upgrade datadir 參數 使用innobackupex基於從庫搭建mysql主從架構 現有的架構是一主一從,版本為Mysql5.6.37。實施要求是:利用從庫,搭建第二個從庫,版本為5.7.21 1、備

Docker Compose搭建MySQL主從複製叢集

前言 隨著應用業務資料不斷的增大,應用的 響應速度不斷下降,在檢測過程中我們不難發現大多數的請求都是 查詢操作。此時,我們可以將資料庫擴充套件成 主從複製模式,將 讀操作 和 寫操作 分離開來,多臺資料庫 分攤請求,從而 減少單庫 的 訪問壓力,進而應用得到優

基於keepalived搭建MySQL的高可用叢集

MySQL的高可用方案一般有如下幾種: keepalived+雙主,MHA,MMM,Heartbeat+DRBD,PXC,Galera Cluster 比較常用的是keepalived+雙主,MHA和PXC。 對於小公司,一般推薦使用keepalived+雙主,簡單。 下面來部署一下 配置環境:

基於Docker的MYSQL PXC叢集搭建

pxc叢集是Percona XtraDB Cluster的縮寫,是基於percona資料庫和galera中介軟體一種特殊MYSQL資料庫,而且據說percona資料庫的效能要比mysql還要好一些,並且是基於mysql,可以使用mysql的jdbc和客戶端進行連線的。pxc叢

基於Dokcer搭建Redis叢集搭建主從叢集

最近陸陸續續有不少園友加我好友諮詢 redis 叢集搭建的問題,我覺得一定是之前寫的這篇 《基於Docker的Redis叢集搭建》 文章有問題了,所以我花了幾分鐘瀏覽之前的文章總結了下面幾個問題: redis 數量太少,只建立了 3 個例項; 由於只有 3 個例項,所以全部只能是主節點,無法體現叢集主從關係

搭建mysql主從集群的步驟

pass msyql pos 主服務器 繼續 服務器 usr ast col 前提條件是:須要在linux上安裝4個mysql數據庫,都須要配置完對應的信息。 須要搭建: mysql 01: 主數據庫 master mysql 0

在CentOS7中搭建MySQL主從

mysql主從 linux centos mysql 筆記內容:17.1 MySQL主從介紹17.2 準備工作17.3 配置主17.4 配置從17.5 測試主從同步筆記日期:2017-11-0817.1 MySQL主從介紹 Mysql Replication(MySQL主從復制)是MySQL數

基於Mycat的MySQL主從讀寫分離配置詳解與示例

welcome 語句 port nodes false max Language sel 檢查 1.mycat二進制包安裝 tar -zxvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gzcd mycatmv

搭建MySql主從復制與讀寫分離

單向 replicate from 命令 bec 方便 命令行 balance 之前 一、實驗名稱:?mysql主從復制讀寫分離二、實驗目的:??熟悉mysql主從復制的原理?熟悉mysql讀寫分離的原理?學會配置mysql主從復制?學會配置mysql讀寫分離三、實驗環境:

搭建 MySQL主從復制與讀寫分離

ast round running mysql配置 一個表 mysql主從 安全性 配置 tab 搭建 MySQL主從復制與讀寫分離 案例概述 : 在實際環境中 ,如果對數據庫的讀和寫都在同一個數據庫服務中操作 ,無論實在安全性、高可用性, 還是高並發等各個方面都是完全不

基於bind搭建DNS主從

red 語法錯誤 directory 冗余 錯誤 chan transfer ria eve 使用bind的主從復制功能可以實現的功能:提供冗余,避免單點故障;均衡負載查詢需求,從而提高系統可用性。 一、安裝 #bind-chroot 負責DNS安全作用,將bind

社交網站部署——Nginx服務器+PHP服務器搭建+MySQL主從集群

安裝環境 nginx服務器 環境 tar.gz fast vim tex use nginx 案例概述 某公司的社交網站采用PHP語言開發,為了管理PHP程序員開發的代碼,上級領導要求搭建SVN服務器進行版本控制。社交網站的第一個版本部署在LNMP平臺之上,前端為Nginx

Docker搭建mysql主從

文章目錄 Dockerfile製作mysql主從映象 mysql-master映象製作 mysql-slave映象製作 搭建mysql主從 獲取映象 宿主機建立目錄用來掛載 啟動主從mysql容器

基於CM搭建的CDH叢集之hive元件升級過程(hive0.13.1升級到hive-1.2.1且確保納入CM管理)

  1、在hive0.13.1版本下建立lib121目錄 cd /opt/cloudera/parcels/CDH/lib/hive;mkdir lib121 2、下載hive1.2.1版本,並將該版本lib下所有檔案拷貝到lib121中 3、修改/opt/cloudera/par

基於keepalived搭建mysql雙主高可用

目錄 概述 環境準備 keepalived搭建 mysql搭建 mysql雙主搭建 mysql雙主高可用搭建 概述     傳統(不借助中介軟體)的資料庫主從搭建,如果主節點掛掉了,從節點只能讀取無法寫