Настройка репликации Master-Master на MySQL 5.7 (Репликация MySql)

В предыдущей статье был описан процесс настройки репликации на более низкий версиях MySQL. С версии 5.7, процесс немножко изменился.

1) Открываем на каждом сервере фай my.cnf (посмотреть где он, можно при помощи команды :

root@zeus:~ # ps -aux | grep mysql
mysql       92401   0,0  0,0   17104   2436  -  Is    5:24      0:00,04 /bin/sh /usr/local/bin/mysqld_safe --defaults-extra-file=/usr/local/etc/mysql/my.cnf --basedir=/usr/local --datadir=/var/db/mysql --pid-file=/var/db/mysql/zeus.pid --use
mysql       93865   0,0  4,4 2078892 369796  -  S     5:24      6:09,86 /usr/local/libexec/mysqld --defaults-extra-file=/usr/local/etc/mysql/my.cnf --basedir=/usr/local --datadir=/var/db/mysql --plugin-dir=/usr/local/lib/mysql/plugin --user=
root        58846   0,0  0,0   18844   2144  1  S+    9:21      0:00,00 grep mysql

И изменяем/добавляем следующие строчки:

bind-address = 0.0.0.0 #слушаем все ИП
log_bin = mysql-bin.log #куда пишем бинарный логи
binlog_do_db = radme_rep  #база для бинарных логов
slave-skip-errors = 1062 #пропускаем ошибки дубликатов ID если вдруг будут. Дубликаты исключаем разными автоинскрементами
expire_logs_days = 5 #сколько дней храним бинарный логи
expire-logs-days = 5 #встречается и такой синтаксис
auto-increment-increment = 3 #автоинскремент для счетчиков. На разных серверах нужен разный. Обычно если два, то на первом 2, на втором 3
auto-increment-offset = 1 #сдвиг автоинскремента. Можно тоже разный на серверах. Цель - чтоб ID в таблицах были уникальные на каждом сервере
binlog-ignore-db = mysql #игнорируем для репликации
binlog-ignore-db = sys #игнорируем для репликации
binlog-ignore-db = performance_schema #игнорируем для репликации
binlog-ignore-db = information_schema #игнорируем для репликации
server-id=2 #разный для каждого сервера

На каждом сервере найдем файл auto.cnf (на FreeBSD он /var/db/mysql/auto.cnf), и и убедимся, что server-uuid разный. Если вдруг одинаковые — поменяем (36 символов!, лучше если менять то конечные числа и с опаской!)

Перезапустим MySql

service mysql-server restart

2) На каждом сервере создадим пользователя, от которого будет происходить репликация

create user 'replicator'@'%' identified by 'password';
grant replication slave on *.* to 'replicator'@'%';

3) На каждом сервере выполним, команду, чтоб увидеть текущий статус репликации

root@localhost [(none)]> SHOW MASTER STATUS;
+------------------+----------+---------------------+-------------------------------------------------------------------------------------------------+---------------------------------------------+
| File             | Position | Binlog_Do_DB        | Binlog_Ignore_DB                                                                                | Executed_Gtid_Set                           |
+------------------+----------+---------------------+-------------------------------------------------------------------------------------------------+---------------------------------------------+
| mysql-bin.000008 |  3019073 | radme_rep,radme_rep | mysql,sys,performance_schema,information_schema,mysql,sys,performance_schema,information_schema | c2cc8aab-dfaa-11e7-a13b-90e2baa24e6c:1-4443 |
+------------------+----------+---------------------+-------------------------------------------------------------------------------------------------+---------------------------------------------+
1 row in set (0.01 sec)

На каждом сервере создаем задание мастер репликацию друг на друга, и запускаем собственно репликацию:

Сервер 1

CHANGE MASTER TO MASTER_HOST='10.20.0.41', MASTER_USER='replicator', MASTER_PORT=3306, MASTER_PASSWORD='password', MASTER_AUTO_POSITION = 1 FOR CHANNEL 'master1';
START SLAVE FOR CHANNEL "master1";

Сервер 2

CHANGE MASTER TO MASTER_HOST='10.20.0.41', MASTER_USER='replicator', MASTER_PORT=3306, MASTER_PASSWORD='password', MASTER_AUTO_POSITION = 1 FOR CHANNEL 'master2';
START SLAVE FOR CHANNEL "master2";

Смотрим как идет репликация:

SHOW SLAVE STATUS\G

Если нужно приостановить репликацию:

STOP SLAVE FOR CHANNEL "master2";

Если нужно удалить репликацию:

RESET SLAVE;
RESET MASTER;
RESET SLAVE ALL;

Установка курсора в позицию поля input или textarea на JavaScript

Кроссплатформенное решение, не требующее Jquery:

function getCaretPosition(ctrl) {
    if (document.selection) {
        ctrl.focus();
        var range = document.selection.createRange();
        var rangelen = range.text.length;
        range.moveStart('character', -ctrl.value.length);
        var start = range.text.length - rangelen;
        return {
            'start': start,
            'end': start + rangelen
        };
    } else if (ctrl.selectionStart || ctrl.selectionStart == '0') {
        return {
            'start': ctrl.selectionStart,
            'end': ctrl.selectionEnd
        };
    } else {
        return {
            'start': 0,
            'end': 0
        };
    }
}


function setCaretPosition(ctrl, start, end) {
    if (ctrl.setSelectionRange) {
        ctrl.focus();
        ctrl.setSelectionRange(start, end);
    } else if (ctrl.createTextRange) {
        var range = ctrl.createTextRange();
        range.collapse(true);
        range.moveEnd('character', end);
        range.moveStart('character', start);
        range.select();
    }
};    

Использование:

//прочитаем позицию с выделеним
outpz = getCaretPosition(document.getElementById('summpayme'));
//установим позицию с выделением
setCaretPosition(document.getElementById('summpayme'),outpz.start, outpz.end);

Ночник из Arduino Mega

Купили как-то в FixPirice светильник «ночное» небо за 99р. Так-то бы в принципе и ничего, но единственный светодиод дико раздражал своим миганием невпопад. А тут как раз оказалась что у меня есть Arduino Mega завалящаяся да три светодиода. Час работы и вот результат 😉

Кому интересно вот Скетч:

void setup() {
  pinMode(13, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);

  digitalWrite(13, LOW); 
  
  analogWrite(11, 100);  // средний
  analogWrite(9, 255);  //желтый
  analogWrite(12, 255);  //зеленый
  analogWrite(10, 255);   //красный
  
}

int step=8;
int paus=20;
void loop() {
  //зажигаем желтый, гасим зеленый
  for (int i=255;i>0;i=i-step){
    analogWrite(9, i);  //желтый    
    analogWrite(12, 255-i);  //зеленый
    delay(paus);
  };
  analogWrite(12, 255);
  //зажигаем красный, гасим желтый
  for (int i=255;i>0;i=i-step){
    analogWrite(10, i);  //красный
    analogWrite(9, 255-i);  //желтый    
    delay(paus);
  };
  analogWrite(9, 255);
  //зажигаем зеленый, гасим красный
  for (int i=255;i>0;i=i-step){
    analogWrite(12, i);  //зеленый
    analogWrite(10, 255-i);  //красный
    delay(paus);
  };
  analogWrite(10, 255);

  paus=paus-1;
  if (paus==5){paus=20;};
}

LAMP для WordPress на FreeBSD 10 через pkg add

1) Устанавливаем apache

pkg install apache24

, правим /usr/local/etc/apache24/httpd.conf, присвоив ServerName и ServerAdmin. Стартуем

service apache24 start

, разрешаем запуск после перезагрузки

sysrc apache24_enable=yes

2) Ставим Mysql

pkg install mysql57-server
sysrc mysql_enable=yes
service mysql-server start

И поменяем пароль на вход для root

mysql_secure_installation

3) Ставим PHP

pkg install mod_php71 php71-mysqli

Для того чтобы Apache24 знал что делать с файлами php, редактируем https.conf

<IfModule dir_module>
    <FilesMatch «\.php$»>
        SetHandler application/xhttpdphp
    </FilesMatch>
    <FilesMatch «\.phps$»>
        SetHandler application/xhttpdphpsource
    </FilesMatch>
</IfModule>

Ставим дополнительные модули PHP для работы WordPress

pkg install php71-zip php71-openssl php71-mbstring php71-mysqli php71-mcrypt php71-json php71-iconv php71-gd php71-curl php71-dom php71-curl

4) Создаем пользователя для доступа по SSH

adduser