您现在的位置是:首页 >其他 >MySQL企业级的多种部署方式网站首页其他

MySQL企业级的多种部署方式

码农高飞 2023-06-05 16:00:02
简介MySQL企业级的多种部署方式

数据库概述

为什么要用数据库

要实现对数据的存储就要对数据进行持久化,意味着把数据保存到可掉电式设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以固化,而持久化的实现过程大多通过各种关系数据库来完成。

持久化的主要作用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、xml数据文件中。

数据库和数据库管理系统

DB:数据库,即存储数据的仓库,其本质是一个文件系统,保存了一系列有组织的数据。

DBMS:数据管理系统,是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,用户通过数据库管理系统访问数据库中表内的数据。

SQL:结构化查询语言,专门用来与数据库通信的语言。

数据库管理系统可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库,为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体用户的数据。

数据库管理系统、数据库和表的关系如下图:

常见的数据库管理系统排名:
目前互联网上常见的数据库管理软件有Oracle、MySQL、MS SQL Server、DB2、PostgreSQL、Access、Sybase、Informix这几种,下面是各数据库管理系统的受欢迎程度排名。

对应的走势图:

RDBMS与非RDBMS

从排名中可以看出来,关系型数据库绝对是DBMS的主流,其中使用最多的DBMS分别是Oracle、MySQL和SQL Server,这些都是关系型数据库(RDBMS)。
关系型数据库(RDBMS)
这种类型的数据库是最古老的数据库类型,关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。

关系型数据库以行和列的形式存储数据,以便于用户理解。这一系列的行和列被称为表,一组表组成了一个库。

表与表之间的数据记录有关系,现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示,关系型数据库就是建立在关系模型基础上的数据库。

sql就是关系型数据库的查询语言。

复杂查询可以用sql语句方便的在一个表以及多个表之间做非常复杂的数据查询。另外事务支持使得对于安全性能很高的数据访问要求得以实现。
非关系型数据库(非RDBMS)
非关系型数据库可看成传统关系型数据库的功能阉割版本,基于键值对存储数据,不需要经过sql层的解析,性能很高,同时通过减少不常用的功能进一步提高了性能。目前基本大部分主流的非关系型数据库都是免费的。

相比于SQL,NoSQL泛指非关系型数据库,包括了榜单上的键值型数据库、文档型数据库、搜索引擎和列存储等,除此以外还包括图形数据库,也只有用NoSQL才能将这些技术囊括进来。

键值型数据库:通过key-value键值的方式来存储数据,其中key和value可以是简单的对象,也可以是复杂的对象,key作为唯一的标识符,优点是查找速度快,在这方面明显优于关系型数据库,缺点是无法像关系型数据库一样使用条件过滤,如果不知道去哪里找数据就要遍历所有的键,这就会消耗大量的计算,所以键值型数据库典型的使用场景是作为内存缓存,Redis是最流行的键值型数据库。

文档型数据库:此类数据库可存放并获取文档,可以是xml、json等格式,在数据库中文档作为处理信息的基本单位,一个文档就相当于一条记录,文档数据库所存放的文档就相当于键值数据库所存放的值。MongoDB就是最流行的文档型数据库。

搜索引擎数据库:虽然关系型数据库采用了索引提升检索效率,但针对全文索引效率却较低。搜索引擎数据库是应用在搜索引擎领域的数据存储形式,由于搜索引擎会爬取大量的数据,并以特定的格式进行存储,这样在检索的时候才能保证性能最优,核心原理就是倒排索引。典型产品有Solr、Elasticsearch、Splunk等。

列式数据库:列式数据库是相对于行式存储的数据库,Oracle、MySQL和SQL Server等数据库都是采用的行式存储,而列式数据库是将数据按照列存储到数据库中,这样做的好处就是可以大量降低系统的io,适合用于分布式文件系统,不足在于功能相对有限。典型产品有HBase等。

图形数据库:利用了图这种数据结构存储实体之间的关系,图形数据库最典型的例子就是社交网络中人与人的关系,数据模型主要是以节点和边来实现,特点在于能高效的解决复杂的关系问题。典型产品有Neo4J、InfoGrid等。

由于SQL一直称霸DBMS,因此许多人在思考是否有一种数据库技术能远离SQL,于是NoSQL就诞生了,但随着发展却发现越来越离不开SQL。到目前为止NoSQL阵营中的DBMS都会有实现类似SQL的功能。NoSQL对SQL做出了很好的补充,在实际开发中,很多业务不需要完整的关系型数据库功能,非关系型数据库就够用了,这时使用性能更高成本更低的非关系型数据库当然是明智的选择,比如日志收集、排行榜、定时器等。

关系型数据库设计规则

关系型数据库的典型数据结构就是数据表,这些数据表的组成都是结构化的。将数据放到表中,表再放到库中。一个数据库中可以有多个表,每个表都有一个名字,用来标识自己,表名具有唯一性。表具有一些特性,这些特性定义了数据在表中如何存储,类似Java中类的设计。
表、记录、字段
E-R模型中有三个主要概念:实体集、属性、联系集。一个实体集对应数据库中的一个表,一个实体则对应数据库表中的一行,也称为一条记录,一个属性对应于数据库表中的一列,也称为一个字段。

ORM思想体现:

  • 数据库中的一个表对应Java中的一个类
  • 表中的一条数据对应类中的一个对象
  • 表中的一个列对应类中的一个字段、属性

表的关联关系
表与表之间的数据记录有关系,现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。关联关系有四种,分别为一对一关联、一对多关联、多对多关联、自我引用。

一对一关联:实际开发中应用不多,因为一对一可以创建成一张表。

一对多关联:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键。

多对多关联:要表示多对多关系,必须创建第三个表,该表通常称为联接表,它将多对多关系划分为两个一对多关系,将这两个表的主键都插入到第三个表中。

MySQL介绍

MySQL是一个开放源代码的关系型数据库管理系统。MySQL支持大型的数据库,可以处理拥有上千万条记录的大型数据库。MySQL支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。

MySQL的4大版本

  1. MySQL Community Server:社区版本,开源免费,自由下载,但不提供官方技术支持,使用于大多数普通用户。
  2. MySQL Enterprise Edition:企业版本,需要付费,不能在线下载,可以试用30天,提供了更多的功能和更完备的技术支持,更适合于对数据库的功能和可靠性要求较高的企业客户。
  3. MySQL Cluster:集群版,开源免费,用于架设集群服务器,可将几个MySQL Server封装成一个Server,需要在社区版或企业版的基础上使用。
  4. MySQL Cluster CGE:高级集群版,需要付费。

此外官方还提供了MySQL Workbench,一款专为MySQL设计的ER/数据库建模工具,它是著名的数据库设计工具DBDesigner4的继任者,MySQL Workbench又分为两个版本,分别是社区版和商用版。

MySQL8新特性

MySQL从5.7版本直接跳到8.0版本,可见这是一个令人兴奋的里程碑版本,MySQL8版本在功能上做了显著的改进和增强,开发者对MySQL的源代码进行了重构,最突出的一点是多MySQL Optimizer优化器进行了优化,不仅在速度上得到了改善,还为用户带来了更好的性能和更棒的体验。

新特性如下:

  1. 更简便的NoSQL支持。
    NoSQL泛指非关系型数据库和数据存储,随着互联网平台的规模飞速发展,传统的关系型数据库已经越来越不能满足需求。从5.6版本开始,MySQL就开始支持简单的NoSQL存储功能。MySQL8对这一功能做了优化,以更灵活的方式实现NoSQL功能,不再依赖模式(schema)。
  2. 更好的索引。
    在查询中正确地使用索引可以提高查询的效率。MySQL8中新增了隐藏索引和降序索引。隐藏索引可以用来测试去掉索引对查询性能的影响。在查询中混合存在多列索引时,使用降序索引可以提高查询的性能。
  3. 更完善的json支持。
    MySQL从5.7开始支持原生JSON数据的存储,MySQL8对这一功能做了优化,增加了聚合函数 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() ,将参数聚合为JSON数组或对象,新增了行内操作符->>,是列路径运算符->的增强,对JSON排序做了提升,并优化了JSON的更新操作。
  4. 安全和账户管理。
    MySQL8中新增了caching_sha2_password授权插件、角色、密码历史记录和FIPS模式支持,这些特性提高了数据库的安全性和性能,使数据库管理员能够更灵活地进行账户管理工作。
  5. InnoDB的变化。
    InnoDB是MySQL默认的存储引擎 ,是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。在MySQL8版本中,InnoDB在自增、索引、加密、死锁、共享锁等方面做了大量的 改进和优化 ,并且支持原子数据定义语言(DDL),提高了数据安全性,对事务提供更好的支持。
  6. 数据字典。
    在之前的MySQL版本中,字典数据都存储在元数据文件和非事务表中。从MySQL8开始新增了事务数据字典,在这个字典里存储着数据库对象信息,这些数据字典存储在内部事务表中。
  7. 原子数据定义语句。
    MySQL8开始支持原子数据定义语句(Automic DDL),即原子DDL 。目前只有InnoDB存储引擎支持原子DDL。原子数据定义语句(DDL)将与DDL操作相关的数据字典更新、存储引擎操作、二进制日志写入结合到一个单独的原子事务中,这使得即使服务器崩溃,事务也会提交或回滚。使用支持原子操作的存储引擎所创建的表,在执行DROP TABLE、CREATE TABLE、ALTER TABLE、RENAME TABLE、TRUNCATE TABLE、CREATE TABLESPACE、DROP TABLESPACE等操作时,都支持原子操作,即事务要么完全操作成功,要么失败后回滚,不再进行部分提交。 对于从MySQL 5.7复制到MySQL8版本中的语句,可以添加 IF EXISTS 或 IF NOT EXISTS 语句来避免发生错误。
  8. 资源管理。
    MySQL8开始支持创建和管理资源组,允许将服务器内运行的线程分配给特定的分组,以便线程根据组内可用资源执行。
  9. 字符集支持。
    MySQL8中默认的字符集由latin1更改为utf8mb4,并首次增加了日语所特定使用的集合,utf8mb4_ja_0900_as_cs。
  10. 优化器增强。
    MySQL优化器开始支持隐藏索引和降序索引。隐藏索引不会被优化器使用,验证索引的必要性时不需要删除索引,先将索引隐藏,如果优化器性能无影响就可以真正地删除索引。降序索引允许优化器对多个列进行排序,并且允许排序顺序不一致。
  11. 公用表表达式。
    公用表表达式(Common Table Expressions)简称为CTE,MySQL现在支持递归和非递归两种形式的CTE。CTE通过在SELECT语句或其他特定语句前 使用WITH语句对临时结果集 进行命名。
  12. 窗口函数。
    MySQL 8开始支持窗口函数。在之前的版本中已存在的大部分 聚合函数 在MySQL 8中也可以作为窗口函数来使用。
  13. 正则表达式支持。
    MySQL在8.0.4以后的版本中采用支持Unicode的国际化组件库实现正则表达式操作,这种方式不仅能提供完全的Unicode支持,而且是多字节安全编码。MySQL增加了REGEXP_LIKE()、EGEXP_INSTR()、REGEXP_REPLACE()和 REGEXP_SUBSTR()等函数来提升性能。另外,regexp_stack_limit和regexp_time_limit 系统变量能够通过匹配引擎来控制资源消耗。
  14. 内部临时表。
    TempTable存储引擎取代MEMORY存储引擎成为内部临时表的默认存储引擎 。TempTable存储引擎为VARCHAR和VARBINARY列提供高效存储。internal_tmp_mem_storage_engine会话变量定义了内部临时表的存储引擎,可选的值有两个,TempTable和MEMORY,其中TempTable为默认的存储引擎。temptable_max_ram系统配置项定义了TempTable存储引擎可使用的最大内存数量。
  15. 日志记录。
    在MySQL 8中错误日志子系统由一系列MySQL组件构成。这些组件的构成由系统变量log_error_services来配置,能够实现日志事件的过滤和写入。
  16. 备份锁。
    新的备份锁允许在线备份期间执行数据操作语句,同时阻止可能造成快照不一致的操作。新备份锁由 LOCK INSTANCE FOR BACKUP 和 UNLOCK INSTANCE 语法提供支持,执行这些操作需要备份管理员特权。
  17. 增强的MySQL复制。
    MySQL 8复制支持对 JSON文档 进行部分更新的 二进制日志记录 ,该记录使用紧凑的二进制格式 ,从而节省记录完整JSON文档的空间。当使用基于语句的日志记录时,这种紧凑的日志记录会自动完成,并且可以通过将新的binlog_row_value_options系统变量值设置为PARTIAL_JSON来启用。

MySQL安装

MySQL在linux下的安装包有rpm包、二进制包和源码包三种,用相应的包有三种安装方式。

rpm安装

rpm安装简单,不需要过多的安装配置,适合初学者安装使用。但需要下载客户端和服务端,安装路径为默认安装路径不能修改,一台服务器只能安装一个MySQL,不能安装多个虚拟主机。

文件的安装路径如下:

/usr/bin # 客户端程序和脚本
/usr/sbin # mysqld服务器
/usr/share/doc/packages # 文档
/usr/include/mysql # 包含公共头文件
/usr/lib/mysql # 库文件
/usr/share/mysql # 错误消息和字符集文件
/usr/share/sql-bench # 基准程序
/var/lib/mysql # 日志文件和数据库

安装MySQL步骤:

  1. 检查当前系统是否安装过MySQL。
rpm -qa|grep mariadb
sudo rpm -e --nodeps  mariadb-libs # 如果存在用此命令卸载mariadb
  1. 将MySQL安装包拷贝到linux。
  2. 解压MySQL安装包。
tar -zxvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
  1. 在安装目录下依次执行以下rpm命令进行安装。
sudo rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
sudo rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
sudo rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
sudo rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
# 如果linux是最小安装的可能在安装server时会报错,用以下命令安装依赖后重新安装server即可
sudo yum install -y libaio
  1. 删除/etc/my.cnf文件中datadir指向的目录下的所有内容。
cd /var/lib/mysql
sudo rm -rf ./* # 注意执行命令的位置,谨慎操作
  1. 初始化数据库。
sudo mysqld --initialize --user=mysql
  1. 查看临时生成的root用户密码。
sudo cat /var/log/mysqld.log
  1. 启动MySQL服务。
sudo systemctl start mysqld
  1. 登录MySQL数据库
mysql -u root -p 
Enter password:   # 输入临时生成的密码
  1. 修改root用户的密码,否则执行其他的操作会报错。
mysql> set password = password("xxxxxxxx");
  1. 修改MySQL库下的user表中的root用户允许任意ip连接。
# 根据需要是否开启
mysql> update mysql.user set host='%' where user='root';
mysql> flush privileges;

MySQL8的安装几乎和5.7的安装一样,这里就不再重复。

二进制安装

二进制安装同样安装简单,但是可以安装到任何路径下,灵活性好,且一台服务器可以安装多个mysql,但是二进制包是经过编译的,性能上不如源码编译的好,不能灵活定制编译参数。

文件布局如下:

bin # 客户端程序和mysqld服务器
data # 日志文件和数据库
docs # 文档和changelog
include # 包含公共头文件
lib # 库文件
script # mysql_install_db脚本,用来安装系统数据库
share/mysql # 错误消息文件
sql-bench # 基准程序

安装MySQL步骤:

  1. 官网下载安装包。
  2. 解压并移动到安装目录下。
tar -zxvf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.22-linux-glibc2.12-x86_64 /opt/mysql
  1. 创建用户组。
groupadd mysql
useradd mysql -g mysql
passwd mysql
  1. 添加文件授权。
# 创建目录,将日志和数据文件单独存放
mkdir -p /data/mysql_log 
mkdir -p /data/mysql_data 
mkdir -p /data/tmp
# 做软链接,指向当前目录
ln -s /data/mysql_log /opt/mysql/logs 
ln -s /data/mysql_data /opt/mysql/data
# 授权
chown -R mysql:mysql /opt/mysql
chown -R mysql:mysql /opt/mysql/logs 
chown -R mysql:mysql mysql_log 
chown -R mysql:mysql /data/tmp
# 上传my.cnf到安装目录下

我的my.cnf文件如下,路径一定要对上:

[client]
default-character-set = utf8mb4
socket = /tmp/mysql.sock
port=3306

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
#基础参数
basedir=/opt/mysql
datadir=/opt/mysql/data
port=3306
tmpdir = /data/tmp
user=mysql
pid-file=/opt/mysql/mysqld.pid
socket = /tmp/mysql.sock
default-storage-engine=INNODB
explicit_defaults_for_timestamp = true
#开启二进制日志
server-id=1234
log-bin=/opt/mysql/logs/mysql-bin
#开启慢日志
slow_query_log=ON
long_query_time=2
slow_query_log_file=/opt/mysql/logs/mysql-slow.log
#时区
log_timestamps=SYSTEM
[mysqld_safe]
log-error = /opt/mysql/logs/error.log
pid-file = /opt/mysql/mysqld.pid
  1. 初始化数据库。
/opt/mysql/bin/mysqld --defaults-file=/opt/mysql/my.cnf --basedir=/opt/mysql --datadir=/opt/mysql/data --initialize --user=mysql
# 执行完会输出root的初始化密码,需要记住
  1. 拷贝控制启停文件。
cp /opt/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
# 编辑/etc/init.d/mysqld文件内容
vim /etc/init.d/mysqld
# 在第46~47行,改成my.cnf里面的那个路径
basedir=/opt/mysql 
datadir=/opt/mysql/data
  1. 配置开机启动。
chkconfig --add mysqld 
chkconfig mysqld on 
# 检查mysql是否开机启动
chkconfig --list mysqld 
  1. 创建错误日志文件并启动mysql。
# 创建错误日志文件并授权
touch /opt/mysql/logs/error.log
chown -R mysql:mysql /opt/mysql/logs/error.log
# 启动
/etc/init.d/mysqld start

MySQL8的安装几乎和5.7的安装一样,这里就不再重复。

源码安装

源码安装可以按需定制编译,最灵活性能最好,且一台服务器可以安装多个MySQL,但是安装过程复杂,编译时间较长,不适合初学者。

文件布局如下:

bin # 客户端程序和脚本
include/mysql # 公共头文件
info # info格式的文档
lib/mysql # 库文件
libexec # mysql的服务器
share/mysql # 错误消息文件
sql-bench # 基准程序
var # 数据库和日志文件

源码安装(了解即可):

# 安装cmake
tar -zxvf cmake-3.18.3.tar.gz
mv cmake-3.18.3 /usr/local
cd /usr/local/cmake-3.18.3
./configure -prefix=/usr/local/cmake
make
make install # 之后需要配置cmake的环境变量并source生效
# 安装MySQL
mkdir -p /usr/local/mysql # mysql安装目录
mkdir -p /usr/local/mysql/data # 数据库存储目录
groupadd mysql # 创建mysql用户组及用户
useradd -r -g mysql mysql 
tar -zxvf mysql-5.7.28.tar.gz
mv mysql-5.7.28 /usr/local
cd /usr/local/mysql-5.7.28
# cmake后加参数开始安装
cmake .
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DINSTALL_DATADIR=/usr/local/mysql/data
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
-DEXTRA_CHARSETS=all
-DENABLED_LOCAL_INFILE=1

make
make install
# 配置MySQL
cd /usr/local/mysql 
chown -R root:mysql . # 设置目录权限
chown -R mysql:mysql data
cp support-files/my-default.cnf /etc/my.cnf # 将mysql的启动服务添加到系统服务中
cd /usr/local/mysql
scripts/mysql_install_db --user=mysql # 创建系统数据库的表,然后配置mysql环境变量
# 启动MySQL
service mysql start
service mysql stop # 停止
service mysql restart # 重启

多实例安装

多实例其实就是在一台服务器上同时开启多个不同的数据库服务端口,同时运行多个MySQL服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供服务。

MySQL的多实例可以通过多个端口向用户提供服务,充分的利用一台服务器的闲置资源,但是当访问量过大时会存在高并发的问题。

下面介绍下多实例的安装部署步骤:

# 解压
tar -zxvf mysql-5.7.34-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.34-linux-glibc2.12-x86_64 /usr/local/mysql
cd /usr/local/mysql && mkdir data/{3307..3309} -p # 创建数据目录
groupadd mysql
useradd -r -g mysql mysql # 创建用户组
chown -R mysql:mysql /usr/local/mysql
# 初始化三个示例
cd /usr/local/mysql/bin/
./mysqld --initialize-insecure --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/3307/ --user=mysql
./mysqld --initialize-insecure --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/3308/ --user=mysql
./mysqld --initialize-insecure --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/3309/ --user=mysql
# 添加配置,其余两台更换上对应的端口即可
cd /usr/local/mysql/data/3307
vim my.cnf
# 具体内容如下
[client]
port=3307
socket=/usr/local/mysql/data/3307/mysql.sock
default_character_set=utf8
[mysqld]
port=3307
socket=/usr/local/mysql/data/3307/mysql.sock
datadir=/usr/local/mysql/data/3307
log-error=/usr/local/mysql/data/3307/error.log
pid-file=/usr/local/mysql/data/3307/mysql.pid
character_set_server=utf8
lower_case_table_names=1
autocommit=1
# 启动实例
cd /usr/local/mysql/bin/
./mysqld_safe --defaults-file=/usr/local/mysql/data/3307/my.cnf &
./mysqld_safe --defaults-file=/usr/local/mysql/data/3308/my.cnf &
./mysqld_safe --defaults-file=/usr/local/mysql/data/3309/my.cnf &
# 查看三个实例进程状态
ps -ef | grep mysql

到这里多实例就按照完毕了。

今天的内容就到这里,喜欢的话点个关注吧,下篇见!

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。