Mysql/MariaDB-多主互备原理及实践

keepalived中,IP较大的将会成为新的主MASTER,原MASTER重新上线之后将会成为BACKUP。

MariaDB

原理

Mysql主从复制原理

Mysql的主从复制中主要有三个线程:master(binlog dump thread)、slave(I/O thread 、SQL thread),Master一条线程和Slave中的两条线程。

master(binlog dump thread)主要负责Master库中有数据更新的时候,会按照binlog格式,将更新的事件类型写入到主库的binlog文件中。并且,Master会创建log dump线程通知Slave主库中存在数据更新。

I/O thread线程在Slave中创建,该线程用于请求Master,Master会返回binlog的名称以及当前数据更新的位置、binlog文件位置的副本。然后,将binlog保存在 「relay log(中继日志)」 中,中继日志也是记录数据更新的信息。

SQL线程也是在Slave中创建的,当Slave检测到中继日志有更新,就会将更新的内容同步到Slave数据库中,这样就保证了主从的数据的同步。

多主互备的话就是,为每个数据库都配置其他数据库的主从复制即可。

配置

[mysqld]
# server-id不能相同
server-id = 100

# bin_log的地址
log_bin = /var/lib/mysql/mysql-bin.log

# id自增幅度,有几台就配置成几
auto-increment-increment = 3

# id初始值,与auto-increment-increment一起就能保证id两台mysql插入的id不同,每台需要配置不一样
auto-increment-offset = 1

# 复制时忽略数据库及表,建议了解该字段含义之后进行配置,这里配置成完全忽略复制时的错误
slave-skip-errors = all

# 定义relay_log的位置和名称,如果值为空,则默认位置在数据文件的目录,文件名为host_name-relay-bin.nnnnnn,如果服务器的主机名不是localhost的话不配置会有问题,建议配置
relay-log = localServer-relay-log
relay_log_index = localServer-relay-log.index

# 主备连接断开超时时间,超过该时间之后,slave进行重连,如果该值太大的话(默认1小时),那么当Master的dump log线程关闭之后到1小时这段期间内,就算slave连接回来也需要过1小时才能进行正常的同步
slave-net-timeout = 300

slave相关命令如下:

## 关闭名称为xxxx的同步
STOP SLAVE 'xxxx';

## 设置slave配置
change master 'xxxx' to MASTER_HOST='host', master_port=3306,master_user='rep',master_password='password',MASTER_LOG_FILE='mysql-bin.xxxxxx', MASTER_LOG_POS=x for channel 'xxxx';

## 开启名称为peerServer的同步
START SLAVE 'xxxxx';

## 同时开启和关闭所有slave
start all slaves;
stop all slaves;

## 查看所有slave状态
show all slaves status;

## 查看单个slave状态
show slave 'xxxx' status;

测试

配置文件如下:

# 237
[mysqld]
server-id = 100
auto-increment-increment = 3
auto-increment-offset = 1

# 238
[mysqld]
server-id = 200
auto-increment-increment = 3
auto-increment-offset = 2

# 104
[mysqld]
server-id = 300
auto-increment-increment = 3
auto-increment-offset = 3

配置完成后,为同一张表插入两条数据,查看id与预期相同,即237的为1和4;238为2和5;104为3和6。

slave开启命令如下(先通过show master status查看各个数据库的binlog位置):

本次测试binlog位置如下:

# 237
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000014 |      587 |              |                  |
+------------------+----------+--------------+------------------+

# 238
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000008 |     1011 |              |                  |
+------------------+----------+--------------+------------------+

# 104
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000008 |     2114 |              |                  |
+------------------+----------+--------------+------------------+

各数据库slave配置如下:

# 237
# 关闭所有slaves
stop all slaves;
## 237->238
change master 'peerServer' to MASTER_HOST='peerServer', master_port=3306, master_user='rep', master_password='zhkjmysql@002396', MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=1011;
## 237->104
change master 'server104' to MASTER_HOST='server104', master_port=3306, master_user='rep', master_password='zhkjmysql@002396', MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=2114;
# 开启所有slaves
start all slaves;

# 238
# 关闭所有slaves
stop all slaves;
## 238->237
change master 'peerServer' to MASTER_HOST='peerServer', master_port=3306, master_user='rep', master_password='zhkjmysql@002396', MASTER_LOG_FILE='mysql-bin.000014', MASTER_LOG_POS=587;
## 237->104
change master 'server104' to MASTER_HOST='server104', master_port=3306, master_user='rep', master_password='zhkjmysql@002396', MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=2114;
# 开启所有slaves
start all slaves;

# 104
stop all slaves;
## 104->237
change master 'server237' to MASTER_HOST='server237', master_port=3306, master_user='rep', master_password='zhkjmysql@002396', MASTER_LOG_FILE='mysql-bin.000014', MASTER_LOG_POS=587;
## 104->238
change master 'server238' to MASTER_HOST='server238', master_port=3306, master_user='rep', master_password='zhkjmysql@002396', MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=1011;
# 开启所有slaves
start all slaves;

开启之后,分别在三个数据库中分别插入数据,查看各数据库均完成了数据的同步。

因为数据库是互备的,因此没有主备的概念,对于其使用在主备方案下,不要需要通过代码进行主备切换的操作;但是需要去检测slave的状态是否正常,并在其slave不正常时进行告警处理以及恢复slave异常的处理。

Supongo que te gusta

Origin blog.csdn.net/clearlxj/article/details/120841141
Recomendado
Clasificación