使用Docker设置MySQL群集

通过设置一个三节点的mysql innodb集群,只使用docker容器,可以在任何地方实现。

Mysql是企业和公司为其应用或业务需求所采用的最突出和最流行的数据库解决方案之一。

集群是一个资源的集合,在这里是指提供可扩展性和高可用性的服务器。Mysql集群可以为数百万用户提供服务,处理大量的数据负载,提供实时响应和敏捷性。

关注本博客所需的所有文件都可以在这个链接中找到。

MYSQL集群的结构

在这种情况下,该集群有三个节点或容器。

具有读写权限的单一主节点。

有两个二级单位,其中写的内容是复制的。

设置代码

为了配置mysql集群,我们首先需要三个独立的mysql服务器,在我们的案例中我们将使用docker。

我们定义一个dockerfile,它将被用作我们的基础镜像

FROM mysql/mysql-server:8.0

COPY ./setup.sql /docker-entrypoint-initdb.d

EXPOSE 3306

mysql-server:8.0被使用,一个sql数据文件被用来执行一些初始设置。该文件被复制到docker-entrypoint-initdb.d,这将确保执行该文件的内容

CREATE USER 'clusteradmin'@'%' IDENTIFIED BY 'cladmin';

GRANT ALL privileges ON *.* TO 'clusteradmin'@'%' with grant option;

reset master;

为了建立一个集群,我们创建了一个拥有所有权限的用户clusteradmin。当设置开始时,这个用户会在所有节点上创建。

最后,一个docker-compose文件被用来创建docker容器。

version: "3.3"
services:
  mysql-dev1:
        build: .
              command: --default-authentication-plugin=mysql_native_password
      environment:
        MYSQL_ROOT_PASSWORD: password
              volumes:
      - ./db-data1:/var/lib/mysql
      ports:
      - "3306:3306"
  
  mysql-dev2:
        build: .
              command: --default-authentication-plugin=mysql_native_password
      environment:
        MYSQL_ROOT_PASSWORD: password
              ports:
      - "3307:3306"
      volumes:
      - ./db-data2:/var/lib/mysql
  
  mysql-dev3:
        build: .
              command: --default-authentication-plugin=mysql_native_password
      environment:
        MYSQL_ROOT_PASSWORD: password
              ports:
      - "3308:3306"
      volumes:
      - ./db-data3:/var/lib/mysql

volumes:
  db-data1:
      driver: local
        db-data2:
            driver: local
              db-data3:
                  driver: local
                  

已经设置了三个docker容器,它们以root密码为密码,与主机系统有三种不同的端口号映射,默认的认证插件为密码。

确保为容器设置一个卷,因为这是mysql存储其元数据的地方。

进行预先检查

通过运行docker compose命令启动三个服务器

docker-compose up 
or
docker-compose up -d (for background process)

这就启动了三个docker容器,这将是我们的mysql服务器,也是并行的,为容器创建三个镜像。

为了不创建三个独立的镜像,而使用一个单一的镜像,事先建立docker镜像,并在compose文件中引用它。

以根用户身份进入其中一个节点,查看用户、主机是否存在,确保集群管理员用户存在。

docker exec -it {container name} /bin/bash   // exec into container

mysql -uroot -p'password'  // Login as root user

SELECT user,host FROM mysql.user;     // list all users and host

以集群管理员用户身份登录,以确保用户已经设置了正确的凭据

考虑将其中一个节点作为主节点,使用mysqlsh来启动集群创建过程

使用clusteradmin用户登录到mysql shell

mysqlsh -uclusteradmin -p'cladmin'

第一步是检查节点配置是否符合所需要求。

在同一个shell上运行下面的命令,用docker容器的名字替换容器的名字,因为每个容器都有相互的连接。

dba.checkInstanceConfiguration("clusteradmin@{container name}:port")

从单一的mysqlsh shell中,也可以通过用相应的容器名称替换容器名称来检查其他节点。

然后对每个容器进行配置,使它们能够作为innodb集群的一部分。

在同一个shell上运行下面的命令,用docker容器的名称替换容器名称。

dba.configureInstance("clusteradmin@{container name}:port")

这将设置所需的环境变量和设置,以便每个容器可以作为一个innodb节点。

configureInstance命令必须为每个容器运行三次,并使用各自的容器名称,这可以从同一个mysql shell运行。

在运行checkInstanceConfiguration时,我们注意到它现在的结果是成功。

创建集群

在mysql shell上启动集群创建

var cluster = dba.createCluster("{cluster name}")

检查集群状态

cluster.status()

我们有一个单节点集群,我们需要在其中添加另外两个容器。

使用addInstance命令添加一个不同的实例/容器

cluster.addInstance("clusteradmin@{container name}:{port}")

这个命令必须被用来将其他两个容器添加到主节点上。

在每一步之后运行cluster.status()将使我们能够了解集群的状态

我们有一个三节点的mysql与docker设置,有一个主节点和两个次节点。主节点用于所有的写操作,这些操作被复制到次节点。

mysql集群的特点

  1. 集团复制

根据该架构,主节点作为节点,负责在数据库中写入数据,并将其复制到第二个节点。

登录到mysql主节点并输入数据,这些数据将被复制到其他二级节点。

在主节点上创建一个新的数据库

CREATE DATABASE developer;

创建表格以插入数据

CREATE TABLE dev(name VARCHAR(20 NOT NULL, SLNO INT NOT NULL, 
                 PRIMARY KEY(SLNO));

DESCRIBE dev;

在表中插入虚拟数据

现在登录到另外两个容器,数据库和表以及数据将被复制到其中。

2. 自动故障转移

如果在任何情况下,一个二级节点发生故障,集群仍在运行,但如果一个主节点发生故障,则会选出一个新的主节点并继续运行。

目前的初始集群状态是这样的

我们继续前进,停止和启动主节点容器

在这种情况下,该节点进入缺失状态,另一个节点被选为主节点。

一旦节点恢复正常,它就会重新加入集群。

错误或调试

在某些情况下,可能需要在增加节点时或在故障后执行集群重新扫描。

运行命令

var cluster = dba.getCluster()  // if cluster var is not set

cluster.rescan()

展开阅读全文

页面更新:2024-03-09

标签:节点   集群   容器   故障   命令   状态   名称   两个   数据   用户

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top