MySQL中间件代理服务器MyCat
Mycat
Mycat可以简单概括为
- 一个彻底开源的,面向企业应用开发的大数据库集群
支持事务、ACID、可以替代MySQL的加强版数据库 - 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
- 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
- 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
- 一个新颖的数据库中间件产品
Mycat 官网:
http://www.mycat.io/
Mycat关键特性
- 支持SQL92标准
- 遵守MySQL 原生协议,跨语言,跨平台,跨数据库的通用中间件代理
- 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群
- 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
- 基于Nio实现,有效管理线程,高并发问题
- 支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页
- 支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join
- 支持通过全局表,ER关系的分片策略,实现了高效的多表join查询
- 支持多租户方案
- 支持分布式事务(弱xa)
- 支持全局序列号,解决分布式下的主键生成问题
- 分片规则丰富,插件化开发,易于扩展
- 强大的web,命令行监控
- 支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉
- 支持密码加密
- 支持服务降级
- 支持IP白名单
- 支持SQL黑名单、sql注入攻击拦截
- 支持分表(1.6)
- 集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)
Mycat应用场景
Mycat适用的场景很丰富,以下是几个典型的应用场景
- 单纯的读写分离,此时配置最为简单,支持读写分离,主从切换
- 分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片
- 多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化报表系统,借助于Mycat的分表能力,处理大规模报表的统计
- 替代Hbase,分析大数据
- 作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择
- Mycat长期路线图
- 强化分布式数据库中间件的方面的功能,使之具备丰富的插件、强大的数据库智能优化功能、全面的系统监控能力、以及方便的数据运维工具,实现在线数据扩容、迁移等高级功能
- 进一步挺进大数据计算领域,深度结合Spark Stream和Storm等分布式实时流引擎,能够完成快速的巨表关联、排序、分组聚合等 OLAP方向的能力,并集成一些热门常用的实时分析算法,让工程师以及DBA们更容易用Mycat实现一些高级数据分析处理功能
- 不断强化Mycat开源社区的技术水平,吸引更多的IT技术专家,使得Mycat社区成为中国的Apache,并将Mycat推到Apache基金会,成为国内顶尖开源项目,最终能够让一部分志愿者成为专职的Mycat开发者,荣耀跟实力一起提升
Mycat不适合的应用场景
- 设计使用Mycat时有非分片字段查询,请慎重使用Mycat,可以考虑放弃!
- 设计使用Mycat时有分页排序,请慎重使用Mycat,可以考虑放弃!
- 设计使用Mycat时如果要进行表JOIN操作,要确保两个表的关联字段具有相同的数据分布,否则请慎重使用Mycat,可以考虑放弃!
- 设计使用Mycat时如果有分布式事务,得先看是否得保证事务得强一致性,否则请慎重使用Mycat,可以考虑放弃!
MyCat的高可用性
需要注意: 在生产环境中, Mycat节点最好使用双节点, 即双机热备环境, 防止Mycat这一层出现单点故障.
可以使用的高可用集群方式有:
- Keepalived+Mycat+Mysql
- Keepalived+LVS+Mycat+Mysql
- Keepalived+Haproxy+Mycat+Mysql
Mycat+MySQL实现读写分离
Mycat安装
下载安装JDK
[root@centos8|~]#yum -y install java
[root@centos8|~]#java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
下载安装mycat
[root@centos8|~]#wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-
linux.tar.gz
[root@centos8|~]#mkdir /app[root@centos8|~]#tar xvf Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz -C /app/mycat[root@centos8|~]#ls /app/mycat/
bin catlet conf lib logs version.txt
mycat安装目录结构:
- bin mycat命令,启动、重启、停止等
- catlet catlet为Mycat的一个扩展功能
- conf Mycat 配置信息,重点关注
- lib Mycat引用的jar包,Mycat是java开发的
- logs 日志文件,包括Mycat启动的日志和运行的日志
- version.txt mycat版本说明
logs目录:
- wrapper.log mycat启动日志
- mycat.log mycat详细工作日志
Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:
- server.xml Mycat软件本身相关的配置文件,设置账号、参数等
- schema.xml Mycat对应的物理数据库和数据库表的配置,读写分离、高可用、分布式策略定制、节点控制
- rule.xml Mycat分片(分库分表)规则配置文件,记录分片规则列表、使用方法等
启动和连接
#配置环境变量
[root@centos8|~]#vim /etc/profile.d/mycat.sh
PATH=/app/mycat/bin:$PATH
[root@centos8|~]#source /etc/profile.d/mycat.sh#启动
mycat start
#查看日志,确定成功
cat /app/mycat/logs/wrapper.log
...省略...
INFO | jvm 1 | 2019/11/01 21:41:02 | MyCAT Server startup successfully. see
logs in logs/mycat.log#连接mycat:
mysql -uroot -p123456 -h 127.0.0.1 -P8066
Mycat 主要配置文件说明
server.xml
存放Mycat软件本身相关的配置文件,比如:连接Mycat的用户,密码,数据库名称等
server.xml文件中配置的参数解释说明:
参数 说明
user 用户配置节点
name 客户端登录MyCAT的用户名,也就是客户端用来连接Mycat的用户名。
password 客户端登录MyCAT的密码
schemas 数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如:db1,db2
privileges 配置用户针对表的增删改查的权限
readOnly mycat逻辑库所具有的权限。true为只读,false为读写都有,默认为false
注意:
- server.xml文件里登录mycat的用户名和密码可以任意定义,这个账号和密码是为客户机登录mycat时使用的账号信息
- 逻辑库名(如上面的TESTDB,也就是登录mycat后显示的库名,切换这个库之后,显示的就是代理的真实mysql数据库的表)要在schema.xml里面也定义,否则会导致mycat服务启动失败!
- 这里只定义了一个标签,所以把多余的都注释了。如果定义多个标签,即设置多个连接mycat的用户名和密码,那么就需要在schema.xml文件中定义多个对应的库!
schema.xml
是最主要的配置项,此文件关联mysql读写分离策略,读写分离、分库分表策略、分片节点都是在此文件中配置的.MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的
schema.xml文件中配置的参数解释说明:
参数 说明
schema 数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应
dataNode 分片信息,也就是分库相关配置
dataHost 物理数据库,真正存储数据的数据库
配置说明
name属性唯一标识dataHost标签,供上层的标签使用。
maxCon属性指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的writeHost、readHost标签都会使用这个属性的值来实例化出连接池的最大连接数
minCon属性指定每个读写实例连接池的最小连接,初始化连接池的大小
每个节点的属性逐一说明
#schema:
属性 说明
name 逻辑数据库名,与server.xml中的schema对应
checkSQLschema 数据库前缀相关设置,这里为false
sqlMaxLimit select 时默认的limit,避免查询全表#table
属性 说明
name 表名,物理数据库中表名
dataNode 表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name
primaryKey 主键字段名,自动生成主键时需要设置
autoIncrement 是否自增
rule 分片规则名,具体规则下文rule详细介绍
#dataNode
属性 说明
name 节点名,与table中dataNode对应
datahost 物理数据库名,与datahost中name对应
database 物理数据库中数据库名
#dataHost
属性 说明
name 物理数据库名,与dataNode中dataHost对应
balance 均衡负载的方式
writeType 写入方式
dbType 数据库类型
heartbeat 心跳检测语句,注意语句结尾的分号要加schema.xml文件中有三点需要注意:balance="1",writeType="0" ,switchType="1"
schema.xml中的balance的取值决定了负载均衡对非事务内的读操作的处理。balance 属性负载均衡类型,目前的取值有 4 种:balance="0": 不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上,即读请求仅发送到writeHost上balance="1": 读请求随机分发到当前writeHost对应的readHost和standby的writeHost上。即全部的readHost与stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1, S2 都参与 select 语句的负载均衡balance="2": 读请求随机分发到当前dataHost内所有的writeHost和readHost上。即所有读操作都随机的在writeHost、 readhost 上分发balance="3": 读请求随机分发到当前writeHost对应的readHost上。即所有读请求随机的分发到wiriterHost 对应的 readhost 执行, writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本
有,1.3 没有
writeHost和readHost标签
这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。
唯一不同的是:writeHost指定写实例、readHost指定读实例,组着这些读写实例来满足系统的要求。
在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕
机,那么这个writeHost绑定的所有readHost都将不可用。
另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去
注意:
Mycat主从分离只是在读的时候做了处理,写入数据的时候,只会写入到writehost,需要通过mycat的主从复制将数据复制到readhost
实战案例:利用Mycat实现MySQL的读写分离
10.0.0.7 -->client
10.0.0.8 -->MyCat
10.0.0.18 -->master
10.0.0.28 -->slave
1. 修改master和slave上的配置文件
#master上的my.cnf
[root@centos18 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id = 18
log-bin#slave上的my.cnf
[root@centos28 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
read_only=ON
server-id = 28
log-bin重启服务:systemctl restart mariadb
2. Master上创建复制用户(10.0.0.18)
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'10.0.0.%'
IDENTIFIED BY '123456';MariaDB [(none)]> flush privileges;#查看二进制位置
show binlog events;
show master logs;
3. Slave上执行(10.0.0.28)
MariaDB [(none)]>
CHANGE MASTER TO
MASTER_HOST='10.0.0.18',
MASTER_USER='repluser',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=370;start slave;show slave status\G
4. 在10.0.0.8安装mycat并启动
[root@centos8|~]#yum -y install java
#确认安装成功
[root@centos8|~]#java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)#下载并安装
[root@centos8|~]#wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@centos8|~]#mkdir /app[root@centos8|~]#tar xvf Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz -C /app/mycat[root@centos8|~]#ls /app/mycat/
bin catlet conf lib logs version.txt#配置环境变量
[root@centos8 ~]#vim /etc/profile.d/mycat.sh
PATH=/app/mycat/bin:$PATH
[root@centos8 ~]#source /etc/profile.d/mycat.sh#启动mycat
[root@centos8 ~]#mycat start
Starting Mycat-server...
[root@centos8 ~]#ss -ntlp[root@centos8 ~]#ss -ntlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=791,fd=5)) LISTEN 0 1 127.0.0.1:32000 0.0.0.0:* users:(("java",pid=4640,fd=4)) LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=791,fd=7)) LISTEN 0 50 *:1984 *:* users:
(("java",pid=4640,fd=57))
LISTEN 0 100 *:8066 *:* users:
(("java",pid=4640,fd=87))
LISTEN 0 50 *:43465 *:* users:(("java",pid=4640,fd=58)) LISTEN 0 100 *:9066 *:* users:
(("java",pid=4640,fd=83))
LISTEN 0 50 *:45259 *:* users:(("java",pid=4640,fd=56))#查看状态
[root@centos8|mycat]#mycat status;
Mycat-server is running (1951).#查看日志,确定成功
[root@centos8 ~]#cat /app/mycat/logs/wrapper.log
ERROR | wrapper | 2020/02/28 15:21:48 | Startup failed: Timed out waiting for
a signal from the JVM.
ERROR | wrapper | 2020/02/28 15:21:48 | JVM did not exit on request,
terminated
INFO | wrapper | 2020/02/28 15:21:48 | JVM exited on its own while waiting to
kill the application.
STATUS | wrapper | 2020/02/28 15:21:48 | JVM exited in response to signal
SIGKILL (9).
STATUS | wrapper | 2020/02/28 15:21:52 | Launching a JVM...
INFO | jvm 2 | 2020/02/28 15:21:52 | OpenJDK 64-Bit Server VM warning:
ignoring option MaxPermSize=64M; support was removed in 8.0
INFO | jvm 2 | 2020/02/28 15:22:13 | Wrapper (Version 3.2.3)
http://wrapper.tanukisoftware.org
INFO | jvm 2 | 2020/02/28 15:22:13 | Copyright 1999-2006 Tanuki Software,
Inc. All Rights Reserved.
INFO | jvm 2 | 2020/02/28 15:22:13 |
INFO | jvm 2 | 2020/02/28 15:22:31 | MyCAT Server startup successfully. see
logs in logs/mycat.log#用默认密码123456来连接mycat:
[root@centos8 ~]#mysql -uroot -p123456 -h 127.0.0.1 -P8066
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+ 1 row in set (0.01 sec)
MySQL [TESTDB]> show tables;
+------------------+
| Tables in TESTDB |
+------------------+
| travelrecord |
+------------------+ 1 row in set (0.00 sec)
5. 在mycat 服务器上修改server.xml文件配置Mycat的连接信息(10.0.0.8)
mycat登陆密码默认为123456
[root@centos8 ~]#vim /app/mycat/conf/server.xml
...省略...
<user name="root"> #连接Mycat的用户名<property name="password">123456</property> #连接Mycat的密码<property name="schemas">TESTDB</property> #数据库名要和schema.xml相
对应
</user>
</mycat:server>
这里使用的是root,密码为magedu,逻辑数据库为TESTDB,这些信息都可以自己随意定义,读写权限都有,没有针对表做任何特殊的权限。重点关注上面这段配置,其他默认即可。
6. 修改schema.xml实现读写分离策略(10.0.0.8)
[root@centos8 ~]#vim /app/mycat/conf/schema.xml <?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"><!-- auto sharding by id (long) --><!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"/> --></schema><!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"/> --><dataNode name="dn1" dataHost="localhost1" database="hellodb" /><!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" /><dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" /><dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" /><dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> --><dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><!-- can have multi write hosts --><writeHost host="host1" url="10.0.0.18:3306" user="root"password="123456"><!-- can have multi read hosts --><readHost host="host2" url="10.0.0.28:3306" user="root" password="123456" /></writeHost><writeHost host="hostS1" url="localhost:3316" user="root"password="123456" /><!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->#重新启动mycat
[root@centos8 ~]#mycat restart
上面配置中,balance改为1,表示读写分离。以上配置达到的效果就是10.0.0.18为主库,10.0.0.28为从库注意:要保证10.0.0.18和10.0.0.28机器能使用root/123456权限成功登录mysql数据库。同时,也一定要授权mycat机器能使用root/123456权限成功登录这两台机器的mysql数据库!!这很重要,否则会导致登录mycat后,对库和表操作失败!
范例:schema.xml
7. 在后端主服务器创建用户并对mycat授权10.0.0.18
[root@centos18 ~]#mysql mysql>GRANT ALL ON *.* TO 'root'@'10.0.0.8' IDENTIFIED BY '123456' WITH GRANT OPTION;mysql> flush privileges;
8. 在Mycat服务器上连接并测试
[root@centos8 ~]#mysql -uroot -p123456 -h10.0.0.7 -P8066
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.01 sec)mysql> use TESTDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes |
| coc |
| courses |
| scores |
| students |
| teachers |
| testlog |
| toc |
+-------------------+
8 rows in set (0.00 sec)
9. 通过通用日志确认实现读写分离
show variables like 'general_log'; #查看日志是否开启
set global general_log=on; #开启日志功能
show variables like 'general_log_file'; #查看日志文件保存位置
set global general_log_file='tmp/general.log'; #设置日志文件保存位置
在主和从服务器分别启用通用日志,查看读写分离
[root@centos8 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
general_log=ON
[root@centos8 ~]#systemctl restart mariadb
[root@centos8 ~]#tail -f /var/lib/mysql/centos8.log
9、停止从节点,MyCAT自动调度读请求至主节点
[root@slave ~]#systemctl stop mariadb
[root@client ~]#mysql -uroot -pmagedu -h192.168.100.10 -P8066
MySQL [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 1 |
+-------------+
1 row in set (0.00 sec)
MySQL [(none)]>
[root@centos8 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
general_log=ON
[root@centos8 ~]#systemctl restart mariadb
[root@centos8 ~]#tail -f /var/lib/mysql/centos8.log
9、停止从节点,MyCAT自动调度读请求至主节点
[root@slave ~]#systemctl stop mariadb
[root@client ~]#mysql -uroot -pmagedu -h192.168.100.10 -P8066
MySQL [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 1 |
+-------------+
1 row in set (0.00 sec)
MySQL [(none)]>
MySQL中间件代理服务器MyCat相关推荐
- 分布式mysql中间件(mycat)
官方地址: 主站:Mycat-server@github : https://github.com/MyCATApache/Mycat-Server.git Mycat-web@github ...
- zabbix历史数据mysql_处理Zabbixl历史数据库解决办法三---使用MySQL中间件为Zabbix数据库扩容...
一 应用场景描述 前面介绍了两种处理Zabbix历史数据的解决办法,但是如果当监控数据继续增长的话是不足以解决问题的. 办法一适合在没有做表分区的情况下,只保留一段时间的数据,比如一个月,然后把老的数 ...
- mysql中间件研究(Atlas,cobar,TDDL,Mycat)
2019独角兽企业重金招聘Python工程师标准>>> mysql中间件研究(Atlas,cobar,TDDL,Mycat) 博客分类: 数据库 mysql-proxy是官方提供的m ...
- mysql 分库分表中间件 mycat_阿里开源的分布式分库分表中间件之MyCat从入门到放弃...
原标题:阿里开源的分布式分库分表中间件之MyCat从入门到放弃 1.非分片字段查询 Mycat中的路由结果是通过分片字段和分片方法来确定的.例如下图中的一个Mycat分库方案: 根据 tt_waybi ...
- mysql中间件研究( Atlas,cobar,TDDL,mycat,heisenberg,Oceanus,vitess,OneProxy )
mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持大数据量的分库分表且性能较差.下面介绍几款能代替其的mysql开源中间件产品,Atlas ...
- 我的架构梦:(五十四) 分库分表实战及中间件之Mycat实战
分库分表实战及中间件之Mycat实战 一. Mycat 简介 二.Mycat 核心概念 三.server.xml配置 四.schema.xml配置 五.rule.xml配置 六.Mycat实战 七.M ...
- mysql中间件汇总
一.写在前面 mysql作为互联网公司都会用到的数据库,在使用过程中.会用主从复制来提高性能.会用分库分表解决写入问题.以下介绍mysql中间件的一些实现方案 二.Atlas Atlas时 360 公 ...
- MySQL 中间件汇总比较
360 Atlas 较为活跃,Atlas 是由 360 Web平台部基础架构团队开发维护的一个基于 MySQL 协议的数据中间层项目.它是在mysql-proxy 0.8.2版本的基础上,对其进行了优 ...
- Mysql中间件研究
转自:https://blog.csdn.net/kingzone_2008/article/details/51513910 mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡, ...
最新文章
- AI学高数达到MIT本科水平,学了微积分线性代数概率论等6门课,不光能做题还能出题...
- VS为VC++添加UAC控制(VC程序默认管理员运行)
- 14. Java基础之泛型
- java基础(七) 深入解析java四种访问权限
- boost::units模块实现异构单元片段
- 64win7+64Oracle+32plsql
- 关于purge master logs的一个小实验
- 如何熟悉一个开源项目
- Invalid Gradle JDK configuration found_带你了解Gradle编译速度是如何提升70%的
- 初步认识迭代服务器和并发服务器
- 关于git push报403的问题
- 环境部署(二):Linux下安装jenkins
- java mschart_关于vb中MSCHART控件画二维线图 - conkeyn - JavaEye技术网站
- 善用佳软:如何使用Beyond Compare比对class文件
- 纯php实现中秋博饼游戏(1):绘制骰子图案
- 电力通信网与运营商5G网络融合方案
- Word排版插件,VSTO公文排版,Word论文排版
- 华为网络设备查看电源状态检查命令
- Root Cause Analysis of Anomalies of Multitier Services in Public Clouds
- 未来十年最容易消失和最不易被取代的22个职业,越看越心惊!附相关专业
热门文章
- nginx expires 缓存
- python第六课——列表
- Git 底层数据存储结构与工作原理介绍
- Mac风扇声音大的原因以及如何解决
- 2021年Java程序员职业规划!吐血整理
- 如何设置好看的form表单样式_微信新样式!微信设置“特效字体”,朋友圈变笑脸,好看!...
- 欢迎加入arcgis engine java QQ群
- 动态代理 需求:一个超级明星技能跳舞、唱歌、拍电影、睡觉。明星经纪人公司接活动,赚的钱37分。请用写出代码。
- 神经网络/深度学习(一)
- Morin 魔音音乐软件分享