谷粒商城-集群-89-Docker 部署 MySQL 主从同步

一、集群的目标

高可用(High Avaliability),是当一台服务器停止服务后,对于业务及用户毫无影响。停止服务的原因可能由于网卡、路由器、机房、CPU负载过高、内存溢出、自然灾害等不可预期的原因导致,在很多时候也称为单点问题。

突破数据量限制,一台服务器不能存储大量数据,需要多台分担,每个存储一部分,共同存储完整个集群数据,最好能做到互相备份,即使单节点故障,也能在其他节点找到数据。

数据备份容灾,单节点故障后,存储的数据仍然可以在别的地方拉起。

分担压力,由于多个服务器都能完成各自一部分工作,所以尽量的避免了单点压力的存在。

二、集群的基础形式

file

三、MySQL集群

MySQL-MMM是Master-Master-Replication Manager for Mysql(MySQL主主复制管理器)的简称。MMM基于MySQL Replication 做的扩展架构,主要用来监控 MySQL 主主复制并做失败转移。其原理是将真实数据库节点的IP(RIP)映射为虚拟的IP(VIP)集。

MySQL 主从同步

1、下载MySQL镜像

sudo docker pull mysql:5.7

2、创建Master实例并启动

docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql/master/log:/var/log/mysql \
-v /mydata/mysql/master/data:/var/lib/mysql \
-v /mydata/mysql/master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

参数说明:

  • -p 3307:3306 : 将容器的 3306 端口映射到主机的 3307 端口
  • -v /mydata/mysql/master/conf:/etc/mysql :将配置文件夹挂载到主机,在主机Linux下创建/mydata/mysql/conf文件夹映射docker
  • -v /mydata/mysql/master/log:/var/log/mysql:将日志文件夹挂载到主机
  • -v /mydata/mysql/master/data:/var/lib/mysql : 将运行期间的数据文件挂载到主机
  • e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码
  • -d mysql:5.7 : -d 表示以后台的方式运行,mysql:5.7 表示以该镜像启动容器

修改master基本配置:

vi /mydata/mysql/master/conf/my.cnf
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

设置好了之后,需要重启MySQL容器:

[root@localhost conf]# docker restart mysql-master
mysql

3、创建slaver从库实例并启动

docker run -p 3317:3306 --name mysql-slaver-01 \
-v /mydata/mysql/slaver/log:/var/log/mysql \
-v /mydata/mysql/slaver/data:/var/lib/mysql \
-v /mydata/mysql/slaver/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

同主MySQL一样,需要修改 slave 基本配置。

vi /mydata/mysql/slaver/conf/my.cnf
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

4、添加master主从复制部分配置

主MySQL配置文件修改:

#master-slaver repication
server_id=1
log-bin=mysql-bin
read-only=0
binlog-do-db=gulimall_ums
binlog-do-db=gulimall_pms
binlog-do-db=gulimall_oms
binlog-do-db=gulimall_wms
binlog-do-db=gulimall_admin

replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

修改完配置后重启master。

从MySQL配置文件修改:

#master-slaver repication
server_id=2
log-bin=mysql-bin
read-only=1
binlog-do-db=gulimall_ums
binlog-do-db=gulimall_pms
binlog-do-db=gulimall_oms
binlog-do-db=gulimall_wms
binlog-do-db=gulimall_admin

replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

配置好之后重启 slaver。

为master授权用户来同步它的数据

1、进入master容器

docker exec -it mysql /bin/bash

2、进入mysql内部

> mysql -uroot -p

1)、授权 root可以远程访问(主从无关,为了方便我们远程连接MySQL)

grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
flush privileges;

2)、添加用来同步的用户

GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by '123456';

3)、查看master状态

show master status\G;

配置slaver同步master数据

1、进入slaver容器

docker exec -it mysql-slaver-01 /bin/bash

2、进入mysql内部

> mysql -uroot -p

1)、授权 root可以远程访问(主从无关,为了方便我们远程连接MySQL)

grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
flush privileges;

2)、设置主库连接

change master to master_host='192.168.10.10',master_user='backup',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=0,master_port=3307;

3)、启动从库同步

start slave;

4)、查看从从库状态

show slave status\G;

file

实战:
在master创建 gulimall-oms 库,并创建 order_info 表,然后看从库是否同步过来。
file

如果主从库数据不同步,则可以使用如下命令临时解决:

mysql> stop slave;
Query OK, 0 rows
affected (0.00 sec)

mysql> set global sql_slave_skip_counter=1;
Query OK, 0 rows
affected (0.00 sec)

mysql> start slave;
Query OK, 0 rows
affected (0.00 sec)

相关文章:
3分钟解决MySQL 1032 主从错误

为者常成,行者常至