利用docker实现mysql主从同步/读写分离
为了保证数据的完整和安全,mysql设计了主从同步,一个挂掉还可以用另个。最近重构论坛,想来改成主从吧。担心失误,就先拿docker练练手。
有错误或者不理解的地方,可以联系本人邮箱sunhaokk@qq.com。
通过本文实际你会操作到。
- mysql的主从同步
- docker镜像和容器的创建
- docker容器间的数据传递
- mycat入门
以下需要大于100的智商和mysql基础docker基础,linux基础。
没有也没事,就是看着会有点吃力。
环境是centos,mycat是1.6.docker是1.12.6
下载mysql镜像。
docker pull mysql
ps:如果下载太慢,请添加腾讯源,依次执行
|
|
|
|
|
|
或者直接去阿里仓库下https://dev.aliyun.com/search.html把上面的--registry-mirror=https://mirror.ccs.tencentyun.com换成你的专属源就可以
下载完输入
docker images
|
|
利用mysql镜像,创建用于主从同步的两个新镜像。
我们当前所在的服务器叫宿主服务器,
我们要利用docker 虚拟两个docker容器服务器,一个主服务器,一个从服务器。
创建master(主)和slave(从)两个文件夹
/usr/mysql/master
/usr/mysql/slave
在master和slave文件夹下 创建 Dockerfile 内容为
|
|
在master文件夹下 创建 my.cnf 内容为
|
|
在slave文件夹下 创建 my.cnf 内容为
|
|
切换到master目录下构建master/mysql镜像
docker build -t master/mysql .
(命令最后有个.,不要忘记,代表当前目录)
然后切换到slave目录下构建slave/mysql镜像
docker build -t slave/mysql .
(命令最后有个.,不要忘记,代表当前目录)
查看是否创建成功
|
|
用镜像创建容器
|
|
从这里开始,建议打开两个终端窗口,方便操作。
master终端执行
|
|
输入密码mysql进入到mysql环境
slave终端执行
|
|
输入密码mysql进入到mysql环境
mysql主从配置
mysql配置
在主容器mysql中输入以下命令:
|
|
然后查看主容器数据库状态:
|
|
记录File 的值和Position的值。
下面要用到,到这里为止,主库千万不要再做任何操作,防止状态改变。
然后我们配置一下从库
查看master/mysql的对外端口号
|
|
0.0.0.0:32768->3306/tcp其中32768为master的端口
|
|
master_host=’x.x.x.x’ //这里填master主机ip
master_log_file=’mysql-bin.000003’, //这里填写File 的值
master_log_pos=1338,//这里填写Position的值。
mysql> start slave;//启动从服务器复制功能
如果不小心配置错,输入mysql> stop slave;然后重新录入一遍
|
|
就可以了
检查主从连接状态
|
|
这两个必须是Yes 为No 或者connect说明没有连接上
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
测试主从连接
注意设置主从后,操作只能在master终端上,slave上的操作不会同步到master上。
登陆master终端,
|
|
登陆slave服务器
|
|
如果主服务器已经存在应用数据,则在进行主从复制时,需要单独复制处理(注意此操作,如果对从服务器单独录入的数据,会被覆盖掉。):
这里我们做一次完整的测试
(1)在主服务器数据库插入新的数据,并进行锁表操作,不让数据再进行写入动作
|
|
(2)退出mysql,用mysqldump备份数据文件到/var/lib,然后顺便多余的用tar打包一下玩。哈哈。
|
|
(3)打开宿主服务器,复制mysql主服务器文件sunhao.dump.tar。到宿主服务器
|
|
解释:docker cp 980e:/var/lib/sunhao.dump.tar /var/mydata/
980e是980e5ea48152的缩写。保证不重复简写就可以
980e:/var/lib/sunhao.dump.tar 意思就是选中的容器下面你的文件下的sunhao.dump.tar文件
/var/mydata/ 目标文件
(4)在宿主主机上输入
[root]# docker cp /var/mydata/sunhao.dump.tar 8d1e3b87d49936414c0e91ffdc60a054e7f4ef8b15baee295350565519abba0e:/var/lib/
(5)在从服务器上输入
|
|
(6)在从服务器上输入
|
|
如果写入成功,这个时候就可以用select查询到数据。
(2)取消主服务器数据库锁定
mysql> UNLOCK TABLES;
docker搭建mycat读写分离
制作mycat容器,并运行
首先在本地新建个文件夹/usr/mycat。然后去mycat官网下载最新版本,这里我下载的是1.6版本。安装完解压到这里。
http://dl.mycat.io/
[http://dl.mycat.io/1.6-RELEASE/](http://dl.mycat.io/1.6-RELEASE/ "http://dl.mycat.io/1.6-RELEASE/")
编写Dockerfile,内容为
|
|
先别急着构建镜像,我们先修改下mycat的配置文件。
[root@centos mycat]# ll
total 15324
-rw-r--r-- 1 root root 357 Jul 5 15:26 Dockerfile
-rw-r--r-- 1 root root 15662280 Jul 3 15:07 Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
drwxr-xr-x 7 root root 4096 Jul 5 15:27 mycat
在我用的1.6版本。mycat对外端口是注释掉的。我们要打开下。我们编辑/usr/mycat/mycat/conf/server.xml.找到第32-35行。去掉注释符号。
<!--
<property name="serverPort">8066</property> <property name="managerPort">9066</property>
<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
我们往下看 有这么几句。这里分别默认两个用户。 name为root的管理员,可以进行读写。和普通用户只能进行读。我们也可以手动创建修改,另外password是密码 schemas是用户所能操作的库。 在这里我什么都没有改。下面都是默认。
|
|
我们编辑/usr/mycat/mycat/conf/schema.xml,这个是我们配置分片和逻辑库表,规则的地方,数据节点,和数据源。其中schema是我们所操作的逻辑库。默认为TESTDB。下面分别是各个逻辑表。在这里直接默认。我只是为了区分dh和db两个字的区别,把db1-3改了data1-3你们可以不用管。
|
|
修改37-45行 /usr/mycat/mycat/conf/wrapper.conf。设置java虚拟机内存。
|
|
在schema.xml往下修改。43-55行。数据源地址dataHost。这些就是我们的数据源,mycat把逻辑表的数据,读写都来源于我们配置地址。其中
writeHost写入源。设置多个,默认也只用第一个。readHost是读服务器。heartbeat是我们检测数据库是否正常运行的。
在这里 mycat 有两种配置方式。
分别是两个writeHost和一个writeHost一个readHost
第一种如果写入失败,还是可读。
第二种如果写入失败,不可读。
我们采用安全稳妥的方式。一个writeHost一个readHost
我的配置为
<dataHost name="localhost1" maxCon="1000" minCon="20" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="115.159.124.18:32768" user="root" password="mysql">
<!-- can have multi read hosts -->
<readHost host="hostS1" url="115.159.124.18:32769" user="root" password="mysql" />
</writeHost>
</dataHost>
hostM1和hostS1分别对应我们创建的两个docker容器的对外端口。
修改/usr/mycat/mycat/conf/log4j2.xml 这个是配置日志文件的,我们打开debug方便我们学习。修改第25行info为debug
|
|
构建镜像
|
|
运行创建容器
|
|
就那么简单。我们的mycat已经搭建成功了。测试下吧打开4个终端
1个宿主,1个mysql主,1个mysql从,1个用来看mycat日志。
宿主环境操作
在宿主终端上,安装mysql。并且连接我们的mycat。
|
|
完美,Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server 出现这,说明mycat运行了。
进行简单的操作。
|
|
测试下写入
|
|
分别进入mysql主和mysql从可以看到。
|
|
测试读取分离
打开一个终端,用
docker exec -it 61e74eee274d9d0f0404a572dec1d14c8b03dfd480e13d3c96fa04c534df0556 bash
进入我们的mycat容器
其中61e74为你的mycat容器
这个就是我们的日志终端
|
|
在宿主环境mycat下
输入
|
|
然后切回我们的日志终端,按ctrl+c中断。
然后输入cat tail 进行查看,很长在最后面找个空白的大坑(自己体会)慢慢找。
|
|
如果配置不小心错了,可以用docker cp 复制到镜像里,然后重启镜像
|
|