Docker-Compose编写
docker-compose 官方文档链接Mysql - Official Image | Docker Hub
version: '3'
services:
mysql_master:
image: mysql:5.7
container_name: se-master-mysql
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
restart: always
environment:
MYSQL_DATABASE: se
MYSQL_ROOT_PASSWORD: root
MYSQL_ROOT_HOST: '%'
TZ: Asia/Shanghai
ports:
- 3305:3306
expose:
- 3306
volumes:
- /D/dockerFile/se/mysql/data:/var/lib/mysql #数据文件挂载
- /D/dockerFile/se/mysql/mysql.conf.d:/etc/mysql/mysql.conf.d #配置文件挂载
mysql_slave:
image: mysql:5.7
container_name: se-slave-mysql
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
restart: always
environment:
MYSQL_DATABASE: se
MYSQL_ROOT_PASSWORD: root #设置root帐号密码
MYSQL_ROOT_HOST: '%'
TZ: Asia/Shanghai
ports:
- 3310:3306
expose:
- 3306
volumes:
- /D/dockerFile/se/mysql_slave/data:/var/lib/mysql #数据文件挂载
- /D/dockerFile/se/mysql_slave/mysql.conf.d:/etc/mysql/mysql.conf.d
networks:
default:
name: SE
搭建主从复制
- 建立用户(两种方法)
- 在docker-compose中设置了root可以通过任何用户进行访问(MYSQL_ROOT_HOST: '%')
- 创建user账号
mysql> CREATE user slave;
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'XXX(从服务器IP,可以设置为%)' IDENTIFIED BY '密码'
mysql> FLUSH privileges;
这个配置的含义就是创建了一个数据库用户slave 在从服务器使用repl这个账号和主服务器连接的时候,就赋予其REPLICATION SLAVE的权限, . 表面这个权限是针对主库的所有表的,其中xxx就是从服务器的ip地址。
注意 重启数据库
- 配置主服务器.cnf
修改主 MySQL 配置文档
/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段添加以下配置:
[mysqld]
log-bin = mysql-bin
server-id = 1
- 查看主服务器是否配置成功
sql mysql > show variables like '%log_bin%';显示以下结果为成功,其中log_bin 为on,且log_bin_basename 与 log_bin_index 有Value。
+---------------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysql-bin |
| log_bin_index | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+--------------------------------+
查看主库状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000008 | 419 | | | |
+------------------+----------+--------------+------------------+-------------------+
- 配置从服务器
修改从 MySQL 配置文档
/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段添加以下配置:
[mysqld]
server-id = 2
relay_log = slave-relay-bin
- 在从服务器配置主从复制
mysql>change master to
master_host='mysql_master',
master_user='slave',
master_log_file='mysql-bin.000008',
master_log_pos=419,
master_port=3306,
master_password='root';
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
参数解释:
master_host='mysql_master' // 这里填 master 主机 ip
master_log_file='mysql-bin.000008', // 这里填写 File 的值
master_log_pos=419,// 这里填写 Position 的值。
mysql> start slave;// 启动从服务器复制功能
如果想要重新配置,可以通过sql stop slave;
注意:master_host='mysql_master' 中的'mysql_master' 这里本应该使用ip,但是在docker-compose容器d中其系统内部会自动将'mysql_master'映射为ip,如果希望使用IP,则可以通过一下命令获得主服务器的ip:192.168.224.4 。master_port=3306,这里的端口是容器主机的IP,并不是挂载主机的端口。(expose:暴露出容器将要提供服务所开放的端口,指这个主机的端口别人可以使用访问)
# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.224.4 2ce82c08e502
- 查看slave结果
show slave status;
观察:这两个必须是 Yes 为 No 或者 connect 说明没有连接上。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
6.重启两个容器,使配置生效。
总结
一般情况下数据表是不同步的,先各自在 master 和 salve 创建好。 因为一般来说 master 和 slave 的表的存储引擎是不一样的,master 一般用的是 InnoDB,因为它要写数据比较多。 而 slave 表一般用的是 MyISAM 引擎,因为它是没有写数据操作,只有读,用 MyISAM 引擎能大大节省资源,速度也会快一些。(用于读写分离)