疯狂编程网

  • 首页
  • 后端
    • GOLANG
    • PHP
  • 前端
  • 客户端
  • 服务器
  • AIGC
  • 开发工具
  • 代码人生
  • 关于本站
    • 联系我们
    • 免责声明
  1. 首页
  2. 服务器
  3. MYSQL
  4. 正文

mysql集群搭建docker-compose方案

2023年5月10日 328点热度 0人点赞 0条评论

MySQL集群搭建大致有两种方式,一种是单主/多从的主从复制方式,另一种是使用Galera Cluster高可用解决方案。

1、步骤

以下我们详细介绍一下单主/多从的主从复制方式:

  1. 确认服务器环境,采用官方支持的操作系统版本和MySQL版本,并保证主从服务器之间的网络连接能够正常通信。
  2. 安装MySQL服务器,可以选择二进制安装包、yum/apt安装包和源码编译方式进行安装。在进行安装时,需要配置MySQL的配置文件(my.cnf文件),以配置MySQL的操作参数和节点角色。
  3. 配置主从节点的角色,将其中一个MySQL服务器配置为主节点,其他服务器均配置为从节点。
  4. 配置主从复制参数,在主节点上创建复制账户,并将账户的权限限定在从节点上。
  5. 在从节点上配置主从关系,即将主节点的binlog日志传输到从节点,并将从节点的relay log传输回主节点,实现数据的实时复制。
  6. 测试主从复制的功能及性能,并对其进行调优。可以使用MySQL自带的性能测试工具及一些第三方性能测试工具对MySQL集群的读写性能、扩展能力等进行评估和优化。
2、集群搭建

下面是基于CentOS 7操作系统和MySQL 5.7版本的单主/多从的主从复制方式的具体步骤:

  1. 确认服务器环境
  • 确认服务器之间的连接能够正常通信,可以使用ping命令测试连接;
  • 确认MySQL 5.7版本的安装包已经下载并上传到服务器,建议使用官方提供的二进制安装包(.tar.gz格式)。
  1. 安装MySQL服务器
  • 创建MySQL用户和用户组,建议使用root用户或具有sudo权限的用户进行安装;
  • 解压MySQL安装包,将解压后的目录移动到/usr/local目录下;
  • 新建my.cnf配置文件,将以下配置添加进去:

    <span class="hljs-section">[mysqld]
    <span class="hljs-attr">log-bin=mysql-bin
    <span class="hljs-attr">server-id=<span class="hljs-number">1</span></span></span></span>

其中log-bin配置指定主节点将binlog日志保存到mysql-bin文件中,server-id配置指定服务器的唯一标识,值越小优先级越高。

  • 初始化MySQL数据目录,使用以下命令初始化:

    <span class="hljs-meta"> 
    #<span class="language-bash">/usr/local/mysql/bin/mysqld —initialize —user=mysql —basedir=/usr/local/mysql —datadir=/usr/local/mysql/data</span></span>
  • 启动MySQL服务,使用以下命令启动:

    <span class="hljs-meta"> #<span class="language-bash">/usr/local/mysql/bin/mysqld_safe &</span></span>
  1. 配置主从节点的角色
  • 配置主节点,先登录到主节点的MySQL服务器上,使用以下命令创建复制账户,并限定该账户的权限仅限于从节点:

     mysql> grant replication slave <span class="hljs-keyword">on *.* to <span class="hljs-string">'repl'@<span class="hljs-string">'%' identified <span class="hljs-keyword">by <span class="hljs-string">'password';</span></span></span></span></span>
  • 配置从节点,在从节点的my.cnf配置文件中添加如下内容:

    <span class="hljs-section">[mysqld]
    <span class="hljs-attr">server-id=<span class="hljs-number">2</span></span></span>

这里的server-id需要设置为不同于主节点的唯一值,例如在此设置为2。

  1. 配置主从复制参数
  • 在主节点上执行以下SQL语句,创建binlog日志文件:

     mysql> <span class="hljs-built_in">flush logs;</span>
  • 获取主节点的binlog文件名和位置,执行以下SQL语句:

     mysql> show master status;

记录下File和Position字段的值,将它们配置到从节点的my.cnf文件中:

 <span class="hljs-section">[mysqld]
<span class="hljs-attr">relay-log=mysql-relay-bin
<span class="hljs-attr">log_slave_updates=<span class="hljs-number">1
<span class="hljs-attr">read_only=<span class="hljs-number">1</span></span></span></span></span></span>

其中relay-log配置为从节点将relay log日志保存到mysql-relay-bin文件中,log_slave_updates配置为从节点将自己的binlog传给其他从节点,read_only配置为只读。

  • 在从节点上执行以下SQL语句,建立主从关系:

    CHANGE MASTER TO
    MASTER_HOST='your_master_ip_address',
    MASTER_USER='repl',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=120;    

其中MASTER_HOST指定主节点的IP地址,MASTER_USER和MASTER_PASSWORD为在主节点上之前创建的复制账户名和密码,MASTER_LOG_FILE和MASTER_LOG_POS为从节点的复制进度。

  1. 测试主从复制的功能及性能
  • 使用MySQL自带的性能测试工具和第三方性能测试工具对MySQL集群的读写性能、扩展能力等进行评估和优化,例如AB测试、JMeter测试等。
3、docker-compose容器实现集群

使用Docker-compose实现MySQL集群搭建可以简化部署和维护流程,下面是具体步骤:

  1. 安装Docker和Docker-compose
  • 可以从Docker官网上下载Docker CE和Docker-compose版本;
  • 也可以使用操作系统自带的包管理器进行安装。
  1. 编写docker-compose.yml文件
<span class="hljs-attr">version: <span class="hljs-string">'3'
<span class="hljs-attr">services:
  <span class="hljs-attr">master:
    <span class="hljs-attr">image: <span class="hljs-string">mysql
    <span class="hljs-attr">container_name: <span class="hljs-string">mysql_master
    <span class="hljs-attr">restart: <span class="hljs-string">always
    <span class="hljs-attr">environment:
      <span class="hljs-attr">MYSQL_ROOT_PASSWORD: <span class="hljs-string">master-password
    <span class="hljs-attr">ports:
      <span class="hljs-bullet">- <span class="hljs-string">"3306:3306"
    <span class="hljs-attr">volumes:
      <span class="hljs-bullet">- <span class="hljs-string">./master-conf:/etc/mysql/conf.d
      <span class="hljs-bullet">- <span class="hljs-string">./data:/var/lib/mysql
    <span class="hljs-attr">networks:
      <span class="hljs-bullet">- <span class="hljs-string">mysql
  <span class="hljs-attr">slave1:
    <span class="hljs-attr">image: <span class="hljs-string">mysql
    <span class="hljs-attr">container_name: <span class="hljs-string">mysql_slave1
    <span class="hljs-attr">restart: <span class="hljs-string">always
    <span class="hljs-attr">environment:
      <span class="hljs-attr">MYSQL_ROOT_PASSWORD: <span class="hljs-string">slave1-password
      <span class="hljs-attr">MYSQL_MASTER_HOST: <span class="hljs-string">master
      <span class="hljs-attr">MYSQL_MASTER_USER: <span class="hljs-string">root
      <span class="hljs-attr">MYSQL_MASTER_PASSWORD: <span class="hljs-string">master-password
    <span class="hljs-attr">ports:
      <span class="hljs-bullet">- <span class="hljs-string">"3307:3306"
    <span class="hljs-attr">volumes:
      <span class="hljs-bullet">- <span class="hljs-string">./slave1-conf:/etc/mysql/conf.d
      <span class="hljs-bullet">- <span class="hljs-string">./data:/var/lib/mysql
    <span class="hljs-attr">networks:
      <span class="hljs-bullet">- <span class="hljs-string">mysql
  <span class="hljs-attr">slave2:
    <span class="hljs-attr">image: <span class="hljs-string">mysql
    <span class="hljs-attr">container_name: <span class="hljs-string">mysql_slave2
    <span class="hljs-attr">restart: <span class="hljs-string">always
    <span class="hljs-attr">environment:
      <span class="hljs-attr">MYSQL_ROOT_PASSWORD: <span class="hljs-string">slave2-password
      <span class="hljs-attr">MYSQL_MASTER_HOST: <span class="hljs-string">master
      <span class="hljs-attr">MYSQL_MASTER_USER: <span class="hljs-string">root
      <span class="hljs-attr">MYSQL_MASTER_PASSWORD: <span class="hljs-string">master-password
    <span class="hljs-attr">ports:
      <span class="hljs-bullet">- <span class="hljs-string">"3308:3306"
    <span class="hljs-attr">volumes:
      <span class="hljs-bullet">- <span class="hljs-string">./slave2-conf:/etc/mysql/conf.d
      <span class="hljs-bullet">- <span class="hljs-string">./data:/var/lib/mysql
    <span class="hljs-attr">networks:
      <span class="hljs-bullet">- <span class="hljs-string">mysql
<span class="hljs-attr">networks:
  <span class="hljs-attr">mysql:</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

其中,master服务指定了MySQL作为服务,命名为mysql_master,将宿主机的3306端口映射到容器内的3306端口,以便在宿主机上可以连接到MySQL服务;

slave1和slave2服务是从节点服务,与master服务不同的是,它们需要通过MYSQL_MASTER_HOST、MYSQL_MASTER_USER、MYSQL_MASTER_PASSWORD三个环境变量来实现主从关系,另外将本服务的容器名作为主服务器的连接地址;

volumes选项将容器内的MySQL配置和数据文件分别映射到宿主机上的./master-conf、./slave1-conf和./slave2-conf、./data目录中,以便容器删除和重新创建时不会丢失数据和配置文件;

注意:这里的MySQL配置文件应根据需要进行调整,例如:

<span class="hljs-section">[mysqld]
<span class="hljs-attr">log-bin=mysql-bin
<span class="hljs-attr">server-id=<span class="hljs-number">1
<span class="hljs-comment"># 必要时添加下列参数
<span class="hljs-attr">max_allowed_packet=<span class="hljs-number">256MB
<span class="hljs-attr">innodb_buffer_pool_size=<span class="hljs-number">1GB</span></span></span></span></span></span></span></span></span>

3. 启动MySQL集群

  • 进入docker-compose.yml文件目录,运行以下命令启动MySQL集群服务:

    docker-compose up -d
  • 检查运行情况,使用以下命令查看MySQL容器的状态:

    docker-compose ps
  1. 测试MySQL集群
  • 在MySQL主服务器中创建测试数据库和表:

    <span class="hljs-keyword">CREATE DATABASE test;
    use test;
    <span class="hljs-keyword">CREATE <span class="hljs-keyword">TABLE t (id <span class="hljs-type">int <span class="hljs-keyword">PRIMARY KEY);
    <span class="hljs-keyword">INSERT <span class="hljs-keyword">INTO t (id) valuues (<span class="hljs-number">1);</span></span></span></span></span></span></span></span>
  • 在MySQL从服务器中查询数据表:

    use test;
    <span class="hljs-keyword">select * <span class="hljs-keyword">from t;</span></span>

如果查询结果与主服务器相同,则说明从服务器已经与主服务器同步,集群搭建成功。

以上就是使用Docker-compose实现MySQL集群搭建的具体步骤。

如若转载,请注明出处:http://www.17codes.com/archives/341.html

标签: mysql
最后更新:2023年5月10日

大明

靠写代码养家的开发者。

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2023 疯狂编程网. ALL RIGHTS RESERVED.

京ICP备2022013580号-1