一、环境和部署架构
1.1 MySQL集群安装包
MySQL Router:https://dev.mysql.com/downloads/router/
MySQL Shell:https://dev.mysql.com/downloads/shell/
MySQL Server:https://dev.mysql.com/downloads/mysql/
都选择Linux Generic版本,具体版本号为:
mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz、
mysql-router-8.0.11-linux-glibc2.12-x86-64bit.tar.gz
mysql-shell-8.0.11-linux-glibc2.12-x86-64bit.tar.gz
1.2 集群架构图
备注:上图为网上搜索的截图,其中MySQLRouter为单节点,这里我们通过keepalive的虚拟vip做双活,MySQL-Router做负载均衡,这样可以达到整体高可用的集群的效果,上图没有体现,下面搭建过程有所体现。
1.3 服务器分配
操作系统均为为Centos7,这里提供5台服务器,集群环境至少3台服务器让MySQL-Router和MySQL服务器共存,MySQL集群是通过投票的机制选取主节点,所以所需要的是(2n+1)台服务器,n>=1,为了清晰表达这里做5台服务器,具体服务器安装环境详细信息如下:
192.168.1.151(node01) MySQL Shell、MySQL Router
192.168.1.152(node02) MySQL Shell、MySQL Server
192.168.1.153(node03) MySQL Shell、MySQL Server
192.168.1.154 (node04) MySQL Shell、MySQL Server
192.168.1.155 (node05) MySQL Shell、MySQL Router
二、MySQL安装(3台需要安装MySQL服务器的机子上都要执行相同的步骤)
2.1 服务器配置
在每台服务器配置hosts,当前环境下配置如下:
192.168.1.151 node01
192.168.1.152 node02
192.168.1.153 node03
192.168.1.154 node04
192.168.1.155 node05
执行:sourcehosts
重启:reboot –f
执行命令:hostnamectl 进行查看,如下所示:
2.2 解压安装包mysql
tar –xzvf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.7.17-linux-glibc2.5-x86_64 /usr/local/mysql
2.3 创建data数据库目录
cd /usr/local/mysql
mkdir data
2.4 初始化数据库
./mysqld --user=root --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize
注意:等执行结束之后,控制台会出现一个随机生成的密码,该密码就是当前数据库的root登录密码,临时保存,以便修改。
2.5 配置my.cnf
cp -a /usr/local/mysql/support-files/my-default.cnf/etc/my.cnf #会有一个选择是否覆盖原有文件,直接按 y回车选择是就可以
cp -a /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld #把mysql放到本地系统服务中
配置my.cnf的基本配置如下:
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
character-set-server=utf8
lower_case_table_names=1
sql_mode=NO_ENGINE_SUBSTITUTION
log-error = /usr/local/mysql/data/mysql_error.log
skip-name-resolve
2.6 修改密码
service mysql start #启动MySQL
bin/mysql -uroot –p #登录mysql,此时需要输入刚才生成的随机密码
SET authentication_string FOR 'root'@localhost=PASSWORD(‘新密码’); #设置root的新密码,密码设置最好复杂一点,因为有密码策略,例如:Joymysql_123456。注意:此时所有数据库的密码最好保持一致,貌似有人说不一样可能会有问题,我没有测试过不一样的密码。
2.7 设置远程访问
update user set host=’%’ where user=’root’ limit 1;
flush privileges;
四、配置/etc/my.cnf
在每台安装过MySQL的服务器上的/etc/my.cnf文件末尾添加:
#高可用
server_id=2 #每台服务器修改为自己的id,例如:151为1、152为2、153为3
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
#主从复制配置
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_local_address=
"192.168.1.152:24901" #每台服务器修改为自己的ip或者node02
loose-group_replication_group_seeds="192.168.1.152:24901,192.168.1.153:24901,192.168.1.154:24901" #或者node02、node03、node04
loose-group_replication_single_primary_mode=TRUE
#loose-group_replication_bootstrap_group=off
#loose-group_replication_enforce_update_everywhere_checks=FALSE
#loose-group_replication_start_on_boot=off
disabled_storage_engines= MyISAM,BLACKHOLE,FEDERATED,CSV,ARCHIVE
report_port =3306
group_replication_allow_local_disjoint_gtids_join=on
每台服务器重启MySQL。
五、MySQL-Shell配置集群(MySQL-Shell是一个配置工具,最好每台都解压,以便后续维护每台都可以进行集群的配置)
tar -zxf mysql-shell-8.0.11-linux-glibc2.12-x86-64bit.tar.gzmysql-shell
mv mysql-shell-8.0.11-linux-glibc2.12-x86-64bit.tar.gzmysql-shell mysql-shell
进入mysql-shell/bin并且执行./mysqlsh
连接到151服务器的MySQL,执行如下命令:
# 连接,需要输入密码(mysql的密码)
mysql-js> shell.connect('root@192.168.1.152:3306');或者node02@3306;输入密码:Joysuccess_123
# 执行配置命令,也需要密码
mysql-js> dba.configureLocalInstance();
# 创建一个 cluster,命名为'myCluster'
mysql-js> var cluster = dba.createCluster('myCluster');
# 创建成功后,查看cluster状态
mysql-js> cluster.status();
查看结果为:
添加其他节点实例
# 添加实例其它服务器节点
cluster.addInstance('root@151.168.1.153:3306'); #或者node03
cluster.addInstance('root@151.168.1.154:3306');#或者node04
在一次查看:cluster.status();
结果如下则为正常(注意三台服务器的"status": "ONLINE"):
{
"clusterName": "joyCluster",
"defaultReplicaSet": {
"name": "default",
"primary": "192.168.1.152:3306",
"ssl": "DISABLED",
"status": "OK",
"statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
"topology": {
"192.168.1.152:3306": {
"address": "192.168.1.152:3306",
"mode": "R/W",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"192.168.1.153:3306": {
"address": "192.168.1.153:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
},
"192.168.1.154:3306": {
"address": "192.168.1.154:3306",
"mode": "R/O",
"readReplicas": {},
"role": "HA",
"status": "ONLINE"
}
}
},
"groupInformationSourceMember": "mysql://root@192.168.1.152:3306"
}
如果一台服务器的MySQL停止现在需要重新加入到集群,首先启动MySQL,然后在mysql-shell里面重新rejoin,脚本如下:
cluster.rejoinInstance(root@192.168.1.152:3306);#或者node02
六、MySQL-Router安装(2台服务器151和155都做同样的步骤)
# 直接解压即可
tar –zxf mysql-router-8.0.11-linux-glibc2.12-x86-64bit.tar.gz
mv mysql-router-8.0.11-linux-glibc2.12-x86-64bit.tar.gz mysql-router
cd mysql-router
./bin/mysqlrouter --bootstrap root@node02:3306 -d myrouter --user=root
这里会在mysql-router目录生成myrouter/myrouter.cnf配置文件。
执行:./bin/mysqlrouter --config ./myrouter/myrouter.conf &
此时MySQL-Router启动,可以通过当前服务器的ip地址访问,端口号默认为:6446。
七、KeepAlived配置
7.1 安装keepalivded(网上搜索安装)
yum -y install keepalived
7.2 配置keepalived.conf
mkdir /etc/keepalived/keepalived.conf
chmod 777 /etc/keepalived/keepalived.conf
keepalived.conf的内容如下所示:
! Configuration File for keepalived
global_defs {
notification_email {
itsection@example.com
}
notification_email_from itsection@example.com
smtp_server mail.example.com
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_mysqlrouter {
script "/etc/keepalived/mysqlrouter_check.sh" #此文件为判断mysqlrouter的进程是否存在的脚本,循环判断是否存在,如果不存在则视为mysqlrouter已经停止,此时运行命令:systemctl stop keepalived命令,来切换ip地址,也称为地址漂移。
interval 2
weight -5
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
mcast_src_ip 192.168.1.151
virtual_router_id 51
priority 101 #注意点当前值越大,则为主机,否则为备机
advert_int 2
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.200 #注意点:此为虚拟IP,在设置IP的时候请保证局域网中没有该ip,先ping一下,ping不同说明可以用
}
track_script {
chk_mysqlrouter
}
}
7.3 mysql-router.sh脚本
#!/bin/sh
ps -fe|grep mysqlrouter |wc -l
if [ $? -ne 2 ]
then
systemctl stop keepalived
else
echo "runing....."
fi
安装完成之后,可通过ip addr查看是否虚拟出192.168.1.200地址,如果两台服务器都出现192.168.1.200地址,说明安装成功,这样可通过192.168.1.200地址去访问数据库了。
注意:此文档为安装之后整理,有部分命令是事后手动敲的,如果运行的脚本和命令不成功,有可能是我手误而成,整理之后没有验证里面的每一个命令。大部分命令、步骤和逻辑是按照试验过而总结出来的。