Mysql+Keepalived高可用主备教程(一)

配置主备

由于公司项目需要,所以研究了mysql主备相关。
环境:
CentOS 7.5
Mysql 5.7.23

整体背景

由于公司的一个项目用的是多个微服务,多个微服务有各自的数据库,但这些数据库目前在同一台物理机上(以后可能会拆开),并且做了主备,由于微服务之间要相互调用,如果在sql中直接跨库查询又会导致入侵耦合,所以本人出具的方案是除去用redis缓存和接口之外,必需要关联的查询单独建立一个微服务,该微服务的库中只同步关联查询需要的库表,关系如图(非专业制图,请各位大牛将就):

库表复制关系图
因为该库用于某些关联查询及报表所以从备库上读,数据的实时性要求不高,此方案已经可以满足业务需要。

主库:192.168.31.47
备库:192.168.31.48
只读:192.168.31.49



安装mysql5.7

  1. 官网地址为:https://dev.mysql.com/downloads/repo/yum/ ;也可以在CentOS中直接下载;
#下载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
  1. 安装msyql,一路y;
[root@instance-ktableu5 ~]# yum install mysql-community-server
  1. 启动mysql;
#启动为start,其它命令还有stop、restart、status
[root@instance-ktableu5 ~]#service mysqld start
  1. 设置开机启动;
#开机启动,防止遗漏
[root@instance-ktableu5 ~]#systemctl enable mysqld
  1. 修改密码;
#获取初始密码
[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'
  1. 赋与对外权限;
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

3.连接主服务器
#登陆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;

5.查看同步状态
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只读库

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读库从多个机器同步所需要的表成为大读库的教程也得写。

辛苦手打,转载请注明。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值