Day.12 主从搭建 - 部署流程(Master Slave Replication )

了解昨天提到的主从运作流程後,今天来实际搭建主从架构~

在前面我们起了一台VM当作Master,现在在新增一台VM当作Slave,让Slave能够连接到Master完成主从复制功能。 ps.参考Day.3 部署流程

跳过Slave部署mysql流程. . .

1.确认Master配置有开启binlog设定 (设定档: /etc/mysql/my.cnf)

[mysqld]

#确保与要连线的slave ID不同(唯一)
server-id = 1

#binlog(ON)&设定档名以mysql-bin开头
log-bin = mysql-bin      <- (确认有设定)

#binlog的格式(模式:row/statement/mixed)
binlog-format = row

#保留x天binlog (default:0,表示不自动删除)
expire_logs_days = 1

#写缓冲x次,刷一次磁碟(0:预设系统每隔一段时间重整快取资料到磁碟,1:每次事务提交就会写入磁碟,N:每N个事务提交...)
sync-binlog = 1

...

  1. 在Master上新增一组使用者帐密授予备份权限用於主从同步。
mysql> CREATE USER 'replicate'@'%' IDENTIFIED BY '1234';

mysql> GRANT REPLICATION SLAVE ON *.* TO 'replicate'@'%';

mysql> FLUSH PRIVILEGES;

https://ithelp.ithome.com.tw/upload/images/20210825/20130880vSUCMkgHNP.png

  1. 备份Master上的资料库资料传至Slave服务器汇入 & 确认目前binlog执行位置 (没资料的话跳过...)
root@mysql-master-1:/mnt/mysql_data/mysql# mysqldump -uroot -p1234  --routines --events --single-transaction --master-data=2 --flush-logs --all-databases > 

https://ithelp.ithome.com.tw/upload/images/20210828/20130880oCa5a8UwzB.png

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
  1. 更改slave设定档後重启mysql服务
[client]
#mysql 客户端连线服务端预设port
port=3306
socket=/mnt/mysql_data/mysql/mysql.sock

[mysqld]
#mysql使用socket方式登陆的sock档案路径
socket=/mnt/mysql_data/mysql/mysql.sock
#mysql 资料库档案所在目录
datadir=/mnt/mysql_data/mysql
#错误日志路径
log-error=/var/log/mysql/error.log
#mysql服务端预设监听port
port=3306

# 设定字符集utf8
character_set_server=utf8

#slow log是否开启(1启用/0禁用)
slow-query-log = 1
#慢查询日志路径&档名
slow_query_log_file=/mnt/mysql_data/mysql/slow.log
#执行超过x秒就纪录 (EX: 1s)
long_query_time = 1

#服务器ID,注意要与master的server_id不同(唯一)
server-id = 2
#relay_log 配置中继日志
relay-log=/mnt/mysql_data/mysql/slave1-relay-bin
#只读状态
read_only = 1

#====slave crash-safe====
#master.info和relay-log.info内容写入DB:mysql中的表
master_info_repository = TABLE
relay_log_info_repository = TABLE
#意外时重启後会忽略未被执行的relay log,重新连接master获取relay log来进行恢复
relay-log-recovery = 1

...

root@mysql-slave-1:/mnt/mysql_data/mysql# systemctl restart mysql
  1. 登入slave设定主从
  • master_host : master的ip地址
  • master_user : 设定要连接的使用者 (前面新增的replicate使用者)
  • master_password : 设定要连接master的密码
  • master_log_file & master_log_pos : 步骤3. master备份完的binlog文件和位置
mysql> change master to master_host='10.128.0.4',master_user='replicate',master_password='1234',master_log_file='mysql-bin.000004',master_log_pos=154;

mysql> start slave;

最後确认一下状态是否成功连接就完工啦/images/emoticon/emoticon34.gif
https://ithelp.ithome.com.tw/upload/images/20210828/20130880tYpFoUAbZv.png

如果主从有同步异常停止时,会造成读取资料不一致,影响业务上运作。

所以如何快速第一时间检视问题点 ?

1.透过show slave status 浏览状态
2.错误日志

ex.假设今天先在slave删掉了一笔纪录。那当我在master执行删除同一笔资料,语法同步至slave时会产生该笔资料不存在的问题,等於SQL-thread提取的日志无法应用在slave上会喷下图1032错误,造成同步失败停止。因为对於slave来说该笔资料早就被删除了!!
https://ithelp.ithome.com.tw/upload/images/20210828/20130880zPDshyqgWN.png

以上面例子来说可以看到错误提示为在Master-(mysql-bin.000004, end_log_pos 1010)位置的DELETE事件错误,由於在slave上要执行删除的资料已经不存在,所以在这边我们可以透过还原被删除的资料,逆向手动执行INSERT那笔要被删除的资料让DELETE语法能顺利执行。

  • 首先在master上透过错误提示位置找到该event纪录的详细栏位资讯用来还原该笔资料。
    https://ithelp.ithome.com.tw/upload/images/20210828/20130880ti6YiMAgfo.png

  • 在slave上执行还原插入资料後重启复制线程

mysql> insert into user.user_powers(user_id,nick_name,group_id) values(23122141,'kiki',1242000);

mysql> start slave;

以上算是针对该问题安全解决的做法。但有时看情况也可选择直接跳过该错误Event,如果不会影响到资料的一制性(ex.本例)

mysql> stop slave;

#代表跳过这1个event
mysql> SET GLOBAL sql_slave_skip_counter = 1;  

mysql> start slave;

提供2种方式没问题的话就可以看到Slave_SQL_Running状态恢复成YES正常运作啦~/images/emoticon/emoticon01.gif


<<:  Day 20 「就是真诚」TDD 的实弹演习:Magneto Effect

>>:  [Day 20] JS - 变数宣告

DAY26:Google Map之简介及实作

今天要来说到在APP中加入Google map,以下概略的介绍一些建置与功能用法,首先,我们要来新增...

CSS Animation 使 Mobile 网页崩溃!? 效能优化篇(2) - 查看网页效能并发现问题~

崩溃之後面对的是迟钝 上一章我们解决了网页崩溃问题,接下来发现网页中的动画在电脑上顺利执行,IPho...

爬虫怎麽爬 从零开始的爬虫自学 DAY19 python网路爬虫开爬-2网页解析

前言 各位早安,书接上回我们已经成功抓到网页的原始码了,今天我们要把它变成有用能阅读的资讯 开爬-网...

网页表单-30天学会HTML+CSS,制作精美网站

表单在网页上有不同呈现的功能,像是网路投票、注册、购物、问券、搜寻等,用来收集浏览者的资讯,增加与使...

[Day05] pod service node kubectl

写在前面 test for placeholder test for placeholder tes...