Docker实现Mysql读写分离(主从同步)

概念

  • Mysql读写分离主要是通过主从数据库复制来实现,Mysql自带的二进制复制技术;
  • Mysql5.7与Mysql8操作稍有差别,Mysql8的授权模式有改动,需要先创建用户;
  • 实现主从同步后,使用MyCat等软件实现读写分离;
  • 使用Docker来模拟两台服务器,原理和使用2台不同IP的服务器一样;

安装Docker

  • 下载Docker Desktop https://www.docker.com/get-started,这个是有图形界面的Docker,可以省去很多命令操作,对系统有一定要求;
  • 直接安装即可;

拉取mysql

docker pull mysql:5.7
  • 在Docker Hub查看版本,本文使用5.7版本 https://hub.docker.com/_/mysql?tab=tags
    Docker实现Mysql读写分离(主从同步)_第1张图片

制作主从Mysql镜像

1. 任意位置创建2个文件夹,并分别创建DockerfileMy.cnf

Docker实现Mysql读写分离(主从同步)_第2张图片

  • Dockerfile – 打包配置文件
  • My.cnf – Mysql配置文件,这里修改好以后替换Mysql原有文件,也可以打包以后进入容器修改,但是Docker原生没有Vim编辑,需要更新源安装,但是速度很慢;

2. 编写Dockerfile

FROM mysql:5.7
COPY my.cnf /etc/mysql/  
EXPOSE 3306
CMD ["mysqld"]
  • master和slave相同
  • mysql:5.7 – 不写版本号5.7会拉取最新版Mysql,最新版的授权有变化,需修改授权方式

3. 编写My.cnf

master:

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL

# 新添加的在下面

#启用二进制,必须
log-bin=mysql-bin
#填写整数,每个数据库不同
server-id=1

slave:

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL

# 新添加的在下面

#启用二进制,必须
log-bin=mysql-bin
#填写整数,每个数据库不同
server-id=2
  • 更多配置参考
server-id=1   #任意自然数n,只要保证两台MySQL主机不重复就可以了。

log-bin=mysql-bin   #开启二进制日志

auto_increment_increment=2   #步进值auto_imcrement。一般有n台主MySQL就填n

auto_increment_offset=1   #起始值。一般填第n台主MySQL。此时为第一台主MySQL

binlog-ignore=mysql   #忽略mysql库【我一般都不写】

binlog-ignore=information_schema   #忽略information_schema库【我一般都不写】

replicate-do-db=aa   #要同步的数据库,不填默认所有库

# 配置好后重启MySQL
# https://www.cnblogs.com/phpstudy2015-6/p/6485819.html#_label7

4. 打包

  • master文件夹下
docker build -t master/mysql .
  • slave文件夹下
docker build -t slave/mysql .
  • . – 点代表本文件夹下所有,必写

  • 查看是否成功

Docker实现Mysql读写分离(主从同步)_第3张图片

创建主从Mysql容器

docker run -p 17717:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d master/mysql
docker run -p 17718:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d slave/mysql

  • 查看运行结果:
    Docker实现Mysql读写分离(主从同步)_第4张图片
  • 如果运行失败,点击mysql-master标题进入查看日志;

主从配置 (关键步骤)

进入mysql-master操作

1. 点击>-按钮进入容器内部

//点击`>-`按钮相当于命令行执行,操作2选一
docker exec -it mysql-slave bash

2. 登陆mysql

mysql -uroot -p
//然后输入密码123456

3.给从数据库授权

mysql>GRANT REPLICATION SLAVE ON *.* TO 'user'@'192.168.2.14' IDENTIFIED BY '123456';(指定ip)
或者
mysql>GRANT REPLICATION SLAVE ON *.* to 'user'@'%' identified by '123456';(所有ip)
  • mysql5.7可以直接执行,如果是Mysql8版本,可以参考这里 mysql 8.0.21 对用户授权报错 新版Mysql授权报错
  • 'user'@'192.168.99.100' – user是指定从数据库用户名,ip是从服务器主机ip,这里就是本机局域网ip
  • 123456 – Mysql登陆密码

4.查询主数据库状态信息

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |     137 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
  • File ,Position 和主数据库对外端口 Port:17717 是关键值,需要记录
  • 主库千万不要再做任何操作,防止状态改变

进入mysql-slave操作

1.点击>-按钮进入从数据库内部

2.登陆数据库,密码123456

3.与主库进行连结:

mysql> change master to
master_host='192.168.2.14',
master_user='user',
master_log_file='mysql-bin.000003',
master_log_pos=137,
master_port=17717,
master_password='123456';
  • master_host – 主库IP地址,这里就是本机IP
  • master_user – 连结主库使用的用户名,就是刚才授权的用户名
  • master_log_file – 刚才需要记录的主库的File值
  • master_log_pos – 刚次需要记录的主库的Position值
  • master_port – 主库的外端口
  • master_password='123456'; – 主库密码,分号结束

4.启动

mysql> start slave;// 启动从服务器复制功能

5.检查是否启动成功

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.2.14
                  Master_User: user
                  Master_Port: 32768
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 1338
               Relay_Log_File: 8d1e3b87d499-relay-bin.000002
                Relay_Log_Pos: 1221
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes 
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
              ...
1 row in set (0.00 sec)
  • 可以看到很多刚才配置过的信息
  • Slave_IO_Running / Slave_SQL_Running – 都为Yes是表示启动成功,其他值都不成功
  • Replicate_Do_DB – 空表示所有库

测试

进入master容器

mysql> create database mytest;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| mytest             |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
mysql> use mytest
Database changed
mysql>  create table demo(id int(3),name varchar(10));
Query OK, 0 rows affected (0.04 sec)
mysql> insert into demo values(1,'uname');
Query OK, 1 row affected (0.01 sec)
mysql> select * from demo;
+------+-----------+
| id   | name      |
+------+-----------+
|    1 |   uname   |
+------+-----------+
1 row in set (0.00 sec)

进入slave容器

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| mytest             |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
mysql> use mytest
Database changed
mysql> select * from demo;
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | uname     |
+------+-----------+
1 row in set (0.00 sec)
  • 测试成功

配置读写分离Mycat

java mycat mysqlMaster 数据写入 mysqlSlave 数据读取

1.拉取镜像

2.手写配置项目

3.将配置项通过-v挂载的方式启动容器

4.navicat测试

具体参考 https://www.cnblogs.com/konglingxi/p/14808850.html

你可能感兴趣的:(mysql,docker,数据库)