文末福利
学习Mysql的宝藏都在这里了!
扫码回复“999”领取学习资料
扫码免费自取哦~
MySQL Replication(mysql 主从复制)是指数据可以从一个 mysql 数据库主节点复制到一个或多个从节点的方式。
MySQL 的主从复制主要用途有:
读写分离:数据库有锁机制,在锁表时,会影响读操作,使用主从复制,让主库负责写,从库负责读,这样出现锁表,也可以通过读从库保证业务正常。
数据实时备份:当数据库某个节点出现故障时,能快速切换
高可用 HA
机构扩展
首先,我们准备一台 Linux 机器(以 CentOS7 为例),在 Linux 中安装 docker,用 docker 创建数据 MySQL 数据库的 master 和 slave。
# 安装docker依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 安装docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 设置docker开机启动
systemctl enable docker
docker run -itd --restart always --name mysql-master \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
daocloud.io/mysql:5.7
# --restart always 设置数据库容器为开机自启动
# mysql-master为主数据库容器名称,可以自行修改
# -p 3307:3306 为mysql默认的3306端口映射到宿主机的3307端口,可以自行修改
# -e MYSQL_ROOT_PASSWORD=123456 设置主数据库的root密码为123456,可以自行修改
# daocloud.io/mysql:5.7 为mysql数据库镜像,mysql的版本为5.7
第一次执行,因为要下载 MySQL 的镜像,时间稍微长点,待镜像下载完成后,后续在创建 slave 数据库容器时,就非常非常快了
脚本执行完成,主数据库已经创建成功,此时在宿主机防火墙上开放 3307 端口,或者关闭防火墙(文章以关闭防火墙为例)
# 关闭防火墙
systemctl disable firewalld
docker run -itd --restart always --name mysql-slave \
-p 3308:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
daocloud.io/mysql:5.7
# 命令和创建主数据库一样,只需要修改name和port端口
GRANT REPLICATION SLAVE ON . TO 'backup'@'%' IDENTIFIED BY 'backup';
SHOW GRANTS FOR 'backup'@'%';
从容器中拷贝 mysqld.cnf 到宿主机
# 从mysql-master容器中,拷贝mysqld.cnf文件到宿主机当前目录
docker cp mysql-master:/etc/mysql/mysql.conf.d/mysqld.cnf $PWD/mysqld.cnf
修改 mysqld.cnf
# 在宿主机上修改mysqld.cnf,修改如下
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
server-id = 100
log-bin = mysql-bin
# server-id 是唯一的服务器id,非0整数即可,但不能重复
# log-bin 使用binary logging, mysql-bin是log的文件名称前缀
# 从宿主机本地路径中,拷贝修改后的mysql.cnf文件到mysql-master容器
docker cp mysqld.cnf mysql-master:/etc/mysql/mysql.conf.d/mysqld.cnf
# 在宿主机上修改mysqld.cnf,修改如下
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
server-id = 101
log-bin = mysql-bin
# 与mysql-master相比,server-id发生了变化,不能相同
# 从宿主机本地路径中,拷贝修改后的mysqld.cnf文件到mysql-master容器
docker cp mysqld.cnf mysql-slave:/etc/mysql/mysql.conf.d/mysqld.cn
docker restart mysql-master # 重启主数据库
docker restart mysql-slave # 重启从数据库
执行
CHANGE MASTER TO
MASTER_HOST='192.168.1.239', --宿主机ip
MASTER_PORT=3307, --mysql-master映射到宿主机的端口
MASTER_USER='backup',
MASTER_PASSWORD='backup';START SLAVE;
看到 Slave_IO_Runing、Slave_SQL_Runing 都是 Yes 说明已经配置成功。此时,主从数据库已经配置完成,可以验证一下了。
用 Navicat 等客户端工具,在 mysql-master 数据库中,创建一个库,然后再在 Navicat 等客户端中,打开 mysql-slave 的连接,就能看同样的一个库,也在从库中建立了。
当用 Navicat 等工具连接到 MySQL 数据库后,发现,有多个数据库,但是,没有选中数据库之前,点击查询按钮,不能用‘新建查询’功能打开查询窗口执行脚本。
遇到这样的问题,可以选择‘MySQL’这个库,然后点击查询,再新建查询,就可以打开编辑窗口,写 SQL 语句了。
所以,我们选择了/etc/mysql/mysql.conf.d/mysqld.cnf 文件。
日志是 MySQL 的重要组成部分,MySQL 的日志主要有:错误日志、查询日志、慢查询日志、事物日志、二进制日志。
出现这样的状况,说明你在连接 mysql-slave 从数据库脚本 参数有问题,先 STOP SLAVE 停止从节点服务,再执行修改后的脚本,再 START SLAVE 启动从节点服务,再查看状态 SHOW SLAVE STATUS
文末福利
学习Mysql的宝藏都在这里了!
扫码回复“999”领取学习资料
扫码免费自取哦~