当前位置:   article > 正文

linux上搭建mysql数据库集群,实现数据库主从同步和读写分离_linux搭建mysql集群

linux搭建mysql集群

目录

1.mysql数据同步原理

 2.mysql集群安装

3.主从同步配置


1.mysql数据同步原理

        要搭建mysql集群,首先要知道mysql数据的同步原理:

        当我们在mysql主库上进行写的操作时,主库会将操作进行备份,存储到二进制日志binlog,由从库的I/O线程来读取binlog日志的内容,将主库中写的操作读取到从库并转存到从库的中继日志relaylog中,从库通过SQL线程将relaylog中的内容进行读取并写入库中,实现主从数据同步。

 2.mysql集群安装

        安装之前先关闭防火墙和selinux

  1. systemctl stop firewalld //关闭防火墙
  2. systemctl disable firewalld //将防火墙设置开机不自启
  3. #关闭selinux服务
  4. vi /etc/selinux/config //进入到此目录下将selinux的状态设置为disabled
  5. 修改为
  6. selinux=disabled

        我这里使用docker安装mysql, linux直接安装参见:linux(centos7)安装mysql

        要拉取最新版mysql的docker镜像,直接使用docker pull mysql即可,我这里使用的是mysql5.7版本

docker pull mysql:5.7

使用

docker images

查看下载的镜像

 mysql文件路径配置挂载宿主目录,启动容器

docker run -d -p 3306:3306 --privileged=true -v /usr/local/mysql/log:/var/log/mysql -v /usr/local/mysql/data:/var/lib/mysql -v /usr/local/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7

其余机器同理。

 我这里由于是同一台机器部署,分别执行启动mysql2和mysql3的容器,端口分别设置为3307和3308

  1. #
  2. docker run -d -p 3307:3306 --privileged=true -v /usr/local/mysql2/log:/var/log/mysql -v /usr/local/mysql2/data:/var/lib/mysql -v /usr/local/mysql2/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql2 mysql:5.7
  3. #
  4. docker run -d -p 3308:3306 --privileged=true -v /usr/local/mysql3/log:/var/log/mysql -v /usr/local/mysql3/data:/var/lib/mysql -v /usr/local/mysql3/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql3 mysql:5.7

3.主从同步配置

首先调整mysql配置文件

cd /usr/local/mysql/conf

编辑主节点mysql配置

vim my.cnf

[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
server-id=1 #mysql 服务ID,保证整个集群环境中唯一
log-bin=mysql-bin #开启二进制日记文件
read-only=0 #可读可写
log-slave-updates=1
expire_logs_days = 7
binlog_cache_size=32m
max_binlog_cache_size=512m
max_binlog_size=512m

# 默认是所有记录,可以配置哪些需要记录,哪些不记录

replicate-do-db=数据库名1 #要同步的数据库1

replicate-do-db=数据库名2 #要同步的数据库2

binlog-ignore-db=mysql #忽略的数据, 指不需要同步的数据库

我这里分别是mysql2和mysql3 容器,以mysql2节点为例

  1. cd /usr/local/mysql2/conf
  2. cd /usr/local/mysql3/conf

编辑从节点mysql配置

vim my.cnf

添加以下内容

[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
server-id=2
log-bin=mysql-bin
relay-log= mysql-relay-bin
binlog-format=ROW
read-only=1
log-slave-updates=1
binlog_cache_size=32m
max_binlog_cache_size=512m
max_binlog_size=512m
expire_logs_days=7

# 默认是所有记录,可以配置哪些需要记录,哪些不记录

replicate-do-db=数据库名1 #要同步的数据库1

replicate-do-db=数据库名2 #要同步的数据库2

binlog-ignore-db=mysql #忽略的数据, 指不需要同步的数据库

一定要保证各节点分别使用不同的server_id

重启mysql使配置生效,

  1. docker restart mysql
  2. docker restart mysql2
  3. docker restart mysql3

直接安装的话执行 systemctl restart mysqld

可以进入容器内的mysql查看对应的server_id

show variables like 'server_id';

由于我这里是同一台主机内容器通信,需要进入docker容器内部查看容器ip,执行

docker inspect mysql

 检查mysql主节点容器的配置,找到容器ip,我这里是172.17.0.3,部署在非同一台机器的可以忽略,直接用真实ip即可

然后先进入主节点容器的mysql

  1. #进入容器
  2. docker exec -it mysql /bin/bash
  3. #进入mysql控制台
  4. mysql -uroot -p123456

查看master状态,做好记录

  1. mysql> show master status;
  2. +------------------+----------+--------------+------------------+-------------------+
  3. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  4. +------------------+----------+--------------+------------------+-------------------+
  5. | mysql-bin.000001 | 64163 | | | |
  6. +------------------+----------+--------------+------------------+-------------------+
  7. 1 row in set (0.00 sec)
File : 从哪个日志文件开始推送日志文件 给从节点
Position : 从哪个位置开始推送日志  从什么位置开始同步
Binlog_Ignore_DB : 指定不需要同步的数据库

再确保账号可以正常远程访问

  1. #设置远程访问
  2. mysql> grant replication slave on *.* to 'root'@'172.17.0.3' identified by 'root';
  3. mysql> flush privileges;

exit退出mysql和容器

再进入从节点mysql

  1. #进入容器
  2. docker exec -it mysql2 /bin/bash
  3. #进入mysql控制台
  4. mysql -uroot -p123456

利用上面查到的信息,配置主库ip、日志文件、及从哪个位置开始同步

mysql> change master to master_host= '172.17.0.3', master_user='root', master_password='123456', master_log_file='mysql-bin.000001', master_log_pos=64163;

开启同步

mysql>start slave;

查看同步状态

mysql>show slave status \G;

 slave_IO_running和slave_sql_running这里都是Yes代表同步成功。

可以自己在master库录入修改数据等测试同步情况。实际应用中,可以将主库设置为写库,查询操作全部在从库进行,实现读写分离。

-----------------------------------------------------------

如果后续要要停止同步,执行

mysql> stop slave;

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号