前言
在mysql的使用过程中,因为单台数据库服务器访问压力过大,会导致数据库读写性能变差,响应迟缓等问题,更为严重的情况是出现数据库服务器宕机,数据丢失。这个时候我们使用数据库主从同步集群就能有效的避免上述的问题。本文以流行的docker容器为例,搭建一套mysql8.0版本的mysql主从同步集群,基于全局事务标识符(GTID)的方法实现集群数据同步,希望能够帮助到大家。
正文
拉取mysql8.0镜像
#拉取mysql8.0镜像 docker pull mysql:8.0.23
创建mysql配置文件my.cnf
ps:这里我们只演示GTID的主从同步配置方式,其它同步配置我们后续有时间在行补充。
[mysqld] ###############################master主配置############################## pid-file=/var/run/mysqld/mysqld.pid socket=/var/run/mysqld/mysqld.sock datadir=/var/lib/mysql lower_case_table_names=1 symbolic-links=0 #设置同步的binary log二进制日志文件名前缀,默认为binlog log-bin=mysql-bin #服务器唯一id,默认为1,主数据库和从数据库的server-id不能重复 server-id=1 #开启GTID主从同步模式 gtid_mode=on enforce_gtid_consistency=true ###################################可选配置############################## #主从复制的数据库名 binlog-do-db=atp #指定忽略同步的数据库 binlog-ignore-db=mysql #为每个session分配的内存,在事务过程中用来存储二进制日志的缓存 binlog_cache_size=1M #主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一) binlog_format=row #设置二进制日志自动删除/过期的天数,避免占用磁盘空间。默认值为0,表示不自动删除。这里设置为7天 expire_logs_days=7 #跳过主从同步中遇到的所有错误或指定类型的错误,避免slave端复制中断。 #如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062
[mysqld] ##############################slave从配置############################## pid-file=/var/run/mysqld/mysqld.pid socket=/var/run/mysqld/mysqld.sock datadir=/var/lib/mysql lower_case_table_names=1 symbolic-links=0 #设置同步的binarylog二进制日志文件名前缀,默认是binlog log-bin=mysql-bin #服务器唯一ID,主数据库和从数据库的server-id不能重复 server-id=2 #开启GTID同步模式 gtid_mode=on enforce_gtid_consistency=true ###############################可选配置################################# #需要主从复制的数据库 replicate-do-db=atp #忽略同步的数据库 binlog-ignore-db=mysql #为每个session分配的内存,在事务过程中用来存储二进制日志的缓存 binlog_cache_size=1M #主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一) binlog_format=row #设置二进制日志自动删除/过期的天数,避免占用磁盘空间。默认值为0,表示不自动删除。 expire_logs_days=7 # 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。 # 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062 #relay_log配置中继日志,默认采用主机名-relay-bin的方式保存日志文件 relay_log=replicas-mysql-relay-bin #log_slave_updates表示slave将复制事件写进自己的二进制日志 log_slave_updates=1 #防止改变数据(只读操作,除了特殊的线程) read_only=1
级联创建mysql配置文件目录
主配置命令:
创建主配置文件目录: mkdir -p /mysql/master/conf
创建主配置文件:touch my.cnf
使用vi将上文的my.cnf文件内容写入配置文件中
从配置命令
创建从配置文件目录: mkdir -p /mysql/slave/conf
创建从配置文件:touch my.cnf
使用vi将上文的my.cnf文件内容写入配置文件中
docker启动主数据库
命令:
docker run --name master-mysql -p 3306:3306 -v /mysql/master/data:/var/lib/mysql -v /mysql/master/conf:/etc/mysql -v /mysql/master/mysql-files/:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.23
参数解释:
--name:启动的docker应用名字
-p:端口映射
-v:数据卷映射,第一个是数据库文件的映射,第二个是配置文件的映射,第三个是mysql-files的映射
-d:后台运行
-e:传递环境变量
docker启动从数据库
命令:
docker run --name slave-mysql -p 3307:3306 -v /mysql/slave/data:/var/lib/mysql -v /mysql/slave/conf:/etc/mysql -v /mysql/slave/mysql-files/:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.23
参数解释:
--name:启动的docker应用名字
-p:端口映射
-v:数据卷映射,第一个是数据库文件的映射,第二个是配置文件的映射,第三个是mysql-files的映射
-d:后台运行
-e:传递环境变量
主服务器与从服务器mysql登录密码方式修改
因为在高版本的服务器中mysql的密码方式安全级别更高,公网无法直接访问服务,我们这里授权一个可以主从同步的用户,使用另外的密码登录方式。
命令:
进入docker容器:
docker exec -it master-mysql /bin/bash
登录mysql:
mysql -uroot -proot
切换到mysql数据库:
use mysql;
设置root用户密码:
ALTER USER 'root'@'%' IDENTIFIED BY 'root' PASSWORD EXPIRE NEVER; ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
刷新权限:
flush privileges;
主从库的密码修改方式都遵循上面的步骤,这里就不在赘述。
从服务器开启主从同步服务
命令:
绑定主服务:
change master to MASTER_HOST='192.168.23.134',MASTER_PORT=3306,MASTER_USER='root',MASTER_PASSWORD='root',MASTER_AUTO_POSITION=1;
开启从服务:
start slave;
查看从服务同步状态:
show slave status \G;
停止同步:
stop slave;
重置从服务:
reset slave;
到这里,证明我们的数据库主从同步服务器集群就搭建成功了。
结语
今天的mysql主从同步集群搭建就到这里了,希望能对你有所帮助,好的,我们下期见。