实现mysql数据库主从/主主心得

参考文章:https://www.jianshu.com/p/b0cf461451fb

 

需求:为了无缝上线小程序,需要两个同构的数据库来做支撑(一个线上,一个预备上线)。

问题:两个数据库在同一台服务器的mysql服务下。

解决问题的方案:

1.在同一台服务器下安装两个mysql服务(从服务器版本可以比主服务器版本高),进行主从/主主配置(这种方式不建议,以免服务器宕机)

2.将同构数据库分别部署在两台服务器上。(这种实现方式比较主流,还能防备宕机)。

着手实现:

服务器(将单机拆成多机):

master:xxx.xxx.xxx.1          mysql版本:5.6.43

slave:     xxx.xxx.xxx.2          mysql版本:5.6.43

配置步骤:

看到网上大多都是先锁库,备份,解锁库,在进行配置主从(疑问:如果解锁后数据变动怎么办?)。

所以我个人理解应该先配置master的my.cnf,在进行先锁库,备份,解锁库,在进行配置slave。

1.先配置master服务器的/etc/my.cnf

server_id = 1
binlog-do-db = db  (主从复制需要的数据库)
#binlog-ignore-db=db(主从复制需要忽略的数据库,和上面二选一进行配置)
#log-slave-updates=true (双主需要开启,同步slave中binlog日志)
#sync_binlog = 0
#sync-master-info=1
#auto_increment_offset = 1
#auto_increment_increment = 2
#expire_logs_days = 7
#log_bin_trust_function_creators = 1

配置完成重启数据库服务,让配置生效

2.拷贝master服务器上的数据库备份到slave上

mysql>use db;
mysql>flush tables with read lock;  // 锁库,防止这段时间有写入。

[root@master~]# mysqldump -uroot -pxxxx db > /root/db.sql; 
// 只是导出数据结构+数据 如果需要导出函数和存储过程自行查看

mysql>show master status; // 查看主库binlog的pos位置。
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |   4      | db           |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql>unlock tables;   // 解锁数据库

3.创建replication用户,使slave通过I/O线程以该用户名连接到master,并读取binlog二进制日志。

mysql>grant replication slave on *.* to 'replicate'@'%' identified by 'replicate'; 
myqsl>flush privileges;(刷新缓存,使用户生效)
mysql>show processlist \G;(查看是否已有生效的master的I/O线程)
//state=Master has sent all binlog to slave; waiting for binlog to be updated;user=replicate

4.将db.sql文件发送到slave服务器,然后进行数据导入

[root@slave ~]scp [email protected]:/root/db.sql /root/db.sql(同一网络下使用scp拷贝)
mysql>create datebase db;
mysql>source /root/db.sql;(拷贝成功)

5.配置slave服务器中的/etc/my.cnf

server_id=2
replicate-do-db=db(需要同步主库的从库名称)
#replicate-ignore-db=xxx(忽略不需要进行主从的数据库)

同样重启slave服务器的mysql服务,让配置生效。

6.此时slave应该要知道如何连接到master,并重访其二进制日志。

不需要去修改数据库配置了,而是需要在mysql服务里面执行下面语句就能连接到master服务,获取到二进制日志

mysql>CHANGE MASTER TO
mysql>MASTER_HOST='xxx.xxx.xxx.1',
mysql>MASTER_USER='replicate',
mysql>MASTER_PASSWORD='replicate',
mysql>MASTER_LOG_FILE='mysql-bin.000001',
mysql>MASTER_LOG_POS=4;

mysql>show slave status \G;(查看slave的运行状态,此时应该是尚未运行)
// slave_io_state为空slave_io_running、slave_sql_running为no

mysql>start slave;(开启slave服务)
// slave_io_state =Waiting for master to send event
// slave_io_running = yes
// slave_sql_running = yes

当我们看到slave_io_running和slave_sql_running为双yes的时候,我们配置已经完成,接下来我们可以开始进行测试了。

7.查看二进制日志文件,由于二进制日志格式比较特殊,我们不能用tail指令去查看日志。

[root@slave ~]# mysqlbinlog mysql-bin.000001 | tail -500

8.重点:确定你分配的mysql用户的权限问题,当权限不可达的时候同步数据会失败。

我遇到一个问题,至今还没考虑清楚。如果有大佬遇到过想明白了,还想不吝赐教:

使用root@%用户的时候,用来测试主从同步数据不成功(主库用binlog日志,从库有relay-bin日志;master的I/O线程正常,slave的I/O线程和sql线程都正常,卡了好久)。

后来使用root@localhost用户登录数据库才测试成功的。现在莫名其妙的root@%用户一切正常了。期间没做任何改动,不知道原因。看服务器history,也没有看到其他人修改过其他地方,满脸的懵逼。

 

写得不好,还在初级阶段,还望大家多多指教。

 

 

发布了30 篇原创文章 · 获赞 21 · 访问量 10万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章