您的位置:首页 > 运维架构 > Docker

docker mysql 主从复制实践(亲测可行)

2017-09-16 18:15 816 查看

容器内修改配置模式

1、 假设读者docker已经在centos6.5(或者其他操作系统)上安装好

检测版本:

docker -v
Docker version 1.7.1, build 786b29d/1.7.1


2、 拉取镜像

docker pull hub.c.163.com/library/mysql:5.7 # 或其他地方拉取
docker images  #查看是否有镜像列表


3、启动一个mysql容器

在宿主机路径下新建一个目录用来和docker容器共享数据:

mkdir –p /home/mysql/master-data


启动容器:

docker run \
--name=mysql-master \
-v /home/mysql/master-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD='123456' \
-d hub.c.163.com/library/mysql:5.7


–name=指定容器名字

-v 宿主机路径:容器内路径

-e 环境变量

-d detach模式

注:宿主机路径必须事先存在

4、配置master

如何进入刚刚启动的那个容器?

docker exec -it mysql-master bash


这样就进入到一个装好mysql的容器中了,你可以执行命令试试:

mysql –u root –p
输入密码
show databases;
use mysql;
show tables;
exit;


现在我们要修改下mysql的配置,作为master

cd /etc/mysql/conf.d


在这个目录下修改或者新增master.cnf(用vi命令)

由于mysql官方镜像没有安装vi,我们还需先安装:

apt-get update && apt-get install vim


安装好后,执行:
vi master.cnf


输入内容如下:

[mysqldump]
user=root
password='123456'
[mysqld]
max_allowed_packet=8M
lower_case_table_names=1
character_set_server=utf8
max_connections=900
max_connect_errors=600
server-id=1
log-bin=mysql-bin

slow_query_log=1
long_query_time=1
log_error


5、重启master并授权slave

回到宿主机上执行:

docker restart mysql-master


再次进入容器,登录mysql,

(

mysql –u root –p
输入密码


)

执行下列语句:

授权slave可以进行数据的复制:
GRANT REPLICATION SLAVE ON *.* TO 'rep1'@'%' IDENTIFIED BY '123456';


把在任意对象上的复制权限授予来自任何ip的rep1账户,其使用的密码是123456

查看并记录主mysql信息:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)


记下file和position的值.

6、回到宿主机,启动另一个容器

同第3步:

在宿主机路径下新建一个目录用来和docker容器共享数据:

mkdir –p /home/mysql/slave1-data


启动容器:

docker run \
--name=mysql-slave1\
-v /home/mysql/ slave1-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD='123456' \
-d hub.c.163.com/library/mysql:5.7


注:
--link mysql-master:master
链接到主mysql。主mysql的容器地址可以用master表示。

7、配置slave,同第4步,进入到mysql-slave1

cd /etc/mysql/conf.d


vi slave1.cnf
输入如下内容:

[mysqldump]
user=root
password='123456'
[mysqld]
max_allowed_packet=8M
lower_case_table_names=1
character_set_server=utf8
max_connections=900
max_connect_errors=600
server-id=2
log-bin=mysql-bin

slow_query_log=1
long_query_time=1
log_error


然后退回到宿主机重启:

docker restart mysql-slave1


这时MySQL的主从服务器都在运行中,需要读者自行保证两边的数据相同。只有当两台服务器的数据都一样的时候,才能建立主从复制连接。

8、配置从库连接主库, 再次进入slave容器,登录mysql,在从库上执行

mysql> change master to
master_host=’master’,
master_port=3306,
master_user=’rep1’,
master_password=’123456’,
master_log_file='mysql-bin.000003', master_log_pos=437;


最后两项

MASTER_LOG_FILE
MASTER_LOG_POS
就是刚才我们在master(show master status)上记录下来的值

然后在从库启动 slave 线程开始同步

mysql>START SLAVE;


在从库 查看同步状态

mysql>show slave status;


如果看到
Slave_Io_State
字段有 :

Waiting for master to send event ...


那就成功了 ! ! !

9、验证

只要在主服务器数据库插入或修改数据,就可以自动复制到从服务器上了

数据卷的使用

在第3和第6步中,我们都是进入容器去编辑配置文件,实际上,也可以在宿主机上写好配置文件然后共享给容器,这样可以不用在容器里面去写配置文件,也不用切来切去如下:

宿主机:

mkdir –p /root/mysql-master/cnfdir
vi /root/mysql-master/cnfdir/master.cnf


键入如下内容:

[mysqldump]
user=root
password='123456'
[mysqld]
max_allowed_packet=8M
lower_case_table_names=1
character_set_server=utf8
max_connections=900
max_connect_errors=600
server-id=1
log-bin=mysql-bin

slow_query_log=1
long_query_time=1
log_error


然后通过共享数据卷的形式,传入配置文件:

启动MySQL容器并挂载宿主机共享数据卷到容器

docker run \
--name mysql-master2 \
-e MYSQL_ROOT_PASSWORD='123456' \
-v /root/mysql-master/datadir/:/var/lib/mysql/  \
-v /root/mysql-master/cnfdir/:/etc/mysql/conf.d/ \
-d 573ca163b053


注意
-v /root/mysql-master/cnfdir/:/etc/mysql/conf.d/


Slave是类似的:

mkdir –p /root/mysql-slave1/cnfdir
vi /root/mysql-slave1/cnfdir/slave1.cnf


键入以下内容:

[mysqldump]
user=root
password='123456'
[mysqld]
max_allowed_packet=8M
lower_case_table_names=1
character_set_server=utf8
max_connections=900
max_connect_errors=600
server-id=2
log-bin=mysql-bin

slow_query_log=1
long_query_time=1
log_error


然后启动slave1:

docker run \
--name mysql-slave1 \
-e MYSQL_ROOT_PASSWORD='123456' \
-v /root/mysql-slave1/datadir/:/var/lib/mysql/  \
-v /root/mysql-slave1/cnfdir/:/etc/mysql/conf.d/ \
—link mysql-master2:master \
-d 573ca163b053


两个库都启动了,进入主库去授权、查看日志文件名和位置;进入从库去连接主库并且开启同步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql docker