Георепликация с помощью GlusterFS Александр Руденко # yum -y install glusterfs-geo-replication rsync # ssh-keygen -f /var/lib/glusterd/geo-replication/secret.pem # cat /var/lib/glusterd/geo-replication/secret.pem.pub | ssh root@<ведомый-узел> "cat >> ~/.ssh/authorized_keys" # ssh-keygen -t rsa # ssh-copy-id -i /root/.ssh/id_rsa.pub root@<ведомый-узел> # gluster volume create r1 replica 2 gl01:/r1 gl02:/r1 # gluster volume start r1 gluster peer probe # gluster volume create d1 replica 2 gl03:/d1 gl04:/d1 # gluster volume start rep-d1 ... [peersrx . %5Essh%3A] remote_gsyncd xx/nonexistent/gsyncd ... ... [peersrx . %5Essh%3A] remote_gsyncd /usr/libexec/glusterfs/gsyncd ... # gluster volume geo-replication r1 gl03::d1 create # gluster volume geo-replication r1 gl03::d1 start # gluster volume geo-replication r1 gl03::d1 status # vi /var/lib/glusterd/geo-replication/<мастерТом_ведомыйСервер_ведомыйТом>/ # gluster volume geo-replication r1 gl03::d1 config timeout 120 # gluster volume geo-replication r1 gl03::d1 config use-tarssh true # gluster volume set d1 geo-replication.indexing on # gluster volume set d1 changelog on # gluster volume geo-replication r1 gl03::d1 stop # gluster volume geo-replication <ведомый-том> <мастер-узел>::<мастер-том> create # gluster volume geo-replication <ведомый-том> <мастер-узел>::<мастер-том> config special-sync-mode recover # gluster volume geo-replication <ведомый-том> <мастер-узел>::<мастер-том> start ----------------------------------------------------------------------------------------------------------------- Кластер виртуализации. Часть 2. Разворачиваем бюджетное отказоустойчивое решение Сергей Урушкин filter = [ "a|^/dev/sd.*|", "a|^/dev/drbd.*|", "r/.*/" ] write_cache_state = 0 locking_type = 3 use_lvmetad = 0 # systemctl stop lvm2-lvmetad.service # find /etc/lvm/cache/ -type f | xargs rm -f # yum install -y gcc flex rpm-build wget kernel-devel # wget -c http://oss.linbit.com/drbd/8.4/drbd-8.4.4.tar.gz # tar -xvzf drbd-8.4.4.tar.gz # cd drbd-8.4.4 # ./configure \ --prefix=/usr \ --localstatedir=/var \ --sysconfdir=/etc \ --with-km \ --with-udev \ --with-pacemaker \ --with-bashcompletion \ --with-utils \ --without-xen \ --without-heartbeat # make # make install # modprobe drbd # rpm -Uhv http://mirror.logol.ru/epel/7/x86_64/e/epel-release-7-2.noarch.rpm # yum install -y dkms # cd .. # cp -r drbd-8.4.4 /usr/src # cat > /usr/src/drbd-8.4.4/dkms.conf < /proc/sysrq-trigger ; reboot -f"; pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; } volume 0 { device /dev/drbd0; disk /dev/vg00/drbd0; meta-disk internal; } on vsrv1 { address 192.168.150.1:7780; } on vsrv2 { address 192.168.150.2:7780; } } # drbdadm create-md r0 # drbdadm up r0 # drbdadm primary --force r0 # cat /proc/drbd # drbdadm down r0 # pcs resource create drbd0 ocf:linbit:drbd drbd_resource=r0 # pcs resource clone drbd0 master-max=2 master-node-max=1 clone-max=2 clone-node-max=1 notify=true interleave=true # pcs status # cat /proc/drbd # yum install -y dlm # systemctl disable dlm # mkdir /etc/dlm # echo "enable_fencing=0" > /etc/dlm/dlm.conf # pcs resource create dlm ocf:pacemaker:controld # pcs resource clone dlm meta interleave=true # ps ax|grep dlm # pcs resource # yum install -y lvm2-cluster # pcs resource create clvm ocf:heartbeat:clvm # pcs resource clone clvm meta interleave=true # pcs constraint order dlm-clone then clvm-clone # pvcreate /dev/drbd0 # vgcreate -cy vgv0 /dev/drbd0 # lvcreate -n libvirt -L 1G vgv0 # lvs # pcs resource create vgv0 ocf:heartbeat:LVM volgrpname=vgv0 # pcs resource clone vgv0 meta interleave=true # pcs constraint order promote drbd0-ms then vgv0-clone # pcs constraint order clvm-clone then vgv0-clone # yum install -y gfs2-utils # mkdir /srv/libvirt # mkfs.gfs2 -p lock_dlm -j 2 -t virtcluster:libvirt /dev/vgv0/libvirt # mount -t gfs2 /dev/vgv0/libvirt /srv/libvirt # touch /srv/libvirt/test # rm /srv/libvirt/test # umount /srv/libvirt # pcs resource create gfsvirt ocf:heartbeat:Filesystem device=/dev/vgv0/libvirt directory=/srv/libvirt fstype=gfs2 # pcs resource clone gfsvirt meta interleave=true # pcs constraint order vgv0-clone then gfsvirt-clone # cat /proc/mounts # yum install -y "@Virtualization Hypervisor" # systemctl disable virtlockd # systemctl disable libvirtd # systemctl disable libvirtd-guests # systemctl disable iscsi.service # systemctl disable nfs-lock.service # systemctl disable rpcbind.service # cat > /etc/polkit-1/localauthority/50-local.d/50-libvirt.pkla < 'One Day', 'start' => (60*60*24) ); $views[] = array('title' => 'One Week', 'start' => (60*60*24*7) ); $views[] = array('title' => 'One Month', 'start' => (60*60*24*32) ); $views[] = array('title' => 'One Year', 'start' => (60*60*24*380) ); ----------------------------------------------------------------------------------------------------------------- Одноплатный компьютер Cubieboard2. Часть 1. Первое знакомство Михаил Ушаков $ tar xvfx ct-debian-nand.img.gz # dd if=/home/michael/ct-debian-nand.img of=/dev/sdb # fdisk –l ----------------------------------------------------------------------------------------------------------------- Настройка Windows Firewall с помощью PowerShell Сергей Яремчук PS> Import-Module NetSecurity PS> Get-Command -Noun "*Firewall*" PS> Get-NetFirewallProfile PS> Set-NetFirewallProfile -All -Enabled True PS> Set-NetFirewallProfile -Profile Domain -Enabled True PS> Set-NetFirewallProfile –Name Domain –DefaultInboundAction Block PS> Set-NetFirewallProfile -name Public -DisabledInterfaceAliases Ethernet PS> Get-NetFirewallRule -Enabled true -Action block PS> New-NetFirewallRule -Program "C:\Program Files\Internet Explorer\iexplore.exe" -Action Block -Profile Domain, Private -DisplayName "Block IE" -Description "Block IE" Direction Outbound PS> New-NetFirewallRule -DisplayName "Allow Inbound OpenVPN Client" -Direction Inbound -LocalPort 1194 -Protocol UDP -Action Allow PS> Set-NetFirewallRule -DisplayName "Block IE" -Protocol TCP -RemotePort 80 -RemoteAddress "192.168.1.1" -LocalAddress "192.168.1.10" PS> Get-NetFirewallRule -DisplayName "*IE*" PS> Disable-NetFirewallRule -DisplayName "Block IE" PS> Set-NetFirewallRule -DisplayGroup "Windows Firewall Remote Management" -Enabled True ----------------------------------------------------------------------------------------------------------------- Аудит в MySQL Сергей Яремчук $ wget -c https://downloads.skysql.com/enterprise/MariaDB-Audit-Plugin/server_audit-1.1.7.tar.gz mysql> SHOW GLOBAL VARIABLES LIKE 'plugin_dir'; mysql> INSTALL PLUGIN server_audit SONAME 'server_audit.so'; mysql> SELECT * from information_schema.plugins where plugin_name='server_audit'; mysql> SHOW GLOBAL VARIABLES LIKE 'server_audit%'; mysql> SET GLOBAL server_audit_logging='ON'; mysql> SET GLOBAL server_audit_events='CONNECT,QUERY,TABLE'; [mysqld] ... server_audit_logging=on server_audit_events=connect,query [mysqld] ... server_audit_excl_users=test ----------------------------------------------------------------------------------------------------------------- Метапрограммирование в Ruby: разбор примера Иван Шихалев property :alpha, filter: String, default: '' property :beta, :gamma, filter: Integer, default: 0 property :delta, filter: Float, default: 1.0 do |obj, prop, value| p [obj, prop, value] end class Module private def prop name varnm = "@#{name}" getnm = name setnm = "#{name}=" define_method getnm do instance_variable_get varnm end define_method setnm do |value| instance_variable_set varnm, value end end def property *names names.each do |nm| prop nm end end end class Alpha property :alpha, :beta attr_accessor :gamma end a = Alpha.new a.alpha = 1 a.beta = 2 a.gamma = 3 p [a.alpha, a.beta, a.gamma] p a $ ruby demo00.rb def prop name, default: nil, default_proc: nil varnm = "@#{name}" getnm = name setnm = "#{name}=" define_method getnm do if ! instance_variable_defined?(varnm) if default_proc instance_variable_set varnm, default_proc.to_proc.call(self) else instance_variable_set varnm, default end end instance_variable_get varnm end define_method setnm do |value| instance_variable_set varnm, value end end class Alpha property :alpha, default: 100 property :beta, default_proc: proc { |o| o.class.name } property :gamma, default_proc: :class end a = Alpha.new p [a.alpha, a.beta, a.gamma] p a $ ruby demo01.rb def to_proc proc { |obj, *args| obj.send self, *args } end define_method setnm do |value| instance_variable_set varnm, value if block block.call self, name, value end end class Alpha property :alpha property :beta do |obj, prop, value| p [obj, prop, value] end end a = Alpha.new a.alpha = 100 a.beta = 200 $ ruby demo02.rb define_method setnm do |value| if filter && !(filter === value) if Class === on_invalid && on_invalid <= Exception raise on_invalid, "Invalid property (#{name})" + " value: #{value.inspect}!", caller elsif Proc === on_invalid on_invalid.call self, name, value end else instance_variable_set varnm, value if block block.call self, name, value end end end class Alpha property :alpha, filter: Integer property :beta, filter: proc { |x| Integer === x && x > 0 }, on_invalid: StandardError end a = Alpha.new a.alpha = 11 a.beta = 2 p a a.alpha = "String" p a a.beta = -1 p a $ ruby demo03.rb ----------------------------------------------------------------------------------------------------------------- Смотрим на «Луну» Константин Рачаев lua [options] [scripts] [args]] $ lua > dofile("script.lua") > loadstring("scripts.lua")(arg1, arg2, …) $ lua script.lua #!/usr/bin/env lua $ script.lua long_string = [[ very long text ]] Листинг 1. Пример комментирования кода, который уже содержит внутри другой комментарий, а также код, содержащий ]] outer code... --[[ multiline inner comment ]] outer code... a=b[c[1]] … other code а) --[[ outer code... --[[ multiline inner comment ]] outer code... a=b[c[1]] ]] … other code б) --[[ outer code... --[[ multiline inner comment ]] --[[ outer code... a=b[c[1]] … other code в) --[=[ outer code... --[==[ multiline inner comment ]==] outer code... a=b[c[1]] ]=] … other code г) func{arg1=val1, arg2=val2, arg3=val3} article = {" spe96", authors = {"Roberto Ierusalimschy", "Luiz Henrique de Figueiredo", "Waldemar Celes"}; title = "Lua: an Extensible Extension Language", journal = "Software: Practice & Experience", year = 1996, } for key, value in pairs(article) do print(key, value) end days = { "Mon", "Tue", "Wed", "Thu", "Fri", "Sun", "Sat" }, { [1]="Mon", [2]="Tue", [3]="Wed", [4]="Thu", [5]="Fri", [6]="Sun", [7]="Sat" } employee = { name = "John", age = 23, position="manager" } men["name"] function ReadOnly(t) local proxy = {} local mt = { __index = t, __newindex = function(t, k, v) error("attempt to update a read-only table", 2) end } setmetatable(proxy, mt) return proxy end days = ReadOnly{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"} print(days[1]) days[2] = "Noday" _G[varname] = value require "module_name" package.loaded."module_name" = nil local private_const = 1 local public_const = 2 local function private() print("in private function") end local function foo() print("in foo function") end local function bar() private() foo() end return { const = public_const, foo = foo, bar = bar, } m = require("mymodule") m.bar() require("mypackage.mymodule") Account = { balance = 1000.00, withdraw = function(v) Account.balance = Account.balance – v end } function Account.withdraw(v) Account.balance = Account.balance – v end MyAccount, Acсount = Acсount, nil function Account.withdraw(self, v) self.balance = self.balance – v end MyAccount:withdraw(100.00) Account = { balance = 0 } function Account:new(o) o = o or {} setmetatable(o, self) self.__index = self return o end function Account:deposit(v) self.balance = self.balance + v print("deposit = "..v) end function Account:withdraw(v) if v > self.balance then error"insufficient funds" end self.balance = self.balance – v end myaccount = Account:new{balance=1000.00} print("Initional balance = "..myaccount.balance) myaccount:deposit(100.00) print("balance after deposit = "..myaccount.balance) getmetatable(myaccount).__index.deposit(myaccount, 100.00) ----------------------------------------------------------------------------------------------------------------- Странная формула. Часть 5. Вездесущая единица Алексей Вторников int factorial (int n) { int f = 1; for (int i = 1; i <= n; i++) { f = f * i; } return f; } int factorial (int n) { if (n <= 1) return 1; return (n * factorial (n – 1)); } public class Sum { static int sum (int x, int n) { int s = x; if (n == 0) return s; return (sum (n - 1, x) + 1); } public static void main (String [] args) { System.out.println (sum (4, 7)); } } prod (0, a) = 0 prod (n, a) = prod (n-1, a) + n ----------------------------------------------------------------------------------------------------------------- Программные реализации оператора проектирования на эпсилон-симплекс Кирилл Ткаченко Листинг 1. Исходный код P1 def defined(q): return [x for x in q if x is not None] def sq1(q): return 1.0 - sum(defined(q)) def countOfDefined(q): return float(len(defined(q))) def proek(q, eps): ar = 1.0 - eps * len(q) p = [((x - eps) / ar) for x in q] workIsDone = False while not workIsDone: workIsDone = True cod = countOfDefined(p) sq1p = sq1(p) p2 = [((x + (sq1p / cod)) if (x is not None) else None) for x in p] p = [(None if ((x is not None) and (x < 0.0)) else x) for x in p2] workIsDone = (p == p2) return [(eps + ar * (x if x is not None else 0.0)) for x in p] if __name__ == '__main__': print(proek([1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1], 0.001)) Листинг 2. Исходный код P2 import math def defined(q): return [x for x in q if not math.isnan(x)] def sq1(q): return 1.0 - math.fsum(defined(q)) def countOfDefined(q): return float(len(defined(q))) def proek(q, eps): nan = float('nan') ar = 1.0 - eps * len(q) p = [((x - eps) / ar) for x in q] workIsDone = False while not workIsDone: cod = countOfDefined(p) sq1p = sq1(p) p2 = [(x + (sq1p / cod)) for x in p] p = [(nan if x < 0.0 else x) for x in p2] workIsDone = (p == p2) return [(eps + ar * (x if not math.isnan(x) else 0.0)) for x in p] if __name__ == '__main__': print(proek([1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1], 0.001)) Листинг 3. Исходный код E1 -module(proek). -export([main/0, main/1, proek/2]). main() -> main(args). main(_) -> run(). run() -> io:format("~p\n", [proek([1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1], 0.001)]). proek(Q, Eps) -> AR = 1.0 - Eps * length(Q), P1 = lists:map(fun(X) -> (X - Eps) / AR end, Q), P2 = proekNaPolnySimplex(P1), lists:map(fun(X) -> Eps + AR * X end, P2). proekNaPolnySimplex(Q) -> P1 = lists:map(fun(X) -> if X =/= nil -> X + sq1(Q) / countOfDefined(Q); true -> X end end, Q), P2 = lists:map(fun(X) -> if X < 0 -> nil; true -> X end end, P1), case countOfDefined(P1) =/= countOfDefined(P2) of true -> proekNaPolnySimplex(P2); false -> lists:map(fun(X) -> if X =/= nil -> X; true -> 0 end end, P2) end. sq1(Q) -> 1 - lists:sum(lists:filter(fun(X) -> (X =/= nil) end, Q)). countOfDefined(Q) -> length(lists:filter(fun(X) -> (X =/= nil) end, Q)). Листинг 4. Исходный код E2 -module(proek2). -export([main/0, main/1, proek/2]). main() -> main(args). main(_) -> run(). run() -> io:format("~p\n", [proek([1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1], 0.001)]). proek(Q, Eps) -> AR = 1.0 - Eps * length(Q), P1 = [(X - Eps) / AR || X <- Q], P2 = proekNaPolnySimplex(P1), [Eps + AR * X || X <- P2]. proekNaPolnySimplex(Q) -> P1 = [if X =/= nil -> X + sq1(Q) / countOfDefined(Q); true -> X end || X <- Q], P2 = [if X < 0 -> nil; true -> X end || X <- P1], case countOfDefined(P1) =/= countOfDefined(P2) of true -> proekNaPolnySimplex(P2); false -> [if X =/= nil -> X; true -> 0 end || X <- P2] end. defined(Q) -> [X || X <- Q, X =/= nil].%lists:filter(fun(X) -> (X =/= nil) end, Q). sq1(Q) -> 1 - lists:sum(defined(Q)). countOfDefined(Q) -> length(defined(Q)). Листинг 5. Исходный код J1 public class Main { public static double[] proekNazinPoznyak(double[] q, double e) { int N = q.length; // размерность вектора q double r = e * N; // εN double ar = 1.0 - r; // 1 - εN double ak = N; double sq1 = 0.0; // = 1 - ε{q_i} double[] p = new double[N]; // результат boolean[] mon = new boolean[N]; boolean shagAlgo = true; for (int i = 0; i < N; i++) { sq1 += q[i]; p[i] = q[i]; } sq1 = 1 - sq1; for (int i = 0; i < N; i++) { mon[i] = false; p[i] = (p[i] - e) / ar; } sq1 /= ar; while (shagAlgo) { shagAlgo = false; for (int i = 0; i < N; i++) { if (!mon[i]) { p[i] += sq1 / ak; } } for (int i = 0; i < N; i++) { if (!mon[i] && (p[i] < 0.0)) { sq1 = p[i]; p[i] = 0.0; mon[i] = true; ak--; shagAlgo = true; break; } } } for (int i = 0; i < N; i++) { p[i] = ar * p[i] + e; } return p; } // proekNazinPoznyak public static void main(String[] args) { double[] p = proekNazinPoznyak(new double[] { 1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1 }, 0.001); for (double x : p) System.out.println(" " + x); } } Листинг 6. Исходный код J2 public class ProekWithLists { private static double nil = Double.NaN; private static boolean isNil(double x) { return Double.isNaN(x); } public static double[] proekWithLists(double[] q, double eps) { boolean workIsDone; double[] p = new double[q.length]; double ar = 1.0 - eps * q.length; for (int i = 0; i < q.length; i++) { p[i] = (q[i] - eps) / ar; } do { workIsDone = true; double cod = countOfDefined(p); double sq1p = sq1(p); for (int i = 0; i < p.length; i++) { if (!isNil(p[i])) { p[i] += sq1p / cod; } } for (int i = 0; i < p.length; i++) { if (p[i] < 0.0) { p[i] = nil; workIsDone = false; } } } while (!workIsDone); for (int i = 0; i < p.length; i++) { if (isNil(p[i])) { p[i] = 0.0; } p[i] = eps + ar * p[i]; } return p; } private static double[] defined(double[] q) { java.util.ArrayList result = new java.util.ArrayList(); for (double y : q) { if (!isNil(y)) { result.add(y); } } double[] resultArr = new double[result.size()]; for (int i = 0; i < result.size(); i++) { resultArr[i] = result.get(i); } return resultArr; } private static double sq1(double[] q) { double sum = 0; for (double y : defined(q)) { sum += y; } return 1 - sum; } private static int countOfDefined(double[] q) { return defined(q).length; } } Листинг 7. Исходный код J2, продолжение public class Main { public static void main(String[] args) { double[] result = ProekWithLists.proekWithLists(new double[] { 1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1 }, 0.001); for (double x : result) { System.out.print(" " + x); } System.out.println(); } } -----------------------------------------------------------------------------------------------------------------