方案,docker容器化部署主从mysql
centos7.6,docker-1.13.1,mariadb:latestlinux
#yum install yum-utils device-mapper-persistent-data lvm2 -y
#yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#yum install docker-ce -y
# 修改daemon配置文件/etc/docker/daemon.json来使用加速器
#sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://vb10fi3t.mirror.aliyuncs.com"]
}
EOF
#systemctl daemon-reload
#systemctl restart docker
#拉取mariadb镜像
#docker pull mariadb
复制代码
#mkdir -pv /data/mysql/{master/{data,conf},slave/{data,conf}}
#touch /mysql/master/conf/my.cnf
#touch /mysql/slave/conf/my.cnf
#tree mysql
复制代码
......
[mysqld]
server_id = 1
log-bin= mysql-bin
read-only=0
......
复制代码
......
[mysqld]
server_id = 2
log-bin= mysql-bin
read-only=0
......
复制代码
#docker run --name master -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123 -v /data/mysql/master/data:/var/lib/mysql -v /data/mysql/master/conf/my.cnf:/etc/my.cnf --privileged=true -d mariadb
复制代码
#docker run --name slave -p 3309:3306 -e MYSQL_ROOT_PASSWORD=123 -v /data/mysql/slave/data:/var/lib/mysql -v /data/mysql/slave/conf/my.cnf:/etc/my.cnf --privileged=true -d mariadb
复制代码
//进入容器master
#docker exec -it master bash
//登入mysql
#mysql -uroot -p
password:123
//建立一个用户来同步数据,每一个slave使用标准的MySQL用户名和密码链接master。进行复制操做的用户会授予REPLICATION SLAVE 权限。
> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
//建立一个slave同步帐号slave,容许访问的IP地址为%
> grant replication slave on *.* to 'slave'@'%' identified by '123456';
//查看状态,记住File、Position的值,在Slave中将用到
show master status\G
复制代码
//进入容器slave
#docker exec -it slave bash
//登入mysql
#mysql -uroot -p
password:123
//设置主库连接
> change master to master_host='172.17.0.2',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3306;
//启动从库同步
> start slave;
//查看slave状态
show slave status\G
......
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
......
上述两项都为YES 表示主从同步OK
复制代码
若是出现错误,请滑动到最下方问题👇↓sql
centos7.6,docker-1.13.1,mariadb:latestdocker
#docker pull mariadb
复制代码
#mkdir -pv /data/mysql/{master_1/{data,conf},master_2/{data,conf}}
#touch /mysql/master_1/conf/my.cnf
#touch /mysql/master_2/conf/my.cnf
#tree mysql
复制代码
......
[mysqld]
server_id = 1
log-bin= mysql-bin
read-only=0
auto_increment_offset=1
auto_increment_increment=2
......
复制代码
......
[mysqld]
server_id = 2
log-bin= mysql-bin
read-only=0
auto_increment_offset=2
auto_increment_increment=2
......
复制代码
#docker run --name master -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123 -v /data/mysql/master_1/data:/var/lib/mysql -v /data/mysql/master_1/conf/my.cnf:/etc/my.cnf --privileged=true -d mariadb
复制代码
#docker run --name slave -p 3309:3306 -e MYSQL_ROOT_PASSWORD=123 -v /data/mysql/master_2/data:/var/lib/mysql -v /data/mysql/master_2/conf/my.cnf:/etc/my.cnf --privileged=true -d mariadb
复制代码
//进入容器master_1
#docker exec -it master_1
#mysql -u root -p
password:123
//建立一个用户来同步数据.这里表示建立一个slave同步帐号slave,容许访问的IP地址为%,%表示通配符
GRANT REPLICATION SLAVE ON *.* to 'slave'@'%' identified by '123456';
//查看状态,记住File、Position的值
show master status;
复制代码
//进入容器master_2
docker exec -it master_2
#mysql -u root -p
password:123
//设置主库连接,master_host即为容器IP,master_log_file和master_log_pos即为在maseter_2容器中,经过show master status查出来的值;
change master to master_host='172.17.0.2',master_user='slave',master_password='123456',master_log_file='mysql-bin.000005',master_log_pos=536,master_port=3306;
//建立一个用户来同步数据
GRANT REPLICATION SLAVE ON *.* to 'slave'@'%' identified by '123456';
//启动同步
start slave ;
//查看状态
show master status;
复制代码
//进入master_1容器
docker exec -it master_1
#mysql -u root -p
password:123
//设置master_2主库连接,参数详细说明同上
> change master to master_host='172.17.0.3',master_user='slave',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=536,master_port=3306;
//启动同步
> start slave ;
复制代码
> create database demo_03;
> use demo_03;
> create table user_info(name varchar(20),age int);
> insert into user_info values('abc',1000);
> select name,age from userinfo;
复制代码
> select name,age from demo_03.user_info;
复制代码
若是两次数据一致,表示主主同步成功。json
问题一 执行docker run image 使用docker ps 查看,结果并无启动中的容器centos
#docker logs master
find: '/var/lib/mysql/': Permission denied
chown: changing ownership of '/var/lib/mysql/': Permission denied
复制代码
--privileged=true #给容器加上特定权限;解决问题bash
关闭selinux # 我尝试了,没解决问题架构
问题二 Slave_SQL_Running: No
app
方案一 :ide
stop slave ;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave ;
方案二:
查看master状态
show master status;
file项:mysql-bin.000003
进入slave
stop slave;
change master to master_host='master_ip',master_user='user',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=0,master_port=3306;
start slave;