MySQL 水平切割、分库分表、读写分离、MyCat 集群


注:【网页版】右上方的悬浮框( 有目录索引 )


一、安装 docker,建立基本环境( 可跳过 )

  docker 安装,未经严格校验、还请读者见谅

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# ^^^ 安装依赖包

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# ^^^ 设置阿里云镜像源 

sudo yum install docker-ce    	#安装 Docker-CE( 过程选择 y )
docker -v						#查看版本( 同时验证是否安装成功 )
sudo systemctl enable docker  	#开机自启
sudo systemctl start docker   	#启动docker服务

# 登录啊里镜像官网,将命令复制至 /etc/docker/daemon.json
vim /etc/docker/daemon.json		#复制命令至此目录下
systemctl restart docker		#重启 docker

# 创建 portainer 可视化 docker 管理器
docker run -d -p 9000:9000  --restart=always  -v /var/run/docker.sock:/var/run/docker.sock --name prtainer-test portainer/portainer

systemctl stop firewalld.service	# 关闭防火墙

1 - 啊里镜像官网阿里镜像
2 - 复制命令时若失败,进入如下操作:
  mv /etc/docker/daemon.json daemon.conf
3 - 操作完成后,可进入可视化管理界面:
  Docker 可视化管理访问地址
  初次访问需注册,建议密码:adminadmin


二、Ubuntu 环境创建主从库

2-1】安装主库 01

# 创建目录
mkdir /data/mysql/master01 -p
cd /data/mysql/master01
mkdir conf data
chmod 777 * -R

# 创建配置文件
cd /data/mysql/master01/conf
vim my.cnf

# 输入如下内容
[mysqld]
log-bin=mysql-bin  		# 开启二进制日志
server-id=1        		# 服务 id,不可重复
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

# 创建容器并【启动】,可以在可视化页面启动
docker create --name percona-master01 -v /data/mysql/master01/data:/var/lib/mysql -v /data/mysql/master01/conf:/etc/my.cnf.d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
# docker start percona-master01 && docker logs -f percona-master01

# 【启动后,移步至 MySQL 命令行】
# 端口:3311	密码:root
# 创建同步账户以及授权
create user 'debj'@'%' identified by 'debj'; 
grant replication slave on *.* to 'debj'@'%'; 
flush privileges;

# 重新启动( 建议关闭,再开启,免得出异常 )

show master status;		#查看 master 状态( 从库联系信息 )
show global variables like 'binlog%';	#查看二进制日志相关的配置项 
show global variables like 'server%';	#查看 server 相关的配置项

主表信息


2-2】安装从库 01

# 创建目录 
mkdir /data/mysql/slave01 
cd /data/mysql/slave01 
mkdir conf data 
chmod 777 * -R 

# 创建配置文件 
cd /data/mysql/slave01/conf
vim my.cnf 

# 输入如下内容 
[mysqld] 
server-id=2 		#服务 id,不可重复
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

# 创建容器并启动,可以在可视化页面启动
docker create --name percona-slave01 -v /data/mysql/slave01/data:/var/lib/mysql -v /data/mysql/slave01/conf:/etc/my.cnf.d -p 3312:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
# 启动 # docker start percona-slave01 && docker logs -f percona-slave01
 
#【移步至 MySQL 命令行】
# 端口:3312	密码:root
# 设置 master 相关信息
set sql_mode = ''; 
set sql_mode = 'NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';

# navicat 连接 mysql 3311 端口
CHANGE MASTER TO master_host='192.168.133.128', 
master_user='debj',
master_password='debj',
master_port=3311,
master_log_file='mysql-bin.000004',
master_log_pos=154; 

start slave; 			#启动同步 
show slave status;		#查看 master 状态( 建议在查询页面查看 )

在这里插入图片描述


2-3】安装主库 02

# 创建目录
mkdir /data/mysql/master02
cd /data/mysql/master02
mkdir conf data
chmod 777 * -R

# 创建配置文件
cd /data/mysql/master02/conf
vim my.cnf

# 输入如下内容
[mysqld]
log-bin=mysql-bin  		# 开启二进制日志
server-id=1        		# 服务 id,不可重复,不同容器中,id 互不影响
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

# 创建容器并【启动】,可以在可视化页面启动
docker create --name percona-master02 -v /data/mysql/master02/data:/var/lib/mysql -v /data/mysql/master02/conf:/etc/my.cnf.d -p 3313:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
# docker start percona-master02 && docker logs -f percona-master02

# 【启动后,移步至 MySQL 命令行】
# 端口:3313	密码:root
# 创建同步账户以及授权
create user 'debj'@'%' identified by 'debj'; 
grant replication slave on *.* to 'debj'@'%'; 
flush privileges;

# 重新启动( 建议关闭,再开启,免得出异常 )

show master status;		#查看 master 状态( 从库联系信息 )
show global variables like 'binlog%';	#查看二进制日志相关的配置项 
show global variables like 'server%';	#查看 server 相关的配置项

在这里插入图片描述


2-4】安装从库 02

# 创建目录 
mkdir /data/mysql/slave02 
cd /data/mysql/slave02 
mkdir conf data 
chmod 777 * -R 

# 创建配置文件 
cd /data/mysql/slave02/conf
vim my.cnf 

# 输入如下内容 
[mysqld] 
server-id=2 		#服务 id,不可重复
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

# 创建容器并启动,可以在可视化页面启动
docker create --name percona-slave02 -v /data/mysql/slave02/data:/var/lib/mysql -v /data/mysql/slave02/conf:/etc/my.cnf.d -p 3314:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
# 启动 # docker start percona-slave02 && docker logs -f percona-slave02
 
#【移步至 MySQL 命令行】
# 端口:3314	密码:root
# 设置 master 相关信息
set sql_mode = ''; 
set sql_mode = 'NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';

# navicat 连接 mysql 3311 端口
CHANGE MASTER TO master_host='192.168.133.128', 
master_user='debj',
master_password='debj',
master_port=3313,
master_log_file='mysql-bin.000004',
master_log_pos=154; 

start slave; 			#启动同步 
show slave status;		#查看 master 状态( 建议在查询页面查看 )

在这里插入图片描述
  两个主从库创建好后
  分别在两个主库中创建 test_01 数据库
  再分别创建两个 test_01 表
  此时即可在主从表中添加数据,查看变化

CREATE TABLE `test_01` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pickName` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

三、配置 mycat

3-1】安装 jdk( 可跳过 )

  安装 jdk 方式不止其一种,其它方式奕可
  因为 mycat 由 java 编写,需要 jre 来支持其运行

  Oracle 官网下载 JDK

sudo mkdir /usr/lib/jvm

# 利用 Xftp 将下载好的 jdk.tar.gz 复制至此目录下

tar -zxvf jdk-8u141-linux-x64.tar.gz -C /usr/lib/jvm
sudo vim ~/.bashrc

# 在末尾追加以下内容( 注意路径名中 jdk 版本号 )
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_141
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
						
source ~/.bashrc		# 使环境变量生效

# 设置默认 jdk
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_141/bin/java 300 
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_141/bin/javac 300 
sudo update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/jdk1.8.0_141/bin/jar 300 
sudo update-alternatives --install /usr/bin/javah javah /usr/lib/jvm/jdk1.8.0_141/bin/javah 300 
sudo update-alternatives --install /usr/bin/javap javap /usr/lib/jvm/jdk1.8.0_141/bin/javap 300

sudo update-alternatives --config java
java -version			# 测试是否安装成功
javac -version			# 测试是否安装成功

3-2】安装并配置 mycat

  安装 mycatgithub 下载

mkdir /data/mycat
cd /data/mycat

# 利用 Xftp 将 mycat 复制至此目录下

tar -xvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz

mv mycat mycat01 	# 重命名 
cd mycat01/conf/	# 进入文件夹,将下面的三个配置文件覆盖掉( 个人建议先删除,再逐个复制 )

# 【三个配置文件,配置好后】,启动服务
cd /data/mycat/mycat01/bin/
./startup_nowrap.sh && tail -f ../logs/mycat.log

#【补充:强制杀死占用该端口的线程】 # netstat -tunpl |grep 8066

# 【移步至 MySQL】	端口:8066		密码:root
# 此时,在 mycat 逻辑库中修改会根据 id 进行分片,安置至不同实体库

  1/3  schema.xml  配置参数:逻辑库,逻辑表,数据节点,节点主机

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
	 <tableRule name="mod-long">
		<rule>
			<columns>id</columns>
			<algorithm>mod-long</algorithm>
		</rule>
	</tableRule>
	<function name="mod-long"  class="io.mycat.route.function.PartitionByMod">
		<property name="count">2</property>
	</function>
</mycat:rule>

  2/3  server.xml  连接用户名和密码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
	<system>
		<property name="useSqlStat">0</property>  
		<property name="useGlobleTableCheck">0</property> 
		<property name="sequnceHandlerType">2</property>
		<property name="processorBufferPoolType">0</property>
		<property name="handleDistributedTransactions">0</property>
		<property name="useOffHeapForMerge">1</property>
		<property name="memoryPageSize">1m</property>
		<property name="spillsFileBufferSize">1k</property>
		<property name="useStreamOutput">0</property>
		<property name="systemReserveMemorySize">384m</property>
		<property name="useZKSwitch">true</property>
	</system>
	<user name="root"> 
		<property name="password">root</property> 
		<property name="schemas">test_01</property>
	</user>
</mycat:server>

  3/3  rule.xml  分片规则

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
	<tableRule name="mod-long">
		<rule>
			<columns>id</columns>
			<algorithm>mod-long</algorithm>
		</rule>
	</tableRule>
	<function name="mod-long"  class="io.mycat.route.function.PartitionByMod">
		<property name="count">2</property>
	</function>
</mycat:rule>

四、Mycat 集群

  • 思想:【应用系统】读写操作通过【中间件 mycat 】分别去连接 【MySQL 主从表】进行读写操作
  • 即本文中,主表负责写操作,从表负责读操作,不同连接之间,主从表一致
# mycat 做了数据库的代理,在高并发的情况下,会遇到单节点性能问题,所以需要部署多个 mycat 节点。

# 搭建多节点 mycat: 
cd /data/mycat/
cp mycat01 mycat02 -R 
cd /data/mycat/mycat02/conf/
vim wrapper.conf 

# 设置 jmx 端口( 建议将原配置注释 )
wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1985 vim server.xml 

# 设置服务端口以及管理端口
cd /data/mycat/mycat02/conf/	# 添加至 server.xml 文件
<property name="serverPort">8067</property> 
<property name="managerPort">9067</property> 

# 重新启动服务 
cd /data/mycat/mycat02/bin/
./startup_nowrap.sh tail -f ../logs/mycat.log 

# 多节点的 mycat 搭建完成【移步至 MySQL CUD 操作后回来告诉我,You did it】
192.168.133.128-8067	# 密码:root

猜你喜欢

转载自blog.csdn.net/ice_debj/article/details/106802042
今日推荐