主要配置文件:
server.xml
端口,选举主键生成方式,虚拟逻辑库,虚拟账户
schema.xml
数据库连接,切分规则
rule.xml
每个表的切分规则
mycat不存储数据,不执行sql语句,仅sql路由转发
mycat会把自己虚拟成mysql数据库,用navicat访问mycat就和访问数据库一样
安装mycat
在每个节点上进行安装
安装JDK镜像
docker pull adoptopenjdk/openjdk8
docker tag adoptopenjdk/openjdk8 openjdk8
docker rmi adoptopenjdk/openjdk8
创建Java容器,在数据卷放入MyCat
-it 是放在后台运行暂时不会退出
mycat要用docker主机的网络,要不然连接不上数据库
docker run -d -it --name mycat1
-v mycat1:/root/server --privileged
--net=host
openjdk8
docker run -d -it --name mycat1 -v mycat1:/root/server --privileged --net=host openjdk8
开发linux主机8066和9066端口
firewall-cmd --zone=public --add-port=8066/tcp --permanent
firewall-cmd --zone=public --add-port=9066/tcp --permanent
firewall-cmd --reload
docker service restart
把mycat安装包上传到容器数据卷目录
先查看一下数据卷目录
docker volume inspect 容器名
进到目录解压
tar -xvf Mycat.tar.gz
在docker容器就可以看到mycat了
docker exec -it mycat1 bash
cd ~
cd server
ls
mycat 配置pxc集群负载均衡
负载均衡:执行100条sql语句,每个节点执行250条
打开数据卷目录mycat/conf/sever.xml (在最后97)
配置用户名、密码、虚拟数据库名字
<user name="admin" defaultAccount="true">
<property name="password">password</property>
<property name="schemas">neti</property>
</user>
mycat/conf/schema.xml
更改虚拟数据库名字neti,和上面一致
<schema name="neti" checkSQLschema="false" sqlMaxLimit="100">
为分片A 配置pxc集群负载均衡
<dataHost name="pxc1" maxCon="1000" minCon="10"
balance="0"
writeType="1" dbType="mysql" dbDriver="native"
switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="p1w1" url="192.168.31.147:9001"
user="root"
password="abc123456"/>
<writeHost host="p1w2" url="192.168.31.148:9001"
user="root"
password="abc123456"/>
<writeHost host="p1w3" url="192.168.31.149:9001"
user="root"
password="abc123456"/>
<writeHost host="p1w4" url="192.168.31.150:9001"
user="root"
password="abc123456"/>
</dataHost>
为分片B配置pxc集群负载均衡
<dataHost name="pxc2" maxCon="1000" minCon="10" balance="0"
writeType="1" dbType="mysql" dbDriver="native"
switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="p2w1" url="192.168.31.147:9002"
user="root"
password="abc123456"/>
<writeHost host="p2w2" url="192.168.31.148:9002"
user="root"
password="abc123456"/>
<writeHost host="p2w3" url="192.168.31.149:9002"
user="root"
password="abc123456"/>
<writeHost host="p2w4" url="192.168.31.150:9002"
user="root"
password="abc123456"/>
</dataHost>
当balance=0 ,不开启读写分离,所有读操作都发生在当前的writeHost上
当balance=1 ,所有读操作都随机发送到当前的writeHost对应的readHost和备用的writeHost
当balance=2,所有的读操作都随机发送到所有的writeHost,readHost上
当balance=3 ,所有的读操作都只发送到writeHost的readHost上
writeType="0", 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
writeType="1",所有写操作都随机的发送到配置的writeHost。
writeType="2",没实现。
switchtype属性如下(控制自动切换的)
<heartbeat>心跳检测,发生sql语句检测节点是否宕机,sql语句select 1也行,无所谓
主从数据库同步,从库落后主库100s,mycat剔除从节点,不从该节点读数据
slaveThreshold="100"
配置replication读写分离
先学习第一个方案,第二个双rerplication同步再说
如果 replication 写节点宕机,mycat不会从它下面的从节点读数据
<dataHost name="rep1" maxCon="1000" minCon="10" balance="3"
writeType="1" dbType="mysql" dbDriver="native"
switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="r1w1" url="192.168.31.147:9003"
user="root"
password="abc123456">
<readHost host="r1r1" url="192.168.31.148:9003"
user="root"
password="abc123456"/>
<readHost host="r1r2" url="192.168.31.148:9003"
user="root"
password="abc123456"/>
<readHost host="r1r3" url="192.168.31.148:9003"
user="root"
password="abc123456"/>
</writeHost>
</dataHost>
<dataHost name="rep2" maxCon="1000" minCon="10" balance="3"
writeType="1" dbType="mysql" dbDriver="native"
switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="r2w1" url="192.168.31.147:9004"
user="root"
password="abc123456">
<readHost host="r2r1" url="192.168.31.148:9004"
user="root"
password="abc123456"/>
<readHost host="r2r2" url="192.168.31.148:9004"
user="root"
password="abc123456"/>
<readHost host="r2r3" url="192.168.31.148:9004"
user="root"
password="abc123456"/>
</writeHost>
</dataHost>
读节点 放在 写节点里面