DawnSql快速入门

简介: DawnSql开源分布式数据库,快速入门

1、设置配置文件

1.1、配置文件的位置

安装文件解压后,进入 config 目录,配置文件:default-config.xml

1.2、设置超级管理员的 root token

 <!-- 超级管理员的 root token, 用户可以直接来设置一个 root token -->
 <!-- 本例中 root token 为 dafu -->
<property name="root_token" value="dafu"/>

DawnSql 中用户是通过 user_token 来区分用户之间的访问权限的。
例如:
在通过 jdbc 访问的时候,user_token 是必须要设置的。

        Class.forName("org.apache.ignite.IgniteJdbcDriver");
        String user_token = "my_token";
        String url = "jdbc:ignite:thin://127.0.0.1:10800/public?lazy=true&userToken=" + user_token;
        Connection conn = DriverManager.getConnection(url);

1.3、用户是否实现了 log 事务接口。默认是没有实现,这个需要用户根据自己的实际需求来实现。

<!-- 设置实现 log 事务接口的类 -->
<!--
<property name="myLogCls" value="org.gridgain.smart.logClient.MyLogTransactionClient"/>
-->

1.4、是否实现了初始化后就执行的方法

既数据库系统,初始化完成后,马上执行的方法

<!-- 设置启动的时候,初始化 rpc 服务器 -->
<!-- org.dawn.rpc.MyRpcStartImpl 是实现了 IDawnSqlStart 接口的类 -->
<!-- 不设置则不启动这个服务,具体代码可以参看开源的例子 -->
<property name="startAppCls" value="org.dawn.rpc.MyRpcStartImpl"/>

默认的是开启 DBeaverWeb 访问 DawnSql 集群(推荐使用) 的方法
具体使用方法:

  1. 设置完成后,进入安装文件目录下,启动 DawnSql 数据库:
    安装并激活 DawnSql<br/>
  2. 下载 DBeaverWeb 的 war 包
    下载 DBeaverWeb 的 war 包<br/>
  3. 启动 DBeaverWeb
    启动 DBeaverWeb<br/>
  4. DBeaverWeb 的源码
    DBeaverWeb 的源码<br/>

1.5、创建表的模板 (这个是必须要设置的)

例子中设置了两个模板:
base 模板:复制模式,支持事务
manage 模板:分区模式,同一份数据,在集群中备份 3 次,支持事务

<!-- 创建表的模板 -->
<property name="templateConfiguration">
    <map key-type="java.lang.String" value-type="org.apache.ignite.configuration.TableTemplateConfiguration">
        <entry key="base">
            <bean class="org.apache.ignite.configuration.TableTemplateConfiguration">
                <property name="templateValue" value="template=REPLICATED,ATOMICITY=TRANSACTIONAL"></property>
                <property name="description" value="复制模式,来保存数据!"></property>
            </bean>
        </entry>
        <entry key="manage">
            <bean class="org.apache.ignite.configuration.TableTemplateConfiguration">
                <property name="templateValue" value="template=partitioned,backups=3,ATOMICITY=TRANSACTIONAL"></property>
                <property name="description" value="分片模式,来保存数据!"></property>
            </bean>
        </entry>
    </map>
</property>

1.6、设置多用户组(默认是支持多用户组的)

        <!-- 是否启用多用户组 -->
        <property name="multiUserGroup" value="true"/>

1.7、添加其他节点

        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
                        <property name="addresses">
                            <list>
                                <!-- 分布式环境替换实际的 ip 和 端口 -->
                                <!-- 例如:配置多个台机器机器 -->
                                <!-- 47500..47509 表示端口范围 -->
                                <!-- <value>ip地址一:47500..47509</value> -->
                                <!-- <value>ip地址二:47500..47509</value> -->
                                <!-- <value>ip地址三:47500..47509</value> -->
                                <value>127.0.0.1:47500..47509</value>
                            </list>
                        </property>
                    </bean>
                </property>
            </bean>
        </property>

2、创建 schema

只有 root 用户,才能创建和修改 schema
创建 schema 有两种写法:
具体用法:创建和删除 schema

-- 创建 schema wudafu
create schema wudafu;

-- 或者
-- 创建 schema wudafu
create schema if not exists wudafu;

3、为 schema 添加用户组

只有 root 用户,才能设置用户组
具体用法:添加删除用户组

-- 添加用户组
add_user_group('wudafu_group', 'wudafu_token', 'all', 'wudafu');
-- 通过 user_token 获取用户组
get_user_group('wudafu_token');

add_user_group 为内置函数它有四个参数:第一个:用户组的名字,第二个:用户的 user_token 用户访问数据库,第三个:只能选择 all, dml, ddl,第四个:schema 的名字。
add_user_group 的意思是为 schema 添加一个用户组。包含:用户组名称、user_token 和它的操作权限。

4、添加表并插入数据

例如:用 root 的 token 或者是上面例子的 myy_token
如果用 DBeaverWeb 来操作,只需要输入 root 的 token 或者 myy_token
如果用 JDBC 连接字符串为:jdbc:ignite:thin://127.0.0.1:10800/public?lazy=true&userToken=dafu
dafu 为上面 root 的 userToken
也可以用 myy_token ,因为它的有添加表的权限。

DROP TABLE IF EXISTS public.Categories; 
-- 产品类型表
CREATE TABLE IF NOT EXISTS public.Categories (
     -- 产品类型ID
    CategoryID INTEGER NOT NULL auto,
    -- 产品类型名
    CategoryName VARCHAR(15) NOT NULL,
    -- 类型说明
    Description VARCHAR,
    -- 产品样本
    Picture VARCHAR,
    PRIMARY KEY (CategoryID)
) WITH "template=manage";

CREATE INDEX IF NOT EXISTS Categories_CategoryName_idx ON public.Categories (CategoryName);

INSERT INTO public.Categories (CategoryName, Description, Picture) VALUES('Beverages','Soft drinks, coffees, teas, beers, and ales', '');
INSERT INTO public.Categories (CategoryName, Description, Picture) VALUES('Condiments','Sweet and savory sauces, relishes, spreads, and seasonings', '');
INSERT INTO public.Categories (CategoryName, Description, Picture) VALUES('Confections','Desserts, candies, and sweet breads', '');
INSERT INTO public.Categories (CategoryName, Description, Picture) VALUES('Dairy Products','Cheeses', '');
INSERT INTO public.Categories (CategoryName, Description, Picture) VALUES('Grains/Cereals','Breads, crackers, pasta, and cereal', '');
INSERT INTO public.Categories (CategoryName, Description, Picture) VALUES('Meat/Poultry','Prepared meats', '');
INSERT INTO public.Categories (CategoryName, Description, Picture) VALUES('Produce','Dried fruit and bean curd', '');
INSERT INTO public.Categories (CategoryName, Description, Picture) VALUES('Seafood','Seaweed and fish', '');

添加表要注意,如果是联合主键,可以按照业务的特点,将一个主键设置为 affinity_key
例如:

-- 订单详情表
CREATE TABLE wudagui.OrderDetails (
    -- 订单编号
    OrderID INTEGER NOT NULL,
    -- 产品编号
    ProductID INTEGER NOT NULL,
    -- 单价
    UnitPrice DECIMAL(10,4) DEFAULT 0,
    -- 订购数量
    Quantity SMALLINT(2) DEFAULT 1,
    -- 折扣
    Discount REAL(8,0) NOT NULL,
    PRIMARY KEY (OrderID, ProductID)
) WITH "template=manage,affinity_key=ProductID";

affinity_key 亲和键,意思是将相同键值的数据,分配到同一节点。这样执行 SQL 的时候,同一节点的数据,就不需要移动了!

5、给用户组分配访问权限

具体用法:给用户组分配访问权限

-- 为用户组:wudafu_group,添加查询 public.Categories 表的权限。
-- 让其只能查询 CategoryName <> 'Seafood' 且只能查询列 CategoryName, Description 的数据
my_view('wudafu_group', "SELECT CategoryName, Description from public.Categories where CategoryName <> 'Seafood'");

用 wudafu_group 的 user_token: wudafu_token 登录 DBeaverWeb 查询 public.Categories 得到结果

rm_1.jpg

实际结果是 8 条
rm_2.jpg

权限视图实现的原理:通过方法将表和表的读写权限绑定到用户组,这样用户组执行 sql 语句的时候,就会去读取权限视图的 ast ,最后在组合成新 ast 执行。

6、NoSql 的支持

具体用法:trans(Sql或者NoSql 的序列) 事务函数

-- 创建一个分区的缓存
noSqlCreate({"table_name": "my_cache", "mode": "partitioned"});

-- 在缓存中,插入数据
noSqlInsert({"table_name": "my_cache", "key": "000A", "value": {"name": "吴大富", "age": 100}});

-- 读取缓存中的数据
noSqlGet({"table_name": "my_cache", "key": "000A"});

7、事务的支持

具体用法:NoSql 的支持

function update_table(CategoryID:int, CategoryName:string)
{
    let lst = [['update public.Categories set CategoryName = ? where UserID = ?', [CategoryName, CategoryID]]];
    lst.add(noSqlDeleteTran({"table_name": "my_cache", "key": CategoryID}));
    trans(lst);
}

执行事务需要调用 DawnSql 的 trans 方法。该方法会将序列中的 sql 或 no sql 都会转换成 key -value 形式,然后执行二阶段提交

8、DawnSql 语法的简介

具体用法:DawnSql语法

-- 1、输入一个字符串,输出一个前缀 DawnSql 的字符串
function my_str(line:string)
{
   concat('DawnSql ', line);
}

-- 2、当把 DawnSql函数中提交到数据后,就可以在 sql 和 DawnSql 中使用这个函数
select my_str(CATEGORYNAME) from PUBLIC.categories;

d_1.jpeg

d_2.jpg

9、DawnSql 的扩展

具体用法:DawnSql 的扩展

9.1、Java 代码

package org.dawnsql.lib;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MyUtil {

    public String getNow()
    {
        Timestamp timestamp = new Timestamp(System.currentTimeMillis());
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        System.out.println(simpleDateFormat.format(new Date(timestamp.getTime())));

        return simpleDateFormat.format(new Date(timestamp.getTime()));
    }
}

9.2、注册成 DawnSql 中的方法

add_func({"method_name":"getNow","java_method_name":"getNow","cls_name":"org.dawnsql.lib.MyUtil","return_type":"String","descrip":"","lst":[]});

10、分布式定时任务

具体用法:分布式定时任务

-- 每隔两分钟,重复执行 30 次 getNow 方法
add_job('getNow', [], '{2,30} * * * * *');

定时任务中的任务,在集群中是负载均衡的,当节点故障时,定时任务会进行故障转移

相关文章
|
算法 C语言 C++
快速入门C++
快速入门C++
87 0
|
Kubernetes 监控 调度
K8S快速入门
K8S快速入门
132 0
|
Kubernetes Linux API
[没接触过kubevirt?]15分钟快速入门kubevirt
什么是kubevirt? kubevirt是一个容器方式运行虚拟机的项目。`kubevirt`是附加`kubernetes`集群上的,它是通过 `CustomResourceDefinition(CRD)`部署到`Kubernetes API`变成资源对象。使用方式类似创建`deploy、pod`......这些资源清单。
4463 0
[没接触过kubevirt?]15分钟快速入门kubevirt
|
6月前
|
存储 Python
PythonOOP快速入门
PythonOOP快速入门
|
7月前
|
算法 数据可视化 Java
Gephi快速入门
Gephi快速入门
|
7月前
|
存储 编译器 Linux
C++:快速入门篇
C++:快速入门篇
80 0
|
Linux Windows
QMQTT快速入门
环境搭建 • 准备一台linux设备和一台windows设备虚拟机也是可以的; • 安装mosquitto ; • 准备QMQTT环境 - windows下;
175 0
|
SQL 分布式计算 关系型数据库
MLSQL(Byzer)的快速入门
MLSQL(Byzer)的快速入门
MLSQL(Byzer)的快速入门
|
自然语言处理 编译器 Linux
【C++】—— 快速入门(1)
【C++】—— 快速入门(1)
269 0
【C++】—— 快速入门(1)
|
安全 编译器 C语言
【C++】—— 快速入门(2)
【C++】—— 快速入门(2)
107 0
【C++】—— 快速入门(2)