回顾:
我们可以使用docker 配置 mysql 一主多从 复制 虚拟机环境后来实现多主多从数据库环境。
在项目中微服项目出发:一个子项目对应一组主从数据库环境服务器。
平台工具版本
jdk1.8 xshell xftp vmware8.x contos7.x docker20.x mycat 1.7
JDK安装
- 属于一键安装即可(yum安装)
- 手动安装,需要自己去Oracle官网下载需要的jdk版本,然后解压并配置环境。
- contos系统自带JDK openjdk1.8版本
一、yum一键安装
1.首先执行以下命令查看可安装的jdk版本:
java -version
2.选择自己需要的jdk版本进行安装,比如这里安装1.8,执行以下命令:
# 执行以下命令查看可安装的jdk版本:
yum -y list java*
# 执行安装
yum install -y java-1.8.0-openjdk-devel.x86_64
3.安装完成之后,查看安装的jdk版本,输入以下指令:
#查看安装的jdk版本
java -version
#此处便可以看到自己安装的jdk版本信息。这个自动安装把jdk安装到哪里去了,其实你可以在usr/lib/jvm下找到它们。
网络相关问题处理 :防火墙关闭;注意校园网限制
firewall-cmd --state #查看防火墙
systemctl status firewalld #查看防火墙
systemctl stop firewalld #临时关闭防火墙
systemctl start firewalld #临时打开防火墙
systemctl disable firewalld #开机禁止启动防火墙
systemctl enable firewalld #开机启动防火墙
注:防火墙重启会清空docker相关配置,导致在查询防火墙规则的时候显示不到docker的链。导致后面新安装的容器无法成功运行。
链接: docker出现Error response from daemon: driver failed programming external connectivity on endpoint解决方法
安装Mycat中间件
1. 拉取Mycat镜像
# 查询mycat镜像列表,选择星数高
docker search mycat
# 拉取mycat镜像
docker pull longhronshens/mycat-docker
# 查看版本信息
docker image inspect longhronshens/mycat-docker:latest|grep -i version
2. 创建文件目录
#用于保存mycat的主要配置文件命令
mkdir -p /usr/local/mycat
cd /usr/local/mycat
3. 准备挂载的配置文件
上传或拷贝到contos系统下【根据情况修改参数】:/usr/local/mycat目录下
下面详细说明mycat三个配置文件:rule.xml、server.xml、schema.xml
<function name="murmur"
class="org.opencloudb.route.function.PartitionByMurmurHash">
<property name="seed">0</property><!-- 默认是0 -->
<property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
<property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
<!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->
<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property>
用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
</function>
server.xml,增加mycat连接账户信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
<property name="useHandshakeV10">1</property>
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="sequnceHandlerType">2</property>
<property name="subqueryRelationshipCheck">false</property>
<property name="handleDistributedTransactions">0</property>
<property name="useOffHeapForMerge">1</property>
<property name="memoryPageSize">64k</property>
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<property name="systemReserveMemorySize">384m</property>
<property name="useZKSwitch">false</property>
<property name="strictTxIsolation">false</property>
<property name="useZKSwitch">true</property>
</system>
<user name="mycat" > <!--开放给程序员使用的账户-->
<property name="password">123</property>
<property name="schemas">bmp1907</property> <!--逻辑库名称,暴露给程序员-->
</user>
<user name="mycatread"> <!--只读用户-->
<property name="password">123</property>
<property name="schemas">bmp1907</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
schema.xml,配置mysql主从物理数据库
前提是根据上一节实验配置好主从,url对应的是上面查询的每个mysql容器的ip,注意对应关系即可:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- name =bmp0108 :表示mycat的逻辑数据库名称
当schema节点没有子节点table的时候,一定要有dataNode属性存在(指向mysql真实数据库),
-->
<schema name="bmp1907" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
<!--指定master的数据库db1 暴露给程序员使用-->
<dataNode name="dn1" dataHost="bmphost" database="bmp"/> <!--物理数据库结点,dataHost物理服务器,database真实的物理库-->
<!--用户界面看到数据库名叫bmp0108,后台真实数据库名为bmp-->
<!-- <dataNode name="dn2" dataHost="bmphost" database="myitem1001"/> -->
<!--指定master的ip -->
<dataHost name="bmphost" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<!--表示mysql的心跳状态-->
<heartbeat>select user()</heartbeat>
<!-- master负责写 -->
<writeHost host="hostM1" url="192.168.232.128:3377" user="root" password="123">
<!--slave负责读-->
<readHost host="hostS2" url="192.168.232.128:3378" user="root" password="123"></readHost>
</writeHost>
</dataHost>
</mycat:schema>
配置说明
设置 dataHost标签两个属性: balance="1"与writeType="0"
Balance读操作参数设置:
balance=“0”, 所有读操作都发送到当前可用的writeHost上。
balance=“1”,所有读操作都随机的发送到readHost。
balance=“2”,所有读操作都随机的在writeHost、readhost上分发
WriteType写操作参数设置:
writeType=“0”, 所有写操作都发送到可用的writeHost上。
writeType=“1”,所有写操作都随机的发送到readHost。
writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。
设置 switchType="2" 与slaveThreshold="100"
switchType 目前有三种选择:
-1:表示不自动切换
1 :默认值,自动切换
2 :基于MySQL主从同步的状态决定是否切换
“Mycat心跳检查语句配置为 show slave status
dataHost 上定义两个新属性: switchType="2" 与slaveThreshold="100",此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制。
Mycat心跳机制通过检测 show slave status 中的
"Seconds_Behind_Master",
"Slave_IO_Running",
"Slave_SQL_Running"
三个字段来确定当前主从同步的状态以及Seconds_Behind_Master主从复制时延。
rule.xml:基本不用修改,直接使用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="userrule">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<tableRule name="categoryrule">
<rule>
<columns>id</columns>
<algorithm>jump-consistent-hash</algorithm>
</rule>
</tableRule>
<function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash">
<property name="seed">0</property><!-- 默认是0 -->
<property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
<property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
<!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->
<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property>
用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
</function>
<function name="crc32slot" class="io.mycat.route.function.PartitionByCRC32PreSlot">
<property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
</function>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
</function>
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">4</property>
</function>
<function name="func1" class="io.mycat.route.function.PartitionByLong">
<property name="partitionCount">8</property>
<property name="partitionLength">128</property>
</function>
<function name="latestMonth"
class="io.mycat.route.function.LatestMonthPartion">
<property name="splitOneDay">24</property>
</function>
<function name="partbymonth" class="io.mycat.route.function.PartitionByMonth">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2019-01-01</property>
</function>
<function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
<property name="mapFile">partition-range-mod.txt</property>
</function>
<function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
<property name="totalBuckets">4</property>
</function>
</mycat:rule>
4.启动mycat中间件程序
docker 启动mycat容器,加载上面配置好的文件
# 启动mycat中间件
docker run --name mycat0108 -v /usr/local/mycat/schema.xml:/usr/local/mycat/conf/schema.xml -v /usr/local/mycat/rule.xml:/usr/local/mycat/conf/rule.xml -v /usr/local/mycat/server.xml:/usr/local/mycat/conf/server.xml --privileged=true -p 8066:8066 -p 9066:9066 -e MYSQL_ROOT_PASSWORD=1234qwer! -d longhronshens/mycat-docker
---------------------------------------
#【验证和异常操作说明】
# 查看执行中的容器,执行多次来检察容器是正常启动状态
#【闪退】 可能有闪退情况,可多次执行验证,容器状态和端口
docker ps
#【错误处理】看看mycat日志是否启动成功
docker logs -f mycat0108XXX
# 【错误处理】: 强删除容器 !!! 【慎重】
docker rm -f mycat0108
-p 8066:8066:把容器8066端口映射到宿主机的8066端口;
-v /usr/local/mycat/schema.xml:/usr/local/mycat/conf/schema.xml:虚拟机上配置文件挂载到容器内部中覆盖。
5.测试阿里中间件mycat 操作表和数据
在navicat 主库连接中: 新建数据库db190x db190x,与上面schema.xml中dataNode中database的参数值一致。
6、创建mycat连接
使用navicat连接-阿里中间件mycat
1.在主库上创建db190x,db190x 两个数据库,开放给微服应用
2.新建navicat连接“阿里中间件mycat“(用户密码mycat/123qwer!)
2.1查看投影出这两个数据库(b190x,db190x)
3.在投影库创建表结构book表,增加三个字段,增加三条数据
4.在主库连接中查看验证book表结构和数据
5 在从库连接中查看和验证book表结构和数据