Docker搭建mysql集群

Docker搭建mysql集群

关于mysql主从复制,我会在mysql笔记中详细介绍

运行mysql实例,由于我的虚拟机中已经安装了mysql,所以我的端口不能使用3306,这里遇到一个坑,

docker run -p 3307:3306 --name mysql-master \
-v /ljq/mydata/mysql-master/log:/var/log/mysql \
-v /ljq/mydata/mysql-master/data:/var/lib/mysql \
-v /ljq/mydata/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql:5.7

进入到宿主机目录/ljq/mydata/mysql-master/conf,新建my.cnf文件,配置文件信息如下,请注意各个配置的含义

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101 
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能
log-bin=mall-mysql-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

修改完配置文件之后需要重启docker容器

docker restart mysql-master

进入容器

docker exec -it mysql-master /bin/bash
mysql -u root -p
# 进入到mysql中进行操作
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

新建容器

docker run -p 3308:3306 --name mysql-slave \
-v /ljq/mydata/mysql-slave/log:/var/log/mysql \
-v /ljq/mydata/mysql-slave/data:/var/lib/mysql \
-v /ljq/mydata/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql:5.7

新增配置文件

vim my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin  
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
## slave设置为只读(具有super权限的用户除外)
read_only=1

重启mysql

docker restart mysql-slave 
docker ps -a

CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
2af680a1ab6e   mysql:5.7   "docker-entrypoint.s…"   2 minutes ago    Up 7 seconds    33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp   mysql-slave
eaf262d14077   mysql:5.7   "docker-entrypoint.s…"   20 minutes ago   Up 20 minutes   33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp   mysql-master

进入主mysql容器,查看主从状态

mysql> show master status;
+-----------------------+----------+--------------+------------------+-------------------+
| File                  | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+----------+--------------+------------------+-------------------+
| mall-mysql-bin.000003 |      617 |              | mysql            |                   |
+-----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

在从数据库mysql-slave中配置主从复制,master_log_pos 要根据Position实时进行修改,master_log_file='mall-mysql-bin.000004'对应的版本File 也是要查看主数据库的信息的,千万注意

change master to master_host='192.168.76.128', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000004', master_log_pos=770, master_connect_retry=30;

查看配置

说明

  • master_host:主数据库的IP地址;
  • master_port:主数据库的运行端口;
  • master_user:在主数据库创建的用于同步数据的用户账号;
  • master_password:在主数据库创建的用于同步数据的用户密码;
  • master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
  • master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
  • master_connect_retry:连接失败重试的时间间隔,单位为秒。
mysql> show slave status \G\
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.76.128
                  Master_User: slave
                  Master_Port: 3307
                Connect_Retry: 30
              Master_Log_File: mall-mysql-bin.000004
          Read_Master_Log_Pos: 770
               Relay_Log_File: mall-mysql-relay-bin.000005
                Relay_Log_Pos: 325
        Relay_Master_Log_File: mall-mysql-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

在主数据库创建database和table,并插入数据之后,在从数据库中查询数据。

[root@192 ljq]# docker exec -it mysql-master /bin/bash
bash-4.2# mysql -u root -p
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> use test
Database changed
mysql> create table test(name varchar(20), id int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test(id,name) values(1,"ljq"), (2,'zcc');
^[[AQuery OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> select * from test;
+------+------+
| name | id   |
+------+------+
| ljq  |    1 |
| zcc  |    2 |
+------+------+
2 rows in set (0.00 sec)

在从数据库中查看是否完成主从复制

[root@192 ljq]# docker exec -it mysql-slave /bin/bash
bash-4.2# mysql -u root -p
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)
mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from test;
+------+------+
| name | id   |
+------+------+
| ljq  |    1 |
| zcc  |    2 |
+------+------+
2 rows in set (0.00 sec)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值