Проверка за синхронизация

dakata__92

Super Moderator
Здравейте колеги. Налага ми се в една система да направя аларма дали съществува синхронизация между 3 сървъра. По принцип бих използвам командата :

Код:
SELECT * FROM performance_schema.replication_connection_status

за всеки сървър, но на практика в сайта потребителя на базата няма права да чете от таблицата. Не ми се иска да вдигам на потребителя правата и въпроса ми е дали има и алтернативен начин да видя дали между трите сървъра съществува синхронизация?

Код:
public function getMySqlSync()
    {
        $servers = $this->getServersSettings();
        $countServers = count($servers);
        $mysqlSync = [];
        for ($i = 1; $i <= $countServers; $i++) {
            if (isset($servers[$i])) {
                $query = $this->mdb->query("SELECT * FROM performance_schema.replication_connection_status", $servers[$i]['ip']);
                if ($query->num_rows > 0) {
                    while ($item = $query->fetch_object()) {
                        $mysqlSync[$i] = $item;
                    }
                }
            }
        }
        return $mysqlSync;
    }
 
Офтопик:
С каква идея се правят тези синхронизации ? При бекъп сървъри или? Каква е ползата / предимството ?
 
Ticketa каза:
Офтопик:
С каква идея се правят тези синхронизации ? При бекъп сървъри или? Каква е ползата / предимството ?

Имам 3 сървъра, които са ми в кръгова топология, които поемат постъпващ трафик. И трите сървъра във всеки един момент са ми и мастър и слейв. Тоест синхронизацията ми е между трите сървъра. Ако единия падне или го спрем другите поемат трафика. Лесно мога и да пренастроя топологията, защото базата ми се уеднаквява навсякъде. Та идеята е не само да са бекъп, но са и съвсем легитимни самостоятелни единици. Просто ми трябва аларма да видя в момента статуса на слейв сървърите. Тоест
Код:
SHOW SLAVE STATUS
също ми изисква юзър права, които не смятам да вдигам, за което търся и друг алтернативен вариант да визуализирам аларма в сайта.
 
Ти искаш тази аларма да е част от приложението, което ползва тези бази? Не може ли тази аларма отделно да я направиш, съответно с отделен юзер който само това може да проверява?
 
djman каза:
Ти искаш тази аларма да е част от приложението, което ползва тези бази? Не може ли тази аларма отделно да я направиш, съответно с отделен юзер който само това може да проверява?

Да, алармата трябва да е част от приложението. Няма вариант да е отделен потребител.
 
dakata__92 каза:
djman каза:
Ти искаш тази аларма да е част от приложението, което ползва тези бази? Не може ли тази аларма отделно да я направиш, съответно с отделен юзер който само това може да проверява?

Да, алармата трябва да е част от приложението. Няма вариант да е отделен потребител.

Има вариант. Създай нов потребител с правата, които искаш, добави втори връзка в Ларавел със съответния потребител и прави каквото искаш с него.

Ако създаваш модел, просто задавай името на връзката, която да ползва:

Код:
protected $connection = "second-conn";

или https://laravel.com/docs/7.x/database#using-multiple-database-connections
 
Revelation каза:
dakata__92 каза:
djman каза:
Ти искаш тази аларма да е част от приложението, което ползва тези бази? Не може ли тази аларма отделно да я направиш, съответно с отделен юзер който само това може да проверява?

Да, алармата трябва да е част от приложението. Няма вариант да е отделен потребител.

Има вариант. Създай нов потребител с правата, които искаш, добави втори връзка в Ларавел със съответния потребител и прави каквото искаш с него.

Ако създаваш модел, просто задавай името на връзката, която да ползва:

Код:
protected $connection = "second-conn";

или https://laravel.com/docs/7.x/database#using-multiple-database-connections

Знам, но приемете на доверие, че ми е необходимо алтернативно решение. Мислех си да правя преброяване на всеки от сървърите на една и съща синхронна таблица. Тоест ако синхронизацията на всеки 2 минути се опитва да навакса разликите в сървърите, то по принцип би трябвало да има огромна разлика между таблицата на сървър 1, 2 и 3. Проблема да правя преброяване, е че във всеки един момент мога да имам разлика и от 100 000 записа постъпващ трафик, та ще активира фалшиво - позитивна реакция на алармата, ако направя да е по процент разлика.
 
Никой ли няма идея как да проверя дали има синхронизация между сървърите?!
 
Тоест искаш да направиш load balancing между 3 машини ?
Нямам на идея каква точно е архитекрурата но мога да предположа че:
1. имаш рутер Dell с повечко тунели (В-ланс) понеже е по-евтиното решение.
2. имаш 3 машини за load balancing на заявките.
3. следват процеррни станции
4. бази данни които се се синхронизират/репликират, които са с ъплинк между тях(мегабитови/гигабитови/SFP).

Или си само с 3 машини ? Ако е така какво стои пред тях и казва на заявките коя къде да отива ? С пинг ли се управляват или нещо следи кога мрежата падне и отчита че машината я няма ? ....
Или просто искаш да си синкваш 3 машини в реално време ? Ако е така най-доброто и скъпо е r1 soft. Тествал съм го и работи перфектно. Има и bare-metal restore.
 
muti каза:
Тоест искаш да направиш load balancing между 3 машини ?
Нямам на идея каква точно е архитекрурата но мога да предположа че:
1. имаш рутер Dell с повечко тунели (В-ланс) понеже е по-евтиното решение.
2. имаш 3 машини за load balancing на заявките.
3. следват процеррни станции
4. бази данни които се се синхронизират/репликират, които са с ъплинк между тях(мегабитови/гигабитови/SFP).

Или си само с 3 машини ? Ако е така какво стои пред тях и казва на заявките коя къде да отива ? С пинг ли се управляват или нещо следи кога мрежата падне и отчита че машината я няма ? ....
Или просто искаш да си синкваш 3 машини в реално време ? Ако е така най-доброто и скъпо е r1 soft. Тествал съм го и работи перфектно. Има и bare-metal restore.
Аз проблеми със синхронизацията нямам. Имаме си собствен дата център и страхотни системни администратори. Синхронизацията е в реално време. Има много условия, при които можем да "счупим" вече създадена синхронизация и на практика внимаваме къде какво правим по код, файлове и база данни. Та искам да създам PHP аларма, която да ми казва, че някоя от машините не е синхронна с останалите. Споделих заявките в базата, но няма да вдигам правата на потребителите или да добавям нова конекция с друг потребител и да я разпръсна по сървърите за да достъпя една аларма.
 
View? Или Database procedure която да заобиколиш нещата и да можеш да четеш от тази таблица?
Друга опция е пак с потребител, който може само чете от тази таблица и да държиш допълнителна кънекция към базата данни когато се изивика кода.
Да накараш базата данни през опредлено време да пише в друга таблица, където потребителя има права, например? или в някой файл.
 

Горе