由于公司项目需要,所以研究了mysql主备相关。
环境:
CentOS 7.5
Mysql 5.7.23
由于公司的一个项目用的是多个微服务,多个微服务有各自的数据库,但这些数据库目前在同一台物理机上(以后可能会拆开),并且做了主备,由于微服务之间要相互调用,如果在sql中直接跨库查询又会导致入侵耦合,所以本人出具的方案是除去用redis缓存和接口之外,必需要关联的查询单独建立一个微服务,该微服务的库中只同步关联查询需要的库表,关系如图(非专业制图,请各位大牛将就):
因为该库用于某些关联查询及报表所以从备库上读,数据的实时性要求不高,此方案已经可以满足业务需要。
主库:192.168.31.47
备库:192.168.31.48
只读:192.168.31.49
#下载rpm包,此地址下载的总是5.7最新版本
[root@instance-ktableu5 ~]# wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
#安装rpm
[root@instance-ktableu5 ~]# rpm -Uvh mysql57-community-release-el7-11.noarch.rpm
#查看mysql相关文件
[root@instance-ktableu5 ~]# yum repolist enabled | grep mysql
!mysql-connectors-community/x86_64 MySQL Connectors Community 95
!mysql-tools-community/x86_64 MySQL Tools Community 84
!mysql57-community/x86_64 MySQL 5.7 Community Server 327
[root@instance-ktableu5 ~]# yum install mysql-community-server
#启动为start,其它命令还有stop、restart、status
[root@instance-ktableu5 ~]#service mysqld start
#开机启动,防止遗漏
[root@instance-ktableu5 ~]#systemctl enable mysqld
#获取初始密码
[root@instance-ktableu5 ~]# cat /var/log/mysqld.log | grep 'A temporary password'
2019-03-25T07:52:48.256143Z 1 [Note] A temporary password is generated for root@localhost: fCGYtw-P(8cw
#登陆mysql
[root@instance-ktableu5 ~]# mysql -uroot -p'fCGYtw-P(8cw'
#修改密码
mysql> ALTER user 'root'@'localhost' identified by 'Mima_001';
#退出重登
mysql> exit;
Bye
[root@instance-ktableu5 ~]# mysql -uroot -p'Mima_001'
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Mima_001' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
至此,mysql安装完毕,接下来依次将三台机器安装mysql。
假定三台机的mysql都安装完毕,47主库已按图导入数据且48备库已同步导入。
1.配置文件my.cnf的修改。
[root@localhost ~]# vim /etc/my.cnf
在末尾添加
server-id=47
log_bin=master-bin
log_bin_index=master-bin.index
#binlog_do_db=product,order
#备注:
#server-id 服务器唯一标识。
#log_bin 启动MySQL二进制日志,即数据同步语句,从数据库会一条一条的执行这些语句。
#binlog_do_db 指定记录二进制日志的数据库,即需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可。
#binlog_ignore_db 指定不记录二进制日志的数据库,即不需要复制的数据库名,如果有多个数据库,重复设置这个选项即可。
#其中需要注意的是,binlog_do_db和binlog_ignore_db为互斥选项,一般只需要一个即可,不选则是记录所有数据库。
2.创建从服务器的用户和权限
[root@localhost ~]# mysql -uroot -p'Mima_001'
#创建从数据库的masterbackup用户和权限
mysql> grant replication slave on *.* to masterbackup@'192.168.31.%' identified by 'Backup_123';
#备注
#192.168.31.%通配符,表示0-255的IP都可访问主服务器,正式环境请配置指定从服务器IP
#若将 192.168.31.% 改为 %,则任何ip均可作为其从数据库来访问主服务器
3.重启mysql
[root@localhost ~]# service mysqld restart
4.查看主服务器状态
[root@localhost ~]# mysql -uroot -p'Mima_001'
#查看master状态
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 154 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
请记好这个master-bin.000001和154,这个是日志文件的名称和游标位置。
1.修改48机的my.cnf文件。
[root@localhost ~]# vim /etc/my.cnf
在末尾添加
server-id=48
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
#replicate-do-db=order
#备注:
#server-id 服务器唯一标识,如果有多个从服务器,每个服务器的server-id不能重复,跟IP一样是唯一标识,如果你没设置server-id或者设置为0,则从服务器不会连接到主服务器。
#relay-log 启动MySQL二进制日志,可以用来做数据备份和崩溃恢复,或主服务器挂掉了,将此从服务器作为其他从服务器的主服务器。
#replicate-do-db 指定同步的数据库,如果复制多个数据库,重复设置这个选项即可。若在master端不指定binlog-do-db,则在slave端可用replication-do-db来过滤。
#replicate-ignore-db 不需要同步的数据库,如果有多个数据库,重复设置这个选项即可。
#其中需要注意的是,replicate-do-db和replicate-ignore-db为互斥选项,一般只需要一个即可。都不选则是全部同步。
2.重启mysql
[root@localhost ~]# service mysqld restart
#登陆mysql
[root@localhost ~]# mysql -uroot -p'Mima_001'
#使用47主数据库的masterbackup用户进行同步
mysql> change master to master_host='192.168.31.47',master_port=3306,master_user='masterbackup',master_password='Backup_123',master_log_file='master-bin.000001',master_log_pos=154;
#master_host对应主服务器的IP地址。
#master_port对应主服务器的端口。
#master_log_file对应show master status显示的File列:master-bin.000001。
#master_log_pos对应show master status显示的Position列:154。
4.启动同步
mysql> start slave;
如果需要停止同步则是
mysql> stop slave;
mysql> show slave status\G;
此图是后期补的,主要是看Slave_IO_Running和Slave_SQL_Running的状态,都是Yes表示同步正常,如果Last_IO_Error提示UUIDs相同,则需要将/var/lib/mysql/auto.cnf中的UUID随便改动一下,使其与主服务器的UUID不同。
此时,你可以测试一下在主库进行增删改,从库会相应进行同步。(如果两边数据不一致导致同步失败,可以设置跳过某些错误甚至全部跳过)
6. 前5步就是纯粹的主从,但我们还有49库来读48从库,所以相对来讲48既是从库也是主库,所以也要像配置47一样设置为主的,下面48机简单再走一遍。
[root@localhost ~]# vim /etc/my.cnf
在末尾添加
log_bin=master-bin
log_bin_index=master-bin.index
log_slave_updates=1
前两行不用讲了就是开启日志,log_slave_updates=1 这短短一句话,让哥哥吃了大亏了。。。这句话的意义是将主库的操作更新到日志中去,若没有这句则导致主库的更改只到备库,无法继续传递到49读库。
然后是重启、创建只读账号,查询master状态。
mysql> grant replication slave on *.* to masterbackup@'192.168.31.%' identified by 'Backup_123';
#查看master状态
mysql> show master status;
依然是牢记那俩值,并且保持从47的同步。
49只读库设计的是只读48机中3个库的两个库,且每个库只同步一张表,为什么这么做呢?当然是为了写教程方便你们了。。。。
整体与48的从库步骤一样,也是改my.cnf、使用48机创建的账号进行连接、开启同步。。。其实只有my.cnf不同,因为它同步多个库的表到一个库中,所以它涉及改库名,我就只贴主要的步骤吧
[root@localhost ~]# vim /etc/my.cnf
在末尾添加
server-id=49
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
replicate-do-table=report_db.A
replicate-do-table=report_db.Z
replicate-rewrite-db=order->report_db
replicate-rewrite-db=product->report_db
replicate-rewrite-db是指将源库名转为新库名。
replicate-do-table是指只同步哪些表,注意,要填新库名。
接下来就是重启、登陆mysql,然后
#使用48数据库创建的masterbackup用户进行同步,注意填48机在master status中的值
mysql> change master to master_host='192.168.31.48',master_port=3306,master_user='masterbackup',master_password='Backup_123',master_log_file='master-bin.000001',master_log_pos=154;
#启动同步
mysql> start slave;
记得提前创建report_db数据库并同步A表和Z表。
至此,主备读都已完成,47主库的所有更改都会同步到48备库中,且A表和Z表的更改同时会传递到49读库中。
接下来我抽时间把keepalived做虚拟IP无缝切换主备的教程写出来,以及49读库从多个机器同步所需要的表成为大读库的教程也得写。
辛苦手打,转载请注明。。。