前言
随着业务系统沉淀下来越来越多的数据,加上访问量越来越大,给数据库增加了很多的负担。于是作为技术开发的我,就需要想办法解决这个问题。公司使用的MySQL数据库,所以主从复制(读写分离)作为我的首选。接下来就分享一下我的操作流程。
一、安装数据库
一般公司现有数据库不用重新安装,我这里使用docker运行两个容器来使用
启动master容器
docker run -d -p 3306:3306 --name mysql-master -v /mysql/config:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=mysqlMaster mysql
启动slave容器
docker run -d -p 3307:3306 --name mysql-slave -v /mysql/config/slave:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=mysqlSlave mysql
MYSQL_ROOT_PASSWORD
参数是数据库root账户的密码
两个容器启动好就是这样子
二、数据库主从配置
主库
修改主库my.cnf
文件,路径(/etc/my.cnf
)
[mysqld]
server_id=1 #id仅数字,不能带其他字符
log-slave-updates=true #跟着给true就行
配置好之后重启数据库,查询主库状态
show master status;
从库
从库my.cnf也需要配置,比主库少一行
[mysqld]
server_id=2 #id仅数字,不能带其他字符
这里的server_id不能给主库id相同,相同的话主从复制是不会成功的
创建跨域账户
这里需要一个主库的账户,以保证从库可以登陆主库的mysql数据库,所以我们在主库执行以下SQL
-- 创建rep用户
create USER 'rep'@'%' IDENTIFIED WITH sha256_password BY 'password';
-- 授权
grant replication slave,replication client on *.* to 'rep'@'%';
-- 刷新权限
flush privileges;
从库配置主从关系
在从库执行
change master to master_host='172.17.0.2',master_user='rep',master_port=3306,master_password='123456789',master_log_file='binlog.000002',master_log_pos=2676;
master_host
:主数据库服务器ipmaster_user
:跨域账户的账户名master_port
:主数据库端口master_password
:跨域账户的密码master_log_file
:主数据库binlog文件名(可以查看show master status
的File
的值) 注意:这里是文件名,不包含路径master_log_pos
:主数据库的偏移量(可以查看show master status
的Position
的值)
启动同步服务进程
start slave
查看进程状态
show slave status;
Slave_IO_Running
:写入状态Slave_SQL_Running
:本地数据库运行状态
当连个状态均为yes
时,证明数据库主从状态设置成功