云平台上线前,各种业务各占一台物理服务器,每台机器上都会部署不同的业务及数据库,如果业务量大则有可能数据库服务器单独设置一台,这种情况非常浪费,在云计算时代需要对这类架构进行改革,统一设置高可用数据库,然后将各类业务系统的数据库迁移至高可用数据库中,最后修改业务系统的链接既可实现多业务系统共享使用一套高可用数据库集群,本期就来学习实现如果利用vsphere平台上新建4台虚拟机搭建基于mysql5.7的高可用数据库集群。
一、系统架构如下图
服务器用途 | 服务器IP | 主机名 | server_id |
---|---|---|---|
主用MySQL1 | 10.37.2.21 | master1 | 1 |
主用MySQL2 | 10.37.2.20 | master2 | 2 |
从MySQL1 | 10.37.2.19 | slave1 | 3 |
从MySQL2 | 10.37.2.18 | slave2 | 4 |
二、整体配置思路
1、四台VM上均安装上MySQL5.7,四台VM上均新增一块100G数据盘,并将数据盘挂载到vsphere集群的不同共享存储中;
2、调整四台VM上MySQL默认安装的存储位置到数据盘,防止操作系统故障影响数据及系统盘容量过小不易扩容的问题;
3、修改四台VM主机的MySQL配置文件,确定两台master主机的server-id分别为1,2,其余两台slave主机的server-id为3,4,并开启log-bin复制,定义准备同步或不允许同步的数据库,如果不设置默认全部同步;
4、在master1、master2上分别创建用于数据复制的用户repl,并授权该用户可以从数据库集群所属IP范围登陆;
5、在master1上配置对master2的复制,在master2上配置对master1的复制,分别配置完成后启动服务器复制线程;
6、在slave1、slave2上分别配置对master1、master2的复制,分别完成后启动服务器复制线程;
7、MySQL双主、双从配置完成,分别进入四台主机查看master状态及slave状态;
8、在master1、master2上安装配置keepalived,master1设置为主用,master2设置为备用,在两台机器上设置针对mysql的服务监测脚本,分别开启keepalived服务,启用mysql的ha地址,完成ha配置。
9、MySQL-HA测试:master1宕机后master2自动接管mysql数据库服务,当master1的MySQL服务重新启动后自动切换回master1;
10、双主、双从测试:master1上写入数据自动同步到slave1、master2,master2上写入数据自动同步到slave2、master1上
三、关于MySQL双主循环复制的说明--Master with Active Master
此设置需要两个或更多MySQL服务器作为主服务器。所有master都会收到写入并生成binlog,但需要注意几点:
- 您需要在每台服务器上设置自动增量偏移量以避免主键冲突。
- 没有冲突解决方案。
- MySQL Replication目前不支持主服务器和从服务器之间的任何锁定协议,以保证跨两个不同服务器的分布式更新的原子性。
- 通常的做法是只写入一个主站,另一个主站充当热备用节点。但是,如果您的从属设备低于该层,则必须在指定的主设备发生故障时手动切换到新的主设备。
我采用通过keepalived保障只有一台master服务器处于写状态,规避同时写入两台master出现的数据冲突。您可以使用ClusterControl 1.4及更高版本部署此拓扑。锁定和冲突解决需要由应用程序本身处理。
四、操作步骤说明
(一)、centos7安装MySQL5.7
因为CentOS 7更喜欢MariaDB,它是由原始MySQL开发人员管理的MySQL分支,旨在替代MySQL。如果您yum install mysql
在CentOS 7上运行,则安装MariaDB而不是MySQL。
- 具有
sudo
权限的非root用户的CentOS 7 。您可以在使用CentOS 7指南的初始服务器设置中了解有关如何使用这些权限设置用户的更多信息。
1、下载mysql5.7的rpm文件
wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
2、运行md5sum校验文件是否完整
md5sum mysql57-community-release-el7-9.noarch.rpm
Output
1a29601dc380ef2c7bc25e2a0e25d31e mysql57-community-release-el7-9.noarch.rpm
3、如果md5没有不一致就可以执行安装软件包,新增yum存储库指向oracle仓库
rpm -ivh mysql57-community-release-el7-9.noarch.rpm
4、yum安装mysql
yum install mysql-server -y
5、启动mysql
systemctl start mysqld
6、查看mysql自动生成的临时密码
grep 'temporary password' /var/log/mysqld.log
记下密码,在下一步中您将需要密码来保护安装以及您将被迫更改密码的位置。默认密码策略需要12个字符,至少包含一个大写字母,一个小写字母,一个数字和一个特殊字符。
7、执行mysql内置安全脚本完成安全配置
mysql_secure_installation
建议删除匿名用户,禁止远程root登录,删除测试数据库并访问它,然后重新加载权限表。
8、测试登陆
mysqladmin -u root -p version
(二)、加载初始化新硬盘并切换系统盘中mysql数据到新硬盘中
1、查看服务器新硬盘所属位置
fdisk -l
2、硬盘分区并格式化为ext4文件格式
fdisk /dev/sdb
mkfs.ext4 /dev/sdb1
3、挂载/dev/sdb1到/home/mysql目录
mount /dev/sdb1 /home/mysql
4、修改/etc/fstab文件完成系统启动自动挂载硬盘
首先执行blkid查看硬盘的uuid
然后 修改/etc/fstab文件新增一行内容完成挂载
UUID="82e294bd-4921-44d1-bb0c-871d9c4d40f3" /home/mysql ext4 defaults 0 0
5、 修改mysql配置迁移数据文件到数据磁盘
- 首先停止Mysql服务
1 |
|
- 在/ home分区中创建一个文件夹'mysql'
- 在保留模式下将整个Mysql数据目录复制到'mysql'
1 |
|
-p表示保留指定的属性(默认值:mode,ownership,timestamps)
-r表示复制每个目录子目录和文件
- 然后创建从新数据目录到旧数据目录的符号链接
1 | ls -s /home/mysql-data/mysql/ /var/lib/mysql/ |
- 现在启动Mysql服务
1 |
|
- 如果它正常工作,则从旧数据目录中删除每个文件和文件夹
1 |
|
现在已经把mysql的数据文件迁移到新硬盘/dev/sdb上挂载的目录/home上了。这种方法是不修改mysql的配置文件实现的还有一种方法需要修改mysql的配置文件。
(三)、配置master1、master2为双主复制模式,master1->slave1主从复制模式,master2->slave2主从复制模式
1、master1、master2服务器配置文件修改
在/etc/my.cnf中新增下面两行内容
server-id=1
log_bin=mysql-bin
log_bin必须在主服务器上启用 二进制日志记录,因为二进制日志是将更改从主服务器复制到其从服务器的基础。如果使用该log-bin
选项未在主服务器上启用二进制日志记录,则无法进行复制。
server-id必须使用唯一的服务器ID配置复制组中的每个服务器。此ID用于标识组内的各个服务器,并且必须是介于1和4294967295 之间的正整数。
master1上的/etc/my.cnf配置如下图
master2上的/etc/my.cnf配置如下图
下图为slave1的my.cnf配置文件,slave2的配置与slave1一样,只是server-id=4
2、在master1、master2、slave1、slave2上创建用于复制的用户
每个master站点上都要创建一个用于其它主机连接进来用于后台复制的账号并对其授权允许进行replication slave复制,所以在master站点上必须要有复制账号,从站可以使用该帐户进行连接。
设置复制从站时,用户名由命令MASTER_USER
上的选项指定 CHANGE MASTER TO
。任何帐户都可以用于此操作,只要它已被授予REPLICATION SLAVE
特权。您可以选择为每个从站创建不同的帐户,也可以使用每个从站的相同帐户连接到主站。
a、创建复制用户repl并允许从任何主机登陆
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
b、对用户repl进行replication slave授权
grant replication slave on *.* to 'repl'@'%' identified by 'password';
c、刷新授权到数据库中保存
flush privileges;
master1、master2上都要执行上面a-c三步。
3、创建主-主复制关系
a、在master1上创建对master2的复制配置
首先从master1上测试到master2的复制账号能否登陆成功,否则返回上一步检查
在master1上查看master状态信息
在master1上设置对master2的复制,注意上面画红框的部分在命令中需要使用,master_log_file,master_log_pos。
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.37.2.20',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='password',
-> MASTER_LOG_FILE='mysql-bin.000004',
-> MASTER_LOG_POS=154;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
master1启动到master2复制线程,并查看同步情况。
start slave;//启动同步线程
show slave status\G //查看同步线程状态
b、在master2上创建对master1的复制配置
在master2上查看master状态信息
在master2上设置对master1的复制
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.37.2.21',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='password',
-> MASTER_LOG_FILE='mysql-bin.000017',
-> MASTER_LOG_POS=306;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
master2上启动到master1的复制线程,并查看同步情况。
start slave;//启动同步线程
show slave status\G
4、创建主-从复制关系
主从同步关系与主主原理一致,更加简单,只需要在slave主机上开启到对应master主机的复制线程即可,配置方法与第三步完全一样,这里就不在赘述。
5、复制故障简单总结
经过上面四步,现在主主复制及主从复制应该都已经创建成功了,下面是创建过程中可能遇到的问题如何解决:
a、当遇到start slave不成功时,请使用
reset slave;
b、当遇到show slave status\G出现error故障时,请使用
stop slave;
set global sql_slave_skip_counter=1;
start slave;
跳过故障sql继续执行下一条同步命令
c、当使用复制虚拟机方式创建时需要注意mysql数据目录下的auto.cnf文件中UUID不能重复
四、配置keepalived,虚拟IP地址设置为10.37.2.1,默认主机设置为master1,实现MySQL双主服务自动切换
1、下载安装keepalived软件
yum install keepalived -y
2、在master1上配置keepalived.conf文件,设置master1为主用master,
[root@master1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id MASTER-HA
}
vrrp_script chk_mysql_port {
script "/etc/keepalived/chk_mysql.sh"
interval 2
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface ens192
mcast_src_ip 10.37.2.21
virtual_router_id 51
priority 101
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.37.2.1
}
track_script {
chk_mysql_port
}
virtual_server 10.37.2.1 3306 {
delay_loop 6
lb_algo wrr
lb_kind DR
#nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
## Real Server设置,3306就是连接端口
real_server 10.37.2.21 3306 {
weight 3 ##权重
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
real_server 10.37.2.20 3306 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
}
3、在master2上配置keepalived.conf文件,设置master2为备用主机
[root@master2 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id MASTER-HA
}
vrrp_script chk_mysql_port {
script "/etc/keepalived/chk_mysql.sh"
interval 2
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens192
mcast_src_ip 10.37.2.20
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.37.2.1
}
track_script {
chk_mysql_port
}
virtual_server 10.37.2.1 3306 {
delay_loop 6
lb_algo wrr
lb_kind DR
#nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
## Real Server设置,3306就是连接端口
real_server 10.37.2.21 3306 {
weight 3 ##权重
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
real_server 10.37.2.20 3306 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
}
4、在master1上设置MySQL服务监测脚本并将配好的脚本拷贝到master2对应目录下
[root@master1 ~]# cat /etc/keepalived/chk_mysql.sh
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
systemctl stop keepalived
fi
拷贝脚本到master2上
scp -P 22 root@10.37.2.20:/etc/keepalived/chk_mysql.sh /etc/keepalived/
这个脚本的原理是检查本地主机的MySQL服务端口3306是否开启,如果MySQL的3306端口挂掉就会触发keepalived服务停掉本地的keepalived服务,将浮动IP地址开启到keepalived优先级第二高的主机上。
5、在master1、master2主机上开启keepalived服务
systemctl enable keepalived
systemctl start keepalived
在master1上开启成功后通过ip a查看本地网卡上是否新增了浮动IP地址,如下图所示
6、 测试HA自动倒换功能是否正常
a、模拟master1的MySQL故障看浮动IP地址是否可以自动切换到master2
在master1上手动关闭MySQL服务,观察此时浮动IP地址10.37.2.1是否自动在master2上开启
观察master2上的情况
b、模拟master1的故障恢复后看浮动IP地址是否可以自动切换回master1
在master1上启动之前手动停掉的MySQL服务
systemctl start mysqld
观察master2上的浮动IP地址变化
观察master1上的浮动IP状态