Kubernetesに基づくMySQLマスタークラスタの構築

10585 ワード

あなたが、自分に忠実で、自分のように生きていることを願っています.
リスト:
Name
Version
CentOS
7
Kubernetes
1.9.0
Docker
17.09.1-ce
MySQL
5.7

前言


予想外の出張活動の中で、Kubernetesに接触し始め、これに基づいたMySQL主従クラスタの構築を要求された.筆者はLinux、Kubernetesなどの面でシロだったため、穴埋め活動を展開した.本稿の目的は、他のプログラム猿が穴を踏まないようにするためである.以下、MySQL主従クラスタを簡単に紹介する.MySQLクラスタの分散配置を使用して、MySQLマスターモードを実現します.MySQLクラスタでは、Masterノードが主にデータの配布とslaveノードの管理を担当しています.したがって、Masterノードは主にデータの書き込みと配布(insert、update、deleteを含む)を担当する.slaveノードは主にデータの読み取り(selectを含む)を担当します.基本的なmasterとslaveの分業作業を下図に示します.
MySQLクラスタアーキテクチャ
MySQLクラスタは、プライマリ・スレーブ・モードで1台のサービスがプライマリ・サーバとして機能し、他の1台または複数のサーバがスレーブ・サーバとして機能します.次は構築を始めます.

一、MySQLのインストール

  • 深く研究した結果、dockerミラーは自分でMySQLをインストールする必要はありません.MySQLをインストールする必要がある場合は、別の記事を参照してください.https://www.jianshu.com/p/a6c5ec995660

  • 二、Dockerミラーの構築

  • ミラーを構築するには、後述の手順でDockerfileに
  • を書き込む必要があります.

    マスター構成

  • ファイル/etc/my.cnfに[mysqld]で構成
  • を追加
    log-bin=mysql-bin
    server-id=1
    
  • MySQL # service mysqld restart
  • を再起動
  • 同期アカウント
  • を作成
    # mysql -u root -p
    # create user 'sync'@'%' identified by 'MySQL@lipuan.2018';
    
  • 同期アカウントにリモート権限を付与# grant replication slave on *.* to 'sync'@'%' identified by '[email protected]';
  • slave構成

  • ファイル/etc/my.cnfに[mysqld]で構成
  • を追加
    log-bin=mysql-bin
    server-id=2
    
  • MySQL # service mysqld restart
  • を再起動
  • ホストIP
  • の構成
    # mysql -u root -p
    # change master to master_host='x.x.x.x',master_user='sync',master_password='MySQL@lipuan.2018';
    

    注意:server-idはホストIDであり、繰り返すことはできません.x.x.x.x'はmasterサーバIP
  • 以下では、上記の構成をDockerfileの
  • に書き込む.

    マスターミラーの準備

  • 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
    
  • Dockerfileに追加、位置は下図のように
  • RUN sed -i '/\[mysqld\]/a server-id=1
    log-bin'
    /etc/mysql/mysql.conf.d/mysqld.cnf

    Dockerfile-master
  • 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のミラーリングの準備

  • 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
    
  • Dockerfileに追加、位置は下図のように
  • RUN RAND="$(date +%s | rev | cut -c 1-2)$(echo ${RANDOM})" && sed -i '/\[mysqld\]/a server-id='$RAND'
    log-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の1つは$MYSQLを使用しています.MASTER_SERVICE_HOST,この環境変数(enviromnent variable)はk 8 sによって生成される.
    entrypoint-slave.png
  • masterミラー
  • を構築する
    # cd /home/lipuan/mysqlDockerFile/
    # docker build -t paulliu/mysql-master:0.1 .
    
  • slaveミラー
  • を構築
    # cd /home/lipuan/mysqlDockerFile/
    # docker build -t paulliu/mysql-slave:0.1 .
    
  • アップロードミラー
  • # docker login
    # docke push paulliu/mysql-master:0.1
    # docke push paulliu/mysql-slave:0.1
    

    三、MySQLクラスタ配置

  • # cd /home/lipuan/DockerBuild以降の内容が指摘するなければこのディレクトリの下で
  • を実行する.
  • このセクションでは、すべてのyamlファイルのインデントスペースを厳格にする必要があります.そうしないと、
  • を構築できません.

    master

  • 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]"
    
  • 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
    
  • MySQLマスターサービス
  • の導入
    # kubectl create -f mysql-master-rc.yaml
    # kubectl create -f mysql-master-service.yaml
    
  • 運転状況を確認# kubectl get pods,service,rc
  • slave

  • 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]"
    
  • 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
    
  • MySQL slaveサービス
  • の導入
    # kubectl create -f mysql-slave-rc.yaml
    # kubectl create -f mysql-slave-service.yaml
    
  • 運転状況を確認# kubectl get pods,service,rc
  • 文末に書く


    ここまでKubernetesベースのMySQLマスターはクラスタから構築に成功しましたが、その手順がよく分からない方がいらっしゃいましたら、お互いの勉強を歓迎します.本文は筆者が初めて技術ブログを書いたので、間違いなどの問題があれば、皆さんの批判を大いに指摘してください.

    更新ログ

  • 2018.01.13は、ミラーを準備する部分にdocker-entrypointを追加する.shファイルは実行可能権限を付与し、このステップがないとミラーが実行できない可能性があります.

  • 作者:lipuan
    リンク:https://www.jianshu.com/p/da0b339e1274
    出典:簡書
    著作権は作者の所有である.商業転載は著者に連絡して許可を得てください.非商業転載は出典を明記してください.