秒懂开源许可证GPLBSDMITMozillaApache和LGPL的区别
Posted 星光夏眠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了秒懂开源许可证GPLBSDMITMozillaApache和LGPL的区别相关的知识,希望对你有一定的参考价值。
一、总述
世界上的开源许可证,大概有上百种,很少有人搞得清楚它们的区别。今天,我们来说说最流行的六种:GPL、BSD、MIT、Mozilla、Apache和LGPL。
二、详细说明
1.BSD许可证(https://en.wikipedia.org/wiki/BSD_licenses)
BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。
但”为所欲为”的前提当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件:
如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。
如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。
不可以用开源代码的作者、机构名字和原来产品的名字做市场推广。
BSD 代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。
2.MIT许可证(The MIT License | Open Source Initiative)
MIT是和BSD一样宽范的许可协议。你必须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还是以源代码发布的。作者只想保留版权,而无任何其他了限制,较BSD协议宽松。
一般使用 MIT 授权的项目,需在源文件头部增加以下内容:
Copyright [yyyy] [name of copyright owner]. All rights reserved.
//[yyyy] 表示该源文件创建的年份。紧随其后的是 [name of copyright owner],即版权所有者。如果为个人项目,就写个人名称;若为团队项目,则宜写团队名称。
3.Apache许可证(http://www.apache.org/licenses/LICENSE-2.0)
Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和BSD类似:
需要给代码的用户一份Apache Licence;
如果你修改了代码,需要再被修改的文件中说明。
在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。
Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。
该许可证要求在所有的源文件中的头部放置以下内容才能算协议对该文件有效:
Copyright [yyyy] [name of copyright owner]
//[yyyy] 表示该源文件创建的年份。紧随其后的是 [name of copyright owner],即版权所有者。如果为个人项目,就写个人名称;若为团队项目,则宜写团队名称。
4.GPL许可证(How to use GNU licenses for your own software- GNU Project - Free Software Foundation)
1980,一个叫Richard Stallman的美国人因为无法容忍软件私有化,而建立了GPL许可证。他认为,软件的源代码是全人类的财富,应该允许程序员自由共享。
GPL许可证的核心含义是:允许任何人观看、修改,并散播程序软件里的原始程序码,条件是如果你要发布修改后的版本就要连源代码一起公布,不允许修改后和衍生的代码做为闭源的商业软件发布和销售。Linux就是采用了GPL协议,这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商业软件公司开发的免费软件了。
GPL协议的主要内容是只要在一个软件中使用(”使用”指类库引用,修改后的代码或者衍生代码)GPL 协议的产品,则该软件产品必须也采用GPL协议,即必须也是开源和免费。这就是所谓的”传染性”。GPL协议的产品作为一个单独的产品使用没有任何问题,还可以享受免费的优势。
由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。
5.LGPL许可证(GNU LGPL | Open Source Initiative)
LGPL 允许以动态链接使用开源库。采用LGPL的代码,一般情况下它本身就是一个第三方库(LGPL最早的名字就是Library GPL),这时候开发人员仅仅用到了它的功能,而没有对库本身进行任何修改,那么开发人员也不必公布自己的商业源代码。但是如果修改LGPL协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须开源,并且采用LGPL协议。
6.Mozilla许可证(Internet for people, not profit — Mozilla)
Mozilla公共许可证(英语:Mozilla Public License,简称MPL) 允许免费重发布、免费修改,但要求修改后的代码版权归软件的发起者。要求所有再发布者都得有一个专门的文件就对源代码程序修改的时间和修改的方式有描述。允许一个企业在自己已有的源代码库上加一个接口,除了接口程序的源代码以MPL 许可证的形式对外许可外,源代码库中的源代码就可以不用MPL许可证的方式强制对外许可。
三、总结
严格程度:MIT->BSD->Apache->LGPL->Mozilla->GPL
一篇秒懂mycat
前言
什么是mycat
它是阿里开源的一个数据库中间件,专门为大数据量的项目做分库分表用的。有如下特点:
-
一个彻底开源的,面向企业应用开发的大数据库集群 -
支持事务、ACID、可以替代MySQL的加强版数据库 -
一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 -
一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server -
结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品 -
一个新颖的数据库中间件产品
mycat权威指南:http://www.mycat.org.cn/document/mycat-definitive-guide.pdf
mycat架构
话不多说,一张mycat架构图就能让你知道mycat的角色以及作用。
mycat1.6版本架构如下:
由图可知,mycat位于数据库和应用层(APP)之间,它的角色就是帮我们管理数据库集群,而提供应用统一访问数据库接口。
垂直分库
垂直分库通俗来说就是按照功能划分,将不同的数据放在不同的数据库中。
水平分表
水平分表通俗来说就是某表数据量太大了,那么我们很自然地想到是加多一个表来存储数据,这样查询速度才会更快。那么水平分表就是表结构是一样的,只不过存的数据不一样而已。
逻辑库和逻辑表
逻辑库:通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。
逻辑表:分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。
mycat基本配置
当我们数据量特别大的时候需要分库分表的时候,那么我们可以考虑使用mycat。那么mycat具体如何做到分库分表的呢?接下来就要学习mycat的三大配置文件进行灵活配置就可以实现分库分表啦啦啦。。。
mycat主要的三大配置文件:server.xml、schema.xml、rule.xml
这三个配置文件位于mycat的安装目录的conf目录中。
server.xml
该文件几乎包含了所有 mycat 需要的系统配置信息。其中包括对外(应用)访问端口,编码,连接超时时间,最大连接数,事务级别,用户密码以及逻辑库等信息。
详细可以阅读下面的配置:
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="serverPort">8066</property> <!-- mycat 服务端口-->
<property name="managerPort">9066</property><!-- mycat 管理端口-->
<property name="nonePasswordLogin">0</property>
<property name="bindIp">0.0.0.0</property>
<property name="frontWriteQueueSize">2048</property>
<property name="charset">utf8</property><!-- 配置该属性的时候一定要保证mycat的字符集和mysql 的字符集是一致的 -->
<property name="txIsolation">2</property> <!-- 前端连接的初始化事务隔离级别,只在初始化的时候使用,后续会根据客户端传递过来的属性对后端[数据库](http://msd.misuland.com/pd/3148108429789238586)连接进行同步。默认为 REPEATED_READ,设置值为数字默认 3。 READ_UNCOMMITTED = 1; READ_COMMITTED = 2; REPEATED_READ = 3; SERIALIZABLE = 4;-->
<property name="processors">8</property><!-- 处理线程数量,默认是cpu数量-->
<property name="idleTimeout">1800000</property><!-- mycat访问mysql,多长时间无反应断开连接-->
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全局表一致性检测、0为关闭 -->
<property name="sqlExecuteTimeout">300</property><!-- SQL 执行超时的时间,Mycat 会检查连接上最后一次执行 SQL 的时间,若超过这个时间则会直接关闭这连接。默认时间为 300 秒,单位秒。-->
<property name="sequnceHandlerType">1</property> <!-- 用来指定Mycat全局序列类型,0为本地文件,1为数据库方式,2为时间戳列方式,默认使用本地文件方式,文件方式主要用于测试-->
<property name="defaultMaxLimit">100</property><!-- mycat 默认返回的结果集大小-->
<property name="maxPacketSize">104857600</property><!-- 指定 Mysql 协议可以携带的数据最大长度。默认 16M。-->
</system>
<!--表示mycat的登录用户名-->
<user name="root">
<!--表示mycat的登录密码,密码加密:java -cp Mycat-server-xxx.jar io.mycat.util.DecryptUtil 0:user:password
<property name="usingDecrypt">1</property> -->
<property name="password">123456</property>
<!--表示mycat的逻辑数据库名称,可以自定义-->
<property name="schemas">shop_db</property>
</user>
</mycat:server>
更多关于server.xml的配置可参考以下文章:
http://suo.im/6lJTHF http://suo.im/6lJTK5 http://suo.im/6613kS
schema.xml
作为MyCat中重要的配置文件之一,它主要管理着MyCat的逻辑库、表、分片规则、DataNode以及DataHost。弄懂这些配置,是正确使用MyCat的前提。这里就一层层对该文件进行解析。
标签解析:
-
schema:配置逻辑库,与server.xml中的逻辑库要对应。 -
table:配置逻辑表,包含主键,自增在,位于哪个节点等。 -
dataNode :配置逻辑库与物理库的对应关系 -
dataHost :配置连接数据库主机信息。
更多详细可以参考配置文件说明:
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 定义逻辑库,name属性是指逻辑库,sqlMaxLimit限制返回的行数,checkSQLschema默认是false,判断是否检查发给mycat的sql是否包含库名 -->
<schema name="shop_db" checkSQLschema="false" sqlMaxLimit="100">
<!-- 定义逻辑表,name属性定义逻辑表名称,dataNode表示数据所属逻辑节点,primaryKey定义逻辑表的主键,type表示逻辑表的类型,global为全局表,autoIncrement是指自动递增-->
<table name="region_info" dataNode="orddb,custdb,prodb" primaryKey="region_id" type="global"/>
<table name="order_cart" dataNode="orddb" primaryKey="cart_id"/>
<table name="order_customer_addr" dataNode="orddb" primaryKey="customer_addr_id"/>
<table name="order_detail" dataNode="orddb" primaryKey="order_detail_id"/>
<table name="order_master" dataNode="orddb01,orddb02,orddb03,orddb04" rule="order_master" primaryKey="order_id" autoIncrement="true"/>
<table name="customer_balance_log" dataNode="custdb" primaryKey="balance_id"/>
<table name="customer_inf" dataNode="custdb" primaryKey="customer_inf_id"/>
<table name="customer_level_inf" dataNode="custdb" primaryKey="customer_level"/>
<table name="customer_login" dataNode="custdb" primaryKey="customer_id"/>
<table name="customer_login_log" dataNode="custdb" primaryKey="login_id"/>
<table name="customer_point_log" dataNode="custdb" primaryKey="point_id"/>
<table name="product_brand_info" dataNode="prodb" primaryKey="brand_id"/>
<table name="product_category" dataNode="prodb" primaryKey="category_id"/>
<table name="product_comment" dataNode="prodb" primaryKey="comment_id"/>
<table name="product_info" dataNode="prodb" primaryKey="product_id"/>
<table name="product_supplier_info" dataNode="prodb" primaryKey="supplier_id"/>
</schema>
<!-- 定义数据存储的物理位置,dataHost指逻辑主机,database为物理数据库的名称-->
<dataNode name="orddb" dataHost="mysql10" database="order_db"/>
<dataNode name="custdb" dataHost="mysql11" database="customer_db"/>
<dataNode name="prodb" dataHost="mysql12" database="product_db"/>
<dataNode name="orddb01" dataHost="mysql10" database="orddb01"/>
<dataNode name="orddb02" dataHost="mysql10" database="orddb02"/>
<dataNode name="orddb03" dataHost="mysql11" database="orddb01"/>
<dataNode name="orddb04" dataHost="mysql12" database="orddb01"/>
<dataNode name="mycat" dataHost="mysql10" database="mycat"/>
<!-- 定义后端数据库主机信息;balance=3指所有的读操作都只发送到writeHost的readHost上;writeType=“0”, 所有写操作都发送到可用的writeHost上;switchType='1' 默认值,表示自动切换-->
<dataHost balance="3" maxCon="1000" minCon="10" name="mysql10" writeType="0" switchType="1" dbType="mysql" dbDriver="native">
<!--检查后端数据库是否可用 -->
<heartbeat>select user()</heartbeat>
<!-- writeHost指定写实例、readHost指定读实例-->
<writeHost host="192.168.56.10" url="192.168.56.10:3306" password="123456" user="im_mycat"/>
</dataHost>
<dataHost balance="3" maxCon="1000" minCon="10" name="mysql11" writeType="0" switchType="1" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="192.168.56.11" url="192.168.56.11:3306" password="123456" user="im_mycat"/>
</dataHost>
<dataHost balance="3" maxCon="1000" minCon="10" name="mysql12" writeType="0" switchType="1" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="192.168.56.12" url="192.168.56.12:3306" password="123456" user="im_mycat"/>
</dataHost>
</mycat:schema>
关于更多ER图关系配置和其他参数意义。可参考以下文件或者《mycat权威指南》 https://blog.csdn.net/l1028386804/article/details/53385637 https://www.cnblogs.com/jihaibo/p/9051105.html https://www.cnblogs.com/ivictor/p/5131480.html
rule.xml
它的功能主要体现在以下两个方面:
-
1、配置水平分片的分片规则 -
2、配置分片规则所对应的分片函数
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="order_master"> <!-- 与schema.xml的table标签中的rule对应关系-->
<rule>
<columns>customer_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">4</property>
</function>
</mycat:rule>
其中的function的name必须是唯一的,以上就是hash取模4的分片算法。
常见的分片算法:
-
简单取模-PartitionByMod -
哈希取模-PartitionByHashMod -
分片枚举-PartitionByFileMap -
字符串范围取模分片
更多可以参考文章:https://blog.csdn.net/l1028386804/article/details/53402552 https://www.cnblogs.com/kingsonfu/p/10627423.html
最后
mycat的基本知识到此结束,如果需要了解更多可以阅读官网提供的《mycat权威指南》,后续会对其操作进行详细的描述哦,下期再见!!!
以上是关于秒懂开源许可证GPLBSDMITMozillaApache和LGPL的区别的主要内容,如果未能解决你的问题,请参考以下文章