菜单

docker搭建mysql集群

alexpang
alexpang
发布于 2023-09-12 / 94 阅读
0
0

docker搭建mysql集群

docker搭建mysql主从集群

笔者简单介绍通过docker搭建MySQL集群和主从复制的方法,仅供学习参考使用,生产环境建议通过k8s或者物理机直接搭建

1.新建目录

在服务器上新建mysql集群目录

mkdir -p mysql-cluster  && mkdir -p mysql-cluster/master/data && mkdir -p mysql-cluster/slave1/data && mkdir -p mysql-cluster/slave2/data && touch mysql-cluster/docker-compose.yml && touch mysql-cluster/master/init_master.h && touch mysql-cluster/slave1/slave.sh && touch mysql-cluster/slave2/slave.sh

最终创建的目录结构如下

2.docker-compose写入

编辑 docker-compose文件写入

version: "3.7"
services:
  db_master_alex:
    image: mysql:8.0
    container_name: db_master_alex  # 可配置自己
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456   # 可配置
      MYSQL_USER: developer         # 可配置
      MYSQL_PASSWORD: 123456        # 可配置
      TZ: Asia/Shanghai
    command: 
      --character-set-server=utf8mb4 
      --collation-server=utf8mb4_unicode_ci
      --default-authentication-plugin=mysql_native_password
      --server-id=1
      --log-bin=mysql-bin
    volumes:
      - $PWD/master/data:/var/lib/mysql      # 挂载路径
      - $PWD/master:/docker-entrypoint-initdb.d # 挂载路径
    ports:
      - "3306:3306"
    networks:
      - db_network
  db_slave1_alex:
    depends_on:
      - db_master_alex 
    image: mysql:8.0
    container_name: db_slave1_alex  
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_USER: developer
      MYSQL_PASSWORD: 123456
      TZ: Asia/Shanghai
      MYSQL_MASTER_HOST: db_master_alex  # master的ip
      MYSQL_MASTER_PORT: 3306
      MYSQL_MASTER_USER: developer       # 用于复制的账号
      MYSQL_MASTER_PASSWORD: 123456
    command: 
      --character-set-server=utf8mb4 
      --collation-server=utf8mb4_unicode_ci  
      --default-authentication-plugin=mysql_native_password
      --server-id=2
      --relay-log=mysql-relay-bin
      --log-slave-updates
      --read-only=1
    volumes:
      - $PWD/slave1/data:/var/lib/mysql
      - $PWD/slave1:/docker-entrypoint-initdb.d
    ports:
      - "3307:3306"
    networks:
      - db_network
  db_slave2_alex:
    depends_on:
      - db_master_alex
    image: mysql:8.0
    container_name: db_slave2_alex
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_USER: developer
      MYSQL_PASSWORD: 123456
      TZ: Asia/Shanghai
      MYSQL_MASTER_HOST: db_master_alex
      MYSQL_MASTER_PORT: 3306
      MYSQL_MASTER_USER: developer
      MYSQL_MASTER_PASSWORD: 123456
    command: 
      --character-set-server=utf8mb4 
      --collation-server=utf8mb4_unicode_ci  
      --default-authentication-plugin=mysql_native_password
      --server-id=3
      --relay-log=mysql-relay-bin
      --log-slave-updates
      --read-only=1
    volumes:
      - $PWD/slave2/data:/var/lib/mysql
      - $PWD/slave2:/docker-entrypoint-initdb.d
    ports:
      - "3308:3306"
    networks:
      - db_network

networks:
  db_network:
    driver: bridge

3.init_master文件

init_master文件写入

#!/bin/bash
MASTER_SYNC_USER=${MYSQL_USER:-develop}
GRANT_PRIVILEGES_SQL="GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO '$MASTER_SYNC_USER'@'%';"

mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "$GRANT_PRIVILEGES_SQL"

4.slave文件写入

#!bin/bash
sleep 20
RESULT=`mysql -u"$MYSQL_MASTER_USER" -h$MYSQL_MASTER_HOST -p"$MYSQL_MASTER_PASSWORD" -e "SHOW MASTER STATUS;" | grep -v grep |tail -n +2| awk '{print $1,$2}'`
#解析出logfile
LOG_FILE_NAME=`echo $RESULT | grep -v grep | awk '{print $1}'`
#解析出pos
LOG_FILE_POS=`echo $RESULT | grep -v grep | awk '{print $2}'`

SYNC_SQL="change master to master_host='$MYSQL_MASTER_HOST',master_user='$MYSQL_MASTER_USER',master_password='$MYSQL_MASTER_PASSWORD',master_log_file='$LOG_FILE_NAME',master_log_pos=$LOG_FILE_POS;"
#开启同步
START_SYNC_SQL="start slave;USER='$MYSQL_REPLICA_USER' PASSWORD='$MYSQL_REPLICA_PASSWORD';"
#查看同步状态
STATUS_SQL="show slave status\G;"
mysql -uroot -p"$MYSQL_PASSWORD" -e "$SYNC_SQL $START_SYNC_SQL $STATUS_SQL"

5.启动集群

docker-compose up -d

6.进入mysql容器

docker exec -it {{container_name}} bash 

mysql -uroot -p{{password}} -e "create database {{db1}}";

如果正常即可观察slave也会同步进行更新。


评论