docker实现数据库的主从复制

来源:互联网 发布:cv2.calchist python 编辑:程序博客网 时间:2024/06/03 22:54

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、 启动一个容器

在宿主机路径下新建一个目录用来和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 rootp

输入密码

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 rootp

输入密码

)

执行下列语句:

授权slave可以进行数据的复制:

GRANT REPLICATION SLAVE ON *.* TO 'rep1'@'%' IDENTIFIED BY '123456';              

把在任意对象上的复制权限授予来自任何iprep1账户,其使用的密码是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)

 

记下fileposition的值

 

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

docker run --name mysql-slave1  \

--link mysql-master:master \

-v /home/mysql/slave1-data/:/var/lib/mysql/ \

-d mysql镜像id

 

注:--link mysql-master:master \  链接到主mysqlmysql的容器地址可以用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

——

在主库执行 : SHOW MASTER STATUS;命令可以取得

 

对应的字段是 FilePosition

 

配置从库连接主库,登录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 线程开始同步

sql>START SLAVE;

在从库 查看同步状态

sql>show slave status;

如果看到 Slave_Io_State字段有:

Waiting for master to send event ... 

那就成功了 ! ! !

 

8、 验证

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