采用docker部署之前,需要先检查系统是否安装了docker,没安装可自行安装后再做下面的操作。
环境
系统版本:CentOS 7.6 64bit
docker版本:1.13.1
mysql容器版本:8.0.25
服务器信息:172.16.0.17(主),172.16.0.2(从),172.16.0.3(从)
镜像
此处选取的镜像是官方mysql:8.0.25,可先使用下面的命令拉取到本地:
docker pull mysql:8.0.25
当然,也可以直接在创建mysql的docker容器的时候拉取。
命令
以下采用MySQL InnoDB Cluster来实现高可用集群,默认以root用户来操作,需要分别在3台机器做操作,示例集群为一主两从模式(也可创建其他模式):
1.创建目录:在3台机器分别执行一下命令创建目录:
mkdir -p var/mysql/conf.d
mkdir -p var/mysql/data
2.新建配置文件:在/var/mysql/conf.d目录创建配置文件并编辑,vi my.cnf,主要内容如下(以172.16.0.17机器为例,其他2台机器修改红色部分即可)
[mysqld]
character-set-server=utf8mb4
port=3306
default-storage-engine=INNODB
#其他机器按ip最后一位可分别设置为2和3
server_id=17
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
max_connections=200
max_allowed_packet=16M
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="172.16.0.17:33061"
loose-group_replication_group_seeds="172.16.0.17:33061,172.16.0.2:33061,172.16.0.3:33061"
loose-group_replication_ip_whitelist="172.16.0.17,172.16.0.2,172.16.0.3"
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode=on
loose-group_replication_enforce_update_everywhere_checks=off
disabled_storage_engines=MyISAM,BLACKHOLE,FEDERATED,CSV,ARCHIVE
report_host=172.16.0.17
report_port=3306
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
3.创建容器:在3台机器分别执行下面的命令创建mysql容器实例(注意使用--net host模式)
docker run -itd --privileged=true --net host -e MYSQL_ROOT_PASSWORD=MyGrp945 --name mysql01 -v var/mysql/conf.d:/etc/mysql/conf.d -v var/mysql/data:/var/lib/mysql mysql:8.0.25
可以通过docker ps -a查看容器状态,如果处于退出状态,可以通过docker logs mysql01查看日志,分析原因后重建容器实例
4.下载组件:通过wget命令下载mysql-shell,mysql-router组件(此处只下载了mysql-shell组件,mysql-router通过容器启动)
wget https://cdn.mysql.com//Downloads/MySQL-Shell/mysql-shell-8.0.25-linux-glibc2.12-x86-64bit.tar.gz
tar -xzvf mysql-shell-8.0.25-linux-glibc2.12-x86-64bit.tar.gz
cd mysql-shell-8.0.25-linux-glibc2.12-x86-64bit/bin
5.创建集群:在解压后的bin目录下执行mysqlsh,
连接主数据库
shell.connect('root@172.16.0.17:3306');
配置实例
dba.configureLocalInstance();
检查实例配置
dba.checkInstanceConfiguration("root@172.16.0.17:3306");
创建集群
var cluster = dba.createCluster('myCluster');
查看集群状态
cluster.status();
其中cluster是创建集群后对应的集群实例变量,如果已经创建过,可以通过getCluster获取:
获取集群
var cluster=dba.getCluster("myCluster");
6.添加从数据库:在其他2台集群的mysql容器实例创建好了之后可以使用如下命令添加从库
cluster.addInstance('root@172.16.0.2:3306');
cluster.addInstance('root@172.16.0.3:3306');
执行后会有提示,选择clone,此时会要求重启数据库,重启容器实例即可(分别在从库机器执行docker restart mysql01)
7.添加mysql-router组件:此处通过容器实现,也可以下载组件
docker run -itd --privileged=true --net host --name mysql-router -e MYSQL_HOST=172.16.0.17 -e MYSQL_PORT=3306 -e MYSQL_USER=root -e MYSQL_PASSWORD=MyGrp945 mysql/mysql-router:8.0.25
这样就可以通过mysql-router实现mysql集群管理及负载均衡,可以通过以下命令连接集群(连接端口6446为mysql-router服务端口)
docker run -it --net=host --rm mysql mysql -h172.16.0.17 -P6446 -uroot -pMyGrp945
检查
1.查看容器:执行创建容器的命令后,执行docker ps -a可查看容器运行状况(-a选项可以查看所有容器信息,包括异常状态的);对于异常容器,可以执行docker logs [容器名或id] 查看日志信息
2.查看集群:可进入任意一台机器,查看数据库信息(172.16.0.2为例)
docker run -it --net=host --rm mysql mysql -h172.16.0.2 -P3306 -uroot -pMyGrp945
SELECT * FROM performance_schema.replication_group_members;
3.测试集群:可以在主库新建数据库和表后添加数据,然后在从库查询数据(此处主库是读写模式,从库为只读模式)
效果
1.mysqlsh连接主库:

2.配置主库:

3.检查主库状态

4.创建集群:

5.配置从库(172.16.0.2)

6.添加从库到集群(172.16.0.2)

7.配置从库(172.16.0.3)

8.添加从库到集群(172.16.0.3)


9.查看整个集群:

注意事项
1.创建容器一定要使用--net host模式,使用主机网络,否则创建集群会报错(类似There is no local IP address matching the one configured for the local node (172.16.0.17:33061))
2.可以创建一个mysql临时容器来模拟mysql客户端(类似docker run -it --net=host --rm mysql mysql -h172.16.0.17 -uroot -pMyGrp945)
3.可以通过scp命令把文件复制到远程机器(类似scp mysqlsh root@172.16.0.2:/var/mysql)




