当前位置:   article > 正文

docker 实现mysql主从搭建-读写分离(喂饭)_docker proxysql

docker proxysql

docker -mysql主从搭建-读写分离

创建 master slave文件夹

编写Dockerfile:

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

编写my.cnf master 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=1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

更多配置参考

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   #要同步的数据库,不填默认所有库
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

构建镜像

在master文件夹下

docker build -t mysql-master .

不要忘记最后一个“.”

在slave文件夹下

docker build -t mysql-slave .

输入docker images查看是否成功

启动主从容器

docker run -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql-master
  • 1
docker run -p 3307:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql-slave
  • 1

docker ps -a 查看是否启动成功

docker logs [容器id] 可查看容器启动日志

查看容器ip

语法:docker inspect [容器id/容器名]
  • 1

显示出来的ipaddress就是我们需要用到的ip

记录主容器的ip,后边需要

进入主容器进行操作

  • docker exec -it mysql-master bash 进入容器
  • mysql -uroot -p 登录mysql 回车之后输入密码 (输入密码是看不到的,输入完毕回车就可以)
  • GRANT REPLICATION SLAVE ON *.* to 'root'@'%' identified by '123456';授权一个账户给slave连接使用
  • show master status;查看主数据库信息
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |     137 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
  • 1
  • 2
  • 3
  • 4
  • 5

重要的是上面的File 以及 position

进入从容器进行操作

这里建议,主容器窗口不要关闭,在新开一个窗口进行操作

  • docker exec -it mysql-slave bash 进入容器

  • mysql -uroot -p 登录mysql 回车之后输入密码 (输入密码是看不到的,输入完毕回车就可以)

  •   change master to
      master_host='172.17.0.4',
      master_user='root',
      master_log_file='mysql-bin.000003',
      master_log_pos=437,
      master_port=3306,
      master_password='123456';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • master_host —> 我们上边记录的主容器ip
    • master_user ----> 我们上边授权的用户这里是 root (不明白的看主容器操作的第3步)
    • master_log_file —> 上边红色字体说的 File 的文件名称 mysql-bin.000003
    • master_log_pos —> 上边红色字体中的position的值 137
    • master_port —> 主容器的端口 这里写内部端口 3306 因为我们采用的host是内网的
    • master_password —> 我们上边授权的用户这里是 123456 (不明白的看主容器操作的第3步)
  • start slave; 开启从容器复制功能

  • 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    看到 Slave_IO_Running: Yes && Slave_SQL_Running: Yes 即为成功

测试

在主容器窗口 创建一个数据库并新建表添加一条数据

完成之后

在从容器 show databases; 查看是否有了新建的数据库 use [新建数据库的名称] select * from 表名 能看到数据 即为成功

读写分离

#查看状态
show global variables like "%read_only%";
# 对所有用户生效,包括super用户(不建议使用)此条 和下边这条 随机一个 按需选择
flush tables with read lock;

# 只对普通用户生效,如slave用户
set global read_only=1;

#查看状态
show global variables like "%read_only%";

# 关闭只读
unlock tables;
set global read_only=0;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

演示效果

mysql> show global variables like "%read_only%";
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_read_only      | OFF   |
| read_only             | OFF   |
| super_read_only       | OFF   |
| transaction_read_only | OFF   |
| tx_read_only          | OFF   |
+-----------------------+-------+
5 rows in set (0.01 sec)

mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)

mysql> set global read_only=1;
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like "%read_only%";
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_read_only      | OFF   |
| read_only             | ON    |
| super_read_only       | OFF   |
| transaction_read_only | OFF   |
| tx_read_only          | OFF   |
+-----------------------+-------+
5 rows in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| mytest             |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> drop database mytest;
ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock
mysql>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/230592
推荐阅读
相关标签
  

闽ICP备14008679号