系统环境
Centos:7.4
Docker:18.09.3
Mysql:8.x
安装Docker
参见:https://blog.csdn.net/yan_dk/article/details/89427641
安装单Mysql
//下载镜像mysql8
#docker pull mysql
#自定义网络
#docker network create --subnet=192.168.10.0/16 mynetwork
//生成容器
docker run -itd \
--net mynetwork \
--ip 192.168.0.3 \
-p 3308:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /vdb1/usr/docker/mysql8/data:/usr/local/mysql/data:rw \
-v /vdb1/usr/docker/mysql8/log:/usr/local/mysql/log:rw \
-v /vdb1/usr/docker/mysql8/config/my.cnf:/etc/mysql/my.cnf:rw \
-v /etc/localtime:/etc/localtime:ro \
--name mysql-v8 \
--restart=always \
mysql:latest
- mysql/data 是数据库文件存放的地方。必须要挂载到容器外,否则容器重启一切数据消失。
- mysql/log 是数据库主生的log。建议挂载到容器外。
- mysql/config/my.cnf 是数据库的配置文件,在下面会放出来。
- /etc/localtime:/etc/localtime:ro 是让容器的时钟与宿主机时钟同步,避免时区的问题,ro是read only的意思,就是只读。
my.cnf内容如下:
[mysqld]
server-id = 1
port = 3306
basedir = /usr/local/mysql8
datadir = /usr/local/mysql8/data
secure-file-priv= NULL
tmpdir = /tmp
socket = /tmp/mysql8.sock
skip_name_resolve = 1
sql_mode=NO_ENGINE_SUBSTITUTION
transaction_isolation = READ-COMMITTED
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
sync_binlog = 20
max_connections=10000
innodb_buffer_pool_size = 24G
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_flush_log_at_trx_commit = 0
innodb_lock_wait_timeout = 120
innodb_max_dirty_pages_pct = 90
event_scheduler=1
lower_case_table_names = 1
log_bin = ON
binlog_format = row
binlog_cache_size = 2M
slow_query_log = ON
general_log = ON
default_authentication_plugin= mysql_native_password
//进入容器
#docker exec -it mysql-v8 /bin/bash
/#cd /usr/local/mysql/data & ls
这是可以看到已经有数据了,再看看宿主机的相应数据目录,也是有相同数据,说明这2个数据已经做了docker的数据卷同步了。
//进入容器后的初始化安装组件
- docker容器内安装yum
#apt-get update
#apt install yum
#apt install wget
#apt install weget
- docker容器内部自行安装vim
使用apt-get install vim
命令安装vim,会出现如下问题:
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vim
执行apt-get update
,然后再次执行apt-get install vim
即可成功安装vim。
注意:使用时,若启用右键鼠标粘贴模式,需要 :set mouse -=a
#stty erase ^H
#stty erase ^?
安装Mysql主从复制
目录规划
Master(主)
配置Master主端同步my.cnf
[mysqld]
...
log_bin = master-bin
#二进制日志记录的数据库(多数据库用逗号,隔开)
binlog-do-db = testdb
#二进制日志中忽略数据库 (多数据库用逗号,隔开)
#binlog-ignore-db =
docker run -itd \
--net mynetwork \
--ip 192.168.10.1 \
-p 3301:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /vdb1/usr/docker/mysql_ms/master/data:/usr/local/mysql/data:rw \
-v /vdb1/usr/docker/mysql_ms/master/log:/usr/local/mysql/log:rw \
-v /vdb1/usr/docker/mysql_ms/master/config/my.cnf:/etc/mysql/my.cnf:rw \
-v /etc/localtime:/etc/localtime:ro \
--name mysql-master1 \
--restart=always \
mysql:latest
//进入容器
#docker exec -it mysql-master1 /bin/bash
//操作mysql
#mysql -h192.168.10.1 -uroot -p123456
Slave(从)
配置Slave从端同步my.cnf
[mysqld]
...
log_bin = slave-bin
#设定需要复制的数据库(多数据库使用逗号,隔开)
replicate-do-db=testdb
docker run -itd \
--net mynetwork \
--ip 192.168.10.2 \
-p 3302:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /vdb1/usr/docker/mysql_ms/slave/data:/usr/local/mysql/data:rw \
-v /vdb1/usr/docker/mysql_ms/slave/log:/usr/local/mysql/log:rw \
-v /vdb1/usr/docker/mysql_ms/slave/config/my.cnf:/etc/mysql/my.cnf:rw \
-v /etc/localtime:/etc/localtime:ro \
--name mysql-slave1 \
--restart=always \
mysql:latest
//进入容器
#docker exec -it mysql-slave1 /bin/bash
//操作mysql
#mysql -h192.168.10.2 -uroot -p123456
mysql主从建立如下:
Master节点配置复制
指定主从用户账户
mysql> CREATE USER 'repl'@'192.168.10.2' IDENTIFIED WITH mysql_native_password BY 'rep123456'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.10.2'; mysql> flush privileges; |
mysql> SHOW MASTER STATUS;
Slave节点上设置主节点参数
mysql> CHANGE MASTER TO MASTER_HOST='192.168.10.1', MASTER_USER='repl', MASTER_PASSWORD='rep123456', MASTER_LOG_FILE='master-bin.000002', MASTER_LOG_POS=155; |
mysql> show slave status\G;
启动主从同步
mysql> start slave;
mysql> show slave status\G;
问题记录
- 问题:主从复制,mysql重启后,重新设置从端,报错ERROR 3021 (HY000): Unknown error 3021
解决:mysql>stop slave; 然后重新执行从端配置语句,再mysql>start slave;
- 问题:主从复制,mysql重启后,主端show master status,报错ERROR 1064 (42000):
解决:重新执行mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.10.12'; mysql> flush privileges;
mysql> show master status;
持续完善,待续...