一、首先安装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.xml | MyCat的配置文件,设置账号、参数等 |
schema.xml | MyCat对应的物理数据库和数据库表的设置 |
rule.xml | MyCat分片(分库分表)规则 |
wrapper.conf | MyCat启动日志信息 |
配置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 |
sqlMaxLimit | select 时默认的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"
;而user
与password
两个属性的属性值设置为连接主数据库的用户名和密码;同时,需要将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以上的,相对来说比较简单,不用修改太多配置文件】
现在就先讲到这里,这里出现的问题,后续我会补上,欢迎大家观看学习!!!