Bootstrap

基于mycat实现数据库的读写分离

一、mycat分布式存储服务部署

1. 安装java运行环境(db01)
[root@db01~]# yum install -y java

2. 下载、解压mycat包
# 上传解压mycat程序包
[root@db01 ~]# tar xf Mycat-server-1.6.7.4-release-20200105164103-linux_.tar.gz  -C /usr/local/
[root@db01 ~]# ll /usr/local/mycat
# 配置服务程序环境变量
[root@db01~]# vim /etc/profile
export PATH=/usr/local/mycat/bin:$PATH
[root@db01~]# source /etc/profile

3. 运行启动服务程序并测试连接mycat:
[root@db01~]# mycat start
[root@db01~]# mysql -uroot -p123456 -h 127.0.0.1 -P8066
或者
[root@db01~]# mysql -uroot -p123456 -h 127.0.0.1 -P8066 --default-auth=mysql_native_password
-- 有可能会出现连接不上的情况,因为mycat程序库中,使用的java连接驱动器版本为5.1版本,和数据库8.0可能有兼容问题
[root@db01~]# cp mysql-connector-java-8.0.21/mysql-connector-java-8.0.21.jar /usr/local/mycat/lib/
[root@db01~]# mycat restart
-- 可以进行mycat连接驱动更新操作,可以解决mycat连接问题

二、mycat实现读写分离

1.程序目录配置说明

目录信息解释说明文件信息解释说明
bin程序脚本目录
conf配置文件目录schema.xml管理节点信息配置文件(主配置文件) 节点信息、读写分离、高可用设置、调用分片策略...
rule.xml定义分片规则配置文件(分片策略定义、功能使用方法)
server.xml服务功能本身配置文件(服务有关配置) 用户、网络、权限、策略、资源...
xx.txt分片参数定义文件
log4j2.xml相关日志记录配置
lib驱动程序目录
logs日志文件目录wrapper.log服务运行启动日志文件
mycat.log服务运行情况日志文件

2.schema.xml 配置文件(实现读写分离)

[root@db01 ~]# cd /usr/local/mycat/conf/
[root@db01 conf]# vim schema.xml
# 逻辑库schema部分
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

   <schema name="cqshzl" checkSQLschema="false" sqlMaxLimit="100" dataNode="node_cqshzl"></schema>
   -- schema表示mycat逻辑库
   <schema name="proc_t" checkSQLschema="false" sqlMaxLimit="100" dataNode="node_proc_t"></schema>
   <dataNode name="node_cqshzl" dataHost="host_cqshzl" database="cqshzl" />
    -- database 指向真实的数据库
   <dataNode name="node_proc_t" dataHost="host_cqshzl" database="proc_t" />
   <dataHost name="host_cqshzl" maxCon="4000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
      <heartbeat>select user()</heartbeat>
      <writeHost host="hostM1" url="172.16.130.8:3306" user="jczz" password="12366">
	      <readHost host="hostS1" url="172.16.9.233:3306" user="jczz" password="12366"></readHost>
	      <readHost host="hostS2" url="172.16.10.176:3306" user="jczz" password="12366"></readHost>
	      <readHost host="hostS3" url="172.16.130.11:3306" user="jczz" password="12366"></readHost>
     </writeHost>
   </dataHost> 
</mycat:schema> 

schema区域配置文件说明:

配置参数配置方法解释说明
checkSQLschemacheckSQLschema=true表示检查是否使用数据库.表的方式调取数据信息
checkSQLschema=false表示忽略检查使用数据库.表的方式调取数据信息(默认已经进入到指定库中了)
sqlMaxLimit数值信息表示实现分片功能的行数限制(也可以理解为是分页功能)
dataNode字符信息表示逻辑数据库需要连接访问的后端节点信息

dataNode区域配置文件说明:

配置参数配置方法解释说明
name字符信息表示自定义的后端节点名称(与schema中的dataNode配置要相同)
dataHost字符信息表示自定义的后端主机组或实例组名称
database字符信息表示指定需要访问后端的真实数据库信息

dataHost区域配置文件说明:

配置参数配置方法解释说明
name字符信息表示自定义的后端主机组或实例组名称(与dataNode中的dataHost配置要相同)
maxCon数值信息表示服务承载的最大并发连接数(单节点 写-500~100 读-1000~10000)
minCon数值信息表示服务预先准备的连接池数量,当服务启动之后,在后端节点上自动开启的连接线程 当释放连接资源的最低值,预先准备好连接资源可以减少CPU计算压力 在数据库主节点上,可以使用show processlist命令查询到,已经准备好的sleep连接信息(通常20~50)
balance指定数值表示指定读操作的负载均衡类型,目前的应用取值有三种: 当数值为0,不开启读写分离机制,所有读操作都发送到当前可用的writeHost上; 当数值为1,全部的readHost与standby writeHost参与select语句的负载均衡 简述:当双主双从模式(M1-S1,M2-S2,M1与M2互为主备),M2 S1 S2都参与select语句的负载 当数值为2,所有读操作都随机的在writeHost、readHost上分发
writeType布尔信息表示指定写操作的负载均衡类型,目前的应用取值有两种: 当数值为0时,所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost 重新启动后已切换后的为主,切换信息记录在配置文件中(dnindex.properties) 当数值为1时,所有写操作都随机的发送到配置writeHost节点上(不推荐使用)
switchType数值信息表示主节点故障切换的方式设定 当数值为-1时,表示不自动切换; 当数值为1时,表示默认值设置,会实现自动切换; 当数值为2时,基于mysql主从同步的状态决定是否切换,心跳语句为show slave status,进行datahost切换
tempReadHostAvailable布尔信息当数值设置为1时,表示1主1从时(1个writehost,1个readhost时) 可以开启此参数,表示写节点故障时,对应读节点依然可以正常工作; 当数值设置为0时,如果2主2从时(2个writehost,2个readhost时) 可以关闭此参数,表示写节点故障时,对应读节点随之停止正常工作;

3.server.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <system>
        <property name="useHandshakeV10">1</property>
        <property name="useOffHeapForMerge">0</property>
    </system>
   <!-- 指定mycat要连接的用户名和密码,以及需要展示的数据库,展示的数据库需要与schema配置文件中schema对齐 -->
    <user name="jczz" defaultAccount="true">
        <property name="password">12366</property>
        <!--<property name="schemas">TESTDB</property>-->
        <property name="schemas">cqshzl,proc_t</property>
        <property name="defaultSchema">cqshzl</property>
    </user>
</mycat:server>

3.mycat实现读写分离

1.配置文件修改
[root@db01 conf]# vim schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

   <schema name="cqshzl" checkSQLschema="false" sqlMaxLimit="100" dataNode="node_cqshzl"></schema>
   -- schema表示mycat逻辑库
   <schema name="proc_t" checkSQLschema="false" sqlMaxLimit="100" dataNode="node_proc_t"></schema>
   <dataNode name="node_cqshzl" dataHost="host_cqshzl" database="cqshzl" />
    -- database 指向真实的数据库
   <dataNode name="node_proc_t" dataHost="host_cqshzl" database="proc_t" />
   <dataHost name="host_cqshzl" maxCon="4000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
      <heartbeat>select user()</heartbeat>
      <writeHost host="hostM1" url="172.16.130.8:3306" user="jczz" password="12366">
	      <readHost host="hostS1" url="172.16.9.233:3306" user="jczz" password="12366"></readHost>
	      <readHost host="hostS2" url="172.16.10.176:3306" user="jczz" password="12366"></readHost>
	      <readHost host="hostS3" url="172.16.130.11:3306" user="jczz" password="12366"></readHost>
     </writeHost>
   </dataHost> 
</mycat:schema> 


2. 在db01-3307主节点进行操作
[root@db01 ~]# mysql -S /data/3307/mysql.sock -e "source /root/world.sql"
# 重新加载修改后配置文件或重启mycat
[root@master conf]# mysql -uroot -p123456 -h 10.0.0.51 -P9066
mysql> reload @@config_all;
[root@db01 ~]# mycat restart

3. 读写分离测试操作
[root@db01~]# mysql -uroot -p123456 -h 10.0.0.51 -P8066
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|           9 |
+-------------+
1 row in set (0.05 sec)
-- 测试读效果

mysql> begin;select @@server_id;commit;
+-------------+
| @@server_id |
+-------------+
|           7 |
+-------------+
1 row in set (0.00 sec)
-- 测试写效果

三、mycat运行维护

[root@db01 ~]# mysql -uroot -p123456 -h 10.0.0.51 -P9066
mysql> show @@help;
-- 获取查看帮助信息
mysql> show @@server;
-- 查看mycat服务状态情况
mysql> show @@datanode;
-- 查看分片信息情况
mysql> show @@datasource;
-- 查看数据源信息
mysql> reload @@config;
-- 重新加载配置信息-schema.xml
mysql> reload @@config_all;
-- 重新加载配置信息-所有配置重新加载

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;