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

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

创建 master slave文件夹

编写Dockerfile:

FROM mysql:5.7
COPY my.cnf /etc/mysql/  
EXPOSE 3306
CMD ["mysqld"]
  • 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

更多配置参考

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   #要同步的数据库,不填默认所有库

构建镜像

在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
docker run -p 3307:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql-slave

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

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

查看容器ip

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

显示出来的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 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

重要的是上面的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';
    
    • 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)
    

    看到 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;

演示效果

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值