创建 master slave文件夹
编写Dockerfile:FROM mysql:5.7 COPY my.cnf /etc/mysql/ EXPOSE 3306 CMD ["mysqld"]
- master和slave相同
- mysql:5.7 – 不写版本号5.7会拉取最新版Mysql,最新版的授权有变化,需修改授权方式
[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 statusG查看是否启动成功
*************************** 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>



