目录
1.mysql数据同步原理
2.mysql集群安装
3.主从同步配置
要搭建mysql集群,首先要知道mysql数据的同步原理:
当我们在mysql主库上进行写的操作时,主库会将操作进行备份,存储到二进制日志binlog,由从库的I/O线程来读取binlog日志的内容,将主库中写的操作读取到从库并转存到从库的中继日志relaylog中,从库通过SQL线程将relaylog中的内容进行读取并写入库中,实现主从数据同步。
安装之前先关闭防火墙和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
首先调整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;