• Open-Hours:10 am to 7pm
  • info@themeansar.com

月度归档: 2021 年 8 月

(实战)mycat的安装配置和使用(包含详细说明)

Mycat安装

1. 下载

下载地址:http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/
我这里以linux部署为例

2. 上传安装包

scp Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz root@39.108.xxx.xxx:.usr/local
在这里插入图片描述
我这里是命令上传到linux服务器目录,大家也可以通过工具手工上传,或者直接打开linux用rz上传

3. 解压

tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
在这里插入图片描述

4. mycat目录所有权授权给mycat用户

添加用户:adduser mycat
授权:chown mycat:mycat mycat/

5. 配置环境变量

编辑profile系统文件
vim /etc/profile
文件最后加入这两行

MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin

6. Mycat配置

cd /usr/local/mycat/conf
主要关注一下这三个配置:
在这里插入图片描述
rule.xml 主要是指定各个表的分片算法
schema.xml 配置多节点的信息
server.xml mycat服务配置,账号密码配置

schema.xml

配置文件如下,有详细说明

<mycat:schema xmlns:mycat="http://io.mycat/">

    <!-- scchema名称就是DB名称,dataNode指定当前表的数据节点,和下面的dataNode name必须一致
         rule是分片的规则,我是自己重新定义在rule配置中的crc32slot算法,大家可以使用rule.xml现有的分片算法,部分算法对节点的个数有要求,会导致报错,启动注意查看日志,或者提前看下算法函数-->
    <schema name="et_activity_db" checkSQLschema="true" sqlMaxLimit="100">
        <table name="et_app_t" dataNode="dn1-1,dn2-1" rule="fixedSlot_et_app_t"/>
        <table name="et_handler_t" dataNode="dn1-1,dn2-1" rule="fixedSlot_et_handler_t" primaryKey="id" />
        <table name="et_task_t" dataNode="dn1-1,dn2-1" rule="fixedSlot_et_task_t" primaryKey="id"/>
    </schema>
    <schema name="mysql" checkSQLschema="true" sqlMaxLimit="100">
        <table name="user" dataNode="dn1-2,dn2-2" rule="auto-sharding-long"/>
    </schema>

    <!-- 多节点定义,dataHost指定数据源配置,和下面的dataHost name必须保持一致
        database必须在数据源中存在,否则启动会报错-->
    <dataNode name="dn1-1" dataHost="pzx" database="db1"/>
    <dataNode name="dn1-2" dataHost="pzx" database="db2"/>
    <dataNode name="dn2-1" dataHost="pzx" database="db1-1"/>
    <dataNode name="dn2-2" dataHost="pzx" database="db2-1"/>

    <!--数据源可以配置多个-->
    <dataHost name="pzx" maxCon="1000" minCon="10" balance="0"
                  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
         <heartbeat>select user()</heartbeat>
         <!-- can have multi write hosts -->
         <writeHost host="hostM1" url="替换自己的IP:3306" user="root"
                            password="密码">
                 <!-- can have multi read hosts -->
                 <!-- <readHost host="hostS2" url="192.168.1.200:3306" user="guest" password="123456>" /> -->
         </writeHost>
         <!-- <writeHost host="hostS1" url="localhost:3316" user="root"
                                                 password="123456" /> -->
         <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
    </dataHost>
</mycat:schema>

rule.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
        - you may not use this file except in compliance with the License. - You
        may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
        - - Unless required by applicable law or agreed to in writing, software -
        distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
        WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
        License for the specific language governing permissions and - limitations
        under the License. -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">

    <tableRule name="fixedSlot_et_app_t">
        <rule>
            <columns>app_id</columns>
            <algorithm>crc32slot</algorithm>
        </rule>
    </tableRule>
    <tableRule name="fixedSlot_et_handler_t">
        <rule>
            <!--指定用于计算分片的字段,这样子相同task_id的数据会分配到同一个分片-->
            <columns>task_id</columns>
            <algorithm>crc32slot</algorithm>
        </rule>
    </tableRule>
    <tableRule name="fixedSlot_et_task_t">
        <rule>
            <columns>instance_id</columns>
            <algorithm>crc32slot</algorithm>
        </rule>
    </tableRule>

    <tableRule name="auto-sharding-long">
           <rule>
                    <columns>id</columns>
                    <algorithm>rang-long</algorithm>
            </rule>
    </tableRule>

   <function name="crc32slot"
                    class="io.mycat.route.function.PartitionByCRC32PreSlot">
           <property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
   </function>
   <function name="rang-long"
                      class="io.mycat.route.function.AutoPartitionByLong">
            <property name="mapFile">autopartition-long.txt</property>
    </function>
</mycat:rule>

server.xml

这个文件默认配置都可以直接使用,替换以下部分就行

<user name="root" defaultAccount="true">
                <property name="password">123456</property>
                <property name="schemas">et_activity_db,mysql</property>
                <property name="defaultSchema">et_activity_db</property>
                <!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->

                <!-- 表级 DML 权限设置 -->
                <!--
                <privileges check="false">
                        <schema name="TESTDB" dml="0110" >
                                <table name="tb01" dml="0000"></table>
                                <table name="tb02" dml="1111"></table>
                        </schema>
                </privileges>
                 -->
        </user>

        <user name="user">
                <property name="password">user</property>
                <property name="schemas">et_activity_db</property>
                <property name="readOnly">true</property>
        </user>

7. 启动Mycat

mycat start
在这里插入图片描述
查看启动日志
vim wrapper.log
如果出现此错误,证明没有java环境,安装jdk,配置环境变量即可解决
在这里插入图片描述
启动成功
在这里插入图片描述
ps -ef |grep ‘mycat’
在这里插入图片描述
接下来就可以像mysql一样使用了,用法几乎一样,有少部分mysql语法不支持,不过不影响使用
在这里插入图片描述
命令连接mycat
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201018134140825.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzIyNTgxMw==,size_16,color_FFFF
刚好有一台服务器没有装mycat,我就写了这篇博客帮助大家了解和配置mycat;那么看了之后,你学会了吗?

原创不易,转载请注明原文地址

java多线程的深入理解以及原理解读

一. 为什么需要多线程

这个问题是给基础不扎实的人提的;
原因一首先提一下QPS计算公式(并发数/响应时间(s)),使用多线程就是提升并发数,换句话说就是为了提升QPS;那么多线程越多是不是QPS就越高性能就越好呢?当然不是,分子虽然提高了,但是分母也增大了;多线程的使用会在CPU上开辟一个时间片,会增加上下文切换的耗时;因此多线程也不是越多越好
原因二大部分项目当中如果使用单线程,那么从一个请求进来到响应,只有协议解析和响应后数据处理占用了CPU(先不考虑计算型服务),那么请求发送到服务后,CPU一直处于闲置状态,等待IO/磁盘处理结束;引入多线程后,当程序处理IO时可以要CPU处理其他的事情,等到当前线程需要CPU时再切换回来处理;因此多线程能充分利用CPU来提升性能;这里细心的朋友应该还发现了多线程的一个特点,多线程并不是真正的并发一起执行,而是不同时间片来回切换来执行不同任务,只是cpu处理的效率很快,给人的感觉是同时在执行

二. 如果使用线程池,线程池的线程数怎么设置

关于线程池线程数的设置应该很多地方都有介绍,我相信大家只是看了个结果,不知道原理;我这里就详细介绍一下.
首先提几个关键词,cpu核数、IO密集型服务、计算型密集型服务、阻塞系数=阻塞时间/(阻塞时间+计算时间);

阻塞这里是针对IO来说的,所以阻塞时间就是IO耗时;计算时间级CPU耗时;
然后我再举一个例子,假如一个服务中,阻塞时间50毫秒,计算时间10毫秒,即cpu有50毫秒的时间处于闲置;是不是在这期间cpu可以处理5个这样的请求;再加上第一个请求总共就是处理6个请求。

那么我再提出公式
线程数= ncpu/(1-阻塞系数)
然后把上面的50、10带入进去计算,如果是单核是不是就是6,那么四核就可以设置大概24个线程
上面公式也可以等效成:线程数=ncpu*(1+阻塞时间/计算时间);

看到这里大家应该看懂了怎么计算线程数,可能会提出疑问,为什么网上看到的计算型密集服务的线程数公式=ncpu+1(大家先忽略公式)比IO型服务的设置的线程数要偏少很多呢;那是因为之所以叫计算型服务是因为服务本身大部分都是在计算,而计算是影响CPU的时间,所以一个服务进来几乎都是计算(CPU)耗时,那么大家根据这个特性把上面的阻塞时间改成0,计算时间改成50,带入第一个公式,求出来的话1核就是一个线程数,ncpu+1又是什么道理呢?为什么要+1?带入现实情况中考虑,计算型的服务不可能全部是计算,总会有一部分IO耗时,这个是毋庸置疑的,然后把参数在改一下,IO耗时10,计算耗时50,那么这就对应的上了;所以线程数= ncpu/(1-阻塞系数)这个公式是通用的;同时也得出另一个结论,阻塞系数越大,线程数设置的可以越多,反则设置越少

三. CPU的利用率是怎么计算的,怎么防止CPU过高导致程序奔溃

CPU的使用率=CPU计算时间/CPU计算时间+CPU闲置时间;因此如果CPU计算时间100毫米,闲置时间900毫米,那么利用率就是10%,如果计算时间500毫米,闲置时间0毫米,那么利用率就是100%(系统是统计单位时间内的值);所以随着CPU的不断计算,CPU率也是不断变化的。
CPU过高的话,首先要定位是什么导致的,盲目开辟新的线程,还是程序计算过于复杂,还是不巧当的循环或者死循环;盲目开线程可以用线程池解决,后面这两种就是优化程序了,如果无法优化了,可以使用sleep(0)、sleep(1)这种来解决;可能有人会问sleep(0)这有什么意义,他能优化CPU?当然可以,他虽然是让cpu休眠0毫秒,但是还有一个作用就是会触发cpu时间片的竞争(重新选举),所以就不会出现一个时间片独占整个cpu,导致cpu瞬间飙高;
既然说到这了我就再提一个问题,sleep() 和yield()有什么区别?

  1. 执行sleep()后触发所有时间片一起选举,每个时间片都可能拿到下一次运行权,yield()指挥把执行权交给优先级相同或者更高的
  2. 线程执行 sleep() 进入阻塞状态,执行yield() 方法进入就绪状态
  3. sleep() 声明抛出 InterruptedException;yield() 方法没有声明抛出异常
  4. sleep() 有时间阻塞时间参数;yield() 无参数(直接让出 CPU 的执行权时间由 JVM 控制)

一个个字手敲的,麻烦大家给个赞支持下,谢谢!如有不同意见欢迎评论;

转载请注明出处,原创不易!原文地址