一.使用NAT连接
创建虚拟机之后,我们要设置一下虚拟机网卡的工作模式。 最推荐的是桥接模式,这种模式下,虚拟主机的网卡有独立的IP地址,跟本地局域网里面的真实主机差不多。但是缺点也很明显,就是不能用在校园网当中。因为校园网基本都采用了局域网设备隔离技术,你这个虚拟出来的主机跟本地Windows电脑相互ping不通,所以你在虚拟机上安装各种程序,在Windows 上一个都调用不了。还有就是有些人经常更换网络环境,白天用公司的网络,晚上用家庭网络,这就导致电脑的局域网IP经常切换,Linux的IP地址也经常变化。环境-变化, 你就得修改程序代码,才能通过新的IP地址访问到Linux系统的程序,确实很麻烦。
这里我建议大家选择NAT网络模式,虽然不如桥接网络功能强大,但是却能胜任校园网和.上班族的需要。点击虚拟机上的设置按钮。 设置如下:
1.1 安装Centos镜像
1.2 ssh进行远程连接
5022端口将会映射到linux的22端口。
二、Docker
2.1 防火墙关闭
1.查看防火墙状态
systemctl status firewalld
2、直接设置永久关闭防火墙
systemctl disable firewalld #永久关闭,即设置开机的时候不自动启动
3.关闭 selinux:
修改配置文件(永久关闭selinux可以使用vi命令打开/etc/sysconfig/selinux 文件将SELINUX=disabled)
4、重启linux
reboot
2.2 更新yum程序
yum命令是CentOS自带的软件包管理器,我们安装Docker之前,最好能先更新一下yum命令, 然后等上十分钟左右与, yum就更新好了。
yum update -y
2.3、安装Docker
执行安装命令, Docker就自动安装好了。
yum install docker -y
2.4 管理docker
启动和关闭Docker服务,可以通过下面的命令完成。办Linux系统,别忘了要运行Docker服务,切记!
service docker start
service docker stop
查看Docker中的镜像列表,可以执行下面的命令。
docker images
想要删除某个镜像可以用下面的命令。
docker rmi 镜像名字
三、部署MySQL集群
使用的数据库是MySQL 8.0.23版本,所以我们需要往Docker中导入MySQL镜像,然后用命令就能创建出四个MySQL节点了。
3.1、导入MySQL镜像
找到MySQL.tar.gz 镜像文件,然后把这个文件上传到Linux系统,执行命令导入MySQL镜像。
docker load < MySQL.tar.gz
3.2、设置虚拟机端口转发
因为四个MySQL容器的端口都是3306,所以我们要把这四个3306端口,映射到Linux系统的不同端口上(12001-12005) ,然后还要把Linux的这些个端映射到Windows.上面(12001~12005) ,我们才能用Navicat连接到MySQL容器。(前四个做集群处理,第五个是分布式事务处理) 设置好端口转发,是立即生效的,你不需要重启虚拟机和CentOS系统。
3.3 创建五个MySQL节点
为了给Docker中的容器分配固定的Docker内网IP地址,而且还跟其他现存的Docker容器IP不冲突,所以我们新创建一个Docker内网的网段。网络名字叫做mynet,网段是172.18.0.X, 以后我们创建的容器都分配这个网段的IP。 需要注意,172.18.0.1是网关的IP, 我们不能用。
docker network create -- subnet=172.18.0.0/18 mynet
docker run命令是创建容器的,配合上相应的参数, MySQL容器就能创建出来了。
docker run -it -d --name mysql_1 -p 12001:3306 \
--net mynet --ip 172.18.0.2 \
-m 400m -v /root/mysql_1/data:/var/lib/mysql \
-v /root/mysql_1/config:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=abc123456 \
-e TZ=Asia/Shanghai --privileged=true \
mysql:8.0.23 \
--lower_case_table_names=1
执行后等上十几秒,再执行下一段
docker run -it -d --name mysql_2 -p 12002:3306 \
--net mynet --ip 172.18.0.3 \
-m 400m -v /root/mysql_2/data:/var/lib/mysql \
-v /root/mysql_2/config:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=abc123456 \
-e TZ=Asia/Shanghai --privileged=true \
mysql:8.0.23 \
--lower_case_table_names=1
docker run -it -d --name mysql_3 -p 12003:3306 \
--net mynet --ip 172.18.0.4 \
-m 400m -v /root/mysql_3/data:/var/lib/mysql \
-v /root/mysql_3/config:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=abc123456 \
-e TZ=Asia/Shanghai --privileged=true \
mysql:8.0.23 \
--lower_case_table_names=1
docker run -it -d --name mysql_4 -p 12004:3306 \
--net mynet --ip 172.18.0.5 \
-m 400m -v /root/mysql_4/data:/var/lib/mysql \
-v /root/mysql_4/config:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=abc123456 \
-e TZ=Asia/Shanghai --privileged=true \
mysql:8.0.23 \
--lower_case_table_names=1
运行docker ps -a命令看一下各个MySQL 节点的运行状态,如果是Exited状态, 说明该节点创建失败。
对于创建失败的MySQL节点,你运行docker rm 容器名字这个命令,把该MySQL删除,然后检查创建容器的命令是不是有错误,再重新创建该MySQL容器。
我们要创建的第五个MySQL节点是给事务中间件用的,并不存储业务数据,所以并不算MySQL集群中的节点。
docker run -it -d --name mysql_5 -p 12005:3306 \
--net mynet --ip 172.18.0.6 \
-m 300m -v /root/mysql_5/data:/var/lib/mysql \
-v /root/mysql_5/config:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=abc123456 \
-e TZ=Asia/Shanghai --privileged=true \
mysql:8.0.23 \
--lower_case_table_names=1
四、MySQL集群概念
4.1 数据的切分
MySQL单表数据超过两千万, CRUD性能就会急速下降,所以我们需要把同一张表的数据切分到不同的MySQL节点中。这需要引入MySQL中间件,其实就是个SQL路由器而已。这种集群中间件有很多,比如MyCat、ProxySQL、ShardingSphere等等。 因为MyCat弃管 了,所以我选择了ShardingSphere,功能不输给MyCat,而且还是Apache负责维护的,国内也有很多项目组在用这个产品,手册资料相对齐全,所以相对来说是个主流的中间件。 我们在MySQL .1和MySQL 2两个节点上分别创建订单表,然后在ShardingSphere做好设置。 如果INSERT语句主键_值对2求模余0,这个INSERT语句就路由给MySQL _1节点:如果余数是1, INSERT语句就被路由给MySQL_2执行。
五、配置ShardingSphere
ShardingSphere是开源免费的数据库集群中间件,自带了各种切分数据的算法和雪花主键生成算法,甚至我们自己也可以写代码订制新的算法,相对来说比MyCat’展性更强。更多介绍,大家可以去官网自己查阅。
我这里使用的是ShardingSphere 5.0版本,属于最新的版本。5.0版本的配置文件和4.0版本有很大的区别,所以大家百度的时候尽量看清楚ShardingSphere的版本号,目前百度上大多数帖子讲ShardingSphere配置,都是基于4.0版本的。
5.1 设置端口转发
ShardingSphere默认使用3307端口,稍后我会把容器的3307端口映射到Linux的3307端口上,现在我们要把Linux的3307端口映射到Windows的3307端口上。
5.2导入JDK镜像
因为ShardingSphere是基于Java技术的中间件,所以我们需要先导入JDK镜像,然后创建容器,再放入 ShardingSphere程序。将jdk. tar.gz这个镜像文件上传到Linux系统(root目录下)。
docker load < JDK.tar.gz
5.3 创建容器
我们导入的JDK镜像里面包含的JDK版本是15.0.2的,然后我们用这个镜像创建Java容器。
docker run -it -d --name ss -p 3307:3307 \
--net mynet --ip 172.18.0.7 \
-m 300m -v /root/ss:/root/ss \
-e TZ=Asia/Shanghai --privileged=true \
jdk bash
5.4.运行ShardingSphere
CentOS系统的/root/ss 目录(即docker安装后的jdk映射目录下)是让我们放入ShardingSphere程序的,所以你将ShardingSphere. zip文件,上传到该目录之下。接下来我们要解压缩ZIP文件,那就需要安装UNZIP命令。
yum install unzip -y
先解压缩ZIP文件,然后进入到bin目录,给bin目录中的脚本文件赋权限。
# 进入文件目录
cd ss 或 cd /root/ss
#解压缩文件
unzip ShardingSphere.zip
#进入bin目录
cd ShardingSphere/bin
#给脚本文件赋权限(目录所有文件都给 777最高权限)
chmod -R 777 ./*
#进入容器
docker exec -it ss bash
#进入bin目录
cd /root/ss/ShardingSphere/bin
#启动ShardingSphere
./start.sh
# 退出容器
exit
等待10秒钟,然后进入到ShardingSphere的logs目录,看一下stdout . log文件的内容。如果只有这些警告信息,说明ShardingSphere启动成功了。(此时navict去连接3307端口的mysql) 此时ShardingSphere的虚拟库和虚拟表如下:
等你重新启动虚拟机的时候,要把ss容器启动,然后进入到容器运行这个start. sh脚本才可以。不是只把ss容器运行就可以了,切记! ! !
6、逻辑库的划分
6.1 分库
我们的项目划分出十几个微服务模块,模块之间为了彻底解耦,连逻辑库都是各用各的。如果每个MySQL分片都对应一个逻辑库,那么至少需要十几个分片,每个分片最少也得有6个MySQL节点。这样算下来,我们一共得需要超过60个MySQL节点,你觉得你的电脑能运行起来吗?所以我们必须现实一点,在四个MySQL分片上创建不同的逻辑库,给不同的微服务模块。
6.2管理逻辑库
虽然我们只有四个分片,但是每个分片上都有几个逻辑库,因此我们在ShardingSphere. 上就要创建JDBC连接,去连接这些逻辑库。你可以打开ShardingSphere的 config/config- sharding. yaml文件,阅读这些配置信息。
此时我配置的情况如下: 在mysql集群库中有tb_customer表,当表中的id除以2余0时,数据存放在mysql_1的库中,余1时,存mysql_2中 根据切分规则,将mysql语句路由给对应的mysql节点执行。mysql集群这个库是虚拟表数据,从两个实体表中加载数据汇总到虚拟表中
|