数据库主从同步搭建
MYSQL主从同步是目前使用比较广泛的数据库架构,技术比较成熟,配置也不复杂,特别是对于负载比较大的网站,主从同步能够有效缓解数据库读写的压力。
MySQL主从同步的机制
MYSQL主从同步是在MySQL主从复制(Master-Slave Replication)基础上实现的,通过设置在Master MySQL上的binlog(使其处于打开状态),Slave MySQL上通过一个I/O线程从Master MySQL上读取binlog,然后传输到Slave MySQL的中继日志中,然后Slave MySQL的SQL线程从中继日志中读取中继日志,然后应用到Slave MySQL的数据库中。这样实现了主从数据同步功能。
MySQL主从同步的作用
1、可以作为一种备份机制,相当于热备份
2、可以用来做读写分离,均衡数据库负载
MySQL主从同步的步骤
# 主要步骤:
1. 安装主数据库
2. 修改root账号密码,root账号远程登录
3. 安装从数据库
4. 修改root账号密码,root账号远程登录,密码和主数据库密码相同
5. 主数据库修改配置,添加server-id,添加bin-log文件
6. 主数据库创建同步账号,指定内网ip可以访问,设定同步密码,使用从数据库连接主数据库测试连通性
7. 主数据库刷新表,锁住所有的表,查看master状态,记录bin-log文件和当前的定位编号
8. 使用mysqladmin备份数据库,没有数据可以忽略这一步,数据量大的情况下使用mysqldump来备份数据
9. 从数据库服务器配置server-id,将备份数据导入从服务器。开启binlog等配置
10. 从数据库修改配置,添加同步账户信息以及bin-log文件和当前的定位编号
11. 开启同步,主数据库接触锁定。
实际操作
1. 安装主数据库
2. 修改root账号密码,root账号远程登录
3. 安装从数据库
4. 修改root账号密码,root账号远程登录,密码和主数据库密码相同
1、2、3、4:单机安装mysql教程
cd /app
mkdir mysql
cd mysql
# 下载mysql的包,可以使用服务器下载,也可以本地下载,上传到服务器上去
wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.21-1.el7.x86_64.rpm-bundle.tar
tar -xvf mysql-5.7.21-1.el7.x86_64.rpm-bundle.tar
# 查看冲突版本软件
rpm -qa | grep redhat-lsb-core
rpm -qa | grep postfix
rpm -qa | grep mariadb
# 卸载冲突版本软件
rpm -ev redhat-lsb-core-4.1-27.el7.centos.1.x86_64
rpm -ev postfix-2.10.1-6.el7.x86_64
rpm -ev mariadb-libs-5.5.56-2.el7.x86_64
# 安装依赖
yum install -y net-tools
yum install -y libaio
# 安装rpm,一定要按照顺序安装,遇到问题一定要查询问题,不可直接继续安装
rpm -ivh mysql-community-common-5.7.21-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.21-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.21-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.21-1.el7.x86_64.rpm
# 启动mysql
systemctl start mysqld
# 查看初始用户密码
grep password /var/log/mysqld.log
# 使用mysql账户登录,修改初始化密码
mysql -p
# 输入查看的密码
set password = password("Yingtong@2018!");
# 允许root用户远程连接
grant all privileges on *.* to root@'%' identified by 'Yingtong@2018!';
flush privileges;
# 修改区分大小写的配置
vim /etc/my.cnf
# 底部加入配置
lower_case_table_names=1
# 重新启动mysql
systemctl restart mysqld
# 使用客户端工具连接服务器
5. 主数据库修改配置,添加server-id,添加bin-log文件
# 编辑,并使用:wq保存
vim /etc/my.cnf
# 停止mysql
systemctl stop mysql
# 启动mysql
systemctl start mysql
# 如果启动遇到问题可有可以查看mysql启动日志,以及systemctl 启动日志
# mysql日志
tailf /var/log/mysqld.log
# 系统日志
journalctl -xe
配置:/etc/my.cnf配置修改内容(主数据库)
# 添加serverid,注意必须与从数据库不相同
server-id=2
# 开启mysql-bin日志,使用默认数据目录:/var/lib/mysql/,使用其他目录会有问题
log-bin=/var/lib/mysql/mysql-bin
# 开始mysql-replay-bin日志,使用默认数据目录
relay_log = /var/lib/mysql/relay-bin
# 不区分大小写,项目中有些库使用大写区分,所以服务器上添加这个设定
lower_case_table_names=1
6. 主数据库创建同步账号,指定内网ip可以访问,设定同步密码,使用从数据库连接主数据库测试连通性
主数据库:
# 登录主数据库服务器,输入密码进行登录
mysql -p
# 创建同步账号,ip地址为从数据库ip地址,密码自行定义
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO repl@'172.16.48.131' IDENTIFIED BY 'Repl@2018!';
# 使用户生效
FLUSH PRIVILEGES;
从数据库:
# 使用mysql登录
mysql -urepl -h172.16.48.129 -pRepl@2018!
# 测试连接情况,成功连接上,说明创建的同步账号没有问题
7. 主数据库刷新表,锁住所有的表,查看master状态,记录bin-log文件和当前的定位编号
主数据库;
# 连接主数据库
mysql -p
# 锁定数据库
flush tables with read lock;
# 查询主数据库信息,记录bin-log文件和坐标
show master status;
| File | Position |
+------------------+----------+
| mysql-bin.000007 | 154
8. 使用mysqladmin备份数据库,没有数据可以忽略这一步,数据量大的情况下使用mysqldump来备份数据
主数据库;
# 创建备份文件夹目录
mkdir -p /app/mysqlbackup/
# 备份出文件,数据量小的情况
mysqldump -uroot -p'Yingtong@2018!' -S /var/lib/mysql/mysql.sock --all-databases > /app/mysqlbackup/mysql_bak.$(date +%F).sql
# 备份出文件,数据量大的情况
mysqldump -uroot -p'Yingtong@2018!' -S /var/lib/mysql/mysql.sock --all-databases | gzip > /app/mysqlbackup/mysql_bak.$(date +%F).sql.gz
# 从数据库可以使用scp命令进行拷贝
scp -r root@172.16.48.129:/app/mysqlbackup/mysql_bak.2018-10-21.sql /app/mysqlbackup/
9. 将备份数据导入从服务器。从数据库配置修改和添加,server-id,开启binlog等配置
导入数据库配置
# 将备份数据导入从服务器
mysql -uroot -p'Yingtong@2018!' -S /var/lib/mysql/mysql.sock < /app/mysqlbackup/mysql_bak.2018-10-21.sql
# 修改从服务器数据库配置
vim /etc/my.cnf
# 重新启动数据库
systemctl stop mysqld
systemctl start mysqld
配置:/etc/my.cnf配置修改内容(从数据库)
# 服务id
server-id=1
# 开启mysql-binlog日志
log_bin = /var/lib/mysql/mysql-bin
# 开始mysql-relay日志
relay_log = /var/lib/mysql/relay-bin
# 设定日志的格式化
binlog-format = row
# 设定从库的日志更新
log-slave-updates = true
# 设定只读
read_only = 1
# 设定数据库不区分大小写
lower_case_table_names = 1
10. 从数据库修改配置,添加同步账户信息以及bin-log文件和当前的定位编号
# 从数据库登录mysql
mysql -p
# 设定同步账号,输入前面步骤中的mysql的mysql-bin.000007,和坐标154
CHANGE MASTER TO
MASTER_HOST='172.16.48.129',
MASTER_USER='repl',
MASTER_PASSWORD='Repl@2018!',
MASTER_LOG_FILE='mysql-bin.000007',
MASTER_LOG_POS=154
# 开启同步
start slave;
# 查看同步状态:其中Slave_IO_Running: YES且Slave_SQL_Running: YES即为成功同步了
show slave status G
11. 主数据库接触锁定。
# 主数据库
mysql -p
# 解除锁定
unlock tables;
12. 其他操作
# 停止数据库同步
stop salve;
# 停止同步线程
STOP SLAVE IO_THREAD