Docker-阿里中间件Mycat环境搭建【实验记录】

回顾:
我们可以使用docker 配置 mysql 一主多从 复制 虚拟机环境后来实现多主多从数据库环境。
在项目中微服项目出发:一个子项目对应一组主从数据库环境服务器。

平台工具版本
jdk1.8 xshell xftp vmware8.x contos7.x docker20.x mycat 1.7

JDK安装

  1. 属于一键安装即可(yum安装)
  2. 手动安装,需要自己去Oracle官网下载需要的jdk版本,然后解压并配置环境。
  3. 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表结构和数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值