第一次实现docker实现mysql 主从复制的时候,各种百度,各种热折腾,用了业余几天时间才实现!!现在把实现的详细过程,全部写出来,希望参对大家有所帮助。首先,准备好环境,镜像:CentOS-7-x86_64-DVD-1503-01.iso。用虚拟机安装,我的VMware Workstation14版本,安装虚拟机的过程,我不再这里讨论了。安装好后,如下:
通过ifconfig,不能查询得ip地址,得用ip addr
然后下载xshell,通过它连接虚拟机,方便复制粘贴操作,xshell输入ssh IP地址。
vim 没装,其实vi 也可以用,但vim可以对关键字加亮,所以安装vim ,命令:
yum -y install vim
Rpm方式卸载旧docker
# rpm -qa | grep -i docker //查找已经安装docker
# rpm -e [module1][module2][.....] //卸载docker
yum方式卸载docker
# yum -remove //另外一种卸载docker的方法

退出保存。
启动docker:
systemctl start docker //centos7及以后版本
# service docker start //centos6及之前的版本
查看镜像
docker images
此时没有镜像,抓取镜像:
抓取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/moensun/centos7
创建docker 容器(可以根据一个镜像创建多个容器)
docker run -tid 镜像ID/usr/sbin/init //centos7版本。使用/usr/sbin/init解决systemctl报错不能使用的问题
docker run -tid 镜像ID/bin/bash //非centos7
查看容器列表
docker ps -a
删除镜像
# docker rmi 镜像ID
# docker rmi c862fd4c865c
删除容器
# docker rm 容器名称
# docker rm
Docker文件拷贝(容器<=>docker)
# docker cp 原路径 docker容器路径(系统=》docker)
# docker cpMySQL-server-5.6.38-1.el7.x86_64.rpm mysql_master2:/root/
# docker cp docker容器路径 原路径(docker=》系统)
退出容器
# exit

进入容器
docker exec -it 容器名称 /bin/bash
退出容器的命令是:exit。
接下来,按照这样步骤,再创建一台docker 容器。就是有一台宿主操作系统,然后通过docker,再创建两个docker容器
安装mysql就三个命令就装好了:
# 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
yum -y install wget
如下遇到下图,直接输入:y
安装完成!linux 安装mysql,就三条命令就可以了,前提条件是得有网络,在无网络情况下linux 安装mysql很麻烦也挺困难的。
启动mysql
# systemctl start mysql
登陆mysql
mysql -uroot //默认没有密码
设置mysql初始密码:
mysql> set password = password(‘你的密码’)远程登陆授权
mysql> grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
mysql> flush privileges;
主从复制原理,是通过binlog实现的,如下图
两个docker容器的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
server-id 这个千万不能跟别的mysql的配置一样,无论主机还是从机server-id不能相同
主要server-id = 2和log-bin = mysql-bin,一定要配置,其它的可以没有
查看容器IP:
我以mad_euclid为主机,distracted_wright为从机。
主从复制过程(在主机上操作):
1. 创建同步复制的用户
mysql> create user 'hdg'@'172.17.0.%' identified by 'root';
2. 给同步复制用户赋权
mysql> grant replication slave on *.* to 'hdg'@'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
这个时候就产生binlog了,离成功不远了!
从机操作
1. Stop slave;
主从复制的最关键语句:
2. Change master to
Master_host=’172.17.0.3’, //主机的IP地址
Master_user=’hdg’,
Master_password=’root’,
Master_log_file=’mysql-bin.000001’,
Master_log_pos=120;
3. Start slave;
查看主机状态:
show master status;
查看从机状态:
show slave status\G;
验证,在主机上创建数据库,然后创建表,进行增删改查,会自动同步到从机上,从而实现主从复制!!哈哈,以后出去面试,可以吹牛逼了。现在互联网项目,都是读写分离,高并发解决方案之一。
在主机上创建数据库:
create database hdg;
至此,主从复制功能,全部实现!!!!!
主从复制实现了,主主复制也是一样的,反过来就行可以。