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

5 篇文章 0 订阅
1 篇文章 0 订阅

目录

1.mysql数据同步原理

 2.mysql集群安装

3.主从同步配置


1.mysql数据同步原理

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

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

 2.mysql集群安装

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

systemctl stop firewalld        //关闭防火墙
systemctl disable firewalld   //将防火墙设置开机不自启

#关闭selinux服务
vi /etc/selinux/config  //进入到此目录下将selinux的状态设置为disabled
修改为
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

#
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
#
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节点为例

cd /usr/local/mysql2/conf
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使配置生效,

docker restart mysql
docker restart mysql2
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

#进入容器
docker exec -it mysql /bin/bash
#进入mysql控制台
mysql -uroot -p123456

查看master状态,做好记录

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

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

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

exit退出mysql和容器

再进入从节点mysql

#进入容器
docker exec -it mysql2 /bin/bash
#进入mysql控制台
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;

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值