Docker搭建MySql主从复制及分表分库(一)

一、首先安装MySql
1、搜索mysql镜像源
docker search mysql			#搜索mysql镜像

在这里插入图片描述

2、拉取mysql镜像源 【这里以最新版本为咧】
docker pull mysql			#不加版本号,默认最新版本

在这里插入图片描述

3、运行mysql容器
docker run --name master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
解释:

–name:指定容器别名

-p:宿主机端口号:容器内部端口号

-e:指定MySql初始密码

-d:指定容器后台运行

在这里插入图片描述

4、使用Navicat测试连接

这时候我们尝试去客户端工具去连接会报一个错,这是由于mysql8.0以后的版本都会出现这个问题。

如下报错:

在这里插入图片描述

解决方案如下:

进入mysql容器内部:

docker exec -it 镜像ID/名称	/bin/bash		#进入容器

进入mysql:

mysql -uroot -p		#进入mysql中

授权

GRANT ALL ON *.* TO 'root'@'%';

刷新权限

flush privileges;

更新加密规则

ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;

更新root用户密码:

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

刷新权限

flush privileges;

在这里插入图片描述

好了~~~~现在就可以使用客户端工具连接mysql了。

在这里插入图片描述

5、在Navicat中创建新用户并授予权限
#用户名:slave  密码:123456  %为全部ip,可改为指定ip
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
#赋权限给slave用户
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
#刷新权限
FLUSH PRIVILEGES;
#查看所有用户
SELECT * FROM mysql.`user`;

如下图:

在这里插入图片描述

查看数据库状态信息:

#File为日志文件,Position是其位置,后面配置从数据库需要用到
show master status;

在这里插入图片描述

二、配置主MySql运行环境

将docker中主容器内部的my.cnf的配置文件复制到自建的文件目录下:

docker cp master:/etc/mysql/my.cnf /usr/local/mysql/master/my.cnf

在/usr/local/mysql/master下修改my.cnf

#在 [mysqld] 节点最后加上后保存
log-bin=mysql-bin 	#使用binary logging,mysql-bin是log文件名的前缀
server-id=1 	#唯一服务器ID,非0整数,不能和其他服务器的server-id重复

修改完后,将/usr/local/mysql/master下的配置文件覆盖docker中的配置文件

docker cp /usr/local/mysql/master/my.cnf master:/etc/mysql/my.cnf

重启docker中mysql容器

docker restart master		#重启mysql容器
三、创建MySql从容器
docker run --name slave -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
四、配置从MySql运行环境

将docker中从mysql的配置文件复制到自建的文件目录下:

docker cp slave:/etc/mysql/my.cnf /usr/local/mysql/slave/my.cnf

在/usr/local/mysql/slave下修改my.cnf

log-bin=mysql-bin
server-id=2

修改完后,将/usr/local/mysql/slave下的配置文件覆盖docker中的配置文件

docker cp /usr/local/mysql/slave/my.cnf slave:/etc/mysql/my.cnf

重启docker中从mysql容器:

docker restart slave		#重启从mysql容器
五、Navicat连接从容器进行配置

在navicat中执行如下语句:

change master to 
master_host='134.175.206.167',  #master的ip  不能为127.0.0.1   
master_user='slave',       #master的帐号
master_password='123456',   #master的密码
master_log_file='mysql-bin.000002',  #master 查询的file名,上面查询过
master_port=3306,    #master 端口
master_log_pos=1774;   #日志文件位置,上面查询过
start slave; # 启动
show slave status; #查看从容器的状态

在这里插入图片描述

  • Slave_IO_State等于Waiting for master to send event为成功一半了,如果是Connecting to master,测不成功,回头看看是不是配置或者账号密码错了。
  • Slave_IO_Running与Slave_SQL_Running都为Yes,且上述也成功了,则 可以开始测试主从复制了。
接下来测试一下:

在主mysql中创建一个订单数据库:

#创建订单数据库
CREATE DATABASE IF NOT EXISTS `order`;
#查询数据库
SHOW DATABASES;

在这里插入图片描述

然后,在查看从mysql中数据库:

在这里插入图片描述

到这里就能够看出来从mysql与和主mysql完成了主从复制操作。

至此,mysql主从复制已完成!!!


六、我们这里使用MyCat进行读写分离 【分表分库等操作】
1、MyCat

是基于阿里巴巴的Cobar方案优化而来,支持半自动化分片,join。为什么叫"半自动化"呢?因为需要DBA对每个表的分片策略进行配置和干涉。
优点:

  • 功能较丰富,对读写分离和分库分表都有支持;
  • 易用,且对原有的应用系统侵入比较小,系统改造比较易于实现;
  • 支持故障切换;

不足:

  • 在整个系统中,MyCat作为一个单节点来路由其他数据库,在数据库比较多的情况下,MyCat本身的CPU性能压力会越来越大。因此,在生产系统中,MyCat不可避免的会需要一些高可用的手段;
  • 同样,由于MyCat本身需要解析sql,也需要合并各个数据库返回的结果,本身CPU消耗会比较高,当达到一定临界点时,CPU可能会不堪重负。

为此,在数据库较多的情况下,生产环境下的部署可能是这样的:

在这里插入图片描述

2、下载MyCat安装包
#下载mycat
wget http://dl.mycat.io/1.6.6.1/Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
#重命名安装包
mv Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz mycat.tar.gz
#解压mycat压缩包
tar -zxvf mycat.tar.gz 

配置环境变量vim /etc/profile 在文件末尾加入如下代码,并保存:

MYCAT_HOME=/mycat/mycat	
PATH=$MYCAT_HOME/bin:$PATH
export MYCAT_HOME PATH

使配置文件生效source /etc/profile;

3、配置MyCat
MyCat常用配置文件

文件位置都在mycat下的conf目录中:

文件说明
server.xmlMyCat的配置文件,设置账号、参数等
schema.xmlMyCat对应的物理数据库和数据库表的设置
rule.xmlMyCat分片(分库分表)规则
wrapper.confMyCat启动日志信息

配置server.xml

server.xml中主要配置内容如下(此为默认配置),其他部分默认即可

在这里插入图片描述

MyCat将多个MySQL集群整合起来对外提供服务,提供的服务接口仍然采用MySQL的形式。以上为MyCat对外的"虚拟数据库"配置文件。

  • 以上片段为MyCat默认配置的两个虚拟用户,分别为用户名为root和用户名为user的两个虚拟用户;
  • 默认用户为root用户,该用户没有配置readOnly的属性,为此拥有读写权限。而用户名为user的用户配置了readOnly的属性为true,为此只有读权限;
  • root的密码被设置为123456,而user的密码被设置为user
  • 两者使用的都是TESTDB逻辑库,TESTDB逻辑库的配置在schema.xml

以上的用户名和密码我们都可以根据个人需求进行修改。

配置schema.xml

以下为schema.xml默认的配置文件(其实我删了一小部分schema中的table,因为我们目前做的只是读写分离,因此忽略此部分即可):

在这里插入图片描述

简单解释一下上面代码各参数的含义:

参数说明
schema数据库设置,此数据库为逻辑数据库,name与server.xml中的schema对应
dataNodel分片信息,也就是分库相关配置
dataHost物理数据库,真正存储数据的数据库

每个节点的属性详细说明

schema:
属性说明
name逻辑数据库名称,与server.xml中的schema对应
checkSQLschema数据库前缀相关设置,建议看文档,这里暂时设为folse
sqlMaxLimitselect 时默认的limit,避免查询全表
dataNode分表配置
table:
属性说明
name表名,物理数据库中表名
dataNode表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name
primaryKey主键字段名,自动生成主键时需要设置
autoIncrement是否自增
rule分片规则名
dataNode:
属性说明
name节点名,与table中dataNode对应
dataHost物理数据库名,与dataHost中name对应
database物理数据库中数据库名

dataHost

属性说明
name物理数据库名,与dataNode中dataHost对应
balance负载均衡策略,0为不开启读写分离,1为开启读写分离
writeType写入方式
dbType数据库类型
heartbeat心跳检测语句,注意语句结尾的分号要加

详细介绍以下几个属性值:

  • balance="1":全部的readHost与stand by writeHost参与select语句的负载均衡;
  • writeType="0":所有的写操作都发送到配置文件中的第一个writeHost。(注意:第一个writeHost故障切换到第二个后,即使之后修复了仍然维持第二个为写库)。推荐取值为0,不建议修改;
  • switchType="1":1为默认值,即自动切换。

讲了这么多的属性意思,想必大家已经知道需要配置什么了吧!我们可以根据自己的需求来进行配置,那么接下来我以简单的读写分离来示例配置,以下介绍修改的地方:

  • 在以上默认配置文件schema中设置了一个属性dataNode,其中dn1对应部分中的name属性值;同时,将默认设置的table部分注释掉,最终schema剩余部分如下
 <!-- 逻辑数据库配置,name与server.xml中配置的数据库对应  -->
 <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
 <!-- 如果只是做读写分离,那么我们就不需要配置这个table -->
 <!-- <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /> -->
 </schema>

将部分中的database属性值改为我们实际储存数据的数据库名称;默认配置中给我们设置了3个dataNode,本环境中只有一个主数据库和一个从数据库,为此我们只保留一个dataNode,如下

<!-- 其中database是连接数据库的名称,属于真实存在的数据库  -->
<dataNode name="dn1" dataHost="localhost1" database="db1" />
  • 部分的中的host属性值可改可不改,但是url需要改成我们真实数据库的地址,因为我们在主库中进行写操作,为此此处的url改为我们的主数据ip,即url="134.175.xx.xx";而userpassword两个属性的属性值设置为连接主数据库的用户名和密码;同时,需要将balance的属性值改为1,即balance="1",若为0会在测试时发现读写都是在主库执行;
  • 部分设置host属性值可改可不改;而url改为我们的从数据库ip,即url="134.175.yy.yy",user和password设置为连接从数据库的用户名和密码;
  • 此处因为实验环境是一个主数据库,一个从数据库,为此这里只配置了一个WriteHost和一个readHost;在默认的配置文件中可以看到是可以配置多个的,我们将多余的一个writeHost注释或删除掉,最终剩下如下部分
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="134.175.206.167:3306" user="slave"
                                   password="123456">
                        <!-- can have multi read hosts -->
                        <readHost host="hostS2" url="134.175.206.167:3307" user="root" password="123456" />
                </writeHost>
        </dataHost>

log4j2.xml

将日志等级改为debug

<asyncRoot level="debug" includeLocation="true">
            <!--<AppenderRef ref="Console" />-->
            <AppenderRef ref="RollingFile"/>
</asyncRoot>

至此,整体配置已经完成了,我们开始进行测试!

4、测试配置是否成功

开启MyCat
我们要开启MyCat直接输入启动指令即可,后两条指令为我们停止和重启的时候使用;

#切换到安装mycat目录
cd /mycat/mycat/bin
#启动
./mycat start
#停止
./mycat stop
#重启
./mycat restart

查看端口
其中9066为虚拟schema管理端口,用于查看MyCat运行的情况;
其中8066为虚拟schema登录端口,用于SQL管理,跟普通MySQL差不多

netstat -antp	#查看所有运行端口

启动遇见常见问题这边说一下:

1、第一种报错:

在这里插入图片描述

解决方案:

在这里插入图片描述

2、第二种错误:

在这里插入图片描述
解决方案:

解决方法:找到…/mycat/conf/wrapper.conf,修改

wrapper.java.additional.10=-Xmx4G (大约在36行)

wrapper.java.additional.11=-Xms1G

改成:

wrapper.java.additional.10=-Xmx1G

wrapper.java.additional.11=-Xms256M

修改完成后,重新执行./mycat console即可。

3、第三种错误:

在这里插入图片描述

解决方案:

在这里插入图片描述[外链

这些错误是我遇到过的,避免再次入坑!!!

问题解决以后我们可以开始启动mycat服务了。

启动mycat:
./mycat start	#启动mycat

运行端口查看:

在这里插入图片描述

登录MyCat读写分离服务

#9066是管理端口
mysql -u root -p 123456 -h 134.175.206.167 -P 9066

这时你会发现用Navicat连接mycat会报数据源无效问题,其实,不管你用客户端工具还是用命令行连接都会报这个问题。对于这个问题我折腾了两天,终于百翻搜索中找到了答案,是由于我前面在安装mysql版本使用的是最新版,也就是8.0以上的。目前mycat还不完全支持8.0版本以上的mysql,所以这个mycat读写分离,以及分表分库先告一段落,我下一篇会以mysql5.7版本详细的跟大家讲解。【注意:mycat中的 schema.xml文件可以将连接方式native改为jdbc,这种方式是支持mysql8.0以上的,相对来说比较简单,不用修改太多配置文件】

现在就先讲到这里,这里出现的问题,后续我会补上,欢迎大家观看学习!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

架构潜行之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值