搭建主从MySQL服务

目录

前言

在MySQL复制这篇文章里,讲解了复制的应用场景:负载均衡、离线数据分析、远程数据分发等。

在搭建WordPress博客程序后,我在想,如何才能把MySQL复制的功能用起来呢?

采用MySQL主从复制进行数据备份。

为什么

  1. 主从服务,比定时去备份来看,数据备份更加实时。因为WordPress本身的数据流量不大,没有太多的数据写入。
  2. 之前在MySQL主从服务的文章,但没有真实的场景可以实践,这里是一个应用的场景。
  3. 从真实的需求出发,搭建主从服务的应用,可以更好学习理解MySQL主从服务。

实现方案

我简单把方案分解为3个部分。

为了更好实现备份的效果,我并不是在本机搭建主从服务,而是单独在另外一台机器上做MySQL服务。当然,也是运行在docker下的。

  1. 启动从服务MySQL的docker服务。
  2. 为该服务添加MySQL主服务的用户授权,开放iptables 端访问。
  3. 配置从服务,开始同步数据。

实现步骤

从服务器的mysqld参数配置

[mysqld]
server-id = 2
port = 3306
pid-file    =  /var/run/mysqld/mysqld.pid
socket      =  /var/run/mysqld/mysqld.sock
datadir     =  /var/lib/mysql

ssh root@www.xbc.me -L 3306:127.0.0.1:3306 -N

建立从库MySQL服务

docker run -d --restart always \
--name mysql-slave \
-p 3306:3306 \
-v /var/www/data/mysql:/var/lib/mysql \
-v /var/www/etc/mysql:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=matt \
mysql:5.7.27

建立从库MySQL服务

iptables 授权

sudo apt-get install iptables-persistent

sudo iptables -A INPUT -p tcp -s 47.240.76.191 --dport 3306 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 3306 -m conntrack --ctstate ESTABLISHED -j ACCEPT

sudo iptables -A INPUT -s 47.240.76.191 -p tcp --destination-port 3306 -j ACCEPT
sudo iptables -D INPUT -s 47.240.76.191 -p tcp --destination-port 3306 -j ACCEPT

mysql 授权

#
CREATE USER 'sync'@'47.240.76.191' IDENTIFIED BY 'xbcme';
GRANT REPLICATION SLAVE ON *.* TO 'sync'@'47.240.76.191';
FLUSH PRIVILEGES;

开始同步数据

SLAVE STOP;

CHANGE MASTER TO
  MASTER_HOST='mysql-master',
  MASTER_USER='replication',
  MASTER_PASSWORD='<password>',
  MASTER_LOG_FILE='mysql-bin.00005',
  MASTER_LOG_POS=529;

SLAVE START;

遇到的问题

  1. 远程链接,需要master数据库开启bind_address=0.0.0.0 外网的访问,这样你的端口暴露在外网了。
  2. 你还得做一堆的限制,比如iptable 只允许部分ip地址访问,例如远程slave的IP地址,本地可以访问的IP地址,其他全部拒绝掉。
  3. bind_address=127.0.0.1 只允许本机IP地址looplock地址访问

参考链接

  1. Iptables Essentials: Common Firewall Rules and Commands
  2. MySQL Replication 主從式架構設定教學
  3. Create an SSH Tunnel for MySQL Remote Access
  4. How To Set Up Master Slave Replication in MySQL