这次来安装mysql8了,以前安装不是docker安装,这个我也是第一次,人人都有第一次嚒
前言
前面的redis安装还是花了点时间的,主要是网上教程,各有各的好,大家千万别取其长处,个人觉得这个环境影响很大?反正我照着装很多也不能安装完成。
这次安装mysql希望快点,不过也没关系,陪娃做作业,我就安装这玩意
我们直接安装集群。看时间允许,我们也安装个单机版的
一、MGR简介
确保数据库稳定运行是DBA核心价值之一。通过搭建灾备库,利用复制技术同步主库的数据更新,在主库不可用时,启用备库可以快速恢复数据库服务,减少对业务的影响,同时,备库也可用于负载均衡、数据备份、统计报表等场景。带来诸多好处的同时,自然也有其弊端:增加了额外的硬件、维护成本,以及复制中主从数据延迟或不一致等多种问题。MySQL在3.23.15版本中新增了复制功能,接下来是一系列的增强和优化:row based,半同步复制,GTID,多线程,多源复制,组复制等,本文使用2016年底官方GA的Group Replicaion(下文简称MGR)
架构图:
- MGR(MySQL Group Replication)是MySQL 5.7.17提出的集群方案,它既可以很好地保证数据一致性,又具备故障检测和转移功能,MGR还支持多节点写入,这是一项被普遍看好的技术。
- MGR(MySQL Group Replication)是MySQL自带的一个插件,可以灵活部署。MySQL MGR集群是多个MySQL Server节点共同组成的分布式集群,每个Server都有完整的副本,它是基于行(ROW)格式的二进制日志文件。
- MGR是一个多主结构,通过组复制(Group Replication)机制实现各节点数据的一致性,这与Replication的异步复制、PXC的同步复制都不相同。
- 如图所示,DB1、DB2、DB3构成的MGR集群,集群中每个DB都有MGR层,MGR层功能也可简单理解为由Paxos模块和冲突检测Certify模块实现
- Paxos模块基于Paxos算法,确保所有节点收到相同广播消息,Transactionmessage(交易信息)就是广播消息的内容结构;冲突检测Certify(保证)模块进行冲突检测确保数据的最终一致性。
- 当DB1上有事务T1要执行时,T1对DB1来说是本地事务,对于DB2、DB3来说是远端事务;DB1在事务T1被执行后,会把执行事务T1的信息广播给集群中各个节点,包括DB1本身;通过Paxos模块广播给MGR集群中的各个节点,半数以上的节点同意并且达成共识,之后共识信息进入各个节点的冲突检测Certify模块,各个节点各自进行冲突检测验证,最终保证事务在集群中的最终一致性。
- 在冲突检测通过之后,本地事务T1在DB1直接提交即可,否则直接回滚。远端事务T1在DB2和DB3分别先更新到relaylog,然后应用到binlog,完成数据的同步,否则直接放弃该事务。
- 优点:避免脑裂:MGR中不会出现脑裂的现象;数据一致性保障:MGR的冗余能力很好,能够保证Binlog Event至少被复制到超过一半的成员上,只要同时宕机的成员不超过半数便不会导致数据丢失
二、集群安装
1、环境
victor_t400@victort400:/home$ uname -a
Linux victort400 6.8.0-31-generic #31-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 00:40:06 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
victor_t400@victort400:/home$ docker --version
Docker version 24.0.7, build 24.0.7-0ubuntu4
2、拉取镜像
victor_t400@victort400:/home$ docker pull mysql:8.0.20
8.0.20: Pulling from library/mysql
Digest: sha256:8b7b328a7ff6de46ef96bcf83af048cb00a1c86282bfca0cb119c84568b4caf6
Status: Downloaded newer image for mysql:8.0.20
docker.io/library/mysql:8.0.20
victor_t400@victort400:/home$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 8251f0669c6e 3 days ago 623MB
redis latest 9509c4dd19fb 4 weeks ago 116MB
mysql 8.0.20 be0dbf01a0f3 3 years ago 541MB
3、创建容器网络
victor_t400@victort400:/home$ docker network create --subnet=172.72.0.0/24 mysql-net
96ab815083147c7bdba564c92585ee6d0b64e923beea43844f1c8c9eb08a0b71
victor_t400@victort400:/home$docker network ls
NETWORK ID NAME DRIVER SCOPE
90725f91b3dc bridge bridge local
d009f7a9343b host host local
96ab81508314 mysql-net bridge local
f9c89145d9ab none null local
a09e80dd0716 redis-net bridge local
4、创建mysql的数据目录
sudo mkdir -p /home/mysql-mgr/mysql-mgr-master/conf.d sudo mkdir -p /home/mysql-mgr/mysql-mgr-master/data sudo mkdir -p /home/mysql-mgr/mysql-mgr-slave01/conf.d sudo mkdir -p /home/mysql-mgr/mysql-mgr-slave01/data sudo mkdir -p /home/mysql-mgr/mysql-mgr-slave02/conf.d sudo mkdir -p /home/mysql-mgr/mysql-mgr-slave02/data
5、拉起容器
密码设置不要用123456,这个就可以 LzloveYou123!
docker run -d --name mysql-mgr-master -h mysql-mgr-master \
-p 13066:3306 -p 33011:33011 \
--net=mysql-net --ip 172.72.0.101 \
-v /home/mysql-mgr/mysql-mgr-master/conf.d:/etc/mysql/conf.d \
-v /home/mysql-mgr/mysql-mgr-master/data:/var/lib/mysql/ \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai \
--privileged=true mysql:8.0.20
docker run -d --name mysql-mgr-slave01 -h mysql-mgr-slave01 \
-p 23066:3306 -p 33012:33012 \
--net=mysql-net --ip 172.72.0.102 \
-v /home/mysql-mgr/mysql-mgr-slave01/conf.d:/etc/mysql/conf.d \
-v /home/mysql-mgr/mysql-mgr-slave01/data:/var/lib/mysql/ \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai \
--privileged=true mysql:8.0.20
docker run -d --name mysql-mgr-slave02 -h mysql-mgr-slave02 \
-p 33066:3306 -p 33013:33013 \
--net=mysql-net --ip 172.72.0.103 \
-v /home/mysql-mgr/mysql-mgr-slave02/conf.d:/etc/mysql/conf.d \
-v /home/mysql-mgr/mysql-mgr-slave02/data:/var/lib/mysql/ \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai \
--privileged=true mysql:8.0.20
victor_t400@victort400:/home/mysql-mgr$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
26b69bc2a374 mysql "docker-entrypoint.s…" 4 seconds ago Up 2 seconds 0.0.0.0:33011->33011/tcp, :::33011->33011/tcp, 33060/tcp, 0.0.0.0:13066->3306/tcp, :::13066->3306/tcp mysql-mgr-master
ee9ac39c7cf9 mysql "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:33012->33012/tcp, :::33012->33012/tcp, 33060/tcp, 0.0.0.0:23066->3306/tcp, :::23066->3306/tcp mysql-mgr-slave01
20f7e28c414e mysql "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:33013->33013/tcp, :::33013->33013/tcp, 33060/tcp, 0.0.0.0:33066->3306/tcp, :::33066->3306/tcp mysql-mgr-slave02
这样就建了3个docker容器节点,运行了起来
6、修改配置mysql参数配置文件
a、删除旧的配置文件
sudo rm -rf /home/mysql-mgr/mysql-mgr-master/conf.d/my.cnf
sudo rm -rf /home/mysql-mgr/mysql-mgr-slave01/conf.d/my.cnf
sudo rm -rf /home/mysql-mgr/mysql-mgr-slave02/conf.d/my.cnf
b、mysql-mgr集群master配置文件
sudo touch /home/mysql-mgr/mysql-mgr-master/conf.d/my.cnf
sudo chmod 777 /home/mysql-mgr/mysql-mgr-master/conf.d/my.cnf
sudo cat > /home/mysql-mgr/mysql-mgr-master/conf.d