docker实现MySQL主从复制(小白向)
1.服务器上安装docker
具体可见黑马程序员的教程
简单说说的话,如下
yum install -y docker
启动docker的方法://centos7及以后版本
systemctl start docker
2.拉取centos镜像
拉取centos镜像
docker pull registry.cn-hangzhou.aliyuncs.com/moensun/centos7
查看docker已有镜像的方法:
docker images
3.有了镜像后 创建docker容器
示例代码
格式:docker run -d --name[容器名字] [–privileged=true] -p [宿主机端口号]:[容器某应用的端口号] [镜像id] /usr/sbin/init
docker run -d --name master --privileged=true 3db94df3e006 /usr/sbin/init
–privileged=true 和 /usr/sbin/init的作用:是让docker有更多的权限,避免启动MySQL的命令失败,如systemctl命令
尤其注意的是,最好在docker run 的时候 就绑定端口,实现端口映射,否则后期要改端口很麻烦
如果迫不得已要改端口,可以参考如下链接,后文也会给出一个可行的解决办法。
(289条消息) 教你如何修改运行中的docker容器的端口映射的三种方式_七月的小尾巴的博客-CSDN博客_docker修改端口映射
4.查看容器列表
可以通过如下命令查看所有容器的名称等信息
docker ps -a
如果不小心装错的镜像或者容器,可以采用如下命令删除
删除镜像
docker rmi 镜像ID
如果要强行删除,可以用如下命令
docker rmi -f 镜像ID
删除容器
docker rm 容器名称
如果要强行删除,可以用如下命令
docker rm -f 容器名称
5.进入、退出、重启容器和docker的方法
进入容器的方法
docker exec -it 容器名称 /bin/bash
进入容器后,会发现 左侧变成了root@容器id
退出容器的方法
exit
重启容器的方法:
docker restart 容器ID
停止容器的方法:
docker stop 容器ID
停止docker的方法:
systemctl stop docker
重启docker的方法:
systemctl restart docker
6.在docker的两个容器中分别安装mysql 5.7
执行如下命令 按顺序
yum -y install wget
wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum install mysql-community-server
遇到询问的地方,直接输入y即可
7.搭建MySQL主从复制
首先,注意要分别进入到两个容器中去,
以进入到一个容器后为例,
启动MySQL
systemctl start mysqld
获取MySQL初始root密码
grep 'temporary password' /var/log/mysqld.log
使用该密码登录MySQL 5.7
mysql -uroot -p[root密码]
设置登录密码和远程访问收授权
mysql>set global validate_password_policy=0;
mysql>set global validate_password_length =1; #前两步都是为了降低密码校验安全度
mysql>set password for'root'@'localhost' =password('123456'); #设置root密码为123456
mysql>grant all privileges on *.* to root@'%'identified by '123456'; #远程访问授权
mysql>flush privileges; #刷新配置
修改MySQL的配置文件my.cnf,两个容器的MySQL配置文件都要改
vim /etc/my.cnf
修改建议如下
[mysqld]
server-id = 2
port = 3306
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
default-storage-engine = InnoDB
log-bin = mysql-bin
log-bin-index = mysql-bin.index
relay-log = mysql-relay
relay-log-index = mysql-relay.index
expire-logs-days = 10
max-binlog-size = 100M
max_binlog_cache_size = 8M
log-slave-updates = 1
binlog_cache_size = 4M
# use MIXED binlog
binlog_format = MIXED
#binlog_format = ROW
#replicate-do-db = db%.%
#replicate-ignore-db = mysql.%
# ignore tables
replicate-wild-ignore-table = mysql.%
sync_binlog = 1
relay_log_recovery = 1
log_slave_updates = 1
skip-name-resolve
sql_mode=STRICT_TRANS_TABLES
[mysqldump]
quick
max_allowed_packet = 32M
注意:建议主mysql的server-id=1 ,从MySQL的server-id=2
server-id 这个千万不能跟别的mysql的配置一样,无论主机还是从机server-id不能相同
主要server-id = 2和log-bin = mysql-bin,一定要配置,其它的可以没有
8.查看容器的ip
在容器中输入
ifconfig
9.配置主机
登录主机的MySQL
mysql -uroot -p123456 #MySQL -uroot -p[root密码]
登录后的操作,
主从复制过程(在主机上操作):
1. 创建同步复制的用户lzf
mysql> create user 'lzf'@'172.17.0.%' identified by 'root';#172.17.0.这块要学会改成 自己的内网ip地址
2. 给同步复制用户lzf赋权
mysql> grant replication slave on *.* to 'lzf'@'172.17.0.%' identified by 'root';
mysql> flush privileges;
3. 开启binlog
配置时候注意几个坑:
Replication-do-db的坑,如果多个库则使用多行Replication-do-db进行配置
Replication-ignore-db的坑,如果忽略多个库则使用多行Replication-ignore-db进行配置
4. 重启mysql
#systemctl restart mysql
查看主库的状态
mysql> SHOW MASTER STATUS
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 619 | | | |
+------------------+----------+--------------+------------------+-------------------+
#记住:File是二进制日志文件名,Position 是日志开始的位置。后面从库会用到
10.配置从机
注意,登录了从机的MySQL再进行下列操作
从机操作
1. Stop slave;
主从复制的最关键语句:
2. Change master to
Master_host=’172.17.0.3’, //主机的IP地址
Master_user=’lzf’,
Master_password=’root’,
Master_log_file=’mysql-bin.000001’,
Master_log_pos=120;
3. Start slave;
如果出现以下错误
Slave is not configured or failed to initialize properly
说明 MySQL的配置文件my.cnf存在问题,建议用上文的
查看从机状态
show slave status\G;
正常的结果应该如下所示
11.测试是否成功
在主机上创建一个数据库
create database lzf;
在主机和从机上,查看数据库集
show databases;
如果看到两边的数据库集发生了同步,那么意味着成功实现了主从复制。
12.番外 navicat远程连接docker上的MySQL
连接名字随便
主机是自己的ip地址,如果是服务器就是公网地址
端口号 是对应容器绑定的宿主机的端口号,如上图所示,是充当从机的容器的3306端口号绑定的宿主机的9027
用户名和密码是数据库root用户的