马哥博客作业第十四周

#### 1 MariaDB主从复制原理

1.主节点的更新事件写入binlog;

2.主节点创建一个binlog dump线程,把binlog的内容发送到从节点;

3.从接点连接主节点以后,创建一个I/O线程,读取主节点传过来的binlog内容并写入到relay log;

4.从节点创建一个SQL线程,读取relay log里面的更新事件并解析成SQL语句,然后执行这些SQL语句,将更新内容写入到从节点。

#### 2 MariaDB一主一从架构构建

准备两台纯新的CentOS7.6服务器,其中主机称为node1的服务器地址为192.168.130.132,主机称为node2的服务器地址为192.168.130.133

主节点(node1):

[root@node1 ~]# cat /etc/my.cnf.d/mariadb-server.cnf

[mysqld]

server-id=132

log-bin

[root@node1 ~]# service mysqld restart

[root@node1 ~]# mysql -uroot -p123456

MariaDB [(none)]> grant replication slave on *.* to repluser@'192.168.130.%' identified by 'centos';

MariaDB [(none)]> show master logs;

+--------------------+-----------+
| Log_name         | File_size |
+--------------------+-----------+
| mariadb-bin.000001 | 401 |
+--------------------+-----------+

从节点(node2):

[root@node2 ~]# cat /etc/my.cnf.d/mariadb-server.cnf

[mysqld]

server-id=133

[root@node2 ~]# service mysqld restart

[root@node2 ~]# mysql -uroot -p123456

MariaDB [(none)]> CHANGE MASTER TO

MASTER_HOST='192.168.130.132', #连接master IP地址

MASTER_USER='repluser',

MASTER_PASSWORD='centos',

MASTER_PORT=3306,

MASTER_LOG_FILE='mariadb-bin.000001',

MASTER_LOG_POS=401;

start slave;

show slave statusG

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

#### 3 MariaDB级联复制

上一节中我们完成了一主一从的MariaDB的主从复制架构,但是有的时候,我们期望有一个后备的MariaDB的节点,用只

动词}备份存储数据,不需要对外提供服务。为了实现该功能,我们可以在之前的一主一从架构上进行调整,即将从节点的二进

制文件打开,然后给他配置一个远程同步数据用户,接着使用一台新的服务器做为从服务器的从属同步从服务器数据的即柯林斯,下面我们在原来的架构上添加一台新的CentOS7.6,作为节点3,IP地址为192.168.132.134

node1:

[root@node1 ~]# cat /etc/my.cnf.d/mariadb-server.cnf

[mysqld]

server-id=132

log-bin

[root@node1 ~]# service mysqld restart

[root@node1 ~]# mysql -uroot -p123456

MariaDB [(none)]> grant replication slave on *.* to repluser@'192.168.130.%' identified by 'centos';

node2:
[root@node2 ~]# cat /etc/my.cnf.d/mariadb-server.cnf

[mysqld]

server-id=133

log-bin

read-only

log_slave_updates

[root@node2 ~]# mysql -uroot -p123456

MariaDB [(none)]> show master logs; #记录二进制位置,给第三节点使用

+--------------------+----------------+
| Log_name            | File_size |
+--------------------+----------------+
| mariadb-bin.000001 | 245 |
+--------------------+----------------+

node3:

[root@node3 ~]# cat /etc/my.cnf.d/mariadb-server.cnf

[mysqld]

server-id=134

read-only

[root@node3 ~]# mysql -uroot -p123456

MariaDB [(none)]>CHANGE MASTER TO

MASTER_HOST='192.168.130.133', #连接中间节点 IP地址

MASTER_USER='repluser',

MASTER_PASSWORD='centos',

MASTER_PORT=3306,

MASTER_LOG_FILE='mariadb-bin.000001',

MASTER_LOG_POS=245;

检查状态

start slave;

show slave statusG

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

#### 4 MariaDB半同步复制

yum安装的mariadb-10并且配置好主从同步

主节点:

[root@sz-gl-centos8 ~]# vim /etc/my.cnf.d/mariadb-server.cnf

[mysqld]

server-id=100

log-bin

plugin-load-add=semisync_master

rpl_semi_sync_master_enabled=ON

rpl_semi_sync_master_timeout=3000

[root@sz-kx-centos8 ~]# systemctl restart mariadb

[root@sz-kx-centos8 ~]# mysql -uroot -p123456

MariaDB [(none)]> show global variables like '%semi%';

MariaDB [(none)]> show global status like '%semi%';

从节点:

[root@sz-kx-centos8 ~]# vim /etc/my.cnf.d/mariadb-server.cnf

[mysqld]

server-id=108

plugin_load_add=semisync_slave

rpl_semi_sync_slave_enabled=ON

[root@sz-kx-centos8 ~]# systemctl restart mariadb

[root@sz-kx-centos8 ~]# mysql -uroot -p123456

MariaDB [(none)]> show global variables like '%semi%';

MariaDB [(none)]> show global status like '%semi%';

MariaDB [(none)]> START SLAVE IO_THREAD;

主节点:

MariaDB [(none)]> show global status like '%semi%';

+--------------------------------------------+----------------------+
| Variable_name                                               | Value |
+--------------------------------------------+----------------------+
| Rpl_semi_sync_master_clients                           | 1 |
| Rpl_semi_sync_master_get_ack                        | 0 |
| Rpl_semi_sync_master_net_avg_wait_time      | 0 |
| Rpl_semi_sync_master_net_wait_time              | 0 |
| Rpl_semi_sync_master_net_waits                     | 0 |
| Rpl_semi_sync_master_no_times                      | 1 |
| Rpl_semi_sync_master_no_tx                            | 1 |
| Rpl_semi_sync_master_request_ack                 | 1 |
| Rpl_semi_sync_master_status                        | ON |

测试:

在主节点创建数据库,立即成功

MariaDB [(none)]> create database db1;

Query OK, 1 row affected (0.001 sec)

在从节点实现,停止复制线程

MariaDB [(none)]> stop slave;

在主节点创建数据库,需要等待3s才成功

MariaDB [(none)]> create database db2;

Query OK, 1 row affected (3.001 sec)

在从节点恢复线程

MariaDB [(none)]> start slave;

Query OK, 0 rows affected (0.001 sec)

在主节点创建数据库,立即成功

MariaDB [(none)]> create database db3;

Query OK, 1 row affected (0.004 sec)

yum安装mariadb-5.5.6实现半同步复制

主节点:

#安装master插件,无须重启

MariaDB [(none)]> INSTALL SONAME 'semisync_master';

#开启master_sync

MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=ON;

#设置超时时长为1s

MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_timeout = 1000;

#查看相关全局变量

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';

#查看当前状态信息

MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%';

+--------------------------------------------+-------------+
| Variable_name                                     | Value |
+--------------------------------------------+--------------+
| Rpl_semi_sync_master_clients             | 0 |

从节点:

#安装从插件

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

#启动从插件

MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled=1;

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';

#此时发现slave是关闭的

MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%';

+----------------------------+-------------------+
| Variable_name                        | Value |
+----------------------------+-------------------+
| Rpl_semi_sync_slave_status | OFF |
+----------------------------+-------------------+

#重启线程

MariaDB [(none)]> STOP SLAVE IO_THREAD;

MariaDB [(none)]> START SLAVE IO_THREAD;

#插件开启

MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%';

+----------------------------+------------------+
| Variable_name                      | Value |
+----------------------------+------------------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------------------+

主节点:

MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%';

+--------------------------------------------+-------+
| Variable_name                            | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients        | 2 |

#### 5 MariaDB高可用方案MHA

准备三台新安装的CentOS7.6服务器,并使用yum安装MariaDB10.2.23,主机名分别为node1,node2,node3,IP地址分别为192.168.130.132-134

node1/2/3安装mariadb

[root@node1 ~]# vim /etc/yum.repos.d/mariadb.repo

[mariadb]

name=MariaDB

baseurl=http://mirrors.ustc.edu.cn/mariadb/yum/10.2/centos7-amd64/

gpgkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB

gpgcheck=1

[root@node1 ~]# yum -y install mariadb-server

node1配置

[root@node1 ~]# vim /etc/my.cnf.d/server.cnf

[mysqld]

server-id=132

log-bin

skip_name_resolve=1

general_log

[root@node1 ~]# systemctl enable mariadb.service

[root@node1 ~]# systemctl start mariadb.service

[root@node1 ~]# mysql_secure_installation

[root@node1 ~]# mysql -uroot -p

MariaDB [(none)]> show master status;

找个文本记住下面的信息,一会需要到

File:mha-manager-bin.000001和Position:364

MariaDB [(none)]> grant replication slave on *.* to repluser@'192.168.130.%' identified by 'centos';

MariaDB [(none)]> grant all on *.* to mhauser@'192.168.130.%' identified by 'mhacentos';

[root@node1 ~]# ifconfig eth0:1 192.168.130.200/24

[root@node1 ~]# yum -y install mha4mysql-manager-0.57-0.el7.noarch.rpm mha4mysql-node-0.57-0.el7.noarch.rpm

[root@node1 ~]# ssh-keygen

[root@node1 ~]# ssh-copy-id 192.168.130.132

[root@node1 ~]# rsync -a .ssh 192.168.130.133:/root/

[root@node1 ~]# rsync -a .ssh 192.168.130.134:/root/

[root@node1 ~]# scp mha4mysql-node-0.57-0.el7.noarch.rpm root@192.168.130.133:/root/

[root@node1 ~]# scp mha4mysql-node-0.57-0.el7.noarch.rpm root@192.168.130.134:/root/

[root@node1 ~]# mkdir -p /data/mha/app1

[root@node1 ~]# mkdir /etc/mha

注意:app1.cnf 配置文件有的脚本,需要提前准备好

[root@node1 ~]# vim /etc/mha/app1.cnf

[server default]

user=mhauser

password=mhcentos

manager_workdir=/data/mha/app1/

manager_log=/data/mha/app1/manager.log

remote_workdir=/data/mha/app1/

ssh_user=root

repl_user=repluser

repl_password=centos

ping_interval=1

master_ip_failover_script=/usr/local/bin/master_ip_failover

#master_ip_online_change_script=/usr/local/bin/master_ip_online_change

report_script=/usr/local/bin/sendmail.sh

check_repl_delay=0

[server1]

hostname=192.168.130.132

[server2]

hostname=192.168.130.133

candidate_master=1

[server3]

hostname=192.168.130.134

node2配置

[root@node1 ~]# yum -y install mha4mysql-node-0.57-0.el7.noarch.rpm

node2修改mariadb配置文件

[root@node1 ~]# vim /etc/my.cnf.d/server.cnf

[mysqld]

server-id=133

log-bin

read_only

skip_name_resolve=1

relay_log_purge=0

[root@node1 ~]# systemctl enable mariadb.service

[root@node1 ~]# systemctl start mariadb.service

[root@node1 ~]# mysql_secure_installation

[root@node1 ~]# mysql -uroot -p

MariaDB [(none)]> change master to

master_host='192.168.130.132',

master_user='repluser',

master_password='centos',

master_port=3306,

master_log_file='mha-manager-bin.000001',

master_log_pos=364;

MariaDB [(none)]> start slave;

MariaDB [(none)]> show slave statusG

node3配置

[root@node1 ~]# yum -y install mha4mysql-node-0.57-0.el7.noarch.rpm

node3修改mariadb配置文件

[root@node1 ~]# vim /etc/my.cnf.d/server.cnf

[mysqld]

server-id=134

log-bin

read_only

skip_name_resolve=1

relay_log_purge=0

[root@node1 ~]# systemctl enable mariadb.service

[root@node1 ~]# systemctl start mariadb.service

[root@node1 ~]# mysql_secure_installation

[root@node1 ~]# mysql -uroot -p

MariaDB [(none)]> change master to

master_host='192.168.130.132',

master_user='repluser',

master_password='centos',

master_port=3306,

master_log_file='mha-manager-bin.000001',

master_log_pos=364;

MariaDB [(none)]> start slave;

MariaDB [(none)]> show slave statusG

mha-manager配置

node1检查SSH连接

[root@node1 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf

node1检查复制

[root@node1 ~]# vim /usr/local/bin/master_ip_failover

my $vip设置mha-manager虚拟IP

my $gateway设置默认网关IP

my $interface设置网卡名称

授权

[root@node1 ~]# chmod +x /usr/local/bin/master_ip_failover

[root@node1 ~]# chmod +x /usr/local/bin/sendmail.sh

[root@node1 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf

node1启动mha manager
[root@node1 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf &

[root@node1 ~]# masterha_check_status --conf=/etc/mha/app1.cnf

测试master自动切换

node1执行

[root@node1 ~]# systemctl stop mariadb.service

node1停止mariadb服务后,master自动切换到node2,虚拟IP也切换到node2上

注意事项:

master自动切换后masterha_manager会退出,node1重新启动mariadb服务后需要连接到新的主节点,操作过程如下:

新的master执行

MariaDB [(none)]> show master status;

记住File和Position的值,当前为slave1-bin.000001,1771

node1连接master节点

MariaDB [(none)]> change master to

master_host='192.168.130.133',

master_user='repluser',

master_password='centos',

master_port=3306,

master_log_file='slave1-bin.000001',

master_log_pos=1771;

MariaDB [(none)]> start slave;

再次启动masterha_manager

[root@node1 ~]# rm -rf /data/mha/app1/app1.failover.complete

[root@node1 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf

[root@node1 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf &

[root@node1 ~]# masterha_check_status --conf=/etc/mha/app1.cnf

原文地址:https://www.cnblogs.com/xuanlv-0413/p/13629333.html