需求背景
我自己blog被墙,而我希望国内能正常访问,同时我自己写blog也不要太卡。刚好手头有一台国内闲置VPS。
所以决定这么折腾一下:
- 阿里云智能解析,境外访问解析到linode server; 国内访问,解析到腾讯云。
- 我日常写博客自然是写到linode server的数据库,我不可能手动同步俩数据库,所以设置数据库master slave吧
下面记录下如何设置master slave
找到数据库配置文件位置
找到mysql配置文件my.cnf的位置
# mysql --help|grep 'my.cnf'
....
本文假设配置文件位置:/etc/my.cnf
设置master
修改mysql配置文件/etc/my.cnf
- 开启master模式,server-id=1
log-bin = mysql-bin # 日志文件名称
server-id = 1 # 主数据库 ID = 1
binlog-do-db = game # 只同步game数据库
# 忽略mysql,performance_schema和information_schema三个库
binlog-ignore-db = mysql
binlog-ignore-db = performance_schema
binlog-ignore-db = information_schema
- 创建数据库同步账号。grant replication不能限制数据库,必须使用on .。我们通过修改mysql配置文件中的binlog-do-db来达到限制数据库的目的
# 登录数据库
# mysql -u root -p
# 创建slave账号
mysql>grant replication slave on *.* to 'slave_game'@'%' identified by '123456';
#使slave账号生效
mysql>flush privileges;
- 重启mysql,查看当前master status
# 重启mysql
service mysqld restart
# 登录mysql
#mysql -u root -p
# 查看master status
mysql>show master status;
这地方比较关键 我截个图
ok 此时要保证mysql数据库不被改动了。否则会造成数据不同步。
- 导出数据库
mysqldump -u root -p game > game.sql
设置slave
- 建立同名数据库game,导入master那边备份的数据
mysqldump -u root -p game < game.sql
- 修改mysql配置文件/etc/my.cnf
server-id = 2 # 从数据库端ID号
replicate-do-db = game # 只同步game库
开启同步。这里就要用到上边那张图中的mysql-bin.000003和926566了。假设master ip:x.x.x.x, user是我们前面创建的slave_game,密码123456。
change master to master_host='x.x.x.x',master_user='slave_game',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=926566;
- 启用slave
start slave
- 查看slave状态
mysql> show slave status\G;
测试
写篇blog看看能不能自动同步吧。还挺快的
MySQL主从同步总结
- 让master数据库静止,完成master-slave设置之前不再变。
- 设置master数据库相关参数
- 重启查看当前master数据库master status,说穿了就是当前数据库存储到某一位置的一个标记
- 把数据导入slave数据库
- 设置slave数据库参数
- 告诉slave当前master存储标记位置(3中获得)。此时,master处于存储状态P,slave也处于存储状态P,master和slave同步了。
- 开启slave
在这之后,master有新数据,存储位置P就会向前滚动,同时发通知给slave。slave用收到的通知和当前存储位置比对后,更新输出。此时master和slave又同时处于存储位置P+T。以此类推
遗留问题,数据库里的blog是自动同步了。可是博客里图片没有自动同步到腾讯云。稍后再解决吧