Krug.DistributedMnesia (Krug v1.1.23) View Source
Utilitary module to handle Erlang Mnesia Database. Mnesia Database has single instance mode and also distributed mode that is purpose of this module. Single instance way don't allow us to improve horizontal scalability when we need.
Link to this section Summary
Functions
Removes all object entries from "table_name". Return true or false.
Almost the same that "init_cluster". The diference is that cluster_ips will be calculated to be all range of machine local network according the network mask range (/16 or /24).
Start the distributed mnesia cluster. To be used on application start.
Retrieves an object identified by "id_row" from "table_name". Return the registry entry or nil.
Stores an object "data_row" identified by "id_row" on "table_name". Return true or false.
Link to this section Functions
Removes all object entries from "table_name". Return true or false.
Requires mnesia already be started.
If you wish you application be able to scalabity then should be used
init_cluster(cluster_name,cluster_ips,ips_separator,disc_copies,tables)
function on application startup.
init_auto_cluster(cluster_name, cluster_cookie, disc_copies \\ false, tables \\ [], connection_timeout \\ nil)
View SourceAlmost the same that "init_cluster". The diference is that cluster_ips will be calculated to be all range of machine local network according the network mask range (/16 or /24).
init_cluster(cluster_name, cluster_cookie, cluster_ips, ips_separator \\ "|", disc_copies \\ false, tables \\ [], connection_timeout \\ nil)
View SourceStart the distributed mnesia cluster. To be used on application start.
Example
defmodule <Your_App_Main_Module_Name>.Application do
@moduledoc false
use Application
alias Krug.DistributedMnesia
def start(_type, _args) do
Supervisor.start_link(children(), opts())
end
defp children() do
[
...
<Your_App_Main_Module_Name>.DistributedMnesiaTaskStarter, # calls Krug.DistributedMnesia.init_cluster(...)
...
]
end
defp opts() do
[strategy: :one_for_one, name: <Your_App_Main_Module_Name>.Supervisor]
end
end
defmodule <Your_App_Main_Module_Name>.DistributedMnesiaConfigTaskStarter do
def child_spec(opts) do
%{id: __MODULE__,start: {__MODULE__, :start_link, [opts]}}
end
def start_link(opts) do
Supervisor.start_link([{<Your_App_Main_Module_Name>.DistributedMnesiaConfigTask,opts}], strategy: :one_for_one)
end
end
defmodule <Your_App_Main_Module_Name>.DistributedMnesiaConfigTask do
use Task
alias Krug.DistributedMnesia
def start_link(opts) do
Task.start_link(__MODULE__, :run, [opts])
end
def run(_opts) do
cluster_cookie = "echo"
cluster_name = "echo"
cluster_ips = "192.168.1.12X "
ips_separator = "X"
tables = [
%{
table_name: :users,
table_attributes: [:id, :name, :email, :last_access]
},
%{
table_name: log,
table_attributes: [:id, :user_id, :action, :date_time]
},
]
cluster_name
|> DistributedMnesia.init_cluster(cluster_cookie,cluster_ips,ips_separator,true,tables)
end
end
disc_copies: true for ":disc_copies" (ram + disc), false for ":ram_copies" (only ram).
tables: list of map table configurations
%{
table_name: :users, # atom
table_attributes: [:id, :name, :email] # atom list | the first element is the "id_row" value/column
}
.
connected_nodes: list (of atom) nodes already connected in a erlang cluster.
Retrieves an object identified by "id_row" from "table_name". Return the registry entry or nil.
Requires mnesia already be started.
If you wish you application be able to scalabity then should be used
init_cluster(cluster_name,cluster_ips,ips_separator,disc_copies,tables)
function on application startup.
Stores an object "data_row" identified by "id_row" on "table_name". Return true or false.
Requires mnesia already be started.
If you wish you application be able to scalabity then should be used
init_cluster(cluster_name,cluster_ips,ips_separator,disc_copies,tables)
function on application startup.