一.实验环境
第一次写博客,欢迎大家交流指正!!! 不喜勿喷!!!
操作系统 : Centos7.5虚拟机
数据库软件 : mysql-5.7.17
主机名 | ip地址 | 角色 |
---|---|---|
web33 | 192.168.4.33 | Web服务器 |
maxscale77 | 192.168.4.77 | 读写分离服务器 |
mysql11 | 192.168.4.11 | 主数据库(写) |
mysql22 | 192.168.4.22 | 从数据库(从) |
pxcnode71 | 192.168.4.71 | pxc集群节点 |
pxcnode72 | 192.168.4.72 | pxc集群节点 |
pxcnode73 | 192.168.4.73 | pxc集群节点 |
1.Maxscale实现MySQL的读写分离
<1>Maxscale简介
MaxScale是maridb开发的一个mysql数据中间件,其配置简单,能够实现读写分离,并且可以根据主从状态实现写库的自动切换。在MHA架构上,主库宕掉后,其中从库提升为主,maxscale可以自动判断新主库,而使新主库承担写服务,也可实现从库的宕机自动离线恢复后自动上线功能。
<2>实验过程
1.要想用Maxscale实现MySQL的读写分离, 必须配置MySQL的主从同步结构, 本次实验采用一主一从结构。
由于最近实验使用主从同步较多, 所以写了脚本, 方便自己临时使用。
本来是想写在一个脚本里的, 但是由于有些变量及函数上的问题没有解决, 顾将其拆解。所有有些地方可能会比较繁琐。
MySQL初始化
#!/bin/bash
#Temporary-scripts
if [ -f /root/mysql-5.7.17.tar ];then
[ -d /root/mysql-5.7.17 ] || mkdir /root/mysql-5.7.17
echo -e "\033[1;34m正在解压文件,请稍后...\033[0m"
tar -xf /root/mysql-5.7.17.tar -C /root/mysql-5.7.17
echo -e "\033[1;34m正在安装MySQL,请稍后...\033[0m"
yum -y localinstall /root/mysql-5.7.17/mysql-community-* &> /dev/null
echo -e "\033[1;34m正在启动MySQL,请稍后...\033[0m"
systemctl restart mysqld
fi
echo -e "\033[1;36m初始化完成.密码为123qqq...A\033[0m"
echo "SET PASSWORD = PASSWORD('123qqq...A');" | mysql -u root --password=$(grep 'password is' /var/log/mysqld.log | awk '{print $11}') -b --connect-expired-password &> /dev/null
MySQL主库
#!/bin/bash
#Temporary-scripts
#本脚本适用范围为主机名为 xxx两个数字 如:host50
master_id=master$(hostname | awk -F'.' '{print $1}' | sed -r 's/(.*)(..$)/\2/')
server_id=$(hostname | awk -F'.' '{print $1}' | sed -r 's/(.*)(..$)/\2/')
master_ip=`ifconfig | sed -n '2p' | awk '{print $2}'`
#初始密码
mys_defa_passwd=123qqq...A
#修改配置文件
sed -i "4a log_bin=$master_id" /etc/my.cnf
sed -i "4a server_id=$server_id" /etc/my.cnf
systemctl restart mysqld
mysql -uroot -p"$mys_defa_passwd" -e "grant replication slave on *.* to repluser@'%' identified by '$mys_defa_passwd';"
#允许root在任意地址登录
mysql -p"$mys_defa_passwd" -uroot -e "grant all on *.* to root@'%' identified by '$mys_defa_passwd' with grant option; "
MySQL从库
#!/bin/bash
#Temporary-scripts
#本脚本适用范围为主机名为 xxx两个数字 如:host50
read -p "输入master的ip: " master_ip
master_id=master$(hostname | awk -F'.' '{print $1}' | sed -r 's/(.*)(..$)/\2/')
server_id=$(hostname | awk -F'.' '{print $1}' | sed -r 's/(.*)(..$)/\2/')
#初始密码
mys_defa_passwd=123qqq...A
echo "正在配置Slave,请稍等..."
##修改配置文件
sed -i "4a server_id=$server_id" /etc/my.cnf
systemctl restart mysqld
##配置为从, 前提主数据库管理员root必须允许在任意主机登录.
mysql -uroot -p"$mys_defa_passwd" -e "change master to master_host='$master_ip', master_user='repluser', master_password='$mys_defa_passwd', \
master_log_file='$(mysql -h"$master_ip" -p"$mys_defa_passwd" -uroot -e "show master status" | grep master | awk '{print $1}')' , \
master_log_pos=$(mysql -h"$master_ip" -p"$mys_defa_passwd" -uroot -e "show master status" | grep master | awk '{print $2}');" &> /dev/null
mysql -uroot -p"$mys_defa_passwd" -e "start slave;" &> /dev/null
##[这句可以不写]
mysql -p"$mys_defa_passwd" -uroot -e "grant all on *.* to root@'%' identified by '$mys_defa_passwd' with grant option; "
echo -e "\033[1;36mSlave配置完成.\033[0m"
检查主从同步状态
[root@mysql22 ~]# mysql -uroot -p123qqq...A -e "show slave status\G" | grep -i yes
mysql: [Warning] Using a password on the command line interface can be insecure.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
##看到IO 线程及 SQL 线程都是yes即为成功!!
到这主从同步就配置完成了。
2.配置Maxscale读写分离服务
安装Maxscale软件
yum -y install maxscale-2.1.2-1.rhel.7.x86_64.rpm
vim /etc/maxscale.cnf
主要的修改
[maxscale]
threads=auto ##允许使用的线程数量
[server1] ##定义数据库服务器
type=server
address=192.168.4.11 ##主服务器
port=3306
protocol=MySQLBackend
[server2]
type=server
address=192.168.4.22 ##从服务器
port=3306
protocol=MySQLBackend
[MySQL Monitor] ##定义监控的服务器
type=monitor
module=mysqlmon
servers=server1,server2
user=maxscalemon ##监控所使用的用户
passwd=123qqq...A ##用户密码
monitor_interval=10000
[Read-Write Service] ##定义读写分离服务
type=service
router=readwritesplit
servers=server1,server2
user=maxscalerouter ##路由用户
passwd=123qqq...A ##密码
max_slave_connections=100%
[MaxAdmin Service]
type=service
router=cli
[Read-Write Listener]
type=listener
service=Read-Write Service
protocol=MySQLClient
port=4006
[MaxAdmin Listener]
type=listener
service=MaxAdmin Service
protocol=maxscaled
socket=default
port=4016 ##定义管理使用的端口号
##配置文件中关于 只读 的部分可自行加注释或者删掉
maxscalemon监控用户和maxscalerouter路由用户均没有在数据库授权, 所以需要在主库授权, 从库自动同步
##授权监控用户
mysql> grant replication slave,replication client on *.* to maxscalemon@'%' identified by "123qqq…A";
##授权路由用户
mysql> grant select on mysql.* to maxscalerouter@"%" identified by "123qqq…A";
##授权连接用户
mysql> grant all on *.* to yaya99@"%" identified by "123qqq...A";
配置完成后启动服务并查看
[root@maxscale77 ~]# maxscale -f /etc/maxscale.cnf
[root@maxscale77 ~]# netstat -lnput | grep maxscale
tcp6 0 0 :::4006 :::* LISTEN 908/maxscale
tcp6 0 0 :::4016 :::* LISTEN 908/maxscale
##-P 指定上边定义的管理用的端口号
[root@maxscale77 ~]# maxadmin -uadmin -pmariadb -P4016
MaxScale> list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server | Address | Port | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
server1 | 192.168.4.11 | 3306 | 0 | Master, Running
server2 | 192.168.4.22 | 3306 | 0 | Slave, Running
-------------------+-----------------+-------+-------------+--------------------
验证读写分离可以使用客户端也就是Web中的服务器, 安装MariaDB 连接MySQL主服务器插入数据 ,再连接 Maxscale服务器查看时主库从库数据一致; 在从库插入数据 , 主库不会同步 ,客户端访问Maxscale时查看到的为从库的数据 ; 即表示Maxscale完成了读写分离
2.Maxscale集群过渡到PXC集群
<1>PXC简介
介绍:基于Galera的mysql高可用集群解决方案,PXC集群主要由两部分组成:percona server with xtradb 和 write set replication patches(同步、多主复制插件)
特点:
- 数据强一致性、无同步延迟;
- 没有主从切换操作,无需使用虚IP;
- 支持innodb存储引擎;
- 多线程复制;
- 部署使用简单;
- 支持节点自动加入,无需手动拷贝数据。
<2>实验过程
- 首先先连接之前的maxscale服务器插入几条数据 模拟环境 ,注意这里创建的表必须要有主键, 因为PXC的表要有主键
MySQL [gamedb]> select * from user;
+----+--------+
| id | name |
+----+--------+
| 1 | tom |
| 2 | tom1 |
| 3 | harry |
| 4 | liming |
| 5 | danny |
+----+--------+
要想将数据同步到PXC集群 , 必须在PXC中的第一台机器上安装同样版本 mysql 软件 , 将其配置为 读写分离集群中 主服务器的从 。配置从之前 ,我们先要确保 新建的mysql 服务器与主服务器数据一致性
这里选择作备份选择的方法为 percona-xtrabackup 主要是因为它支持在线热备 不锁表
##安装软件
yum -y localinstall libev-4.15-1.el6.rf.x86_64.rpm
yum -y localinstall percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm
##作备份 --slave-info 记录日志名称及偏移量
innobackupex --user root --password 123qqq...A --slave-info /allbak --no-timestamp
...
xtrabackup: Transaction log of lsn (2585783) to (2585792) was copied.
191110 16:13:20 completed OK!
scp -r /allbak/ root@192.168.4.71:/root/
在pxcnode71上操作安装数据库完成 启动服务 停止服务 删除/var/lib/mysql/* , 再导入 mysql11同步的数据
yum -y localinstall PXC/libev-4.15-1.el6.rf.x86_64.rpm
yum -y localinstall PXC/percona-xtrabackup-24-2.4.13-1.el7.x86_64.rpm
innobackupex --apply-log /root/allbak/ ##恢复数据
innobackupex --copy-back /root/allbak/
chown -R mysql:mysql /var/lib/mysql ##修改属主属组
systemctl start mysqld
vim /etc/my.cnf
server_id=71 ##启用server_id
systemctl restart mysqld
cat /root/allbak/xtrabackup_info | grep master ##查看日志及偏移量
binlog_pos = filename 'master11.000007', position '154'
配置pxcnode01为mysql11的从库
##查看一下数据已经同步
mysql> select * from gamedb.user;
+----+--------+
| id | name |
+----+--------+
| 1 | tom |
| 2 | tom1 |
| 3 | harry |
| 4 | liming |
| 5 | danny |
+----+--------+
##查看从的状态
mysql> show slave status\G
Empty set (0.00 sec)
##配置从
mysql> change master to
-> master_host="192.168.4.11"
-> , master_user="repluser",
-> master_password="123qqq...A",
-> master_log_file="master11.000007",
-> master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.23 sec)
mysql> start slave;
Query OK, 0 rows affected (0.05 sec)
[root@pxcnode71 ~]# mysql -p123qqq...A -uroot -e "show slave status\G" | grep -i yes
mysql: [Warning] Using a password on the command line interface can be insecure.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
停止mysqld服务 .并且卸载
[root@pxcnode71 ~]# systemctl stop mysqld.service
[root@pxcnode71 ~]# rpm -qa | grep -i mysql
mysql-community-server-5.7.17-1.el7.x86_64
mysql-community-embedded-compat-5.7.17-1.el7.x86_64
mysql-community-common-5.7.17-1.el7.x86_64
mysql-community-client-5.7.17-1.el7.x86_64
mysql-community-devel-5.7.17-1.el7.x86_64
mysql-community-test-5.7.17-1.el7.x86_64
mysql-community-libs-compat-5.7.17-1.el7.x86_64
mysql-community-minimal-debuginfo-5.7.17-1.el7.x86_64
perl-DBD-MySQL-4.023-6.el7.x86_64
mysql-community-libs-5.7.17-1.el7.x86_64
mysql-community-embedded-5.7.17-1.el7.x86_64
mysql-community-embedded-devel-5.7.17-1.el7.x86_64
[root@pxcnode71 ~]# rpm -e --nodeps mysql-community-server mysql-community-embedded-compat mysql-community-common mysql-community-client mysql-community-devel mysql-community-test mysql-community-libs-compat mysql-community-minimal-debuginfo mysql-community-libs mysql-community-embedded mysql-community-embedded-devel
警告:/etc/my.cnf 已另存为 /etc/my.cnf.rpmsave
安装PXC相关依赖软件
yum -y localinstall libev-4.15-1.el6.rf.x86_64.rpm
yum -y localinstall percona-xtrabackup-24-2.4.13-1.el7.x86_64.rpm
##
Percona-XtraDB-Cluster-57-5.7.25-31.35.1.el7.x86_64.rpm
Percona-XtraDB-Cluster-57-debuginfo-5.7.25-31.35.1.el7.x86_64.rpm
Percona-XtraDB-Cluster-client-57-5.7.25-31.35.1.el7.x86_64.rpm
Percona-XtraDB-Cluster-devel-57-5.7.25-31.35.1.el7.x86_64.rpm
Percona-XtraDB-Cluster-full-57-5.7.25-31.35.1.el7.x86_64.rpm
Percona-XtraDB-Cluster-garbd-57-5.7.25-31.35.1.el7.x86_64.rpm
Percona-XtraDB-Cluster-server-57-5.7.25-31.35.1.el7.x86_64.rpm
Percona-XtraDB-Cluster-shared-57-5.7.25-31.35.1.el7.x86_64.rpm
Percona-XtraDB-Cluster-shared-compat-57-5.7.25-31.35.1.el7.x86_64.rpm
Percona-XtraDB-Cluster-test-57-5.7.25-31.35.1.el7.x86_64.rpm
##
yum -y localinstall Percona-XtraDB-Cluster-*
修改配置文件
vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
...
server_id=71 ##server_id必须与之前的对应
...
cat -n /etc/percona-xtradb-cluster.conf.d/wsrep.cnf | sed -n "8p;25p;27p;30p;39p"
8 wsrep_cluster_address=gcomm:// ##暂不填写
25 wsrep_node_address=192.168.4.71 ##本机ip
27 wsrep_cluster_name=pxc-cluster ##集群名称
30 wsrep_node_name=pxcnode71 ##本机主机名
39 wsrep_sst_auth="sstuser:123qqq...A" ##数据全量同步用户及密码
启动mysql服务 , 并且开机自启 授权数据全量同步用户
[root@pxcnode71 ~]# systemctl start mysql
[root@pxcnode71 ~]# mysql -uroot -p123qqq...A ##这里的密码由于是同步的mysql11的数据 所以密码与mysql11相同
mysql> grant all on *.* to sstuser@"localhost" identified by "123qqq...A"; ##权限可以细化
mysql> show status like "%wsrep%";
+----------------------------------+--------------------------------------+
| Variable_name | Value |
+----------------------------------+--------------------------------------+
| wsrep_incoming_addresses | 192.168.4.71:3306 |
| wsrep_cluster_weight | 1 |
| wsrep_cluster_conf_id | 1 |
| wsrep_cluster_size | 1 |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
+----------------------------------+--------------------------------------+
##此表只看关键这几项即可
##检查主从关系
mysql -p123qqq...A -uroot -e "show slave status\G" | grep -i yes
mysql: [Warning] Using a password on the command line interface can be insecure.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
pxcnode72和73同样安装 软件 修改配置 .启动服务 即可同步 71上的数据
vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
server_id=71
[root@pxcnode72]# cat -n /etc/percona-xtradb-cluster.conf.d/wsrep.cnf | sed -n "8p;25p;27p;30p;39p"
8 wsrep_cluster_address=gcomm://192.168.4.71,192.168.4.72,192.168.4.73
25 wsrep_node_address=192.168.4.72
27 wsrep_cluster_name=pxc-cluster
30 wsrep_node_name=pxcnode72
39 wsrep_sst_auth="sstuser:123qqq...A"
在都启动完成, 不要忘记将pxcnode71的配置文件再修改下
8 wsrep_cluster_address=gcomm://192.168.4.71,192.168.4.72,192.168.4.73
到这里 数据迁移完成 . 同时PXC开始同步 Maxscale集群中主服务器的数据
注意如果PXC72 / 73 启动失败 , 只要找到错误的点 删除/var/lib/mysql/* 重新启动即可
再搭建起来 PXC 集群 前的 负载均衡 及 高可用 (浮动ip) [ haproxy + keepalived ]
前端的Web直接访问 vip 调度服务器传递给 PXC集群 。至此 Maxscale向PXC过渡完成。