当前位置: 首页>后端>正文

docker搭建mysql主从复制环境

我主要使用Portainer作为个人docker的管理工具,下面一些步骤大部分是在Portainer界面下的操作。

文件准备

分别创建主从数据库的数据存放目录和配置文件

主数据库

mkdir -p ./mysqlms/master/data
mkdir -p ./mysqlms/master/conf.d

配置文件

vi ./mysqlms/master/conf.d/my.cnf

my.cnf主要内容如下

[mysqld]
default-time_zone = '+8:00'
collation-server=utf8mb4_unicode_ci
server-id=100
log-bin=master-bin
binlog-format=row
lower_case_table_names=1

从数据库

mkdir -p ./mysqlms/slave/data
mkdir -p ./mysqlms/slave/conf.d

配置文件

vi ./mysqlms/slave/conf.d/my.cnf

my.cnf主要内容如下

[mysqld]
server-id=101
read_only=1
default-time_zone = '+8:00'
collation-server=utf8mb4_unicode_ci
lower_case_table_names=1

从库的server-id不能和主库相同,主库要开启log-bin,从库设置为只读。
其他配置参考后面给出,如果做读写分类,主库可以侧重写性能,从库则侧重读优化。

创建容器

在portainer中创建stack,类似于创建一个docker-compose.yml,用compose部署这个服务。


docker搭建mysql主从复制环境,第1张
截屏2020-11-30 上午9.46.50.png

如果是高版本的docker,并且开启了swarm,则会使用 docker stack deploy部署

Editor中编辑的内容

version: "2"
services:
  mysql57m:
    image: mysql:5.7
    ports:
      - "4306:3306"
    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password
    volumes:
      - /home/zhujin/mysqlms/master/conf.d:/etc/mysql/conf.d
      - /home/zhujin/mysqlms/master/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: admin123

  mysql57s:
    image: mysql:5.7
    ports:
      - "4307:3306"
    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --default-authentication-plugin=mysql_native_password
    volumes:
      - /home/zhujin/mysqlms/slaver/conf.d:/etc/mysql/conf.d
      - /home/zhujin/mysqlms/slaver/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: admin123
    

内容很简单,分别配置主从库的容器,映射3306端口,指定默认编码,挂载主机上的数据目录和配置文件目录,指定root密码

启动容器

数据库配置

直接portainer进入主数据库的控制台


docker搭建mysql主从复制环境,第2张
截屏2020-11-30 上午9.50.39.png

类似docker exec -it mysqlms_mysql57m_1 bash

登录主数据库

mysql -uroot -padmin123

创建同步账号

mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

查看主库当前日志文件和位置

mysql> show master status;
docker搭建mysql主从复制环境,第3张
截屏2020-11-30 上午9.52.38.png

记录下文件名master-bin.000003和位置值14234

以同样方式登录从数据库
配置从库

mysql> change master to master_host='mysql57m',master_user='slave',master_password='123456',master_port=3306,master_log_file='master-bin.000003', master_log_pos=14234;
mysql> start slave;

master_host,由于主从服务器是编排在一个服务中的,master_host直接用的主库服务名,实际可以是主库的容器ip;或者是主机ip,此时master_port要取映射到主机上的端口。
因为主从数据库都是空库,没有手动复制数据的过程。从库配置过程中,主库不能接入客户端有任何操作,否则log-bin文件和偏移量可能会变。

docker inspect mysqlms_mysql57m_1 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.19.0.3",

在portainer中查找ip就更方便了。

查看从库同步状态

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: mysql57m
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000003
          Read_Master_Log_Pos: 14234
               Relay_Log_File: 4bb7c8dd7ea1-relay-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: master-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 14234
              Relay_Log_Space: 535
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 100
                  Master_UUID: 6a476f6f-30b4-11eb-8271-0242ac130003
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

验证复制
登录主库创建test数据库

CREATE DATABASE IF NOT EXISTS `test` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE `test`;


CREATE TABLE `user` (
  `id` int(11) NOT NULL,
  `name` varchar(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

登录从库

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| phpmyadmin         |
| sys                |
| test               |
+--------------------+
6 rows in set (0.00 sec)

mysql> use test;
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user           |
+----------------+
1 row in set (0.00 sec)

mysql参考配置

max_connections 151 >= 100 根据登录次数和使用spine 数据采集器, MariaDB 将需要许多连接. spine的计算是:total_connections = total_processes *(total_threads + script_servers + 1),那么您必须留下用于用户连接的空间,这取决于并发登录的帐户数.
max_allowed_packet 16777216 >= 16777216 通过远程poller 功能,大量数据将从主服务器同步到远程poller. 因此,请将此值保持在16M 或以上.
max_heap_table_size 125M >= 124M 程序缓冲区。这有两种方法,首先将输出列的大小减小到合适的大小。此列位于表poller_output和poller_output_boost中。您可以做的第二件事是为内存表分配更多内存。我们已经任意选择了系统内存的10%的建议值,但是如果您使用的是SSD磁盘驱动器,或者有一个更小的系统,您可以忽略此建议或选择其他存储引擎。您可以在Console->System Utilities->viewboost Status下看到性能提升程序表的预期消耗量。
tmp_table_size 125M >= 124M 执行具有较大临时表大小的子查询时,请将这些临时表保存在内存中.
join_buffer_size 256M >= 249M 在执行连接时,如果它们低于此大小,它们将被保存在内存中,并且不会写入临时文件.
innodb_file_per_table ON = ON 使用InnoDB 存储引擎时,保持表空间的独立性很重要. 对于 MariaDB 的长期用户,表管理会变得更简单.如果您尚未开启此功能, 可以通过在所有InnoDB 表上运行alter 语句来开启此功能.
innodb_buffer_pool_size 1952M >= 1945M InnoDB将在系统内存中保存尽可能多的表和索引。因此,您应该使innodb_buffer_池足够大,以便在内存中保存尽可能多的表和索引。检查数据库数据文件目录的大小将有助于确定该值。我们建议您的系统内存占系统总内存的25%,但您的要求将根据您的系统大小而有所不同。
innodb_doublewrite ON = ON 除非运行在ZFS或FusionI/O上,否则此设置应保持启用状态,因为这两个实例都具有内部日志记录功能,以适应突然发生的系统崩溃。但是,如果您有非常好的电源,并且您的系统很少停机,并且您有备份,那么将此设置设置为关闭可以使您的数据库性能提高近50%。
innodb_lock_wait_timeout 50 >= 50 恶意查询不应该让数据库脱机给其他人. 请在杀死您的系统之前杀死这些查询.
innodb_flush_method fsync eq O_DIRECT Maximum I/O performance happens when you use the O_DIRECT method to flush pages.
innodb_flush_log_at_timeout 1 >= 3 从 MariaDB 10.3.7开始,您可以控制 MariaDB将交易刷新到磁盘的频率. 默认值是1秒,但是在高I/O系统中设置为大于1的值可以允许磁盘I/O更有序
innodb_read_io_threads 4 >= 32 采用现代SSD类型的存储器,具有多个读取IO线程对于具有高IO特性的应用是有利的.
innodb_write_io_threads 4 >= 16 采用现代SSD类型的存储器,具有多个写入IO线程对于具有高IO特性的应用是有利的.
innodb_buffer_pool_instances 1 >= 16 MariaDB会将innodb_buffer_pool分成内存区域以提高性能. 最大值是64.当您的innodb_buffer_pool小于1GB时,您应该使用池大小除以128MB. 继续使用这个等式,最大值为64.
innodb_io_capacity 200 >= 5000 如果您有SSD磁盘,请使用此建议。如果您有物理硬盘驱动器,请使用200*阵列中活动驱动器的数量。如果使用NVMe或PCIe闪存,则可以使用更大的数字,高达100000。
innodb_io_capacity_max 2000 >= 10000 同样是固体硬盘建议配置

https://www.xamrdz.com/backend/3un1995256.html

相关文章: