前三篇已实现了最基本的负载均衡,但是还存在问题,如两个数据库不同步,上传的附件不同步,数据库没有制定备份计划,负载均衡参数还有待优化等问题。这里先把双机互备和自动备份的内容补齐。
配置 MySQL 数据库的账户密码(以下命令仅用参考,这里的目的是要有一个可供内网其他服务器访问本机数据库的账户);
# 停止数据库服务
service mysql stop
# 免验证启动数据库服务
mysqld –user=mysql –skip-grant-tables –skip-networking
# 登录 mysql
mysql -u root mysql
# 修改用户密码的几种方式
mysql> UPDATE user SET authentication_string=PASSWORD(‘dbpwd’) where USER=’dbadmin’;
mysql> UPDATE user SET authentication_string=PASSWORD(‘dbpwd’) where USER=’dbbaker’;
mysql> UPDATE user SET Password=PASSWORD(‘dbpwd’) where USER=’dbadmin’;
mysql> alter user user() identified by “dbpwd”;
# 使配置生效
mysql> FLUSH PRIVILEGES;
mysql> quit;
# 重启 mysql 服务,注意,这里的 mysql 如果找不到服务,可以尝试 mysqld,再不行就通过 ps -ef | grep mysql 找到进程 ID(pid),然后通过 kill -9 pid 停止服务;
service mysql restart
mysql -udbadmin -p
# Enter password: < 输入新密码 newpassword>
# 创建用户并配置权限:
mysql> GRANT ALL ON *.* TO ‘dbadmin’@’%’ IDENTIFIED BY ‘dbpwd’ WITH GRANT OPTION;
# 移除权限
# REVOKE ALL ON *.* TO ‘dbadmin’@’%’;
FLUSH PRIVILEGES;
# 全局层级:*.*
# 数据库层级:db_name.*
# 表层级:db_name.tbl_name
# ALL 是指分配所有权限,具体权限可以通过下面的查询语句查看
# 查询用户权限
select * from mysql.user \G;
# 删除用户
# delete from mysql.user where Host <> ‘%’;
# 至此,数据库可以通过以上账户进行远程连接了。
配置 MySQL 的双机互备 – 主数据库服务器(192.168.6.200 /etc/my.cnf 的配置请参考 LNMP+HAProxy+Keepalived 负载均衡(三)- 配置文件汇总);
# 在主数据库服务器上执行配置:
vim /etc/my.cnf
# 修改配置内容:
server-id=6 # 数据库集群中唯一
lower_case_table_names=1 # 新增行,数据表不区分大小写
replicate_wild_do_table=sync_db_name.% # 只同步“sync_db_name”库下的表
log-slave-updates=YES # 从服务器同步后记录日志
# 保存配置后重启 MySQL 服务:
service mysql restart
# 进入 MySQL 命令行,查看主数据库状态信息,其中的“File”和“Position”值后面会用到:
mysql> use sync_db_name;
mysql> show master status;
配置 MySQL 的双机互备 – 备数据库服务器(192.168.6.210);
# 停止 slave:
mysql> stop slave;
# 进入 MySQL 命令行,配置要同步的主库来源:
mysql> CHANGE MASTER TO MASTER_HOST=’192.168.6.200′,MASTER_PORT=10002,MASTER_USER=’dbadmin’,MASTER_PASSWORD=’dbpwd’,MASTER_LOG_FILE=’mysql-bin.000016′,MASTER_LOG_POS=1285;
# MASTER_HOST:主数据库的 IP;
# MASTER_PORT:主数据库的端口 (int),默认 3306;
# MASTER_USER,MASTER_PASSWORD:主数据库账户、密码;
# MASTER_LOG_FILE:主数据库中查询到的“File”值;
# MASTER_LOG_POS:主数据库中查询到的“Position”值;
# 启动 slave:
mysql> start slave;
# 检查 slave:
mysql> show slave status \G;
# 命令行汇总:
show master status;
stop slave;
Slave_IO_Running、Slave_SQL_Running 均显示为 Yes 说明主备同步服务正常运行,如下图:
同步数据库的初始状态;在启动同步服务前,还需要手动同步下数据库的初始状态,之后可以通过修改其中主数据库中的表来查看从数据库是否同步变更;
# 锁定要同步的数据库(192.168.6.200):
msyql> use sync_db_name;
msyql> flush tables with read lock;
# 将要同步的数据库导出脚本:
mysqldump -udbadmin -pdbpwd sync_db_name >/home/backup/sync_db_name.sql
# 解锁前面锁定的数据库:
msyql> unlock tables;
# 将上方备份的 sql 拷贝到从数据库服务器(192.168.6.210),然后创建同名数据库,恢复数据:
msyql> create database sync_db_name;
msyql> use sync_db_name;
msyql> source /home/backup/sync_db_name.sql;
做双机互备或多机循环互备;然后将主从数据库服务器反转(即将 192.168.6.200 和 192.168.6.210 的主备身份调换),然后再配置一次同步即可。即 192.168.6.200 变更会同步到 192.168.6.210,反之亦然。简单讲就是:双机互备:A 主 B 从 + A 从 B 主;多机循环互备:A 主 B 从 + B 主 C 从 + C 主 N 从 + N 主 A 从(建议不要过多,尤其是数据库数据量大,且变更频繁的情况下,同步毕竟也是有延迟的);
数据库的自动备份(前三步前面的文章都有提到);
安装计划工具;
yum -y install crontabs
编辑 MySQL 的配置文件;
vim /etc/my.cnf
# 添加配置文件内容:
[mysqldump]
# 用于备份数据库
user=dbbaker
password=dbpwd
重启数据库服务;
service mysql restart & service mysql status
准备备份脚本;
mkdir -p /home/bakup/lgd_system
# 编辑 bakdb.sh 的内容:
echo ‘mysqldump sync_db_name | gzip > /home/backup/lgd_system/sync_db_name_$(date +%Y%m%d_%H%M%S).sql.gz’ > /home/bakup/bakdb.sh
chmod +x /home/bakcup/bakdb.sh
# 解压缩指定的备份文件:
gunzip sync_db_name_*.gz
添加备份计划;
# 方式一:
crontab -e
# 方式二:
vim /etc/crontab
# 编辑计划:
# Example of job definition:
# .—————- minute (0 – 59) * 表示每分钟
# | .————- hour (0 – 23) * 表示每小时
# | | .———- day of month (1 – 31) * 表示每天
# | | | .——- month (1 – 12) OR jan,feb,mar,apr … * 表示每月
# | | | | .—- day of week (0 – 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat * 表示每天
# | | | | |
# * * * * * user-name(用户名) command to be executed(脚本路径)
# 30 10 * * * /home/backup/bakdb.sh # 表示每天 10:30 执行一次备份脚本(前方的注释去掉即可)
计划任务常用操作命令;
service crond start # 启动服务
service crond stop # 关闭服务
service crond restart # 重启服务
service crond reload # 重新载入配置
service crond status # 查看服务状态
tail -f /var/log/cron # 查看执行日志
备份文件解压缩
gzip 命令:
选项参数:
-c:将压缩后的数据显示到屏幕上,可以用于重定向;
-d:解压缩的参数;
-t:检验压缩的一致性,看是否有错误;
-v:显示 源文件大小 / 压缩文件大小 的压缩比;
-#:# 为数字的意思,代表压缩等級,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!默认是 -6
gzip -v => 压缩文件,- v 查看压缩比
gzip -d
gunzip file.gz