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部署这个服务。


截屏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进入主数据库的控制台


截屏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;
截屏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 同样是固体硬盘建议配置
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容