需求背景:
后台统计数据和普通用户都集中在同一个时间点访问,并且统计数据大部分都是实时统计的,因而对服务器的压力,特别是数据库的压力特别大。
第一个想到的改良思路是,先剥离后台统计和普通用户的操作,让他们分别访问不同的服务器,只要数据是一致即可,这样的压力就分开了。那第一步实现的方式就是 Mysql 主从备份。
当前环境:
服务器:
阿里云ECS服务器
Mysql 版本
mysql Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1
主要流程
1 配置Mysql主服务器
配置 只有备份权限的帐号
grant replication slave on *.* to 'copyuser1'@'ip 地址' identified by 'copyuser2016' with grant option;
导出数据库
mysqldump -u root -p wx_wdy > /home/wx_wdy.sql
修改 my.cnf 配置文档
[mysqld]
log_bin=mysql-bin
binlog-do-db=foodcase //需要同步的db
binlog-ignore-db=mysql //不需要同步的 db
binlog-ignore-db=wx_wdy
binlog-ignore-db=test
binlog-ignore-db=information_schema
server_id=1 //主服务器
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
character-set-server=utf8
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
重启mysql,并查看配置
mysql> show master status;
File :mysql-bin.000003
Position:13751
这两个值非常关键
后续从服务器配置就需要用上
2 配置Mysql从服务器
创建数据库
create database foodcase;
使用数据库
use foodcase;
导入数据
source /home/db.sql;
测试是否可以连接主服务器
[root@iZ94fzapvqdZ home]# mysql -u copyuser -h ip地址 -p
修改 my.cnf 配置文档
[mysqld]
log_bin=mysql-bin
replicate-do-db=foodcase //要同步的 db
replicate-ignore-db=mysql //不需要同步的 db
replicate-ignore-db=wx_wdy
replicate-ignore-db=test
replicate-ignore-db=information_schema
read_only=1 //只读
server_id=2 //从服务器
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
character-set-server=utf8
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
重启 mysql,并关闭从服务器同步,配置,再打开
mysql> slave stop;
配置和主服务器关联读取,上面得到的两个字段就可以用上了
mysql> change master to master_host=' IP 地址', MASTER_USER='copy', MASTER_PASSWORD='copypassword', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=13751;
打开slave
mysql> slave start;
查看slave同步信息
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: IP 地址
Master_User: copyuser1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 638775
Relay_Log_File: mysqld-relay-bin.000006
Relay_Log_Pos: 374949
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: foodcase
Replicate_Ignore_DB: mysql,wx_wdy,test,information_schema
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 638775
Relay_Log_Space: 386287
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
ERROR:
No query specified
上面的 Slave_IO_Running,Slave_SQL_Running 都为 Yes 说明配置成功了!
3. 测试
主服务器建一个表,同时在从服务器就看到了,这样就是同步成功了。