参考:https://www.xmmup.com/dbbao45mysqlgaokeyongzhimgrconsuljiagoubushu.html
采用MGR集群、和consul服务注册发现实现应用端通过动态dns访问MGR集群,实现数据库高可用,自动化切换的方案。
本次环境一共包含7台机器。其中3台做MySQL的MGR数据节点(也需要安装Consul,作为Consul client)。单主模式,还有3台做Consul server集群。实现Consul的高可用,剩下一台做DNS服务器,用来解析MGR节点域名。
IP | 数据库版本 | 主机名 | 容器名 | 容器映射端口 | Server ID | 实例端口 | MGR通讯端口 | 备注 |
---|---|---|---|---|---|---|---|---|
192.168.68.60 | 8.0.22 | mgr60 | mysql8022mgr33060 | 33060 | 802233060 | 3306 | 33061 | MGR主节点 |
192.168.68.61 | 8.0.22 | mgr61 | mysql8022mgr33061 | 33061 | 802233061 | 3306 | 33061 | MGR节点 |
192.168.68.62 | 8.0.22 | mgr62 | mysql8022mgr33062 | 33062 | 802233062 | 3306 | 33061 | MGR节点 |
[root@mysql conf]# docker pull lhrbest/lhrcentos76:8.0
-- 创建主从网络环境
[root@mysql ~]# docker network create --subnet=192.168.68.0/16 mhaclone
8b8e5ae9dd1efbb247323978a3dbcf025415b861b76bd828859ac934aefa77d1
[root@mysql ~]# docker network inspect mhaclone
[
{
"Name": "mhaclone",
"Id": "8b8e5ae9dd1efbb247323978a3dbcf025415b861b76bd828859ac934aefa77d1",
"Created": "2022-10-14T20:55:25.87905019+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {
},
"Config": [
{
"Subnet": "192.168.68.0/16"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
},
"Options": {
},
"Labels": {
}
}
]
-- 生成3台CentOS的环境
[root@mysql conf]# docker rm -f mysql8022mgr33060 mysql8022mgr33061 mysql8022mgr33062
[root@mysql conf]# docker run -d --name mysql8022mgr33060 -h mgr60 --network mhaclone --ip 192.168.68.60 --privileged=true -p 33060:3306 -v /sys/fs/cgroup:/sys/fs/cgroup lhrbest/lhrcentos76:8.0 init
575e7d8692eeb9bd702c190d4faf281696eb913611b96cc3eb14f2fd81022b74
[root@mysql conf]# docker run -d --name mysql8022mgr33061 -h mgr61 --network mhaclone --ip 192.168.68.61 --privileged=true -p 33061:3306 -v /sys/fs/cgroup:/sys/fs/cgroup lhrbest/lhrcentos76:8.0 init
73d80f98b3ddd54a5b9c6a4a7c91ae1bf54980e1d7f7aafca571827aff328ae5
[root@mysql conf]# docker run -d --name mysql8022mgr33062 -h mgr62 --network mhaclone --ip 192.168.68.62 --privileged=true -p 33062:3306 -v /sys/fs/cgroup:/sys/fs/cgroup lhrbest/lhrcentos76:8.0 init
3705d9583d6d8f8574a839ddb4e6a46b2055efc86d6e7f0b5b26a074483f6ff6
mysql-8.0.22-1.el7.x86_64.rpm-bundle.tar下载地址:
https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.22-1.el7.x86_64.rpm-bundle.tar
-- 上传mysql-8.0.22-1.el7.x86_64.rpm-bundle.tar到docker
[root@mysql ~]# pwd
/root
[root@mysql ~]# ls
anaconda-ks.cfg centos:7.6.1810 mysql-8.0.22-1.el7.x86_64.rpm-bundle.tar -p --privileged=true
[root@mysql ~]# docker cp mysql-8.0.22-1.el7.x86_64.rpm-bundle.tar mysql8022mgr33060:/
[root@mysql ~]# docker cp mysql-8.0.22-1.el7.x86_64.rpm-bundle.tar mysql8022mgr33061:/
[root@mysql ~]# docker cp mysql-8.0.22-1.el7.x86_64.rpm-bundle.tar mysql8022mgr33062:/
[root@mysql ~]# docker network connect bridge mysql8022mgr33060
[root@mysql ~]# docker network connect bridge mysql8022mgr33061
[root@mysql ~]# docker network connect bridge mysql8022mgr33062
[root@mysql ~]# docker restart mysql8022mgr33060 mysql8022mgr33061 mysql8022mgr33062
mysql8022mgr33060
[root@mysql ~]# docker exec -it mysql8022mgr33060 bash
[root@mgr60 /]# tar -xvf mysql-8.0.22-1.el7.x86_64.rpm-bundle.tar
[root@mgr60 /]# yum localinstall -y mysql-community-*.rpm
-- 取消密码认证
[root@mgr60 /]# mv /usr/lib64/mysql/plugin/validate_password.so /usr/lib64/mysql/plugin/validate_password.so_bk
[root@mgr60 /]# mv /usr/lib64/mysql/plugin/component_validate_password.so /usr/lib64/mysql/plugin/component_validate_password.so_bk
[root@mgr60 /]# systemctl start mysqld
[root@mgr60 /]# systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2022-10-15 11:43:50 CST; 975ms ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 1140 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 1211 (mysqld)
Status: "Server is operational"
CGroup: /system.slice/docker-575e7d8692eeb9bd702c190d4faf281696eb913611b96cc3eb14f2fd81022b74.scope/system.slice/mysqld.service
└─1211 /usr/sbin/mysqld
Oct 15 11:43:46 mgr60 systemd[1]: Starting MySQL Server...
Oct 15 11:43:50 mgr60 systemd[1]: Started MySQL Server.
[root@mgr60 /]# grep 'temporary password' /var/log/mysqld.log
2022-10-15T03:43:47.341706Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: HPe-pnyYh3us
[root@mgr60 /]# mysql -uroot -pHPe-pnyYh3us
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.22
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> alter user root@'localhost' identified with mysql_native_password by 'wcb';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on *.* to root@'localhost' with grant option;
Query OK, 0 rows affected (0.00 sec)
mysql> create user root@'%' identified with mysql_native_password by 'wcb';
Query OK, 0 rows affected (0.01 sec)
mysql> grant all on *.* to root@'%' with grant option;
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> select user,host,grant_priv,super_priv,authentication_string,password_last_changed from mysql.user;
+------------------+-----------+------------+------------+------------------------------------------------------------------------+-----------------------+
| user | host | grant_priv | super_priv | authentication_string | password_last_changed |
+------------------+-----------+------------+------------+------------------------------------------------------------------------+-----------------------+
| root | % | Y | Y | *1095707276B0CF42657EB271586320F15FD4D6AB | 2022-10-15 11:45:00 |
| mysql.infoschema | localhost | N | N | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | 2022-10-15 11:43:47 |
| mysql.session | localhost | N | Y | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | 2022-10-15 11:43:47 |
| mysql.sys | localhost | N | N | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | 2022-10-15 11:43:47 |
| root | localhost | Y | Y | *1095707276B0CF42657EB271586320F15FD4D6AB | 2022-10-15 11:44:49 |
+------------------+-----------+------------+------------+------------------------------------------------------------------------+-----------------------+
5 rows in set (0.00 sec)
mysql8022mgr33061
[root@mysql ~]# docker exec -it mysql8022mgr33061 bash
[root@mgr61 /]# tar -xvf mysql-8.0.22-1.el7.x86_64.rpm-bundle.tar
[root@mgr61 /]# yum localinstall -y mysql-community-*.rpm
[root@mgr61 /]# mv /usr/lib64/mysql/plugin/validate_password.so /usr/lib64/mysql/plugin/validate_password.so_bk
[root@mgr61 /]# mv /usr/lib64/mysql/plugin/component_validate_password.so /usr/lib64/mysql/plugin/component_validate_password.so_bk
[root@mgr61 /]# systemctl start mysqld
[root@mgr61 /]# systemctl status mysqld
● mysqld.service - MySQL Server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2022-10-15 11:47:14 CST; 608ms ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 1262 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 1333 (mysqld)
Status: "Server is operational"
CGroup: /system.slice/docker-73d80f98b3ddd54a5b9c6a4a7c91ae1bf54980e1d7f7aafca571827aff328ae5.scope/system.slice/mysqld.service
└─1333 /usr/sbin/mysqld
Oct 15 11:47:10 mgr61 systemd[1]: Starting MySQL Server...
Oct 15 11:47:14 mgr61 systemd[1]: Started MySQL Server.
[root@mgr61 /]# grep 'temporary password' /var/log/mysqld.log
2022-10-15T03:47:11.109466Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: <A!;j)I4Tptt
[root@mgr61 /]