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>